{"version":3,"file":"ng-search-core.mjs","sources":["../../../projects/ng-search-lib/src/lib/version.ts","../../../projects/ng-search-lib/src/lib/types/search-types.ts","../../../projects/ng-search-lib/src/lib/types/facet-types.ts","../../../projects/ng-search-lib/src/lib/types/adapter-types.ts","../../../projects/ng-search-lib/src/lib/types/component-types.ts","../../../projects/ng-search-lib/src/lib/types/telemetry-types.ts","../../../projects/ng-search-lib/src/lib/models/search-config.model.ts","../../../projects/ng-search-lib/src/lib/models/search-result.model.ts","../../../projects/ng-search-lib/src/lib/models/facet-config.model.ts","../../../projects/ng-search-lib/src/lib/adapters/base-http.adapter.ts","../../../projects/ng-search-lib/src/lib/adapters/rest-api.adapter.ts","../../../projects/ng-search-lib/src/lib/utils/search-utils.ts","../../../projects/ng-search-lib/src/lib/utils/debounce.ts","../../../projects/ng-search-lib/src/lib/utils/keyboard-navigation.ts","../../../projects/ng-search-lib/src/lib/utils/highlight.ts","../../../projects/ng-search-lib/src/lib/utils/facet-utils.ts","../../../projects/ng-search-lib/src/lib/utils/index.ts","../../../projects/ng-search-lib/src/lib/services/search-logger.ts","../../../projects/ng-search-lib/src/lib/services/search-telemetry.service.ts","../../../projects/ng-search-lib/src/lib/services/search-state.service.ts","../../../projects/ng-search-lib/src/lib/services/search-coordinator.service.ts","../../../projects/ng-search-lib/src/lib/components/facets/built-in/text-facet.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/built-in/text-typeahead-facet.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/built-in/number-facet.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/built-in/number-range-facet.component.ts","../../../projects/ng-search-lib/src/lib/services/facet-registry.service.ts","../../../projects/ng-search-lib/src/lib/services/facet-manager.service.ts","../../../projects/ng-search-lib/src/lib/services/ssr-safe.service.ts","../../../projects/ng-search-lib/src/lib/search.tokens.ts","../../../projects/ng-search-lib/src/lib/services/search-provider.service.ts","../../../projects/ng-search-lib/src/lib/services/index.ts","../../../projects/ng-search-lib/src/lib/provide-search.ts","../../../projects/ng-search-lib/src/lib/components/search-box/search-box.component.ts","../../../projects/ng-search-lib/src/lib/components/suggestions/suggestions.component.ts","../../../projects/ng-search-lib/src/lib/components/results/results.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/facet-wrapper.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/facets-container.component.ts","../../../projects/ng-search-lib/src/lib/components/facets/applied-filters.component.ts","../../../projects/ng-search-lib/src/public-api.ts","../../../projects/ng-search-lib/src/ng-search-core.ts"],"sourcesContent":["/**\n * Library version\n */\nexport const LIB_VERSION = '0.1.0';\n\n/**\n * Library name\n */\nexport const LIB_NAME = '@ng-search/core';\n","/**\n * Core search types and interfaces for the @ng-search/core library\n */\n\n/**\n * Generic search result item\n * Can be extended by consumers for custom result types\n */\nexport interface SearchResult<T = any> {\n  /** Unique identifier for the result */\n  id: string;\n  /** The actual data of the result */\n  data: T;\n  /** Optional relevance score */\n  score?: number;\n  /** Optional highlighting information */\n  highlights?: Record<string, string[]>;\n  /** Optional metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Search query parameters\n */\nexport interface SearchQuery {\n  /** The search query string */\n  query: string;\n  /** Number of results to return */\n  size?: number;\n  /** Offset for pagination */\n  from?: number;\n  /** Fields to search in */\n  fields?: string[];\n  /** Sort configuration */\n  sort?: SortConfig[];\n  /** Filter configuration */\n  filters?: FilterConfig[];\n}\n\n/**\n * Sort configuration\n */\nexport interface SortConfig {\n  /** Field to sort by */\n  field: string;\n  /** Sort order */\n  order: 'asc' | 'desc';\n}\n\n/**\n * Filter configuration\n */\nexport interface FilterConfig {\n  /** Field to filter */\n  field: string;\n  /** Filter type */\n  type: 'term' | 'terms' | 'range' | 'match' | 'exists' | 'custom';\n  /** Filter value(s) */\n  value: any;\n  /** Optional operator for combining filters */\n  operator?: 'AND' | 'OR' | 'NOT';\n}\n\n/**\n * Search response from backend\n */\nexport interface SearchResponse<T = any> {\n  /** Array of search results */\n  results: SearchResult<T>[];\n  /** Total number of results */\n  total: number;\n  /** Time taken for search in milliseconds */\n  took?: number;\n  /** Aggregations/facets data */\n  aggregations?: Record<string, AggregationResult>;\n  /** Suggestions for query correction */\n  suggestions?: Suggestion[];\n}\n\n/**\n * Aggregation result from backend\n */\nexport interface AggregationResult {\n  /** Type of aggregation */\n  type: 'terms' | 'range' | 'histogram' | 'stats' | 'custom' | string;\n  /** Aggregation buckets */\n  buckets?: AggregationBucket[];\n  /** Statistical values (for stats aggregation) */\n  stats?: {\n    min: number;\n    max: number;\n    avg: number;\n    sum: number;\n    count: number;\n  };\n}\n\n/**\n * Aggregation bucket\n */\nexport interface AggregationBucket {\n  /** Bucket key */\n  key: string | number;\n  /** Number of documents in bucket */\n  doc_count: number;\n  /** Nested aggregations */\n  nested?: Record<string, AggregationResult>;\n}\n\n/**\n * Search suggestion\n */\nexport interface Suggestion {\n  /** Optional unique identifier */\n  id?: string;\n  /** Suggestion text */\n  text: string;\n  /** Optional highlighted version */\n  highlighted?: string;\n  /** Relevance score */\n  score?: number;\n  /** Number of results for this suggestion */\n  count?: number;\n  /** Additional metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Pagination configuration\n */\nexport interface PaginationConfig {\n  /** Current page (1-indexed) */\n  page: number;\n  /** Items per page */\n  pageSize: number;\n  /** Total items */\n  total: number;\n}\n\n/**\n * Search state\n */\nexport interface SearchState<T = any> {\n  /** Current query */\n  query: string;\n  /** Current results */\n  results: SearchResult<T>[];\n  /** Loading state */\n  loading: boolean;\n  /** Error state */\n  error: Error | null;\n  /** Total results count */\n  total: number;\n  /** Current filters */\n  filters: Map<string, FilterConfig>;\n  /** Current pagination */\n  pagination: PaginationConfig;\n  /** Available aggregations */\n  aggregations: Record<string, AggregationResult>;\n  /** Current suggestions */\n  suggestions: Suggestion[];\n}\n\n/**\n * Search configuration\n */\nexport interface SearchConfig {\n  /** Debounce time for search input (ms) */\n  debounceTime?: number;\n  /** Minimum query length to trigger search */\n  minQueryLength?: number;\n  /** Default page size */\n  pageSize?: number;\n  /** Enable automatic search on query change */\n  autoSearch?: boolean;\n  /** Enable suggestions */\n  enableSuggestions?: boolean;\n  /** Enable aggregations/facets */\n  enableAggregations?: boolean;\n  /** Fields to search */\n  searchFields?: string[];\n  /** Default sort */\n  defaultSort?: SortConfig[];\n  /** Enable highlighting */\n  enableHighlighting?: boolean;\n  /** Highlight fields */\n  highlightFields?: string[];\n  /** Maximum number of telemetry events to keep in memory */\n  eventHistoryLimit?: number | null;\n}\n\n/**\n * Search event types for tracking\n */\nexport type SearchEventType =\n  | 'query_changed'\n  | 'search_started'\n  | 'search_completed'\n  | 'search_failed'\n  | 'filter_added'\n  | 'filter_removed'\n  | 'filter_cleared'\n  | 'page_changed'\n  | 'result_clicked'\n  | 'suggestion_selected'\n  | 'suggestions_requested'\n  | 'suggestions_received'\n  | 'suggestions_cleared'\n  | 'suggestions_failed';\n\n/**\n * Search event\n */\nexport interface SearchEvent {\n  /** Event type */\n  type: SearchEventType;\n  /** Event timestamp */\n  timestamp: number;\n  /** Event payload */\n  payload?: any;\n}\n","/**\n * Facet types and interfaces for the plugin system\n */\n\nimport { Type, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AggregationResult, FilterConfig } from './search-types';\n\n/**\n * Base facet configuration\n */\nexport interface FacetConfig {\n  /** Unique identifier for the facet */\n  id: string;\n  /** Field name in the search backend */\n  field: string;\n  /** Display label */\n  label: string;\n  /** Facet type */\n  type: FacetType;\n  /** Whether facet is collapsible */\n  collapsible?: boolean;\n  /** Whether facet starts collapsed */\n  collapsed?: boolean;\n  /** Sort order for facet values */\n  sort?: 'count' | 'key' | 'custom';\n  /** Maximum number of values to display */\n  maxValues?: number;\n  /** Whether to show \"Show more\" button */\n  showMore?: boolean;\n  /** Custom configuration specific to facet type */\n  config?: Record<string, any>;\n  /** Static options (alternative to aggregations) */\n  options?: FacetOption[];\n  /** Whether to use aggregations from search results */\n  useAggregations?: boolean;\n}\n\n/**\n * Facet types\n */\nexport type FacetType =\n  | 'text'\n  | 'text-typeahead'\n  | 'number'\n  | 'number-range'\n  | 'checkbox'\n  | 'radio'\n  | 'toggle'\n  | 'range'\n  | 'slider'\n  | 'date-range'\n  | 'hierarchical'\n  | 'custom'\n  | (string & Record<never, never>);\n\n/**\n * Facet option\n */\nexport interface FacetOption {\n  /** Option value */\n  value: string | number;\n  /** Display label */\n  label: string;\n  /** Result count (from aggregations) */\n  count?: number;\n  /** Whether option is disabled */\n  disabled?: boolean;\n  /** Additional metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Text facet configuration\n */\nexport interface TextFacetConfig extends FacetConfig {\n  type: 'text';\n  /** Whether to allow multiple selections */\n  multiSelect?: boolean;\n  /** Whether to show search box for filtering options */\n  searchable?: boolean;\n  /** Operator for combining selected values (only for multiSelect) */\n  operator?: 'OR' | 'AND';\n}\n\n/**\n * Text typeahead facet configuration\n */\nexport interface TextTypeaheadFacetConfig extends FacetConfig {\n  type: 'text-typeahead';\n  /** Function to provide options based on query */\n  optionsProvider?: (query: string) => Observable<FacetOption[]>;\n  /** Minimum characters before searching */\n  minQueryLength?: number;\n  /** Debounce time in ms */\n  debounceTime?: number;\n  /** Whether to allow multiple selections */\n  multiSelect?: boolean;\n}\n\n/**\n * Number facet configuration\n */\nexport interface NumberFacetConfig extends FacetConfig {\n  type: 'number';\n  /** Minimum value */\n  min?: number;\n  /** Maximum value */\n  max?: number;\n  /** Step size */\n  step?: number;\n  /** Placeholder text */\n  placeholder?: string;\n}\n\n/**\n * Number range facet configuration\n */\nexport interface NumberRangeFacetConfig extends FacetConfig {\n  type: 'number-range';\n  /** Minimum value */\n  min?: number;\n  /** Maximum value */\n  max?: number;\n  /** Step size */\n  step?: number;\n  /** Whether to show slider UI */\n  showSlider?: boolean;\n  /** Value formatter */\n  formatter?: (value: number) => string;\n}\n\n/**\n * Checkbox facet configuration\n */\nexport interface CheckboxFacetConfig extends FacetConfig {\n  type: 'checkbox';\n  /** Whether to show search box for filtering options */\n  searchable?: boolean;\n  /** Operator for combining selected values */\n  operator?: 'OR' | 'AND';\n}\n\n/**\n * Range facet configuration\n */\nexport interface RangeFacetConfig extends FacetConfig {\n  type: 'range' | 'slider';\n  /** Minimum value */\n  min?: number;\n  /** Maximum value */\n  max?: number;\n  /** Step size */\n  step?: number;\n  /** Value formatter */\n  formatter?: (value: number) => string;\n}\n\n/**\n * Date range facet configuration\n */\nexport interface DateRangeFacetConfig extends FacetConfig {\n  type: 'date-range';\n  /** Date format */\n  format?: string;\n  /** Predefined ranges */\n  ranges?: DateRange[];\n}\n\n/**\n * Predefined date range\n */\nexport interface DateRange {\n  /** Range label */\n  label: string;\n  /** Start date */\n  from: Date | string;\n  /** End date */\n  to: Date | string;\n}\n\n/**\n * Hierarchical facet configuration\n */\nexport interface HierarchicalFacetConfig extends FacetConfig {\n  type: 'hierarchical';\n  /** Path separator */\n  separator?: string;\n  /** Maximum depth to display */\n  maxDepth?: number;\n}\n\n/**\n * Facet value\n */\nexport interface FacetValue {\n  /** Value key */\n  key: string | number;\n  /** Display label */\n  label: string;\n  /** Number of results for this value */\n  count: number;\n  /** Whether this value is selected */\n  selected: boolean;\n  /** Whether this value is disabled */\n  disabled?: boolean;\n  /** Nested values (for hierarchical facets) */\n  children?: FacetValue[];\n}\n\n/**\n * Facet state\n */\nexport interface FacetState {\n  /** Facet configuration */\n  config: FacetConfig;\n  /** Available values */\n  values: FacetValue[];\n  /** Selected values */\n  selectedValues: Set<string | number>;\n  /** Whether facet is collapsed */\n  collapsed: boolean;\n  /** Number of visible values */\n  visibleCount: number;\n  /** Whether facet is loading */\n  loading?: boolean;\n}\n\n/**\n * Facet change event\n */\nexport interface FacetChangeEvent {\n  /** Facet ID */\n  facetId: string;\n  /** Selected values */\n  selectedValues: Set<string | number>;\n  /** Previous selected values */\n  previousValues?: Set<string | number>;\n  /** Facet configuration */\n  config: FacetConfig;\n  /** Filter configuration generated from selection */\n  filter: FilterConfig | null;\n}\n\n/**\n * Base interface for facet plugin components\n * All custom facet components must implement this interface\n */\nexport interface FacetPlugin {\n  /** Facet configuration */\n  config: Signal<FacetConfig>;\n  /** Available facet values/options */\n  values: Signal<FacetValue[] | FacetOption[]>;\n  /** Currently selected values */\n  selectedValues: Signal<Set<string | number>>;\n  /** Callback when selection changes */\n  onSelectionChange: (values: Set<string | number>) => void;\n  /** Optional: callback when facet is collapsed/expanded */\n  onToggleCollapse?: () => void;\n}\n\n/**\n * Facet plugin registration\n */\nexport interface FacetPluginRegistration {\n  /** Facet type identifier */\n  type: FacetType | string;\n  /** Component class */\n  component: Type<FacetPlugin>;\n  /** Optional icon for UI */\n  icon?: string;\n  /** Optional description */\n  description?: string;\n}\n\n/**\n * Facet registry interface\n */\nexport interface IFacetRegistry {\n  /** Register a facet plugin */\n  register(registration: FacetPluginRegistration): void;\n  /** Unregister a facet plugin */\n  unregister(type: string): void;\n  /** Get facet plugin by type */\n  get(type: string): Type<FacetPlugin> | undefined;\n  /** Check if facet type is registered */\n  has(type: string): boolean;\n  /** Get all registered types */\n  getTypes(): string[];\n}\n\n/**\n * Transform aggregation result to facet values\n */\nexport type AggregationToFacetTransformer = (\n  aggregation: AggregationResult,\n  config: FacetConfig\n) => FacetValue[];\n\n/**\n * Transform facet selection to filter configuration\n */\nexport type FacetToFilterTransformer = (\n  selectedValues: Set<string | number>,\n  config: FacetConfig\n) => FilterConfig | null;\n","/**\n * Backend adapter types for search integration\n * Supports any backend: OpenSearch, Algolia, Elasticsearch, custom APIs, etc.\n */\n\nimport { Observable } from 'rxjs';\nimport { SearchQuery, SearchResponse, Suggestion } from './search-types';\n\n/**\n * Base search adapter interface\n * Implement this interface to integrate with any search backend\n */\nexport interface SearchAdapter<T = any> {\n  /**\n   * Execute a search query\n   * @param query Search query parameters\n   * @returns Observable of search response\n   */\n  search(query: SearchQuery): Observable<SearchResponse<T>>;\n\n  /**\n   * Get suggestions/autocomplete results\n   * @param query Partial query string\n   * @param options Optional configuration\n   * @returns Observable of suggestions\n   */\n  suggest?(query: string, options?: SuggestOptions): Observable<Suggestion[]>;\n\n  /**\n   * Get a single document by ID\n   * @param id Document ID\n   * @returns Observable of search result\n   */\n  getById?(id: string): Observable<T | null>;\n\n  /**\n   * Check if adapter is ready/connected\n   * @returns Observable of connection status\n   */\n  isReady?(): Observable<boolean>;\n\n  /**\n   * Cleanup/disconnect\n   */\n  destroy?(): void;\n}\n\n/**\n * Suggest options\n */\nexport interface SuggestOptions {\n  /** Maximum number of suggestions */\n  maxSuggestions?: number;\n  /** Fields to search for suggestions */\n  fields?: string[];\n  /** Fuzzy matching options */\n  fuzzy?: boolean;\n  /** Additional backend-specific options */\n  additionalOptions?: Record<string, any>;\n}\n\n/**\n * Adapter configuration\n */\nexport interface AdapterConfig {\n  /** Backend type identifier */\n  type: 'opensearch' | 'elasticsearch' | 'algolia' | 'custom';\n  /** API endpoint URL */\n  endpoint?: string;\n  /** API key or credentials */\n  credentials?: AdapterCredentials;\n  /** Index name */\n  index?: string;\n  /** Additional backend-specific configuration */\n  options?: Record<string, any>;\n}\n\n/**\n * Adapter credentials\n */\nexport interface AdapterCredentials {\n  /** API key */\n  apiKey?: string;\n  /** Username */\n  username?: string;\n  /** Password */\n  password?: string;\n  /** Token */\n  token?: string;\n  /** Custom headers */\n  headers?: Record<string, string>;\n}\n\n/**\n * Query builder interface\n * Transforms SearchQuery to backend-specific query format\n */\nexport interface QueryBuilder<TQuery = any> {\n  /**\n   * Build backend-specific query\n   * @param query Generic search query\n   * @returns Backend-specific query object\n   */\n  buildQuery(query: SearchQuery): TQuery;\n\n  /**\n   * Build suggest query\n   * @param query Query string\n   * @param options Suggest options\n   * @returns Backend-specific suggest query\n   */\n  buildSuggestQuery?(query: string, options?: SuggestOptions): any;\n}\n\n/**\n * Response parser interface\n * Transforms backend-specific response to generic SearchResponse\n */\nexport interface ResponseParser<TResponse = any, T = any> {\n  /**\n   * Parse backend response to generic format\n   * @param response Backend-specific response\n   * @returns Generic search response\n   */\n  parseResponse(response: TResponse): SearchResponse<T>;\n\n  /**\n   * Parse suggest response\n   * @param response Backend-specific response\n   * @returns Array of suggestions\n   */\n  parseSuggestResponse?(response: any): Suggestion[];\n}\n\n/**\n * HTTP adapter options\n */\nexport interface HttpAdapterOptions {\n  /** Request timeout in milliseconds */\n  timeout?: number;\n  /** Retry configuration */\n  retry?: RetryConfig;\n  /** Request interceptor */\n  requestInterceptor?: (request: any) => any;\n  /** Response interceptor */\n  responseInterceptor?: (response: any) => any;\n  /** Error handler */\n  errorHandler?: (error: any) => Observable<never>;\n}\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n  /** Maximum number of retries */\n  maxRetries?: number;\n  /** Delay between retries in milliseconds */\n  delay?: number;\n  /** Backoff strategy */\n  backoff?: 'linear' | 'exponential';\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory<T = any> = (config: AdapterConfig) => SearchAdapter<T>;\n\n/**\n * Adapter registry for managing multiple adapters\n */\nexport interface AdapterRegistry {\n  /** Register an adapter factory */\n  register(type: string, factory: AdapterFactory): void;\n  /** Get adapter factory by type */\n  get(type: string): AdapterFactory | undefined;\n  /** Create adapter instance */\n  create<T = any>(config: AdapterConfig): SearchAdapter<T>;\n}\n","/**\n * Component-specific types and interfaces\n */\n\nimport { TemplateRef, Type } from '@angular/core';\nimport { SearchResult, Suggestion } from './search-types';\n\n/**\n * Search box configuration\n */\nexport interface SearchBoxConfig {\n  /** Placeholder text */\n  placeholder?: string;\n  /** Debounce time in milliseconds */\n  debounceTime?: number;\n  /** Minimum query length */\n  minQueryLength?: number;\n  /** Show clear button */\n  showClearButton?: boolean;\n  /** Show search button */\n  showSearchButton?: boolean;\n  /** ARIA label */\n  ariaLabel?: string;\n  /** Auto-focus on mount */\n  autoFocus?: boolean;\n  /** Disabled state */\n  disabled?: boolean;\n}\n\n/**\n * Suggestions component configuration\n */\nexport interface SuggestionsConfig {\n  /** Maximum suggestions to display */\n  maxSuggestions?: number;\n  /** Show on focus (empty query) */\n  showOnFocus?: boolean;\n  /** Highlight matching text */\n  highlightMatches?: boolean;\n  /** Custom template for suggestion item */\n  itemTemplate?: TemplateRef<SuggestionContext>;\n  /** Debounce time for suggestions */\n  debounceTime?: number;\n  /** Minimum query length */\n  minQueryLength?: number;\n  /** Position relative to search box */\n  position?: 'bottom' | 'top';\n  /** Enable keyboard navigation */\n  keyboardNavigation?: boolean;\n}\n\n/**\n * Context passed to custom suggestion template\n */\nexport interface SuggestionContext {\n  /** The suggestion data */\n  $implicit: Suggestion;\n  /** Index in the list */\n  index: number;\n  /** Whether this suggestion is highlighted */\n  highlighted: boolean;\n  /** Original query */\n  query: string;\n}\n\n/**\n * Results component configuration\n */\nexport interface ResultsConfig<T = any> {\n  /** Custom template for result item */\n  itemTemplate?: TemplateRef<ResultContext<T>>;\n  /** Custom component for result item */\n  itemComponent?: Type<ResultRenderer<T>>;\n  /** Enable virtual scrolling */\n  virtualScroll?: boolean;\n  /** Virtual scroll item size (required if virtualScroll is true) */\n  itemSize?: number;\n  /** Enable pagination */\n  pagination?: boolean;\n  /** Items per page */\n  pageSize?: number;\n  /** Show loading indicator */\n  showLoading?: boolean;\n  /** Show empty state */\n  showEmpty?: boolean;\n  /** Custom empty state template */\n  emptyTemplate?: TemplateRef<void>;\n  /** Custom loading template */\n  loadingTemplate?: TemplateRef<void>;\n}\n\n/**\n * Context passed to custom result template\n */\nexport interface ResultContext<T = any> {\n  /** The result data */\n  $implicit: SearchResult<T>;\n  /** Index in the list */\n  index: number;\n  /** Total number of results */\n  total: number;\n  /** Original query */\n  query: string;\n}\n\n/**\n * Interface for custom result renderer components\n */\nexport interface ResultRenderer<T = any> {\n  /** Result data */\n  result: SearchResult<T>;\n  /** Index in list */\n  index?: number;\n  /** Click handler */\n  onClick?: () => void;\n}\n\n/**\n * Facet container configuration\n */\nexport interface FacetContainerConfig {\n  /** Layout orientation */\n  layout?: 'vertical' | 'horizontal';\n  /** Whether facets are collapsible */\n  collapsible?: boolean;\n  /** Show clear all button */\n  showClearAll?: boolean;\n  /** Position */\n  position?: 'left' | 'right' | 'top';\n  /** Sticky behavior */\n  sticky?: boolean;\n}\n\n/**\n * Pagination configuration\n */\nexport interface PaginationComponentConfig {\n  /** Show first/last buttons */\n  showFirstLast?: boolean;\n  /** Show previous/next buttons */\n  showPrevNext?: boolean;\n  /** Maximum page buttons to show */\n  maxPages?: number;\n  /** Page size options */\n  pageSizeOptions?: number[];\n  /** Show page size selector */\n  showPageSize?: boolean;\n  /** Show total results */\n  showTotal?: boolean;\n}\n\n/**\n * Keyboard navigation keys\n */\nexport interface KeyboardNavigationConfig {\n  /** Key for moving up */\n  up?: string;\n  /** Key for moving down */\n  down?: string;\n  /** Key for selection */\n  select?: string;\n  /** Key for closing/escape */\n  close?: string;\n  /** Enable Ctrl+K shortcut */\n  enableShortcut?: boolean;\n}\n\n/**\n * Highlight configuration\n */\nexport interface HighlightConfig {\n  /** CSS class for highlighted text */\n  highlightClass?: string;\n  /** Pre-tag for highlighting */\n  preTag?: string;\n  /** Post-tag for highlighting */\n  postTag?: string;\n}\n\n/**\n * Loading state\n */\nexport interface LoadingState {\n  /** Whether currently loading */\n  loading: boolean;\n  /** Loading message */\n  message?: string;\n  /** Progress percentage (0-100) */\n  progress?: number;\n}\n\n/**\n * Error state\n */\nexport interface ErrorState {\n  /** Error object */\n  error: Error | null;\n  /** Error message */\n  message?: string;\n  /** Whether error is recoverable */\n  recoverable?: boolean;\n  /** Retry function */\n  retry?: () => void;\n}\n\n/**\n * Empty state\n */\nexport interface EmptyState {\n  /** Empty state message */\n  message: string;\n  /** Optional icon */\n  icon?: string;\n  /** Optional action */\n  action?: {\n    label: string;\n    handler: () => void;\n  };\n}\n","/**\n * Telemetry types for the @ng-search/core library\n *\n * Consumers can implement the {@link SearchTelemetryClient} interface and\n * provide it via the `NG_SEARCH_TELEMETRY_CLIENTS` injection token to capture\n * analytics, logging or observability data. The library does not ship with a\n * concrete implementation which keeps instrumentation optional and\n * infrastructure-agnostic.\n */\n\nimport { SearchEvent, SearchEventType } from './search-types';\n\n/**\n * Telemetry event emitted by the library. Extends the public\n * {@link SearchEvent} with optional categorisation and context metadata.\n */\nexport interface SearchTelemetryEvent extends SearchEvent {\n  /** High level event category to simplify downstream routing */\n  category?: 'search' | 'suggestions' | 'facets' | 'results' | 'pagination' | 'custom';\n  /** Optional key/value context with sanitised metadata */\n  context?: Record<string, any>;\n}\n\n/**\n * Duration metric that can be sent to telemetry backends.\n */\nexport interface SearchTelemetryTiming {\n  /** Telemetry measurement name */\n  name: 'search' | 'suggestions' | string;\n  /** Measured duration in milliseconds */\n  duration: number;\n  /** Optional contextual metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Error payload reported through telemetry clients.\n */\nexport interface SearchTelemetryError {\n  /** The error instance */\n  error: Error;\n  /** Optional context describing the operation */\n  context?: Record<string, any>;\n  /** Optional hint which part of the pipeline failed */\n  source?: 'search' | 'suggestions' | 'facets' | 'results' | 'custom';\n}\n\n/**\n * Telemetry client contract. Consumers can supply one or multiple clients to\n * forward analytics data to any observability platform.\n */\nexport interface SearchTelemetryClient {\n  /** Handle structured telemetry events */\n  trackEvent(event: SearchTelemetryEvent): void;\n  /** Handle duration/timing measurements */\n  trackTiming?(timing: SearchTelemetryTiming): void;\n  /** Handle pipeline errors */\n  trackError?(error: SearchTelemetryError): void;\n}\n\n/**\n * Helper type for mapping {@link SearchEventType} to default telemetry\n * categories. Useful when implementing custom telemetry clients.\n */\nexport type SearchTelemetryCategoryMap = Partial<\n  Record<SearchEventType, SearchTelemetryEvent['category']>\n>;\n","/**\n * Search configuration model\n * Provides default values and validation\n */\n\nimport { SearchConfig, SortConfig } from '../types/search-types';\n\nexport class SearchConfigModel implements SearchConfig {\n  debounceTime: number;\n  minQueryLength: number;\n  pageSize: number;\n  autoSearch: boolean;\n  enableSuggestions: boolean;\n  enableAggregations: boolean;\n  searchFields?: string[];\n  defaultSort?: SortConfig[];\n  enableHighlighting: boolean;\n  highlightFields?: string[];\n  eventHistoryLimit: number | null;\n\n  constructor(config?: Partial<SearchConfig>) {\n    // Set defaults\n    this.debounceTime = config?.debounceTime ?? 300;\n    this.minQueryLength = config?.minQueryLength ?? 1;\n    this.pageSize = config?.pageSize ?? 10;\n    this.autoSearch = config?.autoSearch ?? true;\n    this.enableSuggestions = config?.enableSuggestions ?? true;\n    this.enableAggregations = config?.enableAggregations ?? true;\n    this.enableHighlighting = config?.enableHighlighting ?? true;\n    this.searchFields = config?.searchFields;\n    this.defaultSort = config?.defaultSort;\n    this.highlightFields = config?.highlightFields;\n    this.eventHistoryLimit =\n      config?.eventHistoryLimit !== undefined ? config.eventHistoryLimit! : 100;\n\n    this.validate();\n  }\n\n  /**\n   * Validate configuration\n   */\n  private validate(): void {\n    if (this.debounceTime < 0) {\n      throw new Error('debounceTime must be non-negative');\n    }\n    if (this.minQueryLength < 0) {\n      throw new Error('minQueryLength must be non-negative');\n    }\n    if (this.pageSize < 1) {\n      throw new Error('pageSize must be at least 1');\n    }\n    if (this.eventHistoryLimit !== null && this.eventHistoryLimit < 0) {\n      throw new Error('eventHistoryLimit must be null or a non-negative number');\n    }\n  }\n\n  /**\n   * Create a copy with overrides\n   */\n  merge(overrides: Partial<SearchConfig>): SearchConfigModel {\n    return new SearchConfigModel({\n      ...this,\n      ...overrides,\n    });\n  }\n\n  /**\n   * Convert to plain object\n   */\n  toJSON(): SearchConfig {\n    return {\n      debounceTime: this.debounceTime,\n      minQueryLength: this.minQueryLength,\n      pageSize: this.pageSize,\n      autoSearch: this.autoSearch,\n      enableSuggestions: this.enableSuggestions,\n      enableAggregations: this.enableAggregations,\n      searchFields: this.searchFields,\n      defaultSort: this.defaultSort,\n      enableHighlighting: this.enableHighlighting,\n      highlightFields: this.highlightFields,\n      eventHistoryLimit: this.eventHistoryLimit,\n    };\n  }\n}\n","/**\n * Search result model with utility methods\n */\n\nimport { SearchResult } from '../types/search-types';\n\nexport class SearchResultModel<T = any> implements SearchResult<T> {\n  id: string;\n  data: T;\n  score?: number;\n  highlights?: Record<string, string[]>;\n  metadata?: Record<string, any>;\n\n  constructor(result: SearchResult<T>) {\n    this.id = result.id;\n    this.data = result.data;\n    this.score = result.score;\n    this.highlights = result.highlights;\n    this.metadata = result.metadata;\n  }\n\n  /**\n   * Check if result has highlights\n   */\n  hasHighlights(): boolean {\n    return !!this.highlights && Object.keys(this.highlights).length > 0;\n  }\n\n  /**\n   * Get highlight for a specific field\n   */\n  getHighlight(field: string): string[] | undefined {\n    return this.highlights?.[field];\n  }\n\n  /**\n   * Get first highlight snippet for a field\n   */\n  getFirstHighlight(field: string): string | undefined {\n    const highlights = this.getHighlight(field);\n    return highlights?.[0];\n  }\n\n  /**\n   * Check if result has metadata\n   */\n  hasMetadata(): boolean {\n    return !!this.metadata && Object.keys(this.metadata).length > 0;\n  }\n\n  /**\n   * Get metadata value\n   */\n  getMetadata<V = any>(key: string): V | undefined {\n    return this.metadata?.[key] as V | undefined;\n  }\n\n  /**\n   * Get display value from data by path\n   * Example: getField('user.name') returns data.user.name\n   */\n  getField(path: string): any {\n    return path.split('.').reduce((obj, key) => obj?.[key], this.data as any);\n  }\n\n  /**\n   * Convert to plain object\n   */\n  toJSON(): SearchResult<T> {\n    return {\n      id: this.id,\n      data: this.data,\n      score: this.score,\n      highlights: this.highlights,\n      metadata: this.metadata,\n    };\n  }\n}\n","/**\n * Facet configuration model with validation and utilities\n */\n\nimport { FacetConfig, FacetType } from '../types/facet-types';\n\nexport class FacetConfigModel implements FacetConfig {\n  id: string;\n  field: string;\n  label: string;\n  type: FacetType;\n  collapsible: boolean;\n  collapsed: boolean;\n  sort?: 'count' | 'key' | 'custom';\n  maxValues?: number;\n  showMore: boolean;\n  config?: Record<string, any>;\n\n  constructor(config: FacetConfig) {\n    this.id = config.id;\n    this.field = config.field;\n    this.label = config.label;\n    this.type = config.type;\n    this.collapsible = config.collapsible ?? true;\n    this.collapsed = config.collapsed ?? false;\n    this.sort = config.sort ?? 'count';\n    this.maxValues = config.maxValues;\n    this.showMore = config.showMore ?? false;\n    this.config = config.config;\n\n    this.validate();\n  }\n\n  /**\n   * Validate configuration\n   */\n  private validate(): void {\n    if (!this.id) {\n      throw new Error('Facet id is required');\n    }\n    if (!this.field) {\n      throw new Error('Facet field is required');\n    }\n    if (!this.label) {\n      throw new Error('Facet label is required');\n    }\n    if (this.maxValues !== undefined && this.maxValues < 1) {\n      throw new Error('maxValues must be at least 1');\n    }\n  }\n\n  /**\n   * Check if facet is a specific type\n   */\n  isType(type: FacetType): boolean {\n    return this.type === type;\n  }\n\n  /**\n   * Get type-specific configuration\n   */\n  getTypeConfig<T = any>(): T | undefined {\n    return this.config as T | undefined;\n  }\n\n  /**\n   * Create a copy with overrides\n   */\n  merge(overrides: Partial<FacetConfig>): FacetConfigModel {\n    return new FacetConfigModel({\n      ...this,\n      ...overrides,\n    });\n  }\n\n  /**\n   * Convert to plain object\n   */\n  toJSON(): FacetConfig {\n    return {\n      id: this.id,\n      field: this.field,\n      label: this.label,\n      type: this.type,\n      collapsible: this.collapsible,\n      collapsed: this.collapsed,\n      sort: this.sort,\n      maxValues: this.maxValues,\n      showMore: this.showMore,\n      config: this.config,\n    };\n  }\n}\n","/**\n * Base HTTP adapter implementation\n * Provides common HTTP functionality for search adapters\n */\n\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Observable, throwError, TimeoutError } from 'rxjs';\nimport { catchError, retry, timeout } from 'rxjs/operators';\nimport {\n  SearchAdapter,\n  HttpAdapterOptions,\n  AdapterConfig,\n  SuggestOptions,\n} from '../types/adapter-types';\nimport { SearchQuery, SearchResponse, Suggestion } from '../types/search-types';\n\n/**\n * Abstract base class for HTTP-based search adapters\n * Extend this class to implement specific backend integrations\n */\nexport abstract class BaseHttpAdapter<T = any> implements SearchAdapter<T> {\n  protected http = inject(HttpClient);\n  protected config: AdapterConfig;\n  protected options: HttpAdapterOptions;\n\n  constructor(config: AdapterConfig, options?: HttpAdapterOptions) {\n    this.config = config;\n    this.options = {\n      timeout: options?.timeout ?? 30000,\n      retry: {\n        maxRetries: options?.retry?.maxRetries ?? 2,\n        delay: options?.retry?.delay ?? 1000,\n        backoff: options?.retry?.backoff ?? 'exponential',\n      },\n      ...options,\n    };\n  }\n\n  /**\n   * Execute search query\n   * Must be implemented by concrete adapter classes\n   */\n  abstract search(query: SearchQuery): Observable<SearchResponse<T>>;\n\n  /**\n   * Get suggestions\n   * Optional - override if backend supports suggestions\n   */\n  suggest(query: string, options?: SuggestOptions): Observable<Suggestion[]> {\n    return throwError(() => new Error('Suggestions not implemented'));\n  }\n\n  /**\n   * Get document by ID\n   * Optional - override if needed\n   */\n  getById(id: string): Observable<T | null> {\n    return throwError(() => new Error('GetById not implemented'));\n  }\n\n  /**\n   * Check if adapter is ready\n   */\n  isReady(): Observable<boolean> {\n    return new Observable((observer) => {\n      observer.next(true);\n      observer.complete();\n    });\n  }\n\n  /**\n   * Cleanup\n   */\n  destroy(): void {\n    // Override if cleanup is needed\n  }\n\n  /**\n   * Create HTTP headers from config\n   */\n  protected createHeaders(): HttpHeaders {\n    let headers = new HttpHeaders({\n      'Content-Type': 'application/json',\n    });\n\n    if (this.config.credentials?.apiKey) {\n      headers = headers.set('Authorization', `Bearer ${this.config.credentials.apiKey}`);\n    }\n\n    if (this.config.credentials?.headers) {\n      Object.entries(this.config.credentials.headers).forEach(([key, value]) => {\n        headers = headers.set(key, value);\n      });\n    }\n\n    return headers;\n  }\n\n  /**\n   * Create HTTP params\n   */\n  protected createParams(params: Record<string, any>): HttpParams {\n    let httpParams = new HttpParams();\n    Object.entries(params).forEach(([key, value]) => {\n      if (value !== undefined && value !== null) {\n        httpParams = httpParams.set(key, String(value));\n      }\n    });\n    return httpParams;\n  }\n\n  /**\n   * Execute HTTP request with error handling and retries\n   */\n  protected executeRequest<R>(request: Observable<R>): Observable<R> {\n    let processedRequest = request.pipe(timeout(this.options.timeout!));\n\n    // Apply retry logic\n    if (this.options.retry && this.options.retry.maxRetries! > 0) {\n      processedRequest = processedRequest.pipe(\n        retry({\n          count: this.options.retry.maxRetries!,\n          delay: (error, retryCount) => {\n            // Don't retry on client errors (4xx)\n            if (error.status >= 400 && error.status < 500) {\n              throw error;\n            }\n\n            const delay =\n              this.options.retry!.backoff === 'exponential'\n                ? this.options.retry!.delay! * Math.pow(2, retryCount - 1)\n                : this.options.retry!.delay!;\n\n            return new Observable<void>((observer) => {\n              setTimeout(() => {\n                observer.next(undefined);\n                observer.complete();\n              }, delay);\n            });\n          },\n        })\n      );\n    }\n\n    // Apply error handler\n    processedRequest = processedRequest.pipe(\n      catchError((error) => {\n        if (this.options.errorHandler) {\n          return this.options.errorHandler(error);\n        }\n        return throwError(() => this.handleError(error));\n      })\n    );\n\n    // Apply response interceptor\n    if (this.options.responseInterceptor) {\n      processedRequest = processedRequest.pipe(\n        catchError((error) => throwError(() => error)),\n        (source) =>\n          new Observable((observer) => {\n            source.subscribe({\n              next: (value) => {\n                try {\n                  const intercepted = this.options.responseInterceptor!(value);\n                  observer.next(intercepted);\n                } catch (err) {\n                  observer.error(err);\n                }\n              },\n              error: (err) => observer.error(err),\n              complete: () => observer.complete(),\n            });\n          })\n      );\n    }\n\n    return processedRequest;\n  }\n\n  /**\n   * Handle errors\n   */\n  protected handleError(error: any): Error {\n    if (error instanceof TimeoutError) {\n      return new Error('Search request timed out');\n    }\n\n    if (error.status === 401) {\n      return new Error('Unauthorized: Invalid credentials');\n    }\n\n    if (error.status === 403) {\n      return new Error('Forbidden: Access denied');\n    }\n\n    if (error.status === 404) {\n      return new Error('Not found: Invalid endpoint or index');\n    }\n\n    if (error.status >= 500) {\n      return new Error(`Server error: ${error.message || 'Unknown error'}`);\n    }\n\n    return new Error(error.message || 'An unknown error occurred');\n  }\n}\n","/**\n * Example REST API adapter\n * Demonstrates how to implement a custom adapter for any backend\n */\n\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { BaseHttpAdapter } from './base-http.adapter';\nimport { AdapterConfig, SuggestOptions } from '../types/adapter-types';\nimport { SearchQuery, SearchResponse, Suggestion } from '../types/search-types';\n\n/**\n * Generic REST API adapter\n * Works with any REST API that follows a simple JSON format\n *\n * Example usage:\n * ```typescript\n * const adapter = new RestApiAdapter({\n *   type: 'custom',\n *   endpoint: 'https://api.example.com',\n *   credentials: { apiKey: 'your-key' }\n * });\n * ```\n */\nexport class RestApiAdapter<T = any> extends BaseHttpAdapter<T> {\n  constructor(config: AdapterConfig) {\n    super(config);\n\n    if (!config.endpoint) {\n      throw new Error('REST API endpoint is required');\n    }\n  }\n\n  /**\n   * Execute search query\n   */\n  search(query: SearchQuery): Observable<SearchResponse<T>> {\n    const url = `${this.config.endpoint}/search`;\n    const headers = this.createHeaders();\n\n    // Build request body\n    const body = this.buildSearchRequest(query);\n\n    // Execute request\n    return this.executeRequest(this.http.post<any>(url, body, { headers })).pipe(\n      map((response) => this.parseSearchResponse(response))\n    );\n  }\n\n  /**\n   * Get suggestions\n   */\n  override suggest(query: string, options?: SuggestOptions): Observable<Suggestion[]> {\n    const url = `${this.config.endpoint}/suggest`;\n    const headers = this.createHeaders();\n\n    const body = {\n      query,\n      max_suggestions: options?.maxSuggestions ?? 10,\n      fields: options?.fields,\n      fuzzy: options?.fuzzy ?? false,\n    };\n\n    return this.executeRequest(this.http.post<any>(url, body, { headers })).pipe(\n      map((response) => this.parseSuggestResponse(response))\n    );\n  }\n\n  /**\n   * Get document by ID\n   */\n  override getById(id: string): Observable<T | null> {\n    const url = `${this.config.endpoint}/document/${id}`;\n    const headers = this.createHeaders();\n\n    return this.executeRequest(this.http.get<any>(url, { headers })).pipe(\n      map((response) => response?.data ?? null)\n    );\n  }\n\n  /**\n   * Build search request body\n   * Override this method to customize the request format\n   */\n  protected buildSearchRequest(query: SearchQuery): any {\n    return {\n      query: query.query,\n      size: query.size ?? 10,\n      from: query.from ?? 0,\n      fields: query.fields,\n      sort: query.sort,\n      filters: query.filters?.map((f) => ({\n        field: f.field,\n        type: f.type,\n        value: f.value,\n        operator: f.operator,\n      })),\n    };\n  }\n\n  /**\n   * Parse search response\n   * Override this method to customize response parsing\n   */\n  protected parseSearchResponse(response: any): SearchResponse<T> {\n    return {\n      results: (response.results || []).map((item: any) => ({\n        id: item.id || item._id,\n        data: item.data || item,\n        score: item.score || item._score,\n        highlights: item.highlights || item.highlight,\n        metadata: item.metadata,\n      })),\n      total: response.total || response.hits?.total?.value || 0,\n      took: response.took,\n      aggregations: response.aggregations || response.aggs,\n      suggestions: response.suggestions,\n    };\n  }\n\n  /**\n   * Parse suggest response\n   */\n  protected parseSuggestResponse(response: any): Suggestion[] {\n    const suggestions = response.suggestions || response.results || [];\n    return suggestions.map((item: any) => ({\n      text: item.text || item.value || item,\n      highlighted: item.highlighted,\n      score: item.score,\n      metadata: item.metadata,\n    }));\n  }\n}\n","/**\n * Search utility functions\n */\n\nimport { SearchQuery, FilterConfig, SortConfig } from '../types/search-types';\n\n/**\n * Build a search query with defaults\n */\nexport function buildSearchQuery(query: string, options?: Partial<SearchQuery>): SearchQuery {\n  return {\n    query,\n    size: options?.size ?? 10,\n    from: options?.from ?? 0,\n    fields: options?.fields,\n    sort: options?.sort,\n    filters: options?.filters ?? [],\n  };\n}\n\n/**\n * Add filter to search query\n */\nexport function addFilter(query: SearchQuery, filter: FilterConfig): SearchQuery {\n  return {\n    ...query,\n    filters: [...(query.filters || []), filter],\n  };\n}\n\n/**\n * Remove filter from search query by field\n */\nexport function removeFilter(query: SearchQuery, field: string): SearchQuery {\n  return {\n    ...query,\n    filters: (query.filters || []).filter((f) => f.field !== field),\n  };\n}\n\n/**\n * Update filter in search query\n */\nexport function updateFilter(query: SearchQuery, field: string, value: any): SearchQuery {\n  return {\n    ...query,\n    filters: (query.filters || []).map((f) => (f.field === field ? { ...f, value } : f)),\n  };\n}\n\n/**\n * Clear all filters from search query\n */\nexport function clearFilters(query: SearchQuery): SearchQuery {\n  return {\n    ...query,\n    filters: [],\n  };\n}\n\n/**\n * Add or update sort in search query\n */\nexport function setSort(query: SearchQuery, sort: SortConfig[]): SearchQuery {\n  return {\n    ...query,\n    sort,\n  };\n}\n\n/**\n * Set pagination in search query\n */\nexport function setPagination(query: SearchQuery, page: number, pageSize: number): SearchQuery {\n  return {\n    ...query,\n    size: pageSize,\n    from: (page - 1) * pageSize,\n  };\n}\n\n/**\n * Check if query is empty\n */\nexport function isEmptyQuery(query: string): boolean {\n  return !query || query.trim().length === 0;\n}\n\n/**\n * Sanitize query string\n */\nexport function sanitizeQuery(query: string): string {\n  return query.trim().replace(/\\s+/g, ' ');\n}\n\n/**\n * Extract pagination info from query\n */\nexport function getPaginationInfo(query: SearchQuery): {\n  page: number;\n  pageSize: number;\n} {\n  const pageSize = query.size || 10;\n  const from = query.from || 0;\n  const page = Math.floor(from / pageSize) + 1;\n\n  return { page, pageSize };\n}\n\n/**\n * Calculate total pages\n */\nexport function getTotalPages(total: number, pageSize: number): number {\n  return Math.ceil(total / pageSize);\n}\n\n/**\n * Check if there's a next page\n */\nexport function hasNextPage(currentPage: number, total: number, pageSize: number): boolean {\n  return currentPage < getTotalPages(total, pageSize);\n}\n\n/**\n * Check if there's a previous page\n */\nexport function hasPrevPage(currentPage: number): boolean {\n  return currentPage > 1;\n}\n","/**\n * Debounce utility for search input\n * Zone-less compatible\n */\n\nimport { MonoTypeOperatorFunction, Observable, timer } from 'rxjs';\nimport { debounce, distinctUntilChanged } from 'rxjs/operators';\n\n/**\n * Debounce operator with configurable time\n */\nexport function debounceSearch<T>(dueTime: number): MonoTypeOperatorFunction<T> {\n  return (source: Observable<T>) =>\n    source.pipe(\n      distinctUntilChanged(),\n      debounce(() => timer(dueTime))\n    );\n}\n\n/**\n * Create a debounced function\n * Works without NgZone\n */\nexport function debounceFunction<T extends (...args: any[]) => any>(\n  func: T,\n  wait: number\n): (...args: Parameters<T>) => void {\n  let timeoutId: number | undefined;\n\n  return function (this: any, ...args: Parameters<T>) {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const context = this;\n\n    if (timeoutId !== undefined) {\n      clearTimeout(timeoutId);\n    }\n\n    timeoutId = window.setTimeout(() => {\n      func.apply(context, args);\n    }, wait);\n  };\n}\n\n/**\n * Throttle function\n * Works without NgZone\n */\nexport function throttleFunction<T extends (...args: any[]) => any>(\n  func: T,\n  wait: number\n): (...args: Parameters<T>) => void {\n  let timeoutId: number | undefined;\n  let lastRan: number | undefined;\n\n  return function (this: any, ...args: Parameters<T>) {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const context = this;\n\n    if (!lastRan) {\n      func.apply(context, args);\n      lastRan = Date.now();\n    } else {\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n\n      timeoutId = window.setTimeout(\n        () => {\n          if (Date.now() - lastRan! >= wait) {\n            func.apply(context, args);\n            lastRan = Date.now();\n          }\n        },\n        wait - (Date.now() - lastRan)\n      );\n    }\n  };\n}\n","/**\n * Keyboard navigation utilities\n * Zone-less compatible\n */\n\n/**\n * Keyboard keys enum\n */\nexport enum KeyboardKey {\n  ArrowUp = 'ArrowUp',\n  ArrowDown = 'ArrowDown',\n  ArrowLeft = 'ArrowLeft',\n  ArrowRight = 'ArrowRight',\n  Enter = 'Enter',\n  Escape = 'Escape',\n  Tab = 'Tab',\n  Space = ' ',\n  Home = 'Home',\n  End = 'End',\n  PageUp = 'PageUp',\n  PageDown = 'PageDown',\n}\n\n/**\n * Check if key is navigation key\n */\nexport function isNavigationKey(key: string): boolean {\n  return [\n    KeyboardKey.ArrowUp,\n    KeyboardKey.ArrowDown,\n    KeyboardKey.ArrowLeft,\n    KeyboardKey.ArrowRight,\n    KeyboardKey.Home,\n    KeyboardKey.End,\n    KeyboardKey.PageUp,\n    KeyboardKey.PageDown,\n  ].includes(key as KeyboardKey);\n}\n\n/**\n * Check if key is action key\n */\nexport function isActionKey(key: string): boolean {\n  return [KeyboardKey.Enter, KeyboardKey.Space].includes(key as KeyboardKey);\n}\n\n/**\n * Keyboard navigation handler for lists\n */\nexport class KeyboardNavigationHandler {\n  private currentIndex = -1;\n  private items: HTMLElement[] = [];\n\n  constructor(private container: HTMLElement) {}\n\n  /**\n   * Update items list\n   */\n  updateItems(selector: string): void {\n    this.items = Array.from(this.container.querySelectorAll<HTMLElement>(selector));\n  }\n\n  /**\n   * Handle keyboard event\n   */\n  handleKeyDown(event: KeyboardEvent): boolean {\n    const { key } = event;\n\n    switch (key) {\n      case KeyboardKey.ArrowDown:\n        event.preventDefault();\n        this.moveNext();\n        return true;\n\n      case KeyboardKey.ArrowUp:\n        event.preventDefault();\n        this.movePrevious();\n        return true;\n\n      case KeyboardKey.Home:\n        event.preventDefault();\n        this.moveFirst();\n        return true;\n\n      case KeyboardKey.End:\n        event.preventDefault();\n        this.moveLast();\n        return true;\n\n      case KeyboardKey.Enter:\n      case KeyboardKey.Space:\n        event.preventDefault();\n        this.selectCurrent();\n        return true;\n\n      case KeyboardKey.Escape:\n        event.preventDefault();\n        this.reset();\n        return true;\n\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * Move to next item\n   */\n  moveNext(): void {\n    if (this.items.length === 0) return;\n\n    this.currentIndex = (this.currentIndex + 1) % this.items.length;\n    this.focusCurrent();\n  }\n\n  /**\n   * Move to previous item\n   */\n  movePrevious(): void {\n    if (this.items.length === 0) return;\n\n    this.currentIndex = this.currentIndex <= 0 ? this.items.length - 1 : this.currentIndex - 1;\n    this.focusCurrent();\n  }\n\n  /**\n   * Move to first item\n   */\n  moveFirst(): void {\n    if (this.items.length === 0) return;\n\n    this.currentIndex = 0;\n    this.focusCurrent();\n  }\n\n  /**\n   * Move to last item\n   */\n  moveLast(): void {\n    if (this.items.length === 0) return;\n\n    this.currentIndex = this.items.length - 1;\n    this.focusCurrent();\n  }\n\n  /**\n   * Select current item\n   */\n  selectCurrent(): void {\n    if (this.currentIndex >= 0 && this.currentIndex < this.items.length) {\n      this.items[this.currentIndex].click();\n    }\n  }\n\n  /**\n   * Focus current item\n   */\n  private focusCurrent(): void {\n    if (this.currentIndex >= 0 && this.currentIndex < this.items.length) {\n      const item = this.items[this.currentIndex];\n      item.focus();\n      item.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n    }\n  }\n\n  /**\n   * Reset navigation\n   */\n  reset(): void {\n    this.currentIndex = -1;\n  }\n\n  /**\n   * Get current index\n   */\n  getCurrentIndex(): number {\n    return this.currentIndex;\n  }\n\n  /**\n   * Set current index\n   */\n  setCurrentIndex(index: number): void {\n    if (index >= 0 && index < this.items.length) {\n      this.currentIndex = index;\n      this.focusCurrent();\n    }\n  }\n}\n","/**\n * Highlight utility for search results\n */\n\n/**\n * Highlight configuration\n */\nexport interface HighlightOptions {\n  /** CSS class to apply to highlighted text */\n  className?: string;\n  /** Pre-tag for highlights */\n  preTag?: string;\n  /** Post-tag for highlights */\n  postTag?: string;\n  /** Case sensitive matching */\n  caseSensitive?: boolean;\n}\n\n/**\n * Highlight text matches in a string\n */\nexport function highlightText(text: string, query: string, options: HighlightOptions = {}): string {\n  if (!text || !query) {\n    return text;\n  }\n\n  const {\n    className = 'highlight',\n    preTag = `<mark class=\"${className}\">`,\n    postTag = '</mark>',\n    caseSensitive = false,\n  } = options;\n\n  // Escape special regex characters\n  const escapedQuery = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n  // Create regex\n  const flags = caseSensitive ? 'g' : 'gi';\n  const regex = new RegExp(escapedQuery, flags);\n\n  // Replace matches\n  return text.replace(regex, (match) => `${preTag}${match}${postTag}`);\n}\n\n/**\n * Highlight multiple terms in text\n */\nexport function highlightTerms(\n  text: string,\n  terms: string[],\n  options: HighlightOptions = {}\n): string {\n  if (!text || !terms || terms.length === 0) {\n    return text;\n  }\n\n  let result = text;\n  terms.forEach((term) => {\n    result = highlightText(result, term, options);\n  });\n\n  return result;\n}\n\n/**\n * Extract highlighted snippets from text\n */\nexport function extractSnippet(\n  text: string,\n  query: string,\n  maxLength: number = 200,\n  options: HighlightOptions = {}\n): string {\n  if (!text || !query) {\n    return text.substring(0, maxLength);\n  }\n\n  const lowerText = options.caseSensitive ? text : text.toLowerCase();\n  const lowerQuery = options.caseSensitive ? query : query.toLowerCase();\n  const index = lowerText.indexOf(lowerQuery);\n\n  if (index === -1) {\n    return text.substring(0, maxLength) + (text.length > maxLength ? '...' : '');\n  }\n\n  // Calculate snippet boundaries\n  const beforeLength = Math.floor((maxLength - query.length) / 2);\n  const start = Math.max(0, index - beforeLength);\n  const end = Math.min(text.length, start + maxLength);\n\n  // Extract snippet\n  let snippet = text.substring(start, end);\n\n  // Add ellipsis\n  if (start > 0) {\n    snippet = '...' + snippet;\n  }\n  if (end < text.length) {\n    snippet = snippet + '...';\n  }\n\n  // Highlight the query\n  return highlightText(snippet, query, options);\n}\n\n/**\n * Strip HTML tags from highlighted text\n */\nexport function stripHighlight(highlightedText: string): string {\n  return highlightedText.replace(/<\\/?mark[^>]*>/g, '');\n}\n\n/**\n * Get highlight boundaries\n */\nexport function getHighlightBoundaries(\n  text: string,\n  query: string,\n  caseSensitive: boolean = false\n): Array<{ start: number; end: number }> {\n  if (!text || !query) {\n    return [];\n  }\n\n  const boundaries: Array<{ start: number; end: number }> = [];\n  const searchText = caseSensitive ? text : text.toLowerCase();\n  const searchQuery = caseSensitive ? query : query.toLowerCase();\n\n  let index = 0;\n  while ((index = searchText.indexOf(searchQuery, index)) !== -1) {\n    boundaries.push({\n      start: index,\n      end: index + query.length,\n    });\n    index += query.length;\n  }\n\n  return boundaries;\n}\n","/**\n * Utility functions for facet operations\n */\n\nimport { FacetValue, FacetOption, FacetConfig } from '../types/facet-types';\n\n/**\n * Filter facet values by query string\n */\nexport function filterFacetValues(\n  values: FacetValue[] | FacetOption[],\n  query: string\n): (FacetValue | FacetOption)[] {\n  if (!query || query.trim() === '') {\n    return values;\n  }\n\n  const lowerQuery = query.toLowerCase().trim();\n  return values.filter((value) => {\n    const label = 'label' in value ? value.label : (value as FacetValue).key.toString();\n    return label.toLowerCase().includes(lowerQuery);\n  });\n}\n\n/**\n * Sort facet values\n */\nexport function sortFacetValues(\n  values: FacetValue[],\n  sort: 'count' | 'key' | 'custom' = 'count'\n): FacetValue[] {\n  const sorted = [...values];\n\n  switch (sort) {\n    case 'count':\n      return sorted.sort((a, b) => b.count - a.count);\n    case 'key':\n      return sorted.sort((a, b) => a.label.localeCompare(b.label));\n    case 'custom':\n      // No sorting, return as is\n      return sorted;\n    default:\n      return sorted;\n  }\n}\n\n/**\n * Toggle value selection in a Set\n */\nexport function toggleSelection(\n  selectedValues: Set<string | number>,\n  value: string | number,\n  multiSelect: boolean = true\n): Set<string | number> {\n  const newSet = new Set(selectedValues);\n\n  if (!multiSelect) {\n    // Single select - clear and add only this value\n    if (newSet.has(value)) {\n      newSet.clear();\n    } else {\n      newSet.clear();\n      newSet.add(value);\n    }\n  } else {\n    // Multi select - toggle value\n    if (newSet.has(value)) {\n      newSet.delete(value);\n    } else {\n      newSet.add(value);\n    }\n  }\n\n  return newSet;\n}\n\n/**\n * Check if value is selected\n */\nexport function isValueSelected(\n  selectedValues: Set<string | number>,\n  value: string | number\n): boolean {\n  return selectedValues.has(value);\n}\n\n/**\n * Get selected count for display\n */\nexport function getSelectedCountText(count: number): string {\n  if (count === 0) return '';\n  if (count === 1) return '(1 selected)';\n  return `(${count} selected)`;\n}\n\n/**\n * Format number value with formatter\n */\nexport function formatNumberValue(value: number, formatter?: (value: number) => string): string {\n  if (formatter) {\n    return formatter(value);\n  }\n  return value.toString();\n}\n\n/**\n * Validate number range\n */\nexport function validateNumberRange(value: number, min?: number, max?: number): boolean {\n  if (min !== undefined && value < min) return false;\n  if (max !== undefined && value > max) return false;\n  return true;\n}\n\n/**\n * Clamp number to range\n */\nexport function clampNumber(value: number, min?: number, max?: number): number {\n  let clamped = value;\n  if (min !== undefined) clamped = Math.max(min, clamped);\n  if (max !== undefined) clamped = Math.min(max, clamped);\n  return clamped;\n}\n\n/**\n * Parse number input value\n */\nexport function parseNumberInput(input: string, fallback: number = 0): number {\n  const parsed = parseFloat(input);\n  return isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Check if facet has selections\n */\nexport function hasSelections(selectedValues: Set<string | number>): boolean {\n  return selectedValues.size > 0;\n}\n\n/**\n * Get facet summary text\n */\nexport function getFacetSummary(config: FacetConfig, selectedCount: number): string {\n  if (selectedCount === 0) {\n    return config.label;\n  }\n  return `${config.label} ${getSelectedCountText(selectedCount)}`;\n}\n","/**\n * Utility functions and helpers\n */\n\nexport * from './search-utils';\nexport * from './debounce';\nexport * from './keyboard-navigation';\nexport * from './highlight';\nexport * from './facet-utils';\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Logger interface used throughout the search library.\n *\n * Applications can provide their own implementation to integrate with\n * existing logging infrastructure. The default implementation is a noop to\n * ensure the library stays silent in production environments unless the\n * consumer opts in.\n */\nexport interface SearchLogger {\n  debug: (...args: any[]) => void;\n  info: (...args: any[]) => void;\n  warn: (...args: any[]) => void;\n  error: (...args: any[]) => void;\n}\n\nfunction noop(): void {}\n\nexport const DEFAULT_SEARCH_LOGGER: SearchLogger = {\n  debug: noop,\n  info: noop,\n  warn: noop,\n  error: noop,\n};\n\nexport const NG_SEARCH_LOGGER = new InjectionToken<SearchLogger>('NG_SEARCH_LOGGER', {\n  providedIn: 'root',\n  factory: () => DEFAULT_SEARCH_LOGGER,\n});\n","/**\n * Search telemetry service\n *\n * Provides a lightweight indirection over consumer supplied telemetry clients.\n * The service is completely optional – if no clients are registered nothing is\n * recorded which keeps the library backend agnostic.\n */\n\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { SearchEvent, SearchEventType } from '../types/search-types';\nimport {\n  SearchTelemetryClient,\n  SearchTelemetryError,\n  SearchTelemetryEvent,\n  SearchTelemetryTiming,\n} from '../types/telemetry-types';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from './search-logger';\n\n/**\n * Injection token for providing custom telemetry clients. The token is marked\n * as `multi` so applications can wire up multiple observability backends.\n */\nexport const NG_SEARCH_TELEMETRY_CLIENTS = new InjectionToken<SearchTelemetryClient[]>(\n  'NG_SEARCH_TELEMETRY_CLIENTS',\n  {\n    providedIn: 'root',\n    factory: () => [],\n  }\n);\n\n@Injectable({ providedIn: 'root' })\nexport class SearchTelemetryService {\n  private readonly clients = inject(NG_SEARCH_TELEMETRY_CLIENTS);\n  private readonly logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n\n  /**\n   * Emit a telemetry event. Payloads are sanitised before being passed to\n   * clients to avoid leaking sensitive data by default.\n   */\n  recordEvent(event: SearchEvent, context?: Record<string, any>): void {\n    if (!this.clients.length) {\n      return;\n    }\n\n    const telemetryEvent: SearchTelemetryEvent = {\n      ...event,\n      category: this.resolveCategory(event.type),\n      context,\n    };\n\n    for (const client of this.clients) {\n      try {\n        client.trackEvent(telemetryEvent);\n      } catch (error) {\n        this.logger.error('[SearchTelemetry] trackEvent failed', error);\n      }\n    }\n  }\n\n  /**\n   * Emit a duration measurement.\n   */\n  recordTiming(timing: SearchTelemetryTiming): void {\n    if (!this.clients.length) {\n      return;\n    }\n\n    for (const client of this.clients) {\n      if (!client.trackTiming) {\n        continue;\n      }\n\n      try {\n        client.trackTiming(timing);\n      } catch (error) {\n        this.logger.error('[SearchTelemetry] trackTiming failed', error);\n      }\n    }\n  }\n\n  /**\n   * Emit an error notification.\n   */\n  recordError(error: SearchTelemetryError): void {\n    if (!this.clients.length) {\n      return;\n    }\n\n    for (const client of this.clients) {\n      if (!client.trackError) {\n        continue;\n      }\n\n      try {\n        client.trackError(error);\n      } catch (err) {\n        this.logger.error('[SearchTelemetry] trackError failed', err);\n      }\n    }\n  }\n\n  private resolveCategory(type: SearchEventType): SearchTelemetryEvent['category'] {\n    switch (type) {\n      case 'search_started':\n      case 'search_completed':\n      case 'search_failed':\n        return 'search';\n      case 'suggestions_requested':\n      case 'suggestions_received':\n      case 'suggestions_cleared':\n      case 'suggestions_failed':\n      case 'suggestion_selected':\n        return 'suggestions';\n      case 'filter_added':\n      case 'filter_removed':\n      case 'filter_cleared':\n        return 'facets';\n      case 'result_clicked':\n        return 'results';\n      case 'page_changed':\n        return 'pagination';\n      default:\n        return 'custom';\n    }\n  }\n}\n","/**\n * Search State Service\n * Central state management using Angular signals\n * Zone-less compatible, SSR-safe\n */\n\nimport { Injectable, signal, computed, Signal, WritableSignal, inject } from '@angular/core';\nimport {\n  FilterConfig,\n  SortConfig,\n  PaginationConfig,\n  AggregationResult,\n  Suggestion,\n  SearchEvent,\n  SearchEventType,\n  SearchQuery,\n  SearchResult,\n} from '../types/search-types';\nimport { SearchConfigModel } from '../models/search-config.model';\nimport { SearchTelemetryService } from './search-telemetry.service';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from './search-logger';\n\nconst DEFAULT_EVENT_HISTORY_LIMIT = 100;\n\n/**\n * Search state service\n * Manages all search-related state using signals\n */\n@Injectable()\nexport class SearchStateService<T = any> {\n  private readonly telemetry = inject(SearchTelemetryService, { optional: true });\n  private readonly logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n  // Writable signals for mutable state\n  private readonly _query = signal<string>('');\n  private readonly _results = signal<SearchResult<T>[]>([]);\n  private readonly _loading = signal<boolean>(false);\n  private readonly _loadingSuggestions = signal<boolean>(false);\n  private readonly _error = signal<Error | null>(null);\n  private readonly _total = signal<number>(0);\n  private readonly _filters = signal<Map<string, FilterConfig>>(new Map());\n  private readonly _sort = signal<SortConfig[]>([]);\n  private readonly _pagination = signal<PaginationConfig>({\n    page: 1,\n    pageSize: 10,\n    total: 0,\n  });\n  private readonly _aggregations = signal<Record<string, AggregationResult>>({});\n  private readonly _suggestions = signal<Suggestion[]>([]);\n  private readonly _events = signal<SearchEvent[]>([]);\n  private readonly _eventHistoryLimit = signal<number | null>(DEFAULT_EVENT_HISTORY_LIMIT);\n\n  // Readonly public signals\n  readonly query: Signal<string> = this._query.asReadonly();\n  readonly results: Signal<SearchResult<T>[]> = this._results.asReadonly();\n  readonly loading: Signal<boolean> = this._loading.asReadonly();\n  readonly loadingSuggestions: Signal<boolean> = this._loadingSuggestions.asReadonly();\n  readonly error: Signal<Error | null> = this._error.asReadonly();\n  readonly total: Signal<number> = this._total.asReadonly();\n  readonly filters: Signal<Map<string, FilterConfig>> = this._filters.asReadonly();\n  readonly sort: Signal<SortConfig[]> = this._sort.asReadonly();\n  readonly pagination: Signal<PaginationConfig> = this._pagination.asReadonly();\n  readonly aggregations: Signal<Record<string, AggregationResult>> =\n    this._aggregations.asReadonly();\n  readonly suggestions: Signal<Suggestion[]> = this._suggestions.asReadonly();\n  readonly events: Signal<SearchEvent[]> = this._events.asReadonly();\n\n  // Computed signals for derived state\n  readonly hasQuery = computed(() => this._query().trim().length > 0);\n  readonly hasResults = computed(() => this._results().length > 0);\n  readonly hasError = computed(() => this._error() !== null);\n  readonly hasFilters = computed(() => this._filters().size > 0);\n  readonly hasSuggestions = computed(() => this._suggestions().length > 0);\n  readonly isEmpty = computed(() => !this.loading() && !this.hasResults() && this.hasQuery());\n  readonly isInitial = computed(() => !this.loading() && !this.hasQuery() && !this.hasResults());\n\n  // Computed current page info\n  readonly currentPage = computed(() => this._pagination().page);\n  readonly pageSize = computed(() => this._pagination().pageSize);\n  readonly totalPages = computed(() => {\n    const { pageSize, total } = this._pagination();\n    return Math.ceil(total / pageSize);\n  });\n  readonly hasNextPage = computed(() => this.currentPage() < this.totalPages());\n  readonly hasPrevPage = computed(() => this.currentPage() > 1);\n\n  // Computed search query object\n  readonly searchQuery = computed<SearchQuery>(() => ({\n    query: this._query(),\n    size: this._pagination().pageSize,\n    from: (this._pagination().page - 1) * this._pagination().pageSize,\n    sort: this._sort(),\n    filters: Array.from(this._filters().values()),\n  }));\n\n  /**\n   * Set search query\n   */\n  setQuery(query: string): void {\n    this._query.set(query);\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n    this.emitEvent('query_changed', { query });\n  }\n\n  /**\n   * Set results\n   */\n  setResults(results: SearchResult<T>[], total: number): void {\n    this._results.set(results);\n    this._total.set(total);\n    this._pagination.update((p) => {\n      if (p.total === total) {\n        return p;\n      }\n      return { ...p, total };\n    });\n  }\n\n  /**\n   * Set loading state\n   */\n  setLoading(loading: boolean): void {\n    this._loading.set(loading);\n    if (loading) {\n      this._error.set(null);\n    }\n  }\n\n  /**\n   * Set suggestions loading state\n   */\n  setLoadingSuggestions(loading: boolean): void {\n    this._loadingSuggestions.set(loading);\n  }\n\n  /**\n   * Set error state\n   */\n  setError(error: Error | null): void {\n    this._error.set(error);\n    if (error) {\n      this._loading.set(false);\n    }\n  }\n\n  /**\n   * Add or update filter\n   */\n  addFilter(filter: FilterConfig): void {\n    this._filters.update((filters) => {\n      const newFilters = new Map(filters);\n      newFilters.set(filter.field, filter);\n      return newFilters;\n    });\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n    this.emitEvent('filter_added', { filter });\n  }\n\n  /**\n   * Remove filter by field\n   */\n  removeFilter(field: string): void {\n    this._filters.update((filters) => {\n      const newFilters = new Map(filters);\n      newFilters.delete(field);\n      return newFilters;\n    });\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n    this.emitEvent('filter_removed', { field });\n  }\n\n  /**\n   * Clear all filters\n   */\n  clearFilters(): void {\n    this._filters.set(new Map());\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n    this.emitEvent('filter_cleared');\n  }\n\n  /**\n   * Update filter value\n   */\n  updateFilter(field: string, value: any): void {\n    this._filters.update((filters) => {\n      const newFilters = new Map(filters);\n      const existingFilter = newFilters.get(field);\n      if (existingFilter) {\n        newFilters.set(field, { ...existingFilter, value });\n      }\n      return newFilters;\n    });\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n  }\n\n  /**\n   * Set sort configuration\n   */\n  setSort(sort: SortConfig[]): void {\n    this._sort.set(sort);\n    this._pagination.update((p) => ({ ...p, page: 1 }));\n  }\n\n  /**\n   * Set pagination\n   */\n  setPagination(page: number, pageSize?: number): void {\n    this._pagination.update((p) => ({\n      ...p,\n      page,\n      pageSize: pageSize ?? p.pageSize,\n    }));\n    this.emitEvent('page_changed', { page, pageSize });\n  }\n\n  /**\n   * Go to next page\n   */\n  nextPage(): void {\n    if (this.hasNextPage()) {\n      this.setPagination(this.currentPage() + 1);\n    }\n  }\n\n  /**\n   * Go to previous page\n   */\n  prevPage(): void {\n    if (this.hasPrevPage()) {\n      this.setPagination(this.currentPage() - 1);\n    }\n  }\n\n  /**\n   * Set aggregations\n   */\n  setAggregations(aggregations: Record<string, AggregationResult>): void {\n    this._aggregations.set(aggregations);\n  }\n\n  /**\n   * Set suggestions\n   */\n  setSuggestions(suggestions: Suggestion[]): void {\n    this._suggestions.set(suggestions);\n    this.emitEvent('suggestions_received', { count: suggestions.length });\n  }\n\n  /**\n   * Clear suggestions\n   */\n  clearSuggestions(): void {\n    this._suggestions.set([]);\n    this.emitEvent('suggestions_cleared');\n  }\n\n  /**\n   * Reset all state\n   */\n  reset(): void {\n    this._query.set('');\n    this._results.set([]);\n    this._loading.set(false);\n    this._error.set(null);\n    this._total.set(0);\n    this._filters.set(new Map());\n    this._sort.set([]);\n    this._pagination.set({ page: 1, pageSize: 10, total: 0 });\n    this._aggregations.set({});\n    this._suggestions.set([]);\n  }\n\n  /**\n   * Get state snapshot (useful for SSR)\n   */\n  getSnapshot() {\n    return {\n      query: this._query(),\n      results: this._results(),\n      loading: this._loading(),\n      error: this._error(),\n      total: this._total(),\n      filters: Array.from(this._filters().entries()),\n      sort: this._sort(),\n      pagination: this._pagination(),\n      aggregations: this._aggregations(),\n      suggestions: this._suggestions(),\n    };\n  }\n\n  /**\n   * Restore state from snapshot (useful for SSR hydration)\n   */\n  restoreSnapshot(snapshot: ReturnType<typeof this.getSnapshot>): void {\n    this._query.set(snapshot.query);\n    this._results.set(snapshot.results);\n    this._loading.set(snapshot.loading);\n    this._error.set(snapshot.error);\n    this._total.set(snapshot.total);\n    this._filters.set(new Map(snapshot.filters));\n    this._sort.set(snapshot.sort);\n    this._pagination.set(snapshot.pagination);\n    this._aggregations.set(snapshot.aggregations);\n    this._suggestions.set(snapshot.suggestions);\n  }\n\n  /**\n   * Emit event for tracking\n   */\n  markSearchStarted(query: SearchQuery): void {\n    this.emitEvent('search_started', { query });\n  }\n\n  markSearchCompleted(details: { query: SearchQuery; total: number; took?: number }): void {\n    this.emitEvent('search_completed', details);\n  }\n\n  markSearchFailed(error: Error, query: SearchQuery): void {\n    this.emitEvent('search_failed', { message: error.message, query });\n  }\n\n  markSuggestionsRequested(query: string): void {\n    this.emitEvent('suggestions_requested', { query });\n  }\n\n  markSuggestionsFailed(error: Error, query: string): void {\n    this.emitEvent('suggestions_failed', { message: error.message, query });\n  }\n\n  markSuggestionSelected(\n    suggestion: Suggestion,\n    metadata?: { index?: number; origin?: string }\n  ): void {\n    this.emitEvent('suggestion_selected', { suggestion, ...metadata });\n  }\n\n  markResultClicked(result: SearchResult<T>, metadata?: { index?: number; origin?: string }): void {\n    this.emitEvent('result_clicked', { result, ...metadata });\n  }\n\n  private emitEvent(type: SearchEventType, payload?: any): void {\n    const event: SearchEvent = {\n      type,\n      timestamp: Date.now(),\n      payload,\n    };\n    const limit = this._eventHistoryLimit();\n    this._events.update((events) => {\n      if (limit === null) {\n        return [...events, event];\n      }\n\n      if (limit <= 0) {\n        return [];\n      }\n\n      const next = [...events, event];\n      return next.length > limit ? next.slice(-limit) : next;\n    });\n\n    const sanitized = this.sanitizeForTelemetry(type, payload);\n    this.telemetry?.recordEvent(event, sanitized);\n  }\n\n  private sanitizeForTelemetry(\n    type: SearchEventType,\n    payload?: any\n  ): Record<string, any> | undefined {\n    if (!payload) {\n      return undefined;\n    }\n\n    switch (type) {\n      case 'search_started':\n        return {\n          query: payload.query?.query ?? payload.query ?? '',\n          filters: payload.query?.filters?.length ?? 0,\n        };\n      case 'search_completed':\n        return {\n          query: payload.query?.query ?? payload.query ?? '',\n          total: payload.total,\n          took: payload.took,\n        };\n      case 'search_failed':\n        return {\n          query: payload.query?.query ?? payload.query ?? '',\n          message: payload.message,\n        };\n      case 'suggestions_requested':\n        return { query: payload.query };\n      case 'suggestions_received':\n        return { count: payload.count };\n      case 'suggestions_cleared':\n        return {};\n      case 'suggestions_failed':\n        return { query: payload.query, message: payload.message };\n      case 'suggestion_selected':\n        return {\n          suggestion: payload.suggestion?.text,\n          id: payload.suggestion?.id,\n          index: payload.index,\n          origin: payload.origin,\n        };\n      case 'result_clicked':\n        return {\n          id: payload.result?.id,\n          score: payload.result?.score,\n          index: payload.index,\n          origin: payload.origin,\n        };\n      case 'filter_added':\n        return {\n          field: payload.filter?.field,\n          type: payload.filter?.type,\n        };\n      case 'filter_removed':\n        return { field: payload.field };\n      case 'page_changed':\n        return { page: payload.page, pageSize: payload.pageSize };\n      default:\n        return undefined;\n    }\n  }\n\n  /**\n   * Get recent events\n   */\n  getRecentEvents(count: number = 10): SearchEvent[] {\n    const allEvents = this._events();\n    return allEvents.slice(-count);\n  }\n\n  /**\n   * Clear events\n   */\n  clearEvents(): void {\n    this._events.set([]);\n  }\n\n  /**\n   * Configure how many events are kept in memory.\n   * Pass `null` to keep all events, `0` to disable event history, or omit the value to reset to the default.\n   */\n  setEventHistoryLimit(limit?: number | null): void {\n    if (limit === null) {\n      this._eventHistoryLimit.set(null);\n      return;\n    }\n\n    if (limit === undefined) {\n      this._eventHistoryLimit.set(DEFAULT_EVENT_HISTORY_LIMIT);\n      this.trimEventHistory(DEFAULT_EVENT_HISTORY_LIMIT);\n      return;\n    }\n\n    const normalized = Number.isFinite(limit)\n      ? Math.max(0, Math.floor(limit))\n      : DEFAULT_EVENT_HISTORY_LIMIT;\n    this._eventHistoryLimit.set(normalized);\n    this.trimEventHistory(normalized);\n  }\n\n  private trimEventHistory(limit: number | null): void {\n    if (limit === null) {\n      return;\n    }\n\n    if (limit <= 0) {\n      this._events.set([]);\n      return;\n    }\n\n    const current = this._events();\n    if (current.length > limit) {\n      this._events.set(current.slice(-limit));\n    }\n  }\n}\n","/**\n * Search Coordinator Service\n * Coordinates search execution with adapters\n * Handles debouncing, cancellation, and error handling\n * Zone-less compatible\n */\n\nimport { Injectable, signal, effect, Signal, DestroyRef, inject } from '@angular/core';\nimport { Subject, Subscription, timer, switchMap, catchError, of, finalize, map } from 'rxjs';\nimport { SearchAdapter } from '../types/adapter-types';\nimport { SearchQuery, SearchResponse } from '../types/search-types';\nimport { SearchStateService } from './search-state.service';\nimport { SearchConfigModel } from '../models/search-config.model';\nimport { SearchTelemetryService } from './search-telemetry.service';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from './search-logger';\n\n/**\n * Search coordinator service\n * Orchestrates search execution between state and adapter\n */\n@Injectable()\nexport class SearchCoordinatorService<T = any> {\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly searchState = inject(SearchStateService<T>);\n  private readonly telemetry = inject(SearchTelemetryService, { optional: true });\n  private readonly logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n\n  // Search trigger subjects\n  private readonly searchTrigger$ = new Subject<SearchQuery>();\n  private readonly suggestTrigger$ = new Subject<string>();\n\n  // Subscriptions\n  private searchSubscription?: Subscription;\n  private suggestSubscription?: Subscription;\n\n  // Configuration\n  private readonly _config = signal<SearchConfigModel>(new SearchConfigModel());\n  readonly config: Signal<SearchConfigModel> = this._config.asReadonly();\n\n  // Adapter\n  private _adapter?: SearchAdapter<T>;\n\n  private currentSearchMeta: { query: SearchQuery; startedAt: number } | null = null;\n  private currentSuggestMeta: { query: string; startedAt: number } | null = null;\n  private lastAutoSearchSignature: string | null = null;\n\n  constructor() {\n    this.setupAutoSearch();\n    // Note: setupAutoSuggest() is called in setAdapter() after adapter is set\n    this.setupCleanup();\n    this.setupConfigSync();\n  }\n\n  /**\n   * Set search adapter\n   */\n  setAdapter(adapter: SearchAdapter<T>): void {\n    this._adapter = adapter;\n\n    // Setup auto-suggest after adapter is set\n    this.suggestSubscription?.unsubscribe();\n    this.setupAutoSuggest();\n  }\n\n  /**\n   * Set configuration\n   */\n  setConfig(config: Partial<SearchConfigModel>): void {\n    this._config.update((current) => current.merge(config));\n  }\n\n  /**\n   * Execute search manually\n   */\n  search(query?: SearchQuery): void {\n    if (!this._adapter) {\n      this.logger.error('[SearchCoordinator] Search adapter is not configured');\n      return;\n    }\n\n    const searchQuery = query ?? this.searchState.searchQuery();\n\n    // Validate minimum query length only if query is not empty\n    if (\n      searchQuery.query.trim().length > 0 &&\n      searchQuery.query.trim().length < this._config().minQueryLength\n    ) {\n      return;\n    }\n\n    this.searchTrigger$.next(searchQuery);\n  }\n\n  /**\n   * Request suggestions\n   */\n  suggest(query: string): void {\n    if (!this._adapter?.suggest) {\n      return;\n    }\n\n    if (query.trim().length < this._config().minQueryLength) {\n      this.searchState.clearSuggestions();\n      return;\n    }\n\n    this.suggestTrigger$.next(query);\n  }\n\n  /**\n   * Cancel ongoing search\n   */\n  cancel(): void {\n    this.searchSubscription?.unsubscribe();\n    this.searchState.setLoading(false);\n  }\n\n  /**\n   * Setup automatic search on query changes\n   */\n  private setupAutoSearch(): void {\n    this.searchSubscription = this.searchTrigger$\n      .pipe(\n        switchMap((query) => {\n          this.currentSearchMeta = { query, startedAt: Date.now() };\n          this.searchState.markSearchStarted(query);\n          this.searchState.setLoading(true);\n\n          return timer(this._config().debounceTime).pipe(\n            switchMap(() => {\n              if (!this._adapter) {\n                return of(null);\n              }\n              const startedAt = this.currentSearchMeta?.startedAt ?? Date.now();\n              return this._adapter.search(query).pipe(\n                map((response) => ({ response, query, startedAt })),\n                catchError((error) => {\n                  this.searchState.setError(error);\n                  this.searchState.markSearchFailed(error, query);\n                  this.telemetry?.recordError({\n                    error,\n                    source: 'search',\n                    context: {\n                      query: query.query,\n                      filters: query.filters?.length ?? 0,\n                    },\n                  });\n                  return of({ response: null, query, startedAt });\n                }),\n                finalize(() => {\n                  this.searchState.setLoading(false);\n                  this.currentSearchMeta = null;\n                })\n              );\n            })\n          );\n        })\n      )\n      .subscribe((payload) => {\n        if (!payload?.response) {\n          return;\n        }\n\n        const { response, query, startedAt } = payload;\n        this.handleSearchResponse(response);\n\n        const duration = response.took ?? Date.now() - startedAt;\n        this.searchState.markSearchCompleted({ query, total: response.total, took: duration });\n\n        if (duration !== undefined) {\n          this.telemetry?.recordTiming({\n            name: 'search',\n            duration,\n            metadata: {\n              query: query.query,\n              total: response.total,\n              filters: query.filters?.length ?? 0,\n            },\n          });\n        }\n      });\n\n    effect(() => {\n      const query = this.searchState.searchQuery();\n\n      if (!this._config().autoSearch) {\n        this.lastAutoSearchSignature = null;\n        return;\n      }\n\n      const signature = this.serializeQuery(query);\n      const hasQuery = query.query.trim().length >= this._config().minQueryLength;\n      const hasFilters = (query.filters?.length ?? 0) > 0;\n\n      if (!hasQuery && !hasFilters) {\n        this.lastAutoSearchSignature = null;\n        return;\n      }\n\n      if (signature === this.lastAutoSearchSignature) {\n        return;\n      }\n\n      this.lastAutoSearchSignature = signature;\n      this.search(query);\n    });\n  }\n\n  /**\n   * Setup automatic suggestions on query changes\n   */\n  private setupAutoSuggest(): void {\n    if (!this._adapter?.suggest) {\n      return;\n    }\n\n    this.suggestSubscription = this.suggestTrigger$\n      .pipe(\n        switchMap((query) => {\n          this.currentSuggestMeta = { query, startedAt: Date.now() };\n          this.searchState.markSuggestionsRequested(query);\n          this.searchState.setLoadingSuggestions(true);\n\n          return timer(this._config().debounceTime).pipe(\n            switchMap(() => {\n              if (!this._adapter?.suggest) {\n                this.searchState.setLoadingSuggestions(false);\n                this.currentSuggestMeta = null;\n                return of({ suggestions: [], query, startedAt: Date.now() });\n              }\n\n              const startedAt = this.currentSuggestMeta?.startedAt ?? Date.now();\n              return this._adapter\n                .suggest(query, {\n                  maxSuggestions: 10,\n                  fuzzy: true,\n                })\n                .pipe(\n                  map((suggestions) => ({ suggestions, query, startedAt })),\n                  catchError((error) => {\n                    this.logger.error('[SearchCoordinator] Suggestion error:', error);\n                    this.searchState.markSuggestionsFailed(error, query);\n                    this.telemetry?.recordError({\n                      error,\n                      source: 'suggestions',\n                      context: { query },\n                    });\n                    return of({ suggestions: [], query, startedAt });\n                  }),\n                  finalize(() => {\n                    this.searchState.setLoadingSuggestions(false);\n                    this.currentSuggestMeta = null;\n                  })\n                );\n            })\n          );\n        })\n      )\n      .subscribe((payload) => {\n        if (!payload) {\n          return;\n        }\n\n        const { suggestions, query, startedAt } = payload;\n        this.searchState.setSuggestions(suggestions);\n\n        if (suggestions.length > 0) {\n          const duration = Date.now() - startedAt;\n          this.telemetry?.recordTiming({\n            name: 'suggestions',\n            duration,\n            metadata: {\n              query,\n              count: suggestions.length,\n            },\n          });\n        }\n      });\n  }\n\n  /**\n   * Handle search response\n   */\n  private handleSearchResponse(response: SearchResponse<T>): void {\n    this.searchState.setResults(response.results, response.total);\n\n    if (response.aggregations) {\n      this.searchState.setAggregations(response.aggregations);\n    }\n\n    if (response.suggestions && response.suggestions.length > 0) {\n      this.searchState.setSuggestions(response.suggestions);\n    }\n  }\n\n  /**\n   * Setup cleanup on destroy\n   */\n  private setupCleanup(): void {\n    this.destroyRef.onDestroy(() => {\n      this.searchSubscription?.unsubscribe();\n      this.suggestSubscription?.unsubscribe();\n      this.searchTrigger$.complete();\n      this.suggestTrigger$.complete();\n\n      // Call adapter cleanup if available\n      this._adapter?.destroy?.();\n    });\n  }\n\n  private serializeQuery(query: SearchQuery): string {\n    const normalizedFilters = query.filters?.map((filter) => ({\n      field: filter.field,\n      operator: filter.operator,\n      type: filter.type,\n      value: filter.value,\n    }));\n\n    return JSON.stringify({\n      query: query.query,\n      from: query.from,\n      size: query.size,\n      sort: query.sort,\n      filters: normalizedFilters,\n    });\n  }\n\n  private setupConfigSync(): void {\n    effect(() => {\n      const config = this._config();\n      if (config.eventHistoryLimit !== undefined) {\n        this.searchState.setEventHistoryLimit(config.eventHistoryLimit);\n      } else {\n        this.searchState.setEventHistoryLimit();\n      }\n    });\n  }\n}\n","/**\n * Text Facet Component\n * Displays checkbox or radio list for text values\n * Zone-less compatible, SSR-safe\n */\n\nimport { Component, ChangeDetectionStrategy, input, output, signal, computed } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { FacetPlugin, FacetValue, FacetOption, TextFacetConfig } from '../../../types/facet-types';\nimport { toggleSelection, filterFacetValues, hasSelections } from '../../../utils/facet-utils';\n\n@Component({\n  selector: 'ngs-text-facet',\n  standalone: true,\n  imports: [FormsModule],\n  styleUrls: [\n    '../facet-base.component.css',\n    './text-facet.component.css',\n  ],\n  template: `\n    <div class=\"ngs-facet ngs-text-facet\">\n      <div class=\"ngs-facet-header\">\n        <h4 class=\"ngs-facet-title\">{{ config().label }}</h4>\n        @if (hasSelections()) {\n          <button\n            type=\"button\"\n            class=\"ngs-facet-clear\"\n            (click)=\"clearAll()\"\n            aria-label=\"Clear selections\"\n          >\n            Clear\n          </button>\n        }\n      </div>\n\n      @if (isSearchable()) {\n        <div class=\"ngs-facet-search\">\n          <input\n            type=\"text\"\n            class=\"ngs-facet-search-input\"\n            placeholder=\"Search...\"\n            [(ngModel)]=\"searchQuery\"\n            (ngModelChange)=\"onSearchChange($event)\"\n            aria-label=\"Search facet options\"\n          />\n        </div>\n      }\n\n      <div class=\"ngs-facet-values\" [attr.role]=\"isMultiSelect() ? 'group' : 'radiogroup'\">\n        @for (value of filteredValues(); track value.key) {\n          <label class=\"ngs-facet-value\" [class.ngs-facet-value-disabled]=\"value.disabled\">\n            <input\n              [type]=\"isMultiSelect() ? 'checkbox' : 'radio'\"\n              [name]=\"config().id\"\n              [value]=\"value.key\"\n              [checked]=\"isSelected(value.key)\"\n              [disabled]=\"value.disabled\"\n              (change)=\"toggleValue(value.key)\"\n              [attr.aria-label]=\"value.label\"\n            />\n            <span class=\"ngs-facet-value-label\">{{ value.label }}</span>\n            @if (value.count !== undefined && value.count > 0) {\n              <span class=\"ngs-facet-value-count\">({{ value.count }})</span>\n            }\n          </label>\n        }\n\n        @if (filteredValues().length === 0) {\n          <div class=\"ngs-facet-empty\">No options found</div>\n        }\n      </div>\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextFacetComponent implements FacetPlugin {\n  // Inputs\n  readonly config = input.required<TextFacetConfig>();\n  readonly values = input<FacetValue[] | FacetOption[]>([]);\n  readonly selectedValues = input<Set<string | number>>(new Set());\n\n  // Outputs\n  readonly selectionChange = output<Set<string | number>>();\n  readonly onSelectionChange = (values: Set<string | number>) => {\n    this.selectionChange.emit(values);\n  };\n\n  // Internal state\n  readonly searchQuery = signal('');\n  readonly filteredValues = computed(() => {\n    const query = this.searchQuery();\n    const vals = this.values() as FacetValue[];\n    return filterFacetValues(vals, query) as FacetValue[];\n  });\n\n  // Computed properties\n  readonly isMultiSelect = computed(() => this.config().multiSelect ?? true);\n  readonly isSearchable = computed(() => this.config().searchable ?? false);\n  readonly hasSelections = computed(() => hasSelections(this.selectedValues()));\n\n  // Methods\n  toggleValue(value: string | number): void {\n    const newSelection = toggleSelection(this.selectedValues(), value, this.isMultiSelect());\n    this.onSelectionChange(newSelection);\n  }\n\n  isSelected(value: string | number): boolean {\n    return this.selectedValues().has(value);\n  }\n\n  clearAll(): void {\n    this.onSelectionChange(new Set());\n  }\n\n  onSearchChange(query: string): void {\n    this.searchQuery.set(query);\n  }\n}\n","/**\n * Text Typeahead Facet Component\n * Searchable text input with autocomplete suggestions\n * Zone-less compatible, SSR-safe\n */\n\nimport {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  signal,\n  computed,\n  effect,\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, switchMap, catchError, of } from 'rxjs';\nimport { FacetPlugin, FacetOption, TextTypeaheadFacetConfig } from '../../../types/facet-types';\nimport { toggleSelection, hasSelections } from '../../../utils/facet-utils';\n\n@Component({\n  selector: 'ngs-text-typeahead-facet',\n  standalone: true,\n  imports: [FormsModule],\n  styleUrls: [\n    '../facet-base.component.css',\n    './text-typeahead-facet.component.css',\n  ],\n  template: `\n    <div class=\"ngs-facet ngs-typeahead-facet\">\n      <div class=\"ngs-facet-header\">\n        <h4 class=\"ngs-facet-title\">{{ config().label }}</h4>\n        @if (hasActiveSelections()) {\n          <button\n            type=\"button\"\n            class=\"ngs-facet-clear\"\n            (click)=\"clearAll()\"\n            aria-label=\"Clear selections\"\n          >\n            Clear\n          </button>\n        }\n      </div>\n\n      <div class=\"ngs-typeahead-container\">\n        <input\n          type=\"text\"\n          class=\"ngs-typeahead-input\"\n          [placeholder]=\"'Search ' + config().label.toLowerCase() + '...'\"\n          [(ngModel)]=\"searchQuery\"\n          (focus)=\"onFocus()\"\n          (blur)=\"onBlur()\"\n          [attr.aria-label]=\"'Search ' + config().label\"\n          [attr.aria-expanded]=\"showDropdown()\"\n          [attr.aria-controls]=\"dropdownId()\"\n        />\n\n        @if (showDropdown()) {\n          <div class=\"ngs-typeahead-dropdown\" [id]=\"dropdownId()\" role=\"listbox\">\n            @if (loading()) {\n              <div class=\"ngs-typeahead-loading\">Loading...</div>\n            } @else if (filteredOptions().length > 0) {\n              @for (option of filteredOptions(); track option.value) {\n                <div\n                  class=\"ngs-typeahead-option\"\n                  [class.ngs-typeahead-option-selected]=\"isSelected(option.value)\"\n                  (mousedown)=\"selectOption(option.value)\"\n                  role=\"option\"\n                  [attr.aria-selected]=\"isSelected(option.value)\"\n                >\n                  <span class=\"ngs-typeahead-option-label\">{{ option.label }}</span>\n                  @if (option.count !== undefined && option.count > 0) {\n                    <span class=\"ngs-typeahead-option-count\">({{ option.count }})</span>\n                  }\n                </div>\n              }\n            } @else {\n              <div class=\"ngs-typeahead-empty\">No options found</div>\n            }\n          </div>\n        }\n      </div>\n\n      @if (selectedOptions().length > 0) {\n        <div class=\"ngs-selected-tags\">\n          @for (option of selectedOptions(); track option.value) {\n            <span class=\"ngs-selected-tag\">\n              {{ option.label }}\n              <button\n                type=\"button\"\n                class=\"ngs-tag-remove\"\n                (click)=\"removeSelection(option.value)\"\n                [attr.aria-label]=\"'Remove ' + option.label\"\n              >\n                ×\n              </button>\n            </span>\n          }\n        </div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextTypeaheadFacetComponent implements FacetPlugin {\n  // Inputs\n  readonly config = input.required<TextTypeaheadFacetConfig>();\n  readonly values = input<FacetOption[]>([]);\n  readonly selectedValues = input<Set<string | number>>(new Set());\n\n  // Outputs\n  readonly selectionChange = output<Set<string | number>>();\n  readonly onSelectionChange = (values: Set<string | number>) => {\n    this.selectionChange.emit(values);\n  };\n\n  // Internal state\n  readonly searchQuery = signal('');\n  readonly loading = signal(false);\n  readonly focused = signal(false);\n  readonly availableOptions = signal<FacetOption[]>([]);\n\n  // Computed\n  readonly dropdownId = computed(() => `typeahead-${this.config().id}`);\n  readonly isMultiSelect = computed(() => this.config().multiSelect ?? false);\n  readonly minQueryLength = computed(() => this.config().minQueryLength ?? 1);\n  readonly hasActiveSelections = computed(() => hasSelections(this.selectedValues()));\n\n  readonly showDropdown = computed(\n    () => this.focused() && this.searchQuery().length >= this.minQueryLength()\n  );\n\n  readonly filteredOptions = computed(() => {\n    const options = this.availableOptions().length > 0 ? this.availableOptions() : this.values();\n    const query = this.searchQuery().toLowerCase();\n\n    if (!query) return options;\n\n    return options.filter((opt) => opt.label.toLowerCase().includes(query));\n  });\n\n  readonly selectedOptions = computed(() => {\n    const selected = this.selectedValues();\n    const allOptions = this.values();\n    return allOptions.filter((opt) => selected.has(opt.value));\n  });\n\n  constructor() {\n    // Watch for search query changes and fetch options if provider exists\n    effect(() => {\n      const query = this.searchQuery();\n      const provider = this.config().optionsProvider;\n\n      if (query.length >= this.minQueryLength() && provider) {\n        this.loading.set(true);\n\n        provider(query)\n          .pipe(\n            debounceTime(this.config().debounceTime ?? 300),\n            distinctUntilChanged(),\n            switchMap((options) => of(options)),\n            catchError(() => of([]))\n          )\n          .subscribe((options) => {\n            this.availableOptions.set(options);\n            this.loading.set(false);\n          });\n      }\n    });\n  }\n\n  selectOption(value: string | number): void {\n    const newSelection = toggleSelection(this.selectedValues(), value, this.isMultiSelect());\n    this.onSelectionChange(newSelection);\n\n    // Clear search and close dropdown for single select\n    if (!this.isMultiSelect()) {\n      this.searchQuery.set('');\n      this.focused.set(false);\n    }\n  }\n\n  removeSelection(value: string | number): void {\n    const newSelection = new Set(this.selectedValues());\n    newSelection.delete(value);\n    this.onSelectionChange(newSelection);\n  }\n\n  isSelected(value: string | number): boolean {\n    return this.selectedValues().has(value);\n  }\n\n  clearAll(): void {\n    this.onSelectionChange(new Set());\n  }\n\n  onFocus(): void {\n    this.focused.set(true);\n  }\n\n  onBlur(): void {\n    // Delay to allow click events to fire\n    setTimeout(() => this.focused.set(false), 200);\n  }\n}\n","/**\n * Number Facet Component\n * Single number input with min/max validation\n * Zone-less compatible, SSR-safe\n */\n\nimport { Component, ChangeDetectionStrategy, input, output, signal, computed } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { FacetPlugin, NumberFacetConfig, FacetOption } from '../../../types/facet-types';\nimport { validateNumberRange, clampNumber, hasSelections } from '../../../utils/facet-utils';\n\n@Component({\n  selector: 'ngs-number-facet',\n  standalone: true,\n  imports: [FormsModule],\n  styleUrls: [\n    '../facet-base.component.css',\n    './number-facet.component.css',\n  ],\n  template: `\n    <div class=\"ngs-facet ngs-number-facet\">\n      <div class=\"ngs-facet-header\">\n        <h4 class=\"ngs-facet-title\">{{ config().label }}</h4>\n        @if (hasActiveSelections()) {\n          <button\n            type=\"button\"\n            class=\"ngs-facet-clear\"\n            (click)=\"clearValue()\"\n            aria-label=\"Clear value\"\n          >\n            Clear\n          </button>\n        }\n      </div>\n\n      <div class=\"ngs-number-input-container\">\n        <input\n          type=\"number\"\n          class=\"ngs-number-input\"\n          [placeholder]=\"config().placeholder ?? 'Enter value'\"\n          [(ngModel)]=\"inputValue\"\n          [attr.min]=\"config().min\"\n          [attr.max]=\"config().max\"\n          [step]=\"config().step ?? 1\"\n          (blur)=\"onInputBlur()\"\n          (keyup.enter)=\"applyValue()\"\n          [attr.aria-label]=\"config().label\"\n        />\n\n        <button\n          type=\"button\"\n          class=\"ngs-number-apply\"\n          (click)=\"applyValue()\"\n          [disabled]=\"!isValidValue()\"\n        >\n          Apply\n        </button>\n      </div>\n\n      @if (validationError()) {\n        <div class=\"ngs-number-error\">{{ validationError() }}</div>\n      }\n\n      @if (config().min !== undefined || config().max !== undefined) {\n        <div class=\"ngs-number-hint\">\n          @if (config().min !== undefined && config().max !== undefined) {\n            Range: {{ config().min }} - {{ config().max }}\n          } @else if (config().min !== undefined) {\n            Min: {{ config().min }}\n          } @else {\n            Max: {{ config().max }}\n          }\n        </div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NumberFacetComponent implements FacetPlugin {\n  // Inputs\n  readonly config = input.required<NumberFacetConfig>();\n  readonly values = input<FacetOption[]>([]);\n  readonly selectedValues = input<Set<string | number>>(new Set());\n\n  // Outputs\n  readonly selectionChange = output<Set<string | number>>();\n  readonly onSelectionChange = (values: Set<string | number>) => {\n    this.selectionChange.emit(values);\n  };\n\n  // Internal state\n  readonly inputValue = signal<number | null>(null);\n  readonly validationError = signal<string>('');\n\n  // Computed\n  readonly hasActiveSelections = computed(() => hasSelections(this.selectedValues()));\n\n  readonly isValidValue = computed(() => {\n    const value = this.inputValue();\n    if (value === null) return false;\n\n    const isValid = validateNumberRange(value, this.config().min, this.config().max);\n    return isValid;\n  });\n\n  constructor() {\n    // Initialize with selected value if exists\n    const selected = Array.from(this.selectedValues());\n    if (selected.length > 0 && typeof selected[0] === 'number') {\n      this.inputValue.set(selected[0] as number);\n    }\n  }\n\n  applyValue(): void {\n    const value = this.inputValue();\n\n    if (value === null) {\n      this.validationError.set('Please enter a value');\n      return;\n    }\n\n    // Validate range\n    if (!this.isValidValue()) {\n      const min = this.config().min;\n      const max = this.config().max;\n      if (min !== undefined && max !== undefined) {\n        this.validationError.set(`Value must be between ${min} and ${max}`);\n      } else if (min !== undefined) {\n        this.validationError.set(`Value must be at least ${min}`);\n      } else if (max !== undefined) {\n        this.validationError.set(`Value must be at most ${max}`);\n      }\n      return;\n    }\n\n    this.validationError.set('');\n    const clampedValue = clampNumber(value, this.config().min, this.config().max);\n    this.onSelectionChange(new Set([clampedValue]));\n  }\n\n  clearValue(): void {\n    this.inputValue.set(null);\n    this.validationError.set('');\n    this.onSelectionChange(new Set());\n  }\n\n  onInputBlur(): void {\n    // Clear validation error on blur if value is empty\n    if (this.inputValue() === null) {\n      this.validationError.set('');\n    }\n  }\n}\n","/**\n * Number Range Facet Component\n * Min/max inputs with optional slider\n * Zone-less compatible, SSR-safe\n */\n\nimport { Component, ChangeDetectionStrategy, input, output, signal, computed } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { FacetPlugin, NumberRangeFacetConfig, FacetOption } from '../../../types/facet-types';\nimport {\n  validateNumberRange,\n  clampNumber,\n  formatNumberValue,\n  hasSelections,\n} from '../../../utils/facet-utils';\n\n@Component({\n  selector: 'ngs-number-range-facet',\n  standalone: true,\n  imports: [FormsModule],\n  styleUrls: [\n    '../facet-base.component.css',\n    './number-range-facet.component.css',\n  ],\n  template: `\n    <div class=\"ngs-facet ngs-number-range-facet\">\n      <div class=\"ngs-facet-header\">\n        <h4 class=\"ngs-facet-title\">{{ config().label }}</h4>\n        @if (hasActiveSelections()) {\n          <button\n            type=\"button\"\n            class=\"ngs-facet-clear\"\n            (click)=\"clearRange()\"\n            aria-label=\"Clear range\"\n          >\n            Clear\n          </button>\n        }\n      </div>\n\n      <div class=\"ngs-range-inputs\">\n        <div class=\"ngs-range-input-group\">\n          <label class=\"ngs-range-label\">Min</label>\n          <input\n            type=\"number\"\n            class=\"ngs-range-input\"\n            placeholder=\"Min\"\n            [(ngModel)]=\"minValue\"\n            [attr.min]=\"config().min\"\n            [attr.max]=\"maxValue() ?? config().max\"\n            [step]=\"config().step ?? 1\"\n            (blur)=\"onMinBlur()\"\n            [attr.aria-label]=\"'Minimum ' + config().label\"\n          />\n        </div>\n\n        <div class=\"ngs-range-separator\">–</div>\n\n        <div class=\"ngs-range-input-group\">\n          <label class=\"ngs-range-label\">Max</label>\n          <input\n            type=\"number\"\n            class=\"ngs-range-input\"\n            placeholder=\"Max\"\n            [(ngModel)]=\"maxValue\"\n            [attr.min]=\"minValue() ?? config().min\"\n            [attr.max]=\"config().max\"\n            [step]=\"config().step ?? 1\"\n            (blur)=\"onMaxBlur()\"\n            [attr.aria-label]=\"'Maximum ' + config().label\"\n          />\n        </div>\n      </div>\n\n      @if (config().showSlider) {\n        <div class=\"ngs-range-slider\">\n          <input\n            type=\"range\"\n            class=\"ngs-slider ngs-slider-min\"\n            [attr.min]=\"config().min ?? 0\"\n            [attr.max]=\"config().max ?? 100\"\n            [step]=\"config().step ?? 1\"\n            [(ngModel)]=\"minValue\"\n            (ngModelChange)=\"onSliderChange()\"\n            [attr.aria-label]=\"'Minimum ' + config().label\"\n          />\n          <input\n            type=\"range\"\n            class=\"ngs-slider ngs-slider-max\"\n            [attr.min]=\"config().min ?? 0\"\n            [attr.max]=\"config().max ?? 100\"\n            [step]=\"config().step ?? 1\"\n            [(ngModel)]=\"maxValue\"\n            (ngModelChange)=\"onSliderChange()\"\n            [attr.aria-label]=\"'Maximum ' + config().label\"\n          />\n        </div>\n\n        <div class=\"ngs-range-values\">\n          <span>{{ formatValue(minValue() ?? config().min ?? 0) }}</span>\n          <span>{{ formatValue(maxValue() ?? config().max ?? 100) }}</span>\n        </div>\n      }\n\n      <button\n        type=\"button\"\n        class=\"ngs-range-apply\"\n        (click)=\"applyRange()\"\n        [disabled]=\"!isValidRange()\"\n      >\n        Apply Range\n      </button>\n\n      @if (validationError()) {\n        <div class=\"ngs-range-error\">{{ validationError() }}</div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NumberRangeFacetComponent implements FacetPlugin {\n  // Inputs\n  readonly config = input.required<NumberRangeFacetConfig>();\n  readonly values = input<FacetOption[]>([]);\n  readonly selectedValues = input<Set<string | number>>(new Set());\n\n  // Outputs\n  readonly selectionChange = output<Set<string | number>>();\n  readonly onSelectionChange = (values: Set<string | number>) => {\n    this.selectionChange.emit(values);\n  };\n\n  // Internal state\n  readonly minValue = signal<number | null>(null);\n  readonly maxValue = signal<number | null>(null);\n  readonly validationError = signal<string>('');\n\n  // Computed\n  readonly hasActiveSelections = computed(() => hasSelections(this.selectedValues()));\n\n  readonly isValidRange = computed(() => {\n    const min = this.minValue();\n    const max = this.maxValue();\n\n    if (min === null && max === null) return false;\n\n    // Validate individual values\n    if (min !== null && !validateNumberRange(min, this.config().min, this.config().max)) {\n      return false;\n    }\n    if (max !== null && !validateNumberRange(max, this.config().min, this.config().max)) {\n      return false;\n    }\n\n    // Ensure min <= max\n    if (min !== null && max !== null && min > max) {\n      return false;\n    }\n\n    return true;\n  });\n\n  constructor() {\n    // Initialize with selected values if exist\n    const selected = Array.from(this.selectedValues());\n    if (selected.length >= 2) {\n      this.minValue.set(selected[0] as number);\n      this.maxValue.set(selected[1] as number);\n    } else if (selected.length === 1) {\n      this.minValue.set(selected[0] as number);\n    }\n  }\n\n  applyRange(): void {\n    const min = this.minValue();\n    const max = this.maxValue();\n\n    if (!this.isValidRange()) {\n      if (min !== null && max !== null && min > max) {\n        this.validationError.set('Minimum value must be less than or equal to maximum');\n      } else {\n        this.validationError.set('Please enter valid values within the allowed range');\n      }\n      return;\n    }\n\n    this.validationError.set('');\n\n    const configMin = this.config().min;\n    const configMax = this.config().max;\n\n    const clampedMin = min !== null ? clampNumber(min, configMin, configMax) : (configMin ?? 0);\n    const clampedMax = max !== null ? clampNumber(max, configMin, configMax) : (configMax ?? 100);\n\n    // Store as [min, max] in the Set\n    this.onSelectionChange(new Set([clampedMin, clampedMax]));\n  }\n\n  clearRange(): void {\n    this.minValue.set(null);\n    this.maxValue.set(null);\n    this.validationError.set('');\n    this.onSelectionChange(new Set());\n  }\n\n  onMinBlur(): void {\n    const min = this.minValue();\n    if (min !== null) {\n      const clamped = clampNumber(min, this.config().min, this.maxValue() ?? this.config().max);\n      this.minValue.set(clamped);\n    }\n  }\n\n  onMaxBlur(): void {\n    const max = this.maxValue();\n    if (max !== null) {\n      const clamped = clampNumber(max, this.minValue() ?? this.config().min, this.config().max);\n      this.maxValue.set(clamped);\n    }\n  }\n\n  onSliderChange(): void {\n    // Ensure min doesn't exceed max\n    const min = this.minValue();\n    const max = this.maxValue();\n\n    if (min !== null && max !== null && min > max) {\n      this.minValue.set(max);\n    }\n  }\n\n  formatValue(value: number): string {\n    const formatter = this.config().formatter;\n    return formatNumberValue(value, formatter);\n  }\n}\n","/**\n * Facet Registry Service\n * Plugin system for facets - allows registering custom facet types\n * Zone-less compatible\n */\n\nimport { Injectable, Type, signal, Signal, inject } from '@angular/core';\nimport {\n  FacetPlugin,\n  FacetPluginRegistration,\n  IFacetRegistry,\n  FacetType,\n} from '../types/facet-types';\nimport { TextFacetComponent } from '../components/facets/built-in/text-facet.component';\nimport { TextTypeaheadFacetComponent } from '../components/facets/built-in/text-typeahead-facet.component';\nimport { NumberFacetComponent } from '../components/facets/built-in/number-facet.component';\nimport { NumberRangeFacetComponent } from '../components/facets/built-in/number-range-facet.component';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from './search-logger';\n\n/**\n * Facet registry service\n * Manages registration and retrieval of facet plugins\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class FacetRegistryService implements IFacetRegistry {\n  // Internal registry map\n  private readonly registry = new Map<string, FacetPluginRegistration>();\n  private readonly logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n\n  // Signal for reactive plugin list\n  private readonly _registeredTypes = signal<string[]>([]);\n  readonly registeredTypes: Signal<string[]> = this._registeredTypes.asReadonly();\n\n  private static builtInsRegistered = false;\n\n  constructor() {\n    this.ensureBuiltInFacets();\n  }\n\n  /**\n   * Register a facet plugin\n   */\n  register(registration: FacetPluginRegistration): void {\n    const type = registration.type;\n\n    if (this.registry.has(type)) {\n      this.logger.warn(`Facet plugin \"${type}\" is already registered. Overwriting.`);\n    }\n\n    this.registry.set(type, registration);\n    this._registeredTypes.set(Array.from(this.registry.keys()));\n  }\n\n  /**\n   * Register multiple facet plugins\n   */\n  registerMany(registrations: FacetPluginRegistration[]): void {\n    registrations.forEach((registration) => this.register(registration));\n  }\n\n  /**\n   * Unregister a facet plugin\n   */\n  unregister(type: string): void {\n    if (!this.registry.has(type)) {\n      this.logger.warn(`Facet plugin \"${type}\" is not registered.`);\n      return;\n    }\n\n    this.registry.delete(type);\n    this._registeredTypes.set(Array.from(this.registry.keys()));\n  }\n\n  /**\n   * Get facet plugin component by type\n   */\n  get(type: string): Type<FacetPlugin> | undefined {\n    return this.registry.get(type)?.component;\n  }\n\n  /**\n   * Get facet plugin registration by type\n   */\n  getRegistration(type: string): FacetPluginRegistration | undefined {\n    return this.registry.get(type);\n  }\n\n  /**\n   * Check if facet type is registered\n   */\n  has(type: string): boolean {\n    return this.registry.has(type);\n  }\n\n  /**\n   * Get all registered types\n   */\n  getTypes(): string[] {\n    return Array.from(this.registry.keys());\n  }\n\n  /**\n   * Get all registrations\n   */\n  getAllRegistrations(): FacetPluginRegistration[] {\n    return Array.from(this.registry.values());\n  }\n\n  /**\n   * Clear all registrations\n   */\n  clear(): void {\n    this.registry.clear();\n    this._registeredTypes.set([]);\n    FacetRegistryService.builtInsRegistered = false;\n  }\n\n  /**\n   * Get count of registered plugins\n   */\n  getCount(): number {\n    return this.registry.size;\n  }\n\n  /**\n   * Check if registry is empty\n   */\n  isEmpty(): boolean {\n    return this.registry.size === 0;\n  }\n\n  /**\n   * Ensure built-in facet plugins are registered once\n   */\n  ensureBuiltInFacets(): void {\n    if (FacetRegistryService.builtInsRegistered) {\n      return;\n    }\n\n    this.registerMany([\n      {\n        type: 'text',\n        component: TextFacetComponent,\n        description: 'Text facet with checkbox/radio selection',\n      },\n      {\n        type: 'text-typeahead',\n        component: TextTypeaheadFacetComponent,\n        description: 'Text facet with typeahead search',\n      },\n      {\n        type: 'number',\n        component: NumberFacetComponent,\n        description: 'Single number input facet',\n      },\n      {\n        type: 'number-range',\n        component: NumberRangeFacetComponent,\n        description: 'Number range facet with min/max inputs',\n      },\n    ]);\n\n    FacetRegistryService.builtInsRegistered = true;\n  }\n}\n","/**\n * Facet Manager Service\n * Manages facet state for a search instance\n * Zone-less compatible, signal-based\n */\n\nimport { Injectable, signal, computed, Signal, inject } from '@angular/core';\nimport {\n  FacetConfig,\n  FacetState,\n  FacetValue,\n  FacetOption,\n  FacetChangeEvent,\n} from '../types/facet-types';\nimport { FilterConfig, AggregationResult } from '../types/search-types';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from './search-logger';\n\n/**\n * Facet Manager Service\n * Handles facet state management for a single search instance\n */\n@Injectable()\nexport class FacetManagerService {\n  private readonly logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n  // Internal state\n  private readonly _facets = signal<Map<string, FacetState>>(new Map());\n  private readonly _changeEvents = signal<FacetChangeEvent | null>(null);\n\n  // Public signals\n  readonly facets = computed(() => Array.from(this._facets().values()));\n  readonly facetsMap: Signal<Map<string, FacetState>> = this._facets.asReadonly();\n  readonly lastChange: Signal<FacetChangeEvent | null> = this._changeEvents.asReadonly();\n\n  // Applied filters computed from facet selections\n  readonly appliedFilters = computed(() => {\n    const filters: FilterConfig[] = [];\n    const facetsMap = this._facets();\n\n    facetsMap.forEach((facetState) => {\n      if (facetState.selectedValues.size > 0) {\n        const filter = this.facetSelectionToFilter(facetState);\n        if (filter) {\n          filters.push(filter);\n        }\n      }\n    });\n\n    return filters;\n  });\n\n  /**\n   * Add or update facet configuration\n   */\n  addFacet(config: FacetConfig): void {\n    const currentMap = new Map(this._facets());\n    const existingState = currentMap.get(config.id);\n\n    const newState: FacetState = {\n      config,\n      values: existingState?.values ?? this.getInitialValues(config),\n      selectedValues: existingState?.selectedValues ?? new Set(),\n      collapsed: config.collapsed ?? false,\n      visibleCount: config.maxValues ?? 10,\n      loading: false,\n    };\n\n    currentMap.set(config.id, newState);\n    this._facets.set(currentMap);\n  }\n\n  /**\n   * Add multiple facets\n   */\n  addFacets(configs: FacetConfig[]): void {\n    configs.forEach((config) => this.addFacet(config));\n  }\n\n  /**\n   * Remove facet\n   */\n  removeFacet(facetId: string): void {\n    const currentMap = new Map(this._facets());\n    currentMap.delete(facetId);\n    this._facets.set(currentMap);\n  }\n\n  /**\n   * Update facet selection\n   */\n  updateFacetSelection(facetId: string, values: Set<string | number>): void {\n    const currentMap = new Map(this._facets());\n    const facetState = currentMap.get(facetId);\n\n    if (!facetState) {\n      this.logger.warn(`Facet \"${facetId}\" not found`);\n      return;\n    }\n\n    const previousValues = new Set(facetState.selectedValues);\n    const updatedState: FacetState = {\n      ...facetState,\n      selectedValues: new Set(values),\n      values: facetState.values.map((v) => ({\n        ...v,\n        selected: values.has(v.key),\n      })),\n    };\n\n    currentMap.set(facetId, updatedState);\n    this._facets.set(currentMap);\n\n    // Emit change event\n    const filter = this.facetSelectionToFilter(updatedState);\n    const changeEvent: FacetChangeEvent = {\n      facetId,\n      selectedValues: new Set(values),\n      previousValues,\n      config: facetState.config,\n      filter,\n    };\n\n    this._changeEvents.set(changeEvent);\n  }\n\n  /**\n   * Clear facet selection\n   */\n  clearFacet(facetId: string): void {\n    this.updateFacetSelection(facetId, new Set());\n  }\n\n  /**\n   * Clear all facets\n   */\n  clearAllFacets(): void {\n    const currentMap = new Map(this._facets());\n    currentMap.forEach((_, facetId) => {\n      this.clearFacet(facetId);\n    });\n  }\n\n  /**\n   * Toggle facet collapsed state\n   */\n  toggleCollapsed(facetId: string): void {\n    const currentMap = new Map(this._facets());\n    const facetState = currentMap.get(facetId);\n\n    if (!facetState) {\n      return;\n    }\n\n    const updatedState: FacetState = {\n      ...facetState,\n      collapsed: !facetState.collapsed,\n    };\n\n    currentMap.set(facetId, updatedState);\n    this._facets.set(currentMap);\n  }\n\n  /**\n   * Update facet values from aggregations\n   */\n  updateFacetValues(facetId: string, aggregation: AggregationResult): void {\n    const currentMap = new Map(this._facets());\n    const facetState = currentMap.get(facetId);\n\n    if (!facetState) {\n      return;\n    }\n\n    const values = this.aggregationToFacetValues(\n      aggregation,\n      facetState.config,\n      facetState.selectedValues\n    );\n    const updatedState: FacetState = {\n      ...facetState,\n      values,\n    };\n\n    currentMap.set(facetId, updatedState);\n    this._facets.set(currentMap);\n  }\n\n  /**\n   * Update all facet values from aggregations map\n   */\n  updateAllFacetValues(aggregations: Record<string, AggregationResult>): void {\n    Object.keys(aggregations).forEach((field) => {\n      const facet = this.findFacetByField(field);\n      if (facet && aggregations[field]) {\n        this.updateFacetValues(facet.config.id, aggregations[field]);\n      }\n    });\n  }\n\n  /**\n   * Get facet state by ID\n   */\n  getFacet(facetId: string): FacetState | undefined {\n    return this._facets().get(facetId);\n  }\n\n  /**\n   * Find facet by field name\n   */\n  findFacetByField(field: string): FacetState | undefined {\n    const facetsMap = this._facets();\n    for (const facetState of facetsMap.values()) {\n      if (facetState.config.field === field) {\n        return facetState;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if any facets have selections\n   */\n  hasActiveSelections(): boolean {\n    const facetsMap = this._facets();\n    for (const facetState of facetsMap.values()) {\n      if (facetState.selectedValues.size > 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Get count of active selections across all facets\n   */\n  getActiveSelectionsCount(): number {\n    let count = 0;\n    const facetsMap = this._facets();\n    facetsMap.forEach((facetState) => {\n      count += facetState.selectedValues.size;\n    });\n    return count;\n  }\n\n  /**\n   * Reset all facets to initial state\n   */\n  reset(): void {\n    this._facets.set(new Map());\n    this._changeEvents.set(null);\n  }\n\n  // Private helper methods\n\n  /**\n   * Get initial values for a facet from config\n   */\n  private getInitialValues(config: FacetConfig): FacetValue[] {\n    if (config.options) {\n      return config.options.map((opt) => ({\n        key: opt.value,\n        label: opt.label,\n        count: opt.count ?? 0,\n        selected: false,\n        disabled: opt.disabled,\n      }));\n    }\n    return [];\n  }\n\n  /**\n   * Convert aggregation result to facet values\n   */\n  private aggregationToFacetValues(\n    aggregation: AggregationResult,\n    config: FacetConfig,\n    selectedValues: Set<string | number>\n  ): FacetValue[] {\n    if (!aggregation.buckets) {\n      return [];\n    }\n\n    let values = aggregation.buckets.map((bucket) => ({\n      key: bucket.key,\n      label: bucket.key.toString(),\n      count: bucket.doc_count,\n      selected: selectedValues.has(bucket.key),\n      disabled: bucket.doc_count === 0,\n    }));\n\n    // Apply sorting\n    if (config.sort === 'count') {\n      values = values.sort((a, b) => b.count - a.count);\n    } else if (config.sort === 'key') {\n      values = values.sort((a, b) => a.label.localeCompare(b.label));\n    }\n\n    // Apply max values limit\n    if (config.maxValues && values.length > config.maxValues) {\n      values = values.slice(0, config.maxValues);\n    }\n\n    return values.map((value) => ({\n      ...value,\n      selected: selectedValues.has(value.key),\n    }));\n  }\n\n  /**\n   * Convert facet selection to filter configuration\n   */\n  private facetSelectionToFilter(facetState: FacetState): FilterConfig | null {\n    if (facetState.selectedValues.size === 0) {\n      return null;\n    }\n\n    const config = facetState.config;\n    const values = Array.from(facetState.selectedValues);\n\n    // Handle different facet types\n    switch (config.type) {\n      case 'text':\n      case 'text-typeahead':\n      case 'checkbox':\n        if (values.length === 1) {\n          return {\n            field: config.field,\n            type: 'term',\n            value: values[0],\n          };\n        } else {\n          return {\n            field: config.field,\n            type: 'terms',\n            value: values,\n            operator: (config as any).operator ?? 'OR',\n          };\n        }\n\n      case 'number':\n        return {\n          field: config.field,\n          type: 'term',\n          value: values[0],\n        };\n\n      case 'number-range':\n      case 'range':\n      case 'slider':\n        // Assume values is [min, max]\n        return {\n          field: config.field,\n          type: 'range',\n          value: {\n            gte: values[0],\n            lte: values[1] ?? values[0],\n          },\n        };\n\n      case 'radio':\n      case 'toggle':\n        return {\n          field: config.field,\n          type: 'term',\n          value: values[0],\n        };\n\n      default:\n        // Custom type - use terms\n        return {\n          field: config.field,\n          type: values.length === 1 ? 'term' : 'terms',\n          value: values.length === 1 ? values[0] : values,\n        };\n    }\n  }\n}\n","/**\n * SSR Safe Service\n * Provides utilities for SSR-compatible code\n */\n\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Service to check platform and provide SSR-safe utilities\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class SSRSafeService {\n  private readonly platformId = inject(PLATFORM_ID);\n\n  /**\n   * Check if code is running in browser\n   */\n  isBrowser(): boolean {\n    return isPlatformBrowser(this.platformId);\n  }\n\n  /**\n   * Check if code is running on server\n   */\n  isServer(): boolean {\n    return !this.isBrowser();\n  }\n\n  /**\n   * Execute callback only in browser\n   */\n  runInBrowser<T>(callback: () => T): T | undefined {\n    if (this.isBrowser()) {\n      return callback();\n    }\n    return undefined;\n  }\n\n  /**\n   * Execute callback only on server\n   */\n  runOnServer<T>(callback: () => T): T | undefined {\n    if (this.isServer()) {\n      return callback();\n    }\n    return undefined;\n  }\n\n  /**\n   * Get window object safely\n   */\n  getWindow(): Window | undefined {\n    return this.isBrowser() ? window : undefined;\n  }\n\n  /**\n   * Get document object safely\n   */\n  getDocument(): Document | undefined {\n    return this.isBrowser() ? document : undefined;\n  }\n\n  /**\n   * Get localStorage safely\n   */\n  getLocalStorage(): Storage | undefined {\n    return this.isBrowser() ? localStorage : undefined;\n  }\n\n  /**\n   * Get sessionStorage safely\n   */\n  getSessionStorage(): Storage | undefined {\n    return this.isBrowser() ? sessionStorage : undefined;\n  }\n\n  /**\n   * Safe setTimeout\n   */\n  setTimeout(callback: () => void, delay: number): number | undefined {\n    if (this.isBrowser()) {\n      return window.setTimeout(callback, delay);\n    }\n    return undefined;\n  }\n\n  /**\n   * Safe clearTimeout\n   */\n  clearTimeout(id?: number): void {\n    if (this.isBrowser() && id !== undefined) {\n      window.clearTimeout(id);\n    }\n  }\n\n  /**\n   * Safe setInterval\n   */\n  setInterval(callback: () => void, delay: number): number | undefined {\n    if (this.isBrowser()) {\n      return window.setInterval(callback, delay);\n    }\n    return undefined;\n  }\n\n  /**\n   * Safe clearInterval\n   */\n  clearInterval(id?: number): void {\n    if (this.isBrowser() && id !== undefined) {\n      window.clearInterval(id);\n    }\n  }\n\n  /**\n   * Safe requestAnimationFrame\n   */\n  requestAnimationFrame(callback: FrameRequestCallback): number | undefined {\n    if (this.isBrowser()) {\n      return window.requestAnimationFrame(callback);\n    }\n    return undefined;\n  }\n\n  /**\n   * Safe cancelAnimationFrame\n   */\n  cancelAnimationFrame(id?: number): void {\n    if (this.isBrowser() && id !== undefined) {\n      window.cancelAnimationFrame(id);\n    }\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { SearchAdapter } from './types/adapter-types';\nimport { SearchConfigModel } from './models/search-config.model';\nimport { FacetConfig } from './types/facet-types';\n\nexport const NG_SEARCH_ADAPTER = new InjectionToken<SearchAdapter>('NG_SEARCH_ADAPTER');\n\nexport const NG_SEARCH_INITIAL_CONFIG = new InjectionToken<Partial<SearchConfigModel>>(\n  'NG_SEARCH_INITIAL_CONFIG'\n);\n\nexport const NG_SEARCH_INITIAL_FACETS = new InjectionToken<FacetConfig[]>(\n  'NG_SEARCH_INITIAL_FACETS'\n);\n\nexport const NG_SEARCH_AUTO_INITIALIZE = new InjectionToken<boolean>('NG_SEARCH_AUTO_INITIALIZE');\n","/**\n * Search Provider\n * Convenient wrapper that provides complete search functionality\n * Use this to set up search in your application\n */\n\nimport { Injectable, Signal, Inject, Optional } from '@angular/core';\nimport { SearchStateService } from './search-state.service';\nimport { SearchCoordinatorService } from './search-coordinator.service';\nimport { FacetRegistryService } from './facet-registry.service';\nimport { FacetManagerService } from './facet-manager.service';\nimport { SearchAdapter } from '../types/adapter-types';\nimport { SearchConfigModel } from '../models/search-config.model';\nimport {\n  SearchResult,\n  SearchQuery,\n  FilterConfig,\n  SortConfig,\n  Suggestion,\n  SearchEvent,\n} from '../types/search-types';\nimport { FacetConfig, FacetState } from '../types/facet-types';\nimport {\n  NG_SEARCH_ADAPTER,\n  NG_SEARCH_AUTO_INITIALIZE,\n  NG_SEARCH_INITIAL_CONFIG,\n  NG_SEARCH_INITIAL_FACETS,\n} from '../search.tokens';\n\n/**\n * Search provider service\n * High-level API for search functionality\n * Combines state, coordination, and registry\n */\n@Injectable()\nexport class SearchProvider<T = any> {\n  constructor(\n    public readonly state: SearchStateService<T>,\n    public readonly coordinator: SearchCoordinatorService<T>,\n    public readonly registry: FacetRegistryService,\n    public readonly facetManager: FacetManagerService,\n    @Optional()\n    @Inject(NG_SEARCH_ADAPTER)\n    private readonly initialAdapter?: SearchAdapter<T> | null,\n    @Optional()\n    @Inject(NG_SEARCH_INITIAL_CONFIG)\n    private readonly initialConfig?: Partial<SearchConfigModel> | null,\n    @Optional()\n    @Inject(NG_SEARCH_INITIAL_FACETS)\n    private readonly initialFacets?: FacetConfig[] | null,\n    @Optional() @Inject(NG_SEARCH_AUTO_INITIALIZE) private readonly autoInitialize?: boolean | null\n  ) {\n    this.registry.ensureBuiltInFacets();\n    this.bootstrapFromTokens();\n  }\n\n  private bootstrapFromTokens(): void {\n    const adapter = this.initialAdapter ?? undefined;\n    const config = this.initialConfig ?? undefined;\n    const facets = this.initialFacets ?? undefined;\n    const shouldInitialize = this.autoInitialize ?? true;\n\n    if (!adapter && !config && !facets?.length) {\n      return;\n    }\n\n    if (adapter && shouldInitialize) {\n      this.initialize(adapter, config);\n    } else if (config) {\n      this.coordinator.setConfig(config);\n    }\n\n    if (facets?.length) {\n      this.addFacets(facets);\n    }\n  }\n\n  // Expose signals from state as getters\n  get query(): Signal<string> {\n    return this.state.query;\n  }\n  get results(): Signal<SearchResult<T>[]> {\n    return this.state.results;\n  }\n  get loading(): Signal<boolean> {\n    return this.state.loading;\n  }\n  get error(): Signal<Error | null> {\n    return this.state.error;\n  }\n  get total(): Signal<number> {\n    return this.state.total;\n  }\n  get hasResults(): Signal<boolean> {\n    return this.state.hasResults;\n  }\n  get isEmpty(): Signal<boolean> {\n    return this.state.isEmpty;\n  }\n  get suggestions(): Signal<Suggestion[]> {\n    return this.state.suggestions;\n  }\n  get events(): Signal<SearchEvent[]> {\n    return this.state.events;\n  }\n  get currentPage(): Signal<number> {\n    return this.state.currentPage;\n  }\n  get totalPages(): Signal<number> {\n    return this.state.totalPages;\n  }\n  get facets(): Signal<FacetState[]> {\n    return this.facetManager.facets;\n  }\n  get appliedFilters(): Signal<FilterConfig[]> {\n    return this.facetManager.appliedFilters;\n  }\n\n  /**\n   * Initialize search with adapter and configuration\n   */\n  initialize(adapter: SearchAdapter<T>, config?: Partial<SearchConfigModel>): void {\n    this.coordinator.setAdapter(adapter);\n    if (config) {\n      this.coordinator.setConfig(config);\n    }\n  }\n\n  /**\n   * Set search query\n   */\n  search(query: string): void {\n    this.state.setQuery(query);\n  }\n\n  /**\n   * Add filter\n   */\n  addFilter(filter: FilterConfig): void {\n    this.state.addFilter(filter);\n  }\n\n  /**\n   * Remove filter\n   */\n  removeFilter(field: string): void {\n    this.state.removeFilter(field);\n  }\n\n  /**\n   * Clear all filters\n   */\n  clearFilters(): void {\n    this.state.clearFilters();\n  }\n\n  /**\n   * Set sort\n   */\n  setSort(sort: SortConfig[]): void {\n    this.state.setSort(sort);\n  }\n\n  /**\n   * Go to page\n   */\n  goToPage(page: number): void {\n    this.state.setPagination(page);\n  }\n\n  /**\n   * Next page\n   */\n  nextPage(): void {\n    this.state.nextPage();\n  }\n\n  /**\n   * Previous page\n   */\n  prevPage(): void {\n    this.state.prevPage();\n  }\n\n  /**\n   * Get suggestions\n   */\n  getSuggestions(query: string): void {\n    this.coordinator.suggest(query);\n  }\n\n  /**\n   * Clear suggestions\n   */\n  clearSuggestions(): void {\n    this.state.clearSuggestions();\n  }\n\n  /**\n   * Reset search\n   */\n  reset(): void {\n    this.state.reset();\n  }\n\n  /**\n   * Manual search execution\n   */\n  executeSearch(query?: SearchQuery): void {\n    this.coordinator.search(query);\n  }\n\n  // Facet methods\n\n  /**\n   * Add facet configuration\n   */\n  addFacet(config: FacetConfig): void {\n    this.facetManager.addFacet(config);\n  }\n\n  /**\n   * Add multiple facets\n   */\n  addFacets(configs: FacetConfig[]): void {\n    this.facetManager.addFacets(configs);\n  }\n\n  /**\n   * Remove facet\n   */\n  removeFacet(facetId: string): void {\n    this.facetManager.removeFacet(facetId);\n  }\n\n  /**\n   * Update facet selection\n   */\n  updateFacetSelection(facetId: string, values: Set<string | number>): void {\n    this.facetManager.updateFacetSelection(facetId, values);\n    // Optionally sync with state filters\n    const changeEvent = this.facetManager.lastChange();\n    if (!changeEvent) {\n      return;\n    }\n\n    if (changeEvent.filter) {\n      this.state.addFilter(changeEvent.filter);\n    } else {\n      this.state.removeFilter(changeEvent.config.field);\n    }\n  }\n\n  /**\n   * Clear facet\n   */\n  clearFacet(facetId: string): void {\n    const facet = this.facetManager.getFacet(facetId);\n    this.facetManager.clearFacet(facetId);\n    if (facet) {\n      this.state.removeFilter(facet.config.field);\n    }\n  }\n\n  /**\n   * Clear all facets\n   */\n  clearAllFacets(): void {\n    const facets = this.facetManager.facets();\n    facets.forEach((facet) => this.state.removeFilter(facet.config.field));\n    this.facetManager.clearAllFacets();\n  }\n\n  /**\n   * Toggle facet collapsed state\n   */\n  toggleFacetCollapsed(facetId: string): void {\n    this.facetManager.toggleCollapsed(facetId);\n  }\n}\n","/**\n * Services barrel export\n */\n\nexport * from './search-state.service';\nexport * from './search-coordinator.service';\nexport * from './facet-registry.service';\nexport * from './facet-manager.service';\nexport * from './ssr-safe.service';\nexport * from './search-provider.service';\nexport * from './search-telemetry.service';\nexport * from './search-logger';\n","/**\n * Provide search functionality\n * Helper functions to set up search in Angular applications\n */\n\nimport {\n  Provider,\n  makeEnvironmentProviders,\n  EnvironmentProviders,\n  Type,\n  inject,\n} from '@angular/core';\nimport { SearchStateService } from './services/search-state.service';\nimport { SearchCoordinatorService } from './services/search-coordinator.service';\nimport { FacetRegistryService } from './services/facet-registry.service';\nimport { FacetManagerService } from './services/facet-manager.service';\nimport { SearchProvider } from './services/search-provider.service';\nimport { SearchAdapter } from './types/adapter-types';\nimport { SearchConfigModel } from './models/search-config.model';\nimport { FacetConfig } from './types/facet-types';\nimport { SearchTelemetryClient } from './types/telemetry-types';\nimport { NG_SEARCH_TELEMETRY_CLIENTS } from './services/search-telemetry.service';\nimport { NG_SEARCH_LOGGER, SearchLogger } from './services/search-logger';\nimport {\n  NG_SEARCH_ADAPTER,\n  NG_SEARCH_INITIAL_CONFIG,\n  NG_SEARCH_INITIAL_FACETS,\n  NG_SEARCH_AUTO_INITIALIZE,\n} from './search.tokens';\n\n/**\n * Options for providing search\n */\ntype SearchAdapterFactory = () => SearchAdapter;\ntype SearchAdapterSource = SearchAdapter | SearchAdapterFactory | Type<SearchAdapter>;\n\nexport interface ProvideSearchOptions {\n  /** Search adapter instance, factory, or injectable type */\n  adapter?: SearchAdapterSource;\n  /** Search configuration */\n  config?: Partial<SearchConfigModel>;\n  /** Optional facet presets to register on initialisation */\n  facets?: FacetConfig[];\n  /** Optional telemetry clients */\n  telemetry?: SearchTelemetryClient | SearchTelemetryClient[];\n  /** Optional logger implementation */\n  logger?: SearchLogger;\n  /** Automatically initialise the adapter (defaults to true) */\n  autoInitialize?: boolean;\n}\n\nfunction resolveAdapter(adapter?: SearchAdapterSource): SearchAdapter | undefined {\n  if (!adapter) {\n    return undefined;\n  }\n\n  if (typeof adapter === 'function') {\n    const maybeType = adapter as Type<SearchAdapter>;\n    if (maybeType.prototype?.search) {\n      return inject(maybeType);\n    }\n\n    return (adapter as SearchAdapterFactory)();\n  }\n\n  if (typeof (adapter as SearchAdapter).search === 'function') {\n    return adapter as SearchAdapter;\n  }\n\n  return undefined;\n}\n\nfunction createTelemetryProviders(options?: ProvideSearchOptions): Provider[] {\n  if (!options?.telemetry) {\n    return [];\n  }\n\n  const providers: Provider[] = [];\n  const clients = Array.isArray(options.telemetry) ? options.telemetry : [options.telemetry];\n  clients.forEach((client) => {\n    providers.push({\n      provide: NG_SEARCH_TELEMETRY_CLIENTS,\n      useValue: client,\n      multi: true,\n    });\n  });\n  return providers;\n}\n\nfunction createLoggerProviders(options?: ProvideSearchOptions): Provider[] {\n  if (!options?.logger) {\n    return [];\n  }\n\n  return [\n    {\n      provide: NG_SEARCH_LOGGER,\n      useValue: options.logger,\n    },\n  ];\n}\n\nfunction createAdapterProviders(options?: ProvideSearchOptions): Provider[] {\n  if (!options?.adapter) {\n    return [];\n  }\n\n  return [\n    {\n      provide: NG_SEARCH_ADAPTER,\n      useFactory: () => resolveAdapter(options.adapter),\n    },\n  ];\n}\n\nfunction createConfigProviders(options?: ProvideSearchOptions): Provider[] {\n  const providers: Provider[] = [];\n\n  if (options?.config) {\n    providers.push({\n      provide: NG_SEARCH_INITIAL_CONFIG,\n      useValue: options.config,\n    });\n  }\n\n  if (options?.facets?.length) {\n    providers.push({\n      provide: NG_SEARCH_INITIAL_FACETS,\n      useValue: options.facets,\n    });\n  }\n\n  if (options?.autoInitialize !== undefined) {\n    providers.push({\n      provide: NG_SEARCH_AUTO_INITIALIZE,\n      useValue: options.autoInitialize,\n    });\n  }\n\n  return providers;\n}\n\nfunction createSearchProviders(options?: ProvideSearchOptions): Provider[] {\n  return [\n    SearchStateService,\n    SearchCoordinatorService,\n    FacetManagerService,\n    SearchProvider,\n    ...createTelemetryProviders(options),\n    ...createLoggerProviders(options),\n    ...createAdapterProviders(options),\n    ...createConfigProviders(options),\n  ];\n}\n\n/**\n * Provide search services at the root level\n * Use in app.config.ts or main.ts\n *\n * @example\n * ```typescript\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideSearch({\n *       adapter: new RestApiAdapter({ endpoint: 'https://api.example.com' }),\n *       config: { debounceTime: 300, pageSize: 20 }\n *     })\n *   ]\n * };\n * ```\n */\nexport function provideSearch(options?: ProvideSearchOptions): EnvironmentProviders {\n  return makeEnvironmentProviders(createSearchProviders(options));\n}\n\n/**\n * Provide search services at component level\n * Use in component providers array for isolated search instances\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [provideSearchForComponent()],\n * })\n * export class SearchComponent {\n *   private search = inject(SearchProvider);\n * }\n * ```\n */\nexport function provideSearchForComponent(options?: ProvideSearchOptions): Provider[] {\n  return createSearchProviders(options);\n}\n\n/**\n * Register built-in facet components\n * Called automatically by provideSearch\n * Can be called manually if needed\n */\nexport function registerBuiltInFacets(registry: FacetRegistryService): void {\n  registry.ensureBuiltInFacets();\n}\n","/**\n * Search Box Component\n * Standalone, signal-based search input with debouncing and keyboard navigation\n * Zone-less compatible, SSR-safe\n */\n\nimport {\n  Component,\n  input,\n  output,\n  signal,\n  computed,\n  effect,\n  viewChild,\n  ElementRef,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { SSRSafeService } from '../../services/ssr-safe.service';\nimport { debounceFunction } from '../../utils/debounce';\n\n@Component({\n  selector: 'ngs-search-box',\n  standalone: true,\n  styleUrls: ['./search-box.component.css'],\n  template: `\n    <div class=\"ngs-search-box\" [class.ngs-disabled]=\"disabled()\">\n      <div class=\"ngs-search-input-wrapper\">\n        <div class=\"ngs-input-container\">\n          @if (showSearchIcon()) {\n            <span class=\"ngs-search-icon\" aria-hidden=\"true\">\n              <svg\n                width=\"20\"\n                height=\"20\"\n                viewBox=\"0 0 20 20\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <path\n                  d=\"M9 17A8 8 0 1 0 9 1a8 8 0 0 0 0 16zM19 19l-4.35-4.35\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                />\n              </svg>\n            </span>\n          }\n\n          <input\n            #searchInput\n            type=\"text\"\n            class=\"ngs-search-input\"\n            [value]=\"value()\"\n            [placeholder]=\"placeholder()\"\n            [disabled]=\"disabled()\"\n            [attr.aria-label]=\"ariaLabel()\"\n            [attr.aria-describedby]=\"ariaDescribedby()\"\n            [attr.aria-controls]=\"ariaControls()\"\n            [attr.aria-expanded]=\"ariaExpanded()\"\n            [attr.autocomplete]=\"autocomplete()\"\n            (input)=\"onInput($event)\"\n            (keydown)=\"onKeyDown($event)\"\n            (focus)=\"onFocus()\"\n            (blur)=\"onBlur()\"\n          />\n\n          @if (showClearButton() && value()) {\n            <button\n              type=\"button\"\n              class=\"ngs-clear-button\"\n              [attr.aria-label]=\"clearButtonLabel()\"\n              (click)=\"clearInput()\"\n            >\n              <svg\n                width=\"16\"\n                height=\"16\"\n                viewBox=\"0 0 16 16\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <path\n                  d=\"M12 4L4 12M4 4l8 8\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                />\n              </svg>\n            </button>\n          }\n        </div>\n\n        <!-- Content projection for custom buttons/actions -->\n        <ng-content select=\"[searchActions]\" />\n      </div>\n\n      @if (loading()) {\n        <div class=\"ngs-loading-indicator\" role=\"status\" aria-live=\"polite\">\n          <span class=\"ngs-spinner\"></span>\n          <span class=\"ngs-sr-only\">Searching...</span>\n        </div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchBoxComponent {\n  private readonly ssrSafe = inject(SSRSafeService);\n\n  // Input signals using input() function\n  readonly value = input<string>('');\n  readonly placeholder = input<string>('Search...');\n  readonly debounceTime = input<number>(300);\n  readonly minQueryLength = input<number>(0);\n  readonly disabled = input<boolean>(false);\n  readonly autoFocus = input<boolean>(false);\n  readonly showClearButton = input<boolean>(true);\n  readonly showSearchIcon = input<boolean>(true);\n  readonly loading = input<boolean>(false);\n  readonly disableAutoSearch = input<boolean>(false);\n  readonly ariaLabel = input<string>('Search');\n  readonly ariaDescribedby = input<string | undefined>(undefined);\n  readonly ariaControls = input<string | undefined>(undefined);\n  readonly ariaExpanded = input<boolean | undefined>(undefined);\n  readonly autocomplete = input<string>('off');\n  readonly clearButtonLabel = input<string>('Clear search');\n\n  // Output signals using output() function\n  readonly queryChange = output<string>();\n  readonly search = output<string>();\n  readonly clear = output<void>();\n  readonly focus = output<void>();\n  readonly blur = output<void>();\n  readonly keyDown = output<KeyboardEvent>();\n\n  // View child\n  private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n  // Internal state\n  private readonly internalValue = signal<string>('');\n  private readonly isFocused = signal<boolean>(false);\n\n  // Debounced search function\n  private debouncedSearch = debounceFunction((query: string) => {\n    if (this.shouldTriggerSearch(query)) {\n      this.search.emit(query);\n    }\n  }, this.debounceTime());\n\n  constructor() {\n    // Sync internal value with input\n    effect(() => {\n      this.internalValue.set(this.value());\n    });\n\n    // Auto-focus if requested\n    effect(() => {\n      if (this.autoFocus() && this.ssrSafe.isBrowser()) {\n        this.ssrSafe.setTimeout(() => {\n          this.focusInput();\n        }, 0);\n      }\n    });\n\n    // Update debounced function when debounceTime changes\n    effect(() => {\n      const time = this.debounceTime();\n      this.debouncedSearch = debounceFunction((query: string) => {\n        if (this.shouldTriggerSearch(query)) {\n          this.search.emit(query);\n        }\n      }, time);\n    });\n  }\n\n  /**\n   * Handle input event\n   */\n  onInput(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    const query = target.value;\n\n    this.internalValue.set(query);\n    this.queryChange.emit(query);\n\n    // Trigger debounced search only if auto-search is not disabled\n    if (!this.disableAutoSearch()) {\n      this.debouncedSearch(query);\n    }\n  }\n\n  /**\n   * Handle key down event\n   */\n  onKeyDown(event: KeyboardEvent): void {\n    this.keyDown.emit(event);\n\n    // Enter key triggers immediate search\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      const query = this.internalValue();\n      if (this.shouldTriggerSearch(query)) {\n        this.search.emit(query);\n      }\n    }\n\n    // Escape key clears input\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.clearInput();\n    }\n  }\n\n  /**\n   * Handle focus event\n   */\n  onFocus(): void {\n    this.isFocused.set(true);\n    this.focus.emit();\n  }\n\n  /**\n   * Handle blur event\n   */\n  onBlur(): void {\n    this.isFocused.set(false);\n    this.blur.emit();\n  }\n\n  /**\n   * Clear input\n   */\n  clearInput(): void {\n    this.internalValue.set('');\n    this.queryChange.emit('');\n    this.clear.emit();\n    this.search.emit('');\n    this.focusInput();\n  }\n\n  /**\n   * Focus input element\n   */\n  focusInput(): void {\n    const input = this.searchInput();\n    if (input && this.ssrSafe.isBrowser()) {\n      input.nativeElement.focus();\n    }\n  }\n\n  /**\n   * Blur input element\n   */\n  blurInput(): void {\n    const input = this.searchInput();\n    if (input && this.ssrSafe.isBrowser()) {\n      input.nativeElement.blur();\n    }\n  }\n\n  /**\n   * Trigger immediate search\n   */\n  triggerSearch(): void {\n    const query = this.internalValue();\n    if (this.shouldTriggerSearch(query)) {\n      this.search.emit(query);\n    }\n  }\n\n  /**\n   * Check if search should be triggered\n   */\n  private shouldTriggerSearch(query: string): boolean {\n    const trimmed = query.trim();\n    return trimmed.length === 0 || trimmed.length >= this.minQueryLength();\n  }\n}\n","import {\n  Component,\n  input,\n  output,\n  signal,\n  computed,\n  effect,\n  viewChild,\n  ElementRef,\n  TemplateRef,\n  contentChild,\n  ChangeDetectionStrategy,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SearchStateService } from '../../services/search-state.service';\nimport { SSRSafeService } from '../../services/ssr-safe.service';\nimport { KeyboardNavigationHandler } from '../../utils/keyboard-navigation';\nimport type { Suggestion } from '../../types/search-types';\nimport type { SuggestionContext } from '../../types/component-types';\n\n/**\n * Suggestions Component\n *\n * Displays search suggestions with:\n * - Custom templates via content projection\n * - Keyboard navigation (Arrow up/down, Enter, Escape)\n * - @defer blocks for lazy rendering\n * - SSR compatibility\n * - Accessibility support\n * - Signal-based reactivity\n *\n * @example\n * ```html\n * <ng-search-suggestions\n *   [maxSuggestions]=\"10\"\n *   [highlightQuery]=\"true\"\n *   (suggestionSelected)=\"onSelect($event)\">\n *   <ng-template #suggestionTemplate let-suggestion let-index=\"index\">\n *     <div class=\"custom-suggestion\">\n *       <strong>{{ suggestion.text }}</strong>\n *       <span>{{ suggestion.count }} results</span>\n *     </div>\n *   </ng-template>\n * </ng-search-suggestions>\n * ```\n */\n@Component({\n  selector: 'ng-search-suggestions',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrls: ['./suggestions.component.css'],\n  template: `\n    @if (isVisible()) {\n      <div\n        class=\"suggestions-container\"\n        [attr.role]=\"'listbox'\"\n        [attr.aria-label]=\"ariaLabel()\"\n        (keydown)=\"handleKeydown($event)\"\n        #container\n      >\n        @defer (when shouldRender()) {\n          @if (isLoading()) {\n            <div class=\"suggestions-loading\" role=\"status\">\n              <span class=\"loading-spinner\"></span>\n              <span class=\"loading-text\">{{ loadingText() }}</span>\n            </div>\n          } @else if (displayedSuggestions().length > 0) {\n            <ul class=\"suggestions-list\" role=\"presentation\">\n              @for (suggestion of displayedSuggestions(); track trackBy(suggestion, $index)) {\n                <li\n                  class=\"suggestion-item\"\n                  [class.highlighted]=\"highlightedIndex() === $index\"\n                  [attr.role]=\"'option'\"\n                  [attr.aria-selected]=\"highlightedIndex() === $index\"\n                  [attr.id]=\"'suggestion-' + $index\"\n                  (click)=\"selectSuggestion(suggestion)\"\n                  (mouseenter)=\"highlightIndex($index)\"\n                >\n                  @if (customTemplate(); as template) {\n                    <ng-container\n                      *ngTemplateOutlet=\"template; context: createContext(suggestion, $index)\"\n                    />\n                  } @else {\n                    <div class=\"suggestion-default\">\n                      @if (showIcon()) {\n                        <span class=\"suggestion-icon\" [innerHTML]=\"searchIcon\"></span>\n                      }\n                      <span class=\"suggestion-text\" [innerHTML]=\"formatSuggestionText(suggestion)\">\n                      </span>\n                      @if (suggestion.count !== undefined) {\n                        <span class=\"suggestion-count\">{{ suggestion.count }}</span>\n                      }\n                    </div>\n                  }\n                </li>\n              }\n            </ul>\n\n            @if (hasMoreSuggestions()) {\n              <div class=\"suggestions-footer\">\n                <button type=\"button\" class=\"show-more-button\" (click)=\"showAllSuggestions.emit()\">\n                  {{ showMoreText() }}\n                </button>\n              </div>\n            }\n          } @else if (showNoResults()) {\n            <div class=\"suggestions-empty\" role=\"status\">\n              {{ noResultsText() }}\n            </div>\n          }\n        } @placeholder {\n          <div class=\"suggestions-placeholder\">\n            <span class=\"loading-spinner\"></span>\n          </div>\n        }\n      </div>\n    }\n  `,\n  host: {\n    class: 'ng-search-suggestions',\n  },\n})\nexport class SuggestionsComponent {\n  private readonly searchState = inject(SearchStateService, { optional: true });\n  private readonly ssrSafe = inject(SSRSafeService);\n\n  // ViewChild references\n  readonly containerRef = viewChild<ElementRef<HTMLDivElement>>('container');\n\n  // Content projection for custom template\n  readonly customTemplate = contentChild<TemplateRef<SuggestionContext>>('suggestionTemplate');\n\n  // Inputs\n  readonly maxSuggestions = input<number>(10);\n  readonly highlightQuery = input<boolean>(true);\n  readonly showIcon = input<boolean>(true);\n  readonly showNoResults = input<boolean>(false);\n  readonly loadingText = input<string>('Loading suggestions...');\n  readonly noResultsText = input<string>('No suggestions found');\n  readonly showMoreText = input<string>('Show all suggestions');\n  readonly ariaLabel = input<string>('Search suggestions');\n  readonly minQueryLength = input<number>(1);\n  readonly autoHighlightFirst = input<boolean>(true);\n  readonly closeOnSelect = input<boolean>(true);\n\n  // Outputs\n  readonly suggestionSelected = output<Suggestion>();\n  readonly suggestionHighlighted = output<Suggestion | null>();\n  readonly showAllSuggestions = output<void>();\n  readonly visibilityChange = output<boolean>();\n\n  // Internal state\n  private keyboardNav: KeyboardNavigationHandler | null = null;\n  private manuallyHidden = signal<boolean>(false);\n  private lastQuery = signal<string>('');\n\n  readonly highlightedIndex = signal<number>(-1);\n  readonly isVisible = signal<boolean>(false);\n\n  // Computed signals\n  readonly suggestions = computed(() => {\n    return this.searchState?.suggestions() ?? [];\n  });\n\n  readonly isLoading = computed(() => {\n    return this.searchState?.loadingSuggestions() ?? false;\n  });\n\n  readonly query = computed(() => {\n    return this.searchState?.query() ?? '';\n  });\n\n  readonly displayedSuggestions = computed(() => {\n    const suggestions = this.suggestions();\n    const max = this.maxSuggestions();\n    return max > 0 ? suggestions.slice(0, max) : suggestions;\n  });\n\n  readonly hasMoreSuggestions = computed(() => {\n    return this.suggestions().length > this.maxSuggestions();\n  });\n\n  readonly shouldRender = computed(() => {\n    const query = this.query();\n    const minLength = this.minQueryLength();\n    return query.length >= minLength;\n  });\n\n  // Search icon SVG\n  readonly searchIcon = `\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n      <path d=\"m21 21-4.35-4.35\"></path>\n    </svg>\n  `;\n\n  constructor() {\n    // Auto-highlight first suggestion when list changes\n    effect(() => {\n      const suggestions = this.displayedSuggestions();\n      const autoHighlight = this.autoHighlightFirst();\n\n      if (suggestions.length > 0 && autoHighlight && this.highlightedIndex() === -1) {\n        this.highlightedIndex.set(0);\n        this.emitHighlightedSuggestion();\n      } else if (suggestions.length === 0) {\n        this.highlightedIndex.set(-1);\n      }\n    });\n\n    // Show suggestions when available, hide when query is cleared\n    // Respect manual dismissal - only show again when query changes\n    effect(() => {\n      const suggestions = this.displayedSuggestions();\n      const loading = this.isLoading();\n      const query = this.query();\n      const queryChanged = query !== this.lastQuery();\n\n      // Reset manual dismissal flag when query changes\n      if (queryChanged) {\n        this.lastQuery.set(query);\n        this.manuallyHidden.set(false);\n      }\n\n      // Only auto-show if not manually hidden\n      if (!this.manuallyHidden()) {\n        const shouldShow = (suggestions.length > 0 || loading) && query.length > 0;\n\n        if (shouldShow !== this.isVisible()) {\n          this.isVisible.set(shouldShow);\n          this.visibilityChange.emit(shouldShow);\n        }\n      }\n    });\n\n    // Handle clicks outside to close suggestions\n    if (this.ssrSafe.isBrowser()) {\n      effect(() => {\n        const container = this.containerRef();\n\n        if (container && this.isVisible()) {\n          const handleClickOutside = (event: MouseEvent) => {\n            const target = event.target as Node;\n\n            // Don't hide if clicking inside the suggestions container\n            if (container.nativeElement.contains(target)) {\n              return;\n            }\n\n            // Don't hide if clicking on the search input\n            // Find the search input by checking if target is an input with class containing 'search'\n            const isSearchInput =\n              (target as HTMLElement).classList?.contains('ngs-search-input') ||\n              (target as HTMLElement).closest('.ngs-search-box') !== null;\n\n            if (isSearchInput) {\n              return;\n            }\n\n            // Hide suggestions for any other outside click\n            this.hideSuggestions();\n          };\n\n          // Add listener after a small delay to avoid immediate closure\n          const timeoutId = window.setTimeout(() => {\n            document.addEventListener('click', handleClickOutside);\n          }, 100);\n\n          // Cleanup\n          return () => {\n            window.clearTimeout(timeoutId);\n            document.removeEventListener('click', handleClickOutside);\n          };\n        }\n\n        return undefined;\n      });\n    }\n  }\n\n  /**\n   * Handle keyboard events\n   */\n  handleKeydown(event: KeyboardEvent): void {\n    const { key } = event;\n\n    switch (key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.navigateSuggestions('down');\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.navigateSuggestions('up');\n        break;\n      case 'Enter':\n        event.preventDefault();\n        this.selectHighlightedSuggestion();\n        break;\n      case 'Escape':\n        event.preventDefault();\n        this.hideSuggestions();\n        break;\n    }\n  }\n\n  /**\n   * Navigate suggestions using keyboard\n   */\n  private navigateSuggestions(direction: 'up' | 'down'): void {\n    const suggestions = this.displayedSuggestions();\n    if (suggestions.length === 0) return;\n\n    const currentIndex = this.highlightedIndex();\n    let newIndex: number;\n\n    if (direction === 'down') {\n      newIndex = currentIndex < suggestions.length - 1 ? currentIndex + 1 : 0;\n    } else {\n      newIndex = currentIndex > 0 ? currentIndex - 1 : suggestions.length - 1;\n    }\n\n    this.highlightIndex(newIndex);\n    this.scrollToHighlighted();\n  }\n\n  /**\n   * Highlight suggestion at given index\n   */\n  highlightIndex(index: number): void {\n    this.highlightedIndex.set(index);\n    this.emitHighlightedSuggestion();\n  }\n\n  /**\n   * Select the currently highlighted suggestion\n   */\n  private selectHighlightedSuggestion(): void {\n    const index = this.highlightedIndex();\n    const suggestions = this.displayedSuggestions();\n\n    if (index >= 0 && index < suggestions.length) {\n      this.selectSuggestion(suggestions[index]);\n    }\n  }\n\n  /**\n   * Select a suggestion\n   */\n  selectSuggestion(suggestion: Suggestion): void {\n    this.suggestionSelected.emit(suggestion);\n    this.searchState?.markSuggestionSelected(suggestion, {\n      index: this.highlightedIndex(),\n      origin: 'component',\n    });\n\n    if (this.closeOnSelect()) {\n      this.hideSuggestions();\n    }\n  }\n\n  /**\n   * Hide suggestions dropdown\n   */\n  hideSuggestions(): void {\n    this.isVisible.set(false);\n    this.highlightedIndex.set(-1);\n    this.visibilityChange.emit(false);\n    this.manuallyHidden.set(true);\n  }\n\n  /**\n   * Show suggestions dropdown\n   */\n  showSuggestions(): void {\n    if (this.displayedSuggestions().length > 0 || this.isLoading()) {\n      this.isVisible.set(true);\n      this.visibilityChange.emit(true);\n      this.manuallyHidden.set(false);\n    }\n  }\n\n  /**\n   * Scroll to highlighted suggestion\n   */\n  private scrollToHighlighted(): void {\n    if (!this.ssrSafe.isBrowser()) return;\n\n    const container = this.containerRef();\n    const index = this.highlightedIndex();\n\n    if (container && index >= 0) {\n      const element = container.nativeElement.querySelector(`#suggestion-${index}`);\n      if (element) {\n        element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n      }\n    }\n  }\n\n  /**\n   * Emit the currently highlighted suggestion\n   */\n  private emitHighlightedSuggestion(): void {\n    const index = this.highlightedIndex();\n    const suggestions = this.displayedSuggestions();\n\n    if (index >= 0 && index < suggestions.length) {\n      this.suggestionHighlighted.emit(suggestions[index]);\n    } else {\n      this.suggestionHighlighted.emit(null);\n    }\n  }\n\n  /**\n   * Format suggestion text with query highlighting\n   */\n  formatSuggestionText(suggestion: Suggestion): string {\n    if (!this.highlightQuery()) {\n      return suggestion.text;\n    }\n\n    const query = this.query().trim();\n    if (!query) {\n      return suggestion.text;\n    }\n\n    // Escape special regex characters in query\n    const escapedQuery = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    const regex = new RegExp(`(${escapedQuery})`, 'gi');\n\n    return suggestion.text.replace(regex, '<mark>$1</mark>');\n  }\n\n  /**\n   * Create context for custom template\n   */\n  createContext(suggestion: Suggestion, index: number): SuggestionContext {\n    return {\n      $implicit: suggestion,\n      index,\n      highlighted: this.highlightedIndex() === index,\n      query: this.query(),\n    };\n  }\n\n  /**\n   * Track by function for suggestions\n   */\n  trackBy(suggestion: Suggestion, index: number): string {\n    return suggestion.id || `${suggestion.text}-${index}`;\n  }\n}\n","import {\n  Component,\n  input,\n  output,\n  signal,\n  computed,\n  effect,\n  viewChild,\n  ElementRef,\n  TemplateRef,\n  contentChild,\n  ChangeDetectionStrategy,\n  inject,\n  ViewContainerRef,\n  ComponentRef,\n  Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SearchStateService } from '../../services/search-state.service';\nimport { SSRSafeService } from '../../services/ssr-safe.service';\nimport type { SearchResult } from '../../types/search-types';\nimport type { ResultContext, ResultRenderer } from '../../types/component-types';\n\n/**\n * Results Component\n *\n * Displays search results with:\n * - Custom templates or components for result items\n * - Pagination with configurable page size\n * - Loading, error, and empty states\n * - Virtual scrolling for large result sets\n * - Keyboard navigation\n * - Result highlighting\n * - @defer blocks for lazy rendering\n * - SSR compatibility\n *\n * @example\n * ```html\n * <ng-search-results\n *   [pageSize]=\"20\"\n *   [showPagination]=\"true\"\n *   (resultClick)=\"onResultClick($event)\">\n *   <ng-template #resultTemplate let-result let-index=\"index\">\n *     <div class=\"custom-result\">\n *       <h3>{{ result.data.title }}</h3>\n *       <p>{{ result.data.description }}</p>\n *     </div>\n *   </ng-template>\n * </ng-search-results>\n * ```\n */\n@Component({\n  selector: 'ng-search-results',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrls: ['./results.component.css'],\n  template: `\n    <div class=\"results-container\" [attr.role]=\"'region'\" [attr.aria-label]=\"ariaLabel()\">\n      @if (isLoading()) {\n        <div class=\"results-loading\" role=\"status\">\n          @if (customLoadingTemplate(); as template) {\n            <ng-container *ngTemplateOutlet=\"template\" />\n          } @else {\n            <div class=\"loading-spinner\"></div>\n            <p class=\"loading-text\">{{ loadingText() }}</p>\n          }\n        </div>\n      } @else if (hasError()) {\n        <div class=\"results-error\" role=\"alert\">\n          @if (customErrorTemplate(); as template) {\n            <ng-container *ngTemplateOutlet=\"template; context: { $implicit: error() }\" />\n          } @else {\n            <div class=\"error-icon\">⚠️</div>\n            <h3 class=\"error-title\">{{ errorTitle() }}</h3>\n            <p class=\"error-message\">{{ error()?.message || errorMessage() }}</p>\n            @if (showRetry()) {\n              <button type=\"button\" class=\"retry-button\" (click)=\"retry.emit()\">\n                {{ retryText() }}\n              </button>\n            }\n          }\n        </div>\n      } @else if (isEmpty()) {\n        <div class=\"results-empty\" role=\"status\">\n          @if (customEmptyTemplate(); as template) {\n            <ng-container *ngTemplateOutlet=\"template\" />\n          } @else {\n            <div class=\"empty-icon\">🔍</div>\n            <h3 class=\"empty-title\">{{ emptyTitle() }}</h3>\n            <p class=\"empty-message\">{{ emptyMessage() }}</p>\n          }\n        </div>\n      } @else {\n        @defer (when shouldRender()) {\n          <!-- Results header with count and sort -->\n          @if (showResultsInfo()) {\n            <div class=\"results-header\">\n              <div class=\"results-count\">\n                {{ getResultsCountText() }}\n              </div>\n              @if (showSort() && sortOptions().length > 0) {\n                <div class=\"results-sort\">\n                  <label for=\"sort-select\">{{ sortLabel() }}</label>\n                  <select\n                    id=\"sort-select\"\n                    [value]=\"currentSortValue()\"\n                    (change)=\"onSortChange($event)\"\n                    class=\"sort-select\"\n                  >\n                    @for (option of sortOptions(); track option.value) {\n                      <option [value]=\"option.value\">{{ option.label }}</option>\n                    }\n                  </select>\n                </div>\n              }\n            </div>\n          }\n\n          <!-- Virtual scrolling viewport -->\n          @if (enableVirtualScroll()) {\n            <div\n              class=\"results-virtual-viewport\"\n              [style.height.px]=\"virtualScrollHeight()\"\n              (scroll)=\"onVirtualScroll($event)\"\n              #viewport\n            >\n              <div class=\"results-virtual-spacer\" [style.height.px]=\"totalVirtualHeight()\">\n                <ul\n                  class=\"results-list\"\n                  [attr.role]=\"'list'\"\n                  [style.transform]=\"'translateY(' + virtualScrollOffset() + 'px)'\"\n                >\n                  @for (result of visibleResults(); track trackByFn(result, $index)) {\n                    <li\n                      class=\"result-item\"\n                      [attr.role]=\"'listitem'\"\n                      [attr.id]=\"'result-' + $index\"\n                      [class.highlighted]=\"highlightedIndex() === $index\"\n                      (click)=\"selectResult(result, $index)\"\n                      (mouseenter)=\"highlightIndex($index)\"\n                    >\n                      <ng-container\n                        *ngTemplateOutlet=\"renderResult; context: createContext(result, $index)\"\n                      />\n                    </li>\n                  }\n                </ul>\n              </div>\n            </div>\n          } @else {\n            <!-- Standard list rendering -->\n            <ul class=\"results-list\" [attr.role]=\"'list'\">\n              @for (result of displayedResults(); track trackByFn(result, $index)) {\n                <li\n                  class=\"result-item\"\n                  [attr.role]=\"'listitem'\"\n                  [attr.id]=\"'result-' + $index\"\n                  [class.highlighted]=\"highlightedIndex() === $index\"\n                  (click)=\"selectResult(result, $index)\"\n                  (mouseenter)=\"highlightIndex($index)\"\n                >\n                  <ng-container\n                    *ngTemplateOutlet=\"renderResult; context: createContext(result, $index)\"\n                  />\n                </li>\n              }\n            </ul>\n          }\n\n          <!-- Pagination -->\n          @if (showPagination() && totalPages() > 1) {\n            <div class=\"results-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n              <button\n                type=\"button\"\n                class=\"pagination-button\"\n                [disabled]=\"!hasPreviousPage()\"\n                (click)=\"previousPage()\"\n                [attr.aria-label]=\"'Previous page'\"\n              >\n                ‹\n              </button>\n\n              @for (page of visiblePages(); track page) {\n                @if (page === '...') {\n                  <span class=\"pagination-ellipsis\">...</span>\n                } @else {\n                  <button\n                    type=\"button\"\n                    class=\"pagination-button\"\n                    [class.active]=\"page === currentPage()\"\n                    (click)=\"goToPage(page)\"\n                    [attr.aria-label]=\"'Page ' + page\"\n                    [attr.aria-current]=\"page === currentPage() ? 'page' : null\"\n                  >\n                    {{ page }}\n                  </button>\n                }\n              }\n\n              <button\n                type=\"button\"\n                class=\"pagination-button\"\n                [disabled]=\"!hasNextPage()\"\n                (click)=\"nextPage()\"\n                [attr.aria-label]=\"'Next page'\"\n              >\n                ›\n              </button>\n\n              @if (showPageSize()) {\n                <select\n                  class=\"page-size-select\"\n                  [value]=\"pageSize()\"\n                  (change)=\"onPageSizeChange($event)\"\n                  [attr.aria-label]=\"'Items per page'\"\n                >\n                  @for (size of pageSizeOptions(); track size) {\n                    <option [value]=\"size\">{{ size }} per page</option>\n                  }\n                </select>\n              }\n            </div>\n          }\n        } @placeholder {\n          <div class=\"results-placeholder\">\n            <div class=\"loading-spinner\"></div>\n          </div>\n        }\n      }\n    </div>\n\n    <!-- Template for rendering individual results -->\n    <ng-template #renderResult let-result let-index=\"index\" let-total=\"total\" let-query=\"query\">\n      @if (customResultTemplate(); as template) {\n        <ng-container\n          *ngTemplateOutlet=\"template; context: { $implicit: result, index, total, query }\"\n        />\n      } @else {\n        <div class=\"result-default\">\n          <div class=\"result-title\">\n            <span [innerHTML]=\"highlightText(result.data?.title || 'Untitled', query)\"></span>\n          </div>\n          @if (result.data?.description) {\n            <p\n              class=\"result-description\"\n              [innerHTML]=\"highlightText(result.data.description, query)\"\n            ></p>\n          }\n          @if (result.score !== undefined && showScore()) {\n            <div class=\"result-score\">Score: {{ result.score.toFixed(2) }}</div>\n          }\n          @if (result.metadata) {\n            <div class=\"result-metadata\">\n              @for (entry of objectEntries(result.metadata); track entry[0]) {\n                <span class=\"metadata-item\">\n                  <strong>{{ entry[0] }}:</strong> {{ entry[1] }}\n                </span>\n              }\n            </div>\n          }\n        </div>\n      }\n    </ng-template>\n  `,\n  host: {\n    class: 'ng-search-results',\n  },\n})\nexport class ResultsComponent<T = any> {\n  private readonly searchState = inject(SearchStateService, { optional: true });\n  private readonly ssrSafe = inject(SSRSafeService);\n\n  // ViewChild references\n  readonly viewportRef = viewChild<ElementRef<HTMLDivElement>>('viewport');\n\n  // Content projection for custom templates\n  readonly customResultTemplate = contentChild<TemplateRef<ResultContext<T>>>('resultTemplate');\n  readonly customLoadingTemplate = contentChild<TemplateRef<void>>('loadingTemplate');\n  readonly customErrorTemplate =\n    contentChild<TemplateRef<{ $implicit: Error | null }>>('errorTemplate');\n  readonly customEmptyTemplate = contentChild<TemplateRef<void>>('emptyTemplate');\n\n  // Inputs - Display options\n  readonly showResultsInfo = input<boolean>(true);\n  readonly showPagination = input<boolean>(true);\n  readonly showPageSize = input<boolean>(false);\n  readonly showSort = input<boolean>(false);\n  readonly showScore = input<boolean>(false);\n  readonly showRetry = input<boolean>(true);\n  readonly highlightQuery = input<boolean>(true);\n\n  // Inputs - Text customization\n  readonly ariaLabel = input<string>('Search results');\n  readonly loadingText = input<string>('Loading results...');\n  readonly emptyTitle = input<string>('No results found');\n  readonly emptyMessage = input<string>('Try adjusting your search or filters');\n  readonly errorTitle = input<string>('Something went wrong');\n  readonly errorMessage = input<string>('An error occurred while loading results');\n  readonly retryText = input<string>('Try again');\n  readonly sortLabel = input<string>('Sort by:');\n  readonly resultsCountText = input<string>('');\n\n  // Inputs - Pagination\n  readonly pageSize = input<number>(10);\n  readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\n  readonly maxVisiblePages = input<number>(7);\n\n  // Inputs - Virtual scrolling\n  readonly enableVirtualScroll = input<boolean>(false);\n  readonly virtualScrollHeight = input<number>(600);\n  readonly itemHeight = input<number>(100);\n\n  // Inputs - Sort options\n  readonly sortOptions = input<{ value: string; label: string }[]>([]);\n\n  // Outputs\n  readonly resultClick = output<{ result: SearchResult<T>; index: number }>();\n  readonly resultHighlighted = output<SearchResult<T> | null>();\n  readonly pageChange = output<number>();\n  readonly pageSizeChange = output<number>();\n  readonly sortChange = output<string>();\n  readonly retry = output<void>();\n\n  // Internal state\n  readonly highlightedIndex = signal<number>(-1);\n  private readonly virtualScrollStartIndex = signal<number>(0);\n  private readonly virtualScrollEndIndex = signal<number>(20);\n\n  // Computed signals from search state\n  readonly results = computed(() => {\n    return (this.searchState?.results() as SearchResult<T>[]) ?? [];\n  });\n\n  readonly isLoading = computed(() => {\n    return this.searchState?.loading() ?? false;\n  });\n\n  readonly error = computed(() => {\n    return this.searchState?.error() ?? null;\n  });\n\n  readonly query = computed(() => {\n    return this.searchState?.query() ?? '';\n  });\n\n  readonly total = computed(() => {\n    return this.searchState?.total() ?? 0;\n  });\n\n  readonly currentPage = computed(() => {\n    return this.searchState?.currentPage() ?? 1;\n  });\n\n  readonly currentSortValue = computed(() => {\n    const sort = this.searchState?.sort() ?? [];\n    return sort.length > 0 ? `${sort[0].field}-${sort[0].order}` : '';\n  });\n\n  // Computed display state\n  readonly hasError = computed(() => this.error() !== null);\n  readonly isEmpty = computed(() => {\n    return !this.isLoading() && this.results().length === 0 && this.query().length > 0;\n  });\n\n  readonly shouldRender = computed(() => {\n    return this.results().length > 0;\n  });\n\n  readonly displayedResults = computed(() => {\n    return this.results();\n  });\n\n  // Pagination computed\n  readonly totalPages = computed(() => {\n    return Math.ceil(this.total() / this.pageSize());\n  });\n\n  readonly hasPreviousPage = computed(() => {\n    return this.currentPage() > 1;\n  });\n\n  readonly hasNextPage = computed(() => {\n    return this.currentPage() < this.totalPages();\n  });\n\n  readonly visiblePages = computed(() => {\n    const current = this.currentPage();\n    const total = this.totalPages();\n    const max = this.maxVisiblePages();\n\n    if (total <= max) {\n      return Array.from({ length: total }, (_, i) => i + 1);\n    }\n\n    const pages: (number | string)[] = [];\n    const halfMax = Math.floor(max / 2);\n\n    let start = Math.max(1, current - halfMax);\n    let end = Math.min(total, current + halfMax);\n\n    if (current <= halfMax) {\n      end = max - 1;\n    } else if (current >= total - halfMax) {\n      start = total - max + 2;\n    }\n\n    if (start > 1) {\n      pages.push(1);\n      if (start > 2) pages.push('...');\n    }\n\n    for (let i = start; i <= end; i++) {\n      pages.push(i);\n    }\n\n    if (end < total) {\n      if (end < total - 1) pages.push('...');\n      pages.push(total);\n    }\n\n    return pages;\n  });\n\n  // Virtual scrolling computed\n  readonly totalVirtualHeight = computed(() => {\n    return this.results().length * this.itemHeight();\n  });\n\n  readonly virtualScrollOffset = computed(() => {\n    return this.virtualScrollStartIndex() * this.itemHeight();\n  });\n\n  readonly visibleResults = computed(() => {\n    const start = this.virtualScrollStartIndex();\n    const end = this.virtualScrollEndIndex();\n    return this.results().slice(start, end);\n  });\n\n  /**\n   * Get results count text\n   */\n  getResultsCountText(): string {\n    const customText = this.resultsCountText();\n    if (customText) return customText;\n\n    const total = this.total();\n    const current = this.currentPage();\n    const size = this.pageSize();\n    const start = (current - 1) * size + 1;\n    const end = Math.min(current * size, total);\n\n    if (total === 0) return 'No results';\n    if (total === 1) return '1 result';\n    if (this.showPagination()) {\n      return `${start}-${end} of ${total} results`;\n    }\n    return `${total} results`;\n  }\n\n  /**\n   * Select a result\n   */\n  selectResult(result: SearchResult<T>, index: number): void {\n    this.resultClick.emit({ result, index });\n    this.searchState?.markResultClicked(result, {\n      index,\n      origin: 'component',\n    });\n  }\n\n  /**\n   * Highlight result at index\n   */\n  highlightIndex(index: number): void {\n    this.highlightedIndex.set(index);\n    const results = this.displayedResults();\n    if (index >= 0 && index < results.length) {\n      this.resultHighlighted.emit(results[index]);\n    } else {\n      this.resultHighlighted.emit(null);\n    }\n  }\n\n  /**\n   * Go to specific page\n   */\n  goToPage(page: number | string): void {\n    if (typeof page === 'number' && page >= 1 && page <= this.totalPages()) {\n      this.searchState?.setPagination(page);\n      this.pageChange.emit(page);\n    }\n  }\n\n  /**\n   * Go to next page\n   */\n  nextPage(): void {\n    if (this.hasNextPage()) {\n      this.goToPage(this.currentPage() + 1);\n    }\n  }\n\n  /**\n   * Go to previous page\n   */\n  previousPage(): void {\n    if (this.hasPreviousPage()) {\n      this.goToPage(this.currentPage() - 1);\n    }\n  }\n\n  /**\n   * Handle page size change\n   */\n  onPageSizeChange(event: Event): void {\n    const select = event.target as HTMLSelectElement;\n    const size = parseInt(select.value, 10);\n    this.searchState?.setPagination(1, size);\n    this.pageSizeChange.emit(size);\n  }\n\n  /**\n   * Handle sort change\n   */\n  onSortChange(event: Event): void {\n    const select = event.target as HTMLSelectElement;\n    const value = select.value;\n    const [field, order] = value.split('-');\n\n    if (field && order) {\n      this.searchState?.setSort([{ field, order: order as 'asc' | 'desc' }]);\n      this.sortChange.emit(value);\n    }\n  }\n\n  /**\n   * Handle virtual scroll\n   */\n  onVirtualScroll(event: Event): void {\n    if (!this.ssrSafe.isBrowser()) return;\n\n    const viewport = event.target as HTMLElement;\n    const scrollTop = viewport.scrollTop;\n    const itemHeight = this.itemHeight();\n    const bufferSize = 5;\n\n    const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - bufferSize);\n    const visibleCount = Math.ceil(this.virtualScrollHeight() / itemHeight) + bufferSize * 2;\n    const endIndex = Math.min(this.results().length, startIndex + visibleCount);\n\n    this.virtualScrollStartIndex.set(startIndex);\n    this.virtualScrollEndIndex.set(endIndex);\n  }\n\n  /**\n   * Create context for custom template\n   */\n  createContext(result: SearchResult<T>, index: number): ResultContext<T> {\n    return {\n      $implicit: result,\n      index,\n      total: this.total(),\n      query: this.query(),\n    };\n  }\n\n  /**\n   * Track by function for results\n   */\n  trackByFn(result: SearchResult<T>, index: number): string {\n    return result.id || `${index}`;\n  }\n\n  /**\n   * Highlight text based on query\n   */\n  highlightText(text: string, query: string): string {\n    if (!this.highlightQuery() || !query || !text) {\n      return text;\n    }\n\n    const escapedQuery = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    const regex = new RegExp(`(${escapedQuery})`, 'gi');\n    return text.replace(regex, '<mark>$1</mark>');\n  }\n\n  /**\n   * Get object entries for template\n   */\n  objectEntries(obj: Record<string, any>): [string, any][] {\n    return Object.entries(obj);\n  }\n}\n","/**\n * Facet Wrapper Component\n * Dynamically loads and renders facet plugins from registry\n * Zone-less compatible, SSR-safe\n */\n\nimport {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  computed,\n  viewChild,\n  effect,\n  Type,\n  ComponentRef,\n  ViewContainerRef,\n  EnvironmentInjector,\n  inject,\n} from '@angular/core';\n\nimport { FacetPlugin, FacetState } from '../../types/facet-types';\nimport { FacetRegistryService } from '../../services/facet-registry.service';\nimport { DEFAULT_SEARCH_LOGGER, NG_SEARCH_LOGGER } from '../../services/search-logger';\n\n@Component({\n  selector: 'ngs-facet-wrapper',\n  standalone: true,\n  imports: [],\n  styleUrls: ['./facet-wrapper.component.css'],\n  template: `\n    <div class=\"ngs-facet-wrapper\" [class.ngs-facet-collapsed]=\"facetState().collapsed\">\n      @if (facetState().config.collapsible) {\n        <button\n          type=\"button\"\n          class=\"ngs-facet-toggle\"\n          (click)=\"toggleCollapse()\"\n          [attr.aria-expanded]=\"!facetState().collapsed\"\n          [attr.aria-controls]=\"'facet-' + facetState().config.id\"\n        >\n          <span class=\"ngs-facet-toggle-icon\">{{ facetState().collapsed ? '▶' : '▼' }}</span>\n          <span>{{ facetState().config.label }}</span>\n          @if (facetState().selectedValues.size > 0) {\n            <span class=\"ngs-facet-badge\">{{ facetState().selectedValues.size }}</span>\n          }\n        </button>\n      }\n\n      @if (!facetState().collapsed) {\n        <div\n          class=\"ngs-facet-content\"\n          [id]=\"'facet-' + facetState().config.id\"\n          role=\"region\"\n          [attr.aria-label]=\"facetState().config.label\"\n        >\n          <!-- ВАЖНО: именно ng-template, а не div -->\n          <ng-template #facetHost></ng-template>\n        </div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FacetWrapperComponent {\n  // Inputs\n  readonly facetState = input.required<FacetState>();\n\n  // Outputs\n  readonly selectionChange = output<Set<string | number>>();\n  readonly collapseToggle = output<void>();\n\n  // ViewChild for dynamic component loading\n  readonly facetHost = viewChild('facetHost', { read: ViewContainerRef });\n\n  // Computed\n  readonly facetType = computed(() => this.facetState().config.type);\n\n  private componentRef: ComponentRef<FacetPlugin> | null = null;\n\n  constructor(\n    private readonly registry: FacetRegistryService,\n    private readonly envInjector: EnvironmentInjector\n  ) {\n    const logger = inject(NG_SEARCH_LOGGER, { optional: true }) ?? DEFAULT_SEARCH_LOGGER;\n    // Effect to load facet component dynamically\n    effect(() => {\n      const state = this.facetState();\n      const vc = this.facetHost();\n      if (!vc) return;\n\n      const Cmp = this.registry.get(state.config.type);\n      if (!Cmp) {\n        logger.warn(`Facet type \"${state.config.type}\" not registered`);\n        this.destroyComponent();\n        vc.clear();\n        return;\n      }\n\n      if (!this.componentRef || this.componentRef.componentType !== Cmp) {\n        this.destroyComponent();\n        vc.clear();\n        this.componentRef = vc.createComponent(Cmp as Type<FacetPlugin>, {\n          environmentInjector: this.envInjector,\n        });\n\n        const instance = this.componentRef.instance;\n        instance.onSelectionChange = (values: Set<string | number>) =>\n          this.selectionChange.emit(values);\n        if (instance.onToggleCollapse) {\n          instance.onToggleCollapse = () => this.collapseToggle.emit();\n        }\n      }\n\n      this.componentRef!.setInput('config', state.config);\n      this.componentRef!.setInput('values', state.values);\n      this.componentRef!.setInput('selectedValues', state.selectedValues);\n      this.componentRef!.changeDetectorRef.markForCheck();\n    });\n\n    // Destroy component when container disappears (e.g., collapsed)\n    effect(() => {\n      if (!this.facetHost()) this.destroyComponent();\n    });\n  }\n\n  toggleCollapse(): void {\n    this.collapseToggle.emit();\n  }\n\n  private destroyComponent(): void {\n    if (this.componentRef) {\n      this.componentRef.destroy();\n      this.componentRef = null;\n    }\n  }\n}\n","/**\n * Facets Container Component\n * Renders all facets for a search instance\n * Zone-less compatible, SSR-safe\n */\n\nimport { Component, ChangeDetectionStrategy, input, output } from '@angular/core';\n\nimport { FacetState } from '../../types/facet-types';\nimport { FacetWrapperComponent } from './facet-wrapper.component';\n\n@Component({\n  selector: 'ngs-facets-container',\n  standalone: true,\n  imports: [FacetWrapperComponent],\n  styleUrls: ['./facets-container.component.css'],\n  template: `\n    <div class=\"ngs-facets-container\">\n      @if (title()) {\n        <h3 class=\"ngs-facets-title\">{{ title() }}</h3>\n      }\n\n      @if (facets().length === 0) {\n        <div class=\"ngs-facets-empty\">No facets configured</div>\n      } @else {\n        @for (facet of facets(); track facet.config.id) {\n          <ngs-facet-wrapper\n            [facetState]=\"facet\"\n            (selectionChange)=\"onFacetChange(facet.config.id, $event)\"\n            (collapseToggle)=\"onToggleCollapse(facet.config.id)\"\n          />\n        }\n      }\n\n      @if (showClearAll() && hasSelections()) {\n        <button type=\"button\" class=\"ngs-facets-clear-all\" (click)=\"onClearAll()\">\n          Clear All Filters\n        </button>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FacetsContainerComponent {\n  // Inputs\n  readonly facets = input<FacetState[]>([]);\n  readonly title = input<string>('');\n  readonly showClearAll = input<boolean>(true);\n\n  // Outputs\n  readonly facetChange = output<{ facetId: string; values: Set<string | number> }>();\n  readonly clearAll = output<void>();\n  readonly toggleCollapse = output<string>();\n\n  // Methods\n  onFacetChange(facetId: string, values: Set<string | number>): void {\n    this.facetChange.emit({ facetId, values });\n  }\n\n  onClearAll(): void {\n    this.clearAll.emit();\n  }\n\n  onToggleCollapse(facetId: string): void {\n    this.toggleCollapse.emit(facetId);\n  }\n\n  hasSelections(): boolean {\n    return this.facets().some((facet) => facet.selectedValues.size > 0);\n  }\n}\n","/**\n * Applied Filters Component\n * Displays currently active filters with remove buttons\n * Zone-less compatible, SSR-safe\n */\n\nimport { Component, ChangeDetectionStrategy, input, output, computed } from '@angular/core';\n\nimport { FilterConfig } from '../../types/search-types';\n\ninterface AppliedFilter {\n  id: string;\n  label: string;\n  value: string;\n  filterConfig: FilterConfig;\n}\n\n@Component({\n  selector: 'ngs-applied-filters',\n  standalone: true,\n  imports: [],\n  styleUrls: ['./applied-filters.component.css'],\n  template: `\n    <div class=\"ngs-applied-filters\">\n      @if (appliedFiltersDisplay().length > 0) {\n        <div class=\"ngs-applied-filters-header\">\n          <h4 class=\"ngs-applied-filters-title\">{{ title() }}</h4>\n          @if (showClearAll()) {\n            <button\n              type=\"button\"\n              class=\"ngs-applied-filters-clear-all\"\n              (click)=\"onClearAll()\"\n              aria-label=\"Clear all filters\"\n            >\n              Clear All\n            </button>\n          }\n        </div>\n\n        <div class=\"ngs-applied-filters-list\">\n          @for (filter of appliedFiltersDisplay(); track filter.id) {\n            <div class=\"ngs-applied-filter\">\n              <span class=\"ngs-applied-filter-label\">{{ filter.label }}:</span>\n              <span class=\"ngs-applied-filter-value\">{{ filter.value }}</span>\n              <button\n                type=\"button\"\n                class=\"ngs-applied-filter-remove\"\n                (click)=\"onRemoveFilter(filter)\"\n                [attr.aria-label]=\"'Remove filter: ' + filter.label\"\n              >\n                ×\n              </button>\n            </div>\n          }\n        </div>\n      } @else if (showEmpty()) {\n        <div class=\"ngs-applied-filters-empty\">{{ emptyMessage() }}</div>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppliedFiltersComponent {\n  // Inputs\n  readonly filters = input<FilterConfig[]>([]);\n  readonly title = input<string>('Active Filters');\n  readonly showClearAll = input<boolean>(true);\n  readonly showEmpty = input<boolean>(false);\n  readonly emptyMessage = input<string>('No filters applied');\n  readonly fieldLabels = input<Record<string, string>>({});\n\n  // Outputs\n  readonly removeFilter = output<FilterConfig>();\n  readonly clearAll = output<void>();\n\n  // Computed\n  readonly appliedFiltersDisplay = computed(() => {\n    return this.filters().map((filter, index) => {\n      const label = this.fieldLabels()[filter.field] || filter.field;\n      const value = this.formatFilterValue(filter);\n      return {\n        id: `${filter.field}-${index}`,\n        label,\n        value,\n        filterConfig: filter,\n      };\n    });\n  });\n\n  // Methods\n  onRemoveFilter(filter: AppliedFilter): void {\n    this.removeFilter.emit(filter.filterConfig);\n  }\n\n  onClearAll(): void {\n    this.clearAll.emit();\n  }\n\n  private formatFilterValue(filter: FilterConfig): string {\n    if (Array.isArray(filter.value)) {\n      return filter.value.join(', ');\n    }\n\n    if (typeof filter.value === 'object' && filter.value !== null) {\n      // Handle range filters\n      if ('gte' in filter.value && 'lte' in filter.value) {\n        return `${filter.value.gte} - ${filter.value.lte}`;\n      }\n      if ('gte' in filter.value) {\n        return `≥ ${filter.value.gte}`;\n      }\n      if ('lte' in filter.value) {\n        return `≤ ${filter.value.lte}`;\n      }\n      if ('gt' in filter.value) {\n        return `> ${filter.value.gt}`;\n      }\n      if ('lt' in filter.value) {\n        return `< ${filter.value.lt}`;\n      }\n    }\n\n    return String(filter.value);\n  }\n}\n","/*\n * Public API Surface of @ng-search/core\n */\n\n// Version\nexport * from './lib/version';\n\n// Types\nexport * from './lib/types/search-types';\nexport * from './lib/types/facet-types';\nexport * from './lib/types/adapter-types';\nexport * from './lib/types/component-types';\nexport * from './lib/types/telemetry-types';\n\n// Models\nexport * from './lib/models/search-config.model';\nexport * from './lib/models/search-result.model';\nexport * from './lib/models/facet-config.model';\n\n// Adapters\nexport * from './lib/adapters/base-http.adapter';\nexport * from './lib/adapters/rest-api.adapter';\n\n// Utils\nexport * from './lib/utils';\n\n// Core Services\nexport * from './lib/services';\nexport * from './lib/services/search-telemetry.service';\nexport * from './lib/services/search-logger';\n\n// Provider functions\nexport * from './lib/provide-search';\nexport * from './lib/search.tokens';\n\n// Components\nexport * from './lib/components/search-box/search-box.component';\nexport * from './lib/components/suggestions/suggestions.component';\nexport * from './lib/components/results/results.component';\n\n// Facet Components\nexport * from './lib/components/facets/facets-container.component';\nexport * from './lib/components/facets/facet-wrapper.component';\nexport * from './lib/components/facets/applied-filters.component';\n\n// Built-in Facet Plugins\nexport * from './lib/components/facets/built-in/text-facet.component';\nexport * from './lib/components/facets/built-in/text-typeahead-facet.component';\nexport * from './lib/components/facets/built-in/number-facet.component';\nexport * from './lib/components/facets/built-in/number-range-facet.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","catchError","distinctUntilChanged","i1","i1.FacetRegistryService"],"mappings":"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"}