{"version":3,"file":"sharedComponents.mjs","sources":["../../../src/lib/feature/sharedComponents.tsx"],"sourcesContent":["/**\n * @file Shared Feature Components\n * @description Reusable component patterns for feature development\n * Performance optimized: static styles extracted to module-level constants\n */\n\nimport React, {\n  type ReactNode,\n  useState,\n  useCallback,\n  useMemo,\n  memo,\n  type CSSProperties,\n} from 'react';\n\n// ============================================================================\n// STATIC STYLES - Extracted outside components to prevent re-creation\n// ============================================================================\n\n// Stats Card styles\nconst statsCardHeaderStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n};\n\nconst statsCardLabelStyle: CSSProperties = {\n  fontSize: '0.875rem',\n  color: 'var(--color-text-muted, #6b7280)',\n};\n\nconst statsCardValueStyle: CSSProperties = {\n  fontSize: '1.5rem',\n  fontWeight: '700',\n  margin: '0.25rem 0',\n  color: 'var(--color-text-primary, #111827)',\n};\n\n// Filter Panel styles\nconst filterToggleButtonStyle: CSSProperties = {\n  padding: '0.5rem 1rem',\n  backgroundColor: '#f3f4f6',\n  border: 'none',\n  borderRadius: '0.375rem',\n  cursor: 'pointer',\n  display: 'flex',\n  alignItems: 'center',\n  gap: '0.5rem',\n};\n\nconst filterBadgeStyle: CSSProperties = {\n  backgroundColor: '#3b82f6',\n  color: '#fff',\n  borderRadius: '9999px',\n  padding: '0.125rem 0.5rem',\n  fontSize: '0.75rem',\n};\n\nconst filterPanelHeaderStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'space-between',\n  marginBottom: '1rem',\n};\n\nconst filterTitleStyle: CSSProperties = {\n  fontWeight: 500,\n};\n\nconst filterActiveCountStyle: CSSProperties = {\n  marginLeft: '0.5rem',\n  color: 'var(--color-text-muted, #6b7280)',\n};\n\nconst filterActionsStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.5rem',\n};\n\nconst clearButtonStyle: CSSProperties = {\n  background: 'none',\n  border: 'none',\n  color: '#3b82f6',\n  cursor: 'pointer',\n  fontSize: '0.875rem',\n};\n\nconst closeButtonStyle: CSSProperties = {\n  background: 'none',\n  border: 'none',\n  cursor: 'pointer',\n  fontSize: '0.875rem',\n};\n\n// Pagination styles\nconst paginationContainerBaseStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n  padding: '1rem 0',\n};\n\nconst paginationInfoStyle: CSSProperties = {\n  fontSize: '0.875rem',\n  color: '#6b7280',\n};\n\nconst paginationControlsStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.5rem',\n  alignItems: 'center',\n};\n\nconst selectStyle: CSSProperties = {\n  padding: '0.25rem 0.5rem',\n  borderRadius: '0.25rem',\n  border: '1px solid #d1d5db',\n};\n\nconst paginationButtonsContainerStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.25rem',\n};\n\nconst ellipsisStyle: CSSProperties = {\n  padding: '0 0.5rem',\n};\n\n// Default state styles\nconst loadingContainerStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  padding: '2rem',\n};\n\nconst spinnerStyle: CSSProperties = {\n  width: 24,\n  height: 24,\n  border: '3px solid #e5e7eb',\n  borderTopColor: '#3b82f6',\n  borderRadius: '50%',\n  animation: 'spin 0.75s linear infinite',\n};\n\nconst emptyStateStyle: CSSProperties = {\n  textAlign: 'center',\n  padding: '2rem',\n  color: '#6b7280',\n};\n\nconst errorStateStyle: CSSProperties = {\n  textAlign: 'center',\n  padding: '2rem',\n  color: '#ef4444',\n  backgroundColor: '#fef2f2',\n  borderRadius: '0.5rem',\n};\n\nconst errorTitleStyle: CSSProperties = {\n  fontWeight: 500,\n};\n\nconst errorMessageStyle: CSSProperties = {\n  fontSize: '0.875rem',\n};\n\n// Search input style\nconst searchInputBaseStyle: CSSProperties = {\n  padding: '0.5rem 1rem',\n  borderRadius: '0.375rem',\n  border: '1px solid #d1d5db',\n  width: '100%',\n  fontSize: '0.875rem',\n};\n\n// Action toolbar loading indicator style\nconst loadingIndicatorStyle: CSSProperties = {\n  width: 16,\n  height: 16,\n};\n\n// ============================================================================\n// Generic List Component\n// ============================================================================\n\n/**\n * Generic list item type constraint\n */\nexport interface ListItemBase {\n  id: string;\n}\n\n/**\n * Generic list props\n */\nexport interface GenericListProps<T extends ListItemBase> {\n  items: T[];\n  renderItem: (item: T, isSelected: boolean, index: number) => ReactNode;\n  keyExtractor?: (item: T) => string;\n  selectedId?: string | null;\n  onSelect?: (id: string | null) => void;\n  emptyState?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n  gap?: string | number;\n  virtualized?: boolean;\n}\n\n/**\n * Generic List component - memoized inner implementation\n */\nfunction GenericListInner<T extends ListItemBase>({\n  items,\n  renderItem,\n  keyExtractor,\n  selectedId,\n  onSelect,\n  emptyState,\n  className,\n  style,\n  gap = '0.5rem',\n}: GenericListProps<T>): React.ReactElement {\n  const getKey = useCallback(\n    (item: T) => (keyExtractor ? keyExtractor(item) : item.id),\n    [keyExtractor]\n  );\n\n  // Memoize container style\n  const containerStyle = useMemo<CSSProperties>(\n    () => ({\n      display: 'flex',\n      flexDirection: 'column',\n      gap: typeof gap === 'number' ? `${gap}px` : gap,\n      ...style,\n    }),\n    [gap, style]\n  );\n\n  // Item wrapper style - memoized\n  const itemWrapperStyle = useMemo<CSSProperties>(\n    () => ({\n      cursor: onSelect !== undefined ? 'pointer' : 'default',\n    }),\n    [onSelect]\n  );\n\n  // Stable click handler using data-* attributes\n  const handleItemClick = useCallback(\n    (event: React.MouseEvent<HTMLDivElement>) => {\n      const { itemId } = event.currentTarget.dataset;\n      if (itemId != null && itemId.length > 0 && onSelect != null) {\n        onSelect(selectedId === itemId ? null : itemId);\n      }\n    },\n    [onSelect, selectedId]\n  );\n\n  if (items.length === 0 && emptyState != null) {\n    return <>{emptyState}</>;\n  }\n\n  return (\n    <div className={className} style={containerStyle}>\n      {items.map((item, index) => (\n        <div\n          key={getKey(item)}\n          data-item-id={item.id}\n          onClick={onSelect !== undefined ? handleItemClick : undefined}\n          style={itemWrapperStyle}\n        >\n          {renderItem(item, selectedId === item.id, index)}\n        </div>\n      ))}\n    </div>\n  );\n}\n\n/**\n * Memoized GenericList component with preserved generic signature\n */\nexport const GenericList = memo(GenericListInner) as <T extends ListItemBase>(\n  props: GenericListProps<T>\n) => React.ReactElement;\n\n// ============================================================================\n// Generic Detail View\n// ============================================================================\n\n/**\n * Generic detail view props\n */\nexport interface GenericDetailProps<T> {\n  item: T | null | undefined;\n  isLoading?: boolean;\n  error?: Error | null;\n  renderContent: (item: T) => ReactNode;\n  renderLoading?: () => ReactNode;\n  renderEmpty?: () => ReactNode;\n  renderError?: (error: Error) => ReactNode;\n}\n\n/**\n * Generic Detail view component - inner implementation\n */\nfunction GenericDetailInner<T>({\n  item,\n  isLoading,\n  error,\n  renderContent,\n  renderLoading,\n  renderEmpty,\n  renderError,\n}: GenericDetailProps<T>): React.ReactElement {\n  if (isLoading === true) {\n    return <>{renderLoading?.() ?? <DefaultLoadingState />}</>;\n  }\n\n  if (error != null) {\n    return <>{renderError?.(error) ?? <DefaultErrorState error={error} />}</>;\n  }\n\n  if (item == null) {\n    return <>{renderEmpty?.() ?? <DefaultEmptyState message=\"No item selected\" />}</>;\n  }\n\n  return <>{renderContent(item)}</>;\n}\n\n/**\n * Memoized GenericDetail component with preserved generic signature\n */\nexport const GenericDetail = memo(GenericDetailInner) as <T>(\n  props: GenericDetailProps<T>\n) => React.ReactElement;\n\n// ============================================================================\n// Stats Card Component\n// ============================================================================\n\n/**\n * Stats card props\n */\nexport interface StatsCardProps {\n  label: string;\n  value: string | number;\n  icon?: ReactNode;\n  trend?: {\n    value: number;\n    direction: 'up' | 'down' | 'neutral';\n  };\n  onClick?: () => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * Stats Card component - memoized for performance\n */\nexport const StatsCard = memo(\n  ({\n    label,\n    value,\n    icon,\n    trend,\n    onClick,\n    className,\n    style,\n  }: StatsCardProps): React.ReactElement => {\n    // Memoize container style based on props\n    const containerStyle = useMemo<CSSProperties>(\n      () => ({\n        padding: '1rem',\n        backgroundColor: 'var(--color-bg-primary, #fff)',\n        borderRadius: 'var(--radius-md, 0.5rem)',\n        border: '1px solid var(--color-border-default, #e5e7eb)',\n        cursor: onClick !== undefined ? 'pointer' : 'default',\n        transition: 'box-shadow 0.2s, transform 0.2s',\n        ...style,\n      }),\n      [onClick, style]\n    );\n\n    // Memoize trend style based on direction\n    const trendStyle = useMemo<CSSProperties | undefined>(() => {\n      if (trend === undefined) return undefined;\n      let color: string;\n      if (trend.direction === 'up') {\n        color = 'var(--color-success, #22c55e)';\n      } else if (trend.direction === 'down') {\n        color = 'var(--color-error, #ef4444)';\n      } else {\n        color = 'var(--color-text-muted, #6b7280)';\n      }\n      return {\n        fontSize: '0.75rem',\n        color,\n      };\n    }, [trend]);\n\n    return (\n      <div onClick={onClick} className={className} style={containerStyle}>\n        <div style={statsCardHeaderStyle}>\n          <span style={statsCardLabelStyle}>{label}</span>\n          {icon}\n        </div>\n        <p style={statsCardValueStyle}>{value}</p>\n        {trend !== undefined && (\n          <span style={trendStyle}>\n            {trend.direction === 'up' && '+'}\n            {trend.direction === 'down' && '-'}\n            {Math.abs(trend.value)}%\n          </span>\n        )}\n      </div>\n    );\n  }\n);\n\nStatsCard.displayName = 'StatsCard';\n\n// ============================================================================\n// Action Toolbar Component\n// ============================================================================\n\n/**\n * Action configuration\n */\nexport interface ActionConfig {\n  id: string;\n  label: string;\n  icon?: ReactNode;\n  onClick: () => void;\n  variant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n  disabled?: boolean;\n  loading?: boolean;\n}\n\n/**\n * Action toolbar props\n */\nexport interface ActionToolbarProps {\n  actions: ActionConfig[];\n  className?: string;\n  style?: CSSProperties;\n  size?: 'sm' | 'md' | 'lg';\n  direction?: 'horizontal' | 'vertical';\n}\n\n// Size style constants\nconst sizeStyles: Record<string, CSSProperties> = {\n  sm: { padding: '0.25rem 0.5rem', fontSize: '0.75rem' },\n  md: { padding: '0.5rem 1rem', fontSize: '0.875rem' },\n  lg: { padding: '0.75rem 1.5rem', fontSize: '1rem' },\n};\n\n// Variant style constants\nconst variantStyles: Record<string, CSSProperties> = {\n  primary: { backgroundColor: '#3b82f6', color: '#fff' },\n  secondary: { backgroundColor: '#f3f4f6', color: '#374151' },\n  danger: { backgroundColor: '#ef4444', color: '#fff' },\n  ghost: { backgroundColor: 'transparent', color: '#374151' },\n};\n\n/**\n * Action Toolbar component - memoized for performance\n */\nexport const ActionToolbar = memo(\n  ({\n    actions,\n    className,\n    style,\n    size = 'md',\n    direction = 'horizontal',\n  }: ActionToolbarProps): React.ReactElement => {\n    const getButtonStyle = useCallback(\n      (variant: ActionConfig['variant'] = 'secondary', disabled?: boolean): CSSProperties => {\n        const base: CSSProperties = {\n          ...sizeStyles[size],\n          borderRadius: '0.375rem',\n          border: 'none',\n          cursor: (disabled ?? false) ? 'not-allowed' : 'pointer',\n          opacity: (disabled ?? false) ? 0.5 : 1,\n          display: 'flex',\n          alignItems: 'center',\n          gap: '0.5rem',\n          fontWeight: 500,\n          transition: 'background-color 0.2s',\n        };\n\n        return { ...base, ...variantStyles[variant] };\n      },\n      [size]\n    );\n\n    // Memoize container style\n    const containerStyle = useMemo<CSSProperties>(\n      () => ({\n        display: 'flex',\n        flexDirection: direction === 'horizontal' ? 'row' : 'column',\n        gap: '0.5rem',\n        ...style,\n      }),\n      [direction, style]\n    );\n\n    // Stable click handler using data-* attributes\n    const handleButtonClick = useCallback(\n      (event: React.MouseEvent<HTMLButtonElement>): void => {\n        const { actionId } = event.currentTarget.dataset;\n        if (actionId !== undefined) {\n          const action = actions.find((a) => a.id === actionId);\n          if (action !== undefined) {\n            action.onClick();\n          }\n        }\n      },\n      [actions]\n    );\n\n    return (\n      <div className={className} style={containerStyle}>\n        {actions.map((action) => (\n          <button\n            key={action.id}\n            data-action-id={action.id}\n            onClick={handleButtonClick}\n            disabled={(action.disabled ?? false) || (action.loading ?? false)}\n            style={getButtonStyle(action.variant, action.disabled)}\n          >\n            {(action.loading ?? false) ? (\n              <span style={loadingIndicatorStyle}>...</span>\n            ) : (\n              action.icon\n            )}\n            {action.label}\n          </button>\n        ))}\n      </div>\n    );\n  }\n);\n\nActionToolbar.displayName = 'ActionToolbar';\n\n// ============================================================================\n// Filter Panel Component\n// ============================================================================\n\n/**\n * Filter panel props\n */\nexport interface FilterPanelProps<TFilters extends Record<string, unknown>> {\n  filters: TFilters;\n  onChange: (filters: Partial<TFilters>) => void;\n  onClear: () => void;\n  renderFilters: (\n    filters: TFilters,\n    onChange: <K extends keyof TFilters>(key: K, value: TFilters[K]) => void\n  ) => ReactNode;\n  isOpen?: boolean;\n  onToggle?: () => void;\n  title?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * Filter Panel component - inner implementation\n */\nfunction FilterPanelInner<TFilters extends Record<string, unknown>>({\n  filters,\n  onChange,\n  onClear,\n  renderFilters,\n  isOpen = true,\n  onToggle,\n  title = 'Filters',\n  className,\n  style,\n}: FilterPanelProps<TFilters>): React.ReactElement | null {\n  const handleChange = useCallback(\n    <K extends keyof TFilters>(key: K, value: TFilters[K]) => {\n      onChange({ [key]: value } as unknown as Partial<TFilters>);\n    },\n    [onChange]\n  );\n\n  const activeFilterCount = useMemo((): number => {\n    return Object.values(filters).filter((v) => v !== undefined && v !== null && v !== '').length;\n  }, [filters]);\n\n  // Memoize panel container style\n  const panelContainerStyle = useMemo<CSSProperties>(\n    () => ({\n      padding: '1rem',\n      backgroundColor: 'var(--color-bg-secondary, #f9fafb)',\n      borderRadius: 'var(--radius-md, 0.5rem)',\n      marginBottom: '1rem',\n      ...style,\n    }),\n    [style]\n  );\n\n  if (isOpen === false) {\n    return onToggle !== undefined ? (\n      <button onClick={onToggle} style={filterToggleButtonStyle}>\n        {title}\n        {activeFilterCount > 0 && <span style={filterBadgeStyle}>{activeFilterCount}</span>}\n      </button>\n    ) : null;\n  }\n\n  return (\n    <div className={className} style={panelContainerStyle}>\n      <div style={filterPanelHeaderStyle}>\n        <span style={filterTitleStyle}>\n          {title}\n          {activeFilterCount > 0 && (\n            <span style={filterActiveCountStyle}>({activeFilterCount} active)</span>\n          )}\n        </span>\n        <div style={filterActionsStyle}>\n          <button onClick={onClear} style={clearButtonStyle}>\n            Clear all\n          </button>\n          {onToggle !== undefined && (\n            <button onClick={onToggle} style={closeButtonStyle}>\n              Close\n            </button>\n          )}\n        </div>\n      </div>\n      {renderFilters(filters, handleChange)}\n    </div>\n  );\n}\n\n/**\n * Memoized FilterPanel component with preserved generic signature\n */\nexport const FilterPanel = memo(FilterPanelInner) as <TFilters extends Record<string, unknown>>(\n  props: FilterPanelProps<TFilters>\n) => React.ReactElement | null;\n\n// ============================================================================\n// Pagination Component\n// ============================================================================\n\n/**\n * Pagination props\n */\nexport interface PaginationProps {\n  currentPage: number;\n  totalPages: number;\n  pageSize: number;\n  totalItems: number;\n  onPageChange: (page: number) => void;\n  onPageSizeChange?: (pageSize: number) => void;\n  pageSizeOptions?: number[];\n  showPageSizeSelector?: boolean;\n  showItemCount?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * Pagination component - memoized for performance\n */\nexport const Pagination = memo(\n  ({\n    currentPage,\n    totalPages,\n    pageSize,\n    totalItems,\n    onPageChange,\n    onPageSizeChange,\n    pageSizeOptions = [10, 20, 50, 100],\n    showPageSizeSelector = true,\n    showItemCount = true,\n    className,\n    style,\n  }: PaginationProps): React.ReactElement => {\n    const startItem = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n    const endItem = Math.min(currentPage * pageSize, totalItems);\n\n    const pageNumbers = useMemo((): (number | 'ellipsis')[] => {\n      const pages: (number | 'ellipsis')[] = [];\n      const maxVisible = 5;\n\n      if (totalPages <= maxVisible) {\n        for (let i = 1; i <= totalPages; i++) pages.push(i);\n      } else {\n        pages.push(1);\n\n        if (currentPage > 3) pages.push('ellipsis');\n\n        const start = Math.max(2, currentPage - 1);\n        const end = Math.min(totalPages - 1, currentPage + 1);\n\n        for (let i = start; i <= end; i++) pages.push(i);\n\n        if (currentPage < totalPages - 2) pages.push('ellipsis');\n\n        pages.push(totalPages);\n      }\n\n      return pages;\n    }, [currentPage, totalPages]);\n\n    // Memoize container style\n    const containerStyle = useMemo<CSSProperties>(\n      () => ({\n        ...paginationContainerBaseStyle,\n        ...style,\n      }),\n      [style]\n    );\n\n    // Navigation button styles - memoized\n    const prevButtonStyle = useMemo<CSSProperties>(\n      () => ({\n        padding: '0.25rem 0.75rem',\n        borderRadius: '0.25rem',\n        border: '1px solid #d1d5db',\n        cursor: currentPage <= 1 ? 'not-allowed' : 'pointer',\n        opacity: currentPage <= 1 ? 0.5 : 1,\n        backgroundColor: '#fff',\n      }),\n      [currentPage]\n    );\n\n    const nextButtonStyle = useMemo<CSSProperties>(\n      () => ({\n        padding: '0.25rem 0.75rem',\n        borderRadius: '0.25rem',\n        border: '1px solid #d1d5db',\n        cursor: currentPage >= totalPages ? 'not-allowed' : 'pointer',\n        opacity: currentPage >= totalPages ? 0.5 : 1,\n        backgroundColor: '#fff',\n      }),\n      [currentPage, totalPages]\n    );\n\n    // Page button style generator - memoized\n    const getPageButtonStyle = useCallback(\n      (page: number): CSSProperties => ({\n        padding: '0.25rem 0.5rem',\n        borderRadius: '0.25rem',\n        border: '1px solid',\n        borderColor: page === currentPage ? '#3b82f6' : '#d1d5db',\n        backgroundColor: page === currentPage ? '#3b82f6' : '#fff',\n        color: page === currentPage ? '#fff' : '#374151',\n        cursor: 'pointer',\n        minWidth: '2rem',\n      }),\n      [currentPage]\n    );\n\n    // Stable page change handlers\n    const handlePrevClick = useCallback(() => {\n      onPageChange(currentPage - 1);\n    }, [onPageChange, currentPage]);\n\n    const handleNextClick = useCallback(() => {\n      onPageChange(currentPage + 1);\n    }, [onPageChange, currentPage]);\n\n    // Stable page number click handler using data-* attributes\n    const handlePageClick = useCallback(\n      (event: React.MouseEvent<HTMLButtonElement>): void => {\n        const { page } = event.currentTarget.dataset;\n        if (page !== undefined) {\n          onPageChange(Number(page));\n        }\n      },\n      [onPageChange]\n    );\n\n    // Stable page size change handler\n    const handlePageSizeChange = useCallback(\n      (event: React.ChangeEvent<HTMLSelectElement>) => {\n        onPageSizeChange?.(Number(event.target.value));\n      },\n      [onPageSizeChange]\n    );\n\n    return (\n      <div className={className} style={containerStyle}>\n        {showItemCount === true && (\n          <span style={paginationInfoStyle}>\n            Showing {startItem}-{endItem} of {totalItems}\n          </span>\n        )}\n\n        <div style={paginationControlsStyle}>\n          {showPageSizeSelector === true && onPageSizeChange !== undefined && (\n            <select value={pageSize} onChange={handlePageSizeChange} style={selectStyle}>\n              {pageSizeOptions.map((size) => (\n                <option key={size} value={size}>\n                  {size} per page\n                </option>\n              ))}\n            </select>\n          )}\n\n          <button onClick={handlePrevClick} disabled={currentPage <= 1} style={prevButtonStyle}>\n            Previous\n          </button>\n\n          <div style={paginationButtonsContainerStyle}>\n            {pageNumbers.map((page, index) =>\n              page === 'ellipsis' ? (\n                <span key={`ellipsis-${index}`} style={ellipsisStyle}>\n                  ...\n                </span>\n              ) : (\n                <button\n                  key={page}\n                  data-page={page}\n                  onClick={handlePageClick}\n                  style={getPageButtonStyle(page)}\n                >\n                  {page}\n                </button>\n              )\n            )}\n          </div>\n\n          <button\n            onClick={handleNextClick}\n            disabled={currentPage >= totalPages}\n            style={nextButtonStyle}\n          >\n            Next\n          </button>\n        </div>\n      </div>\n    );\n  }\n);\n\nPagination.displayName = 'Pagination';\n\n// ============================================================================\n// Default State Components\n// ============================================================================\n\nconst DefaultLoadingState = memo((): React.ReactElement => {\n  return (\n    <div style={loadingContainerStyle}>\n      <div style={spinnerStyle} />\n      <style>\n        {`\n          @keyframes spin {\n            to { transform: rotate(360deg); }\n          }\n        `}\n      </style>\n    </div>\n  );\n});\n\nDefaultLoadingState.displayName = 'DefaultLoadingState';\n\nconst DefaultEmptyState = memo(({ message }: { message: string }): React.ReactElement => {\n  return (\n    <div style={emptyStateStyle}>\n      <p>{message}</p>\n    </div>\n  );\n});\n\nDefaultEmptyState.displayName = 'DefaultEmptyState';\n\nconst DefaultErrorState = memo(({ error }: { error: Error }): React.ReactElement => {\n  return (\n    <div style={errorStateStyle}>\n      <p style={errorTitleStyle}>Error</p>\n      <p style={errorMessageStyle}>{error.message}</p>\n    </div>\n  );\n});\n\nDefaultErrorState.displayName = 'DefaultErrorState';\n\n// ============================================================================\n// Search Input Component\n// ============================================================================\n\n/**\n * Search input props\n */\nexport interface SearchInputProps {\n  value: string;\n  onChange: (value: string) => void;\n  placeholder?: string;\n  debounceMs?: number;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * Search Input component with debouncing - memoized for performance\n */\nexport const SearchInput = memo(\n  ({\n    value,\n    onChange,\n    placeholder = 'Search...',\n    debounceMs = 300,\n    className,\n    style,\n  }: SearchInputProps): React.ReactElement => {\n    const [localValue, setLocalValue] = useState(value);\n\n    // Memoize input style\n    const inputStyle = useMemo<CSSProperties>(\n      () => ({\n        ...searchInputBaseStyle,\n        ...style,\n      }),\n      [style]\n    );\n\n    React.useEffect(() => {\n      const timer = setTimeout(() => {\n        if (localValue !== value) {\n          onChange(localValue);\n        }\n      }, debounceMs);\n\n      return (): void => clearTimeout(timer);\n    }, [localValue, debounceMs, onChange, value]);\n\n    React.useEffect(() => {\n      setLocalValue(value);\n    }, [value]);\n\n    // Stable change handler\n    const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>): void => {\n      setLocalValue(e.target.value);\n    }, []);\n\n    return (\n      <input\n        type=\"text\"\n        value={localValue}\n        onChange={handleChange}\n        placeholder={placeholder}\n        className={className}\n        style={inputStyle}\n      />\n    );\n  }\n);\n\nSearchInput.displayName = 'SearchInput';\n"],"names":["statsCardHeaderStyle","statsCardLabelStyle","statsCardValueStyle","filterToggleButtonStyle","filterBadgeStyle","filterPanelHeaderStyle","filterTitleStyle","filterActiveCountStyle","filterActionsStyle","clearButtonStyle","closeButtonStyle","paginationContainerBaseStyle","paginationInfoStyle","paginationControlsStyle","selectStyle","paginationButtonsContainerStyle","ellipsisStyle","loadingContainerStyle","spinnerStyle","emptyStateStyle","errorStateStyle","errorTitleStyle","errorMessageStyle","searchInputBaseStyle","loadingIndicatorStyle","GenericListInner","items","renderItem","keyExtractor","selectedId","onSelect","emptyState","className","style","gap","getKey","useCallback","item","containerStyle","useMemo","itemWrapperStyle","handleItemClick","event","itemId","jsx","index","GenericList","memo","GenericDetailInner","isLoading","error","renderContent","renderLoading","renderEmpty","renderError","Fragment","DefaultLoadingState","DefaultErrorState","DefaultEmptyState","GenericDetail","StatsCard","label","value","icon","trend","onClick","trendStyle","color","jsxs","sizeStyles","variantStyles","ActionToolbar","actions","size","direction","getButtonStyle","variant","disabled","handleButtonClick","actionId","action","a","FilterPanelInner","filters","onChange","onClear","renderFilters","isOpen","onToggle","title","handleChange","key","activeFilterCount","v","panelContainerStyle","FilterPanel","Pagination","currentPage","totalPages","pageSize","totalItems","onPageChange","onPageSizeChange","pageSizeOptions","showPageSizeSelector","showItemCount","startItem","endItem","pageNumbers","pages","i","start","end","prevButtonStyle","nextButtonStyle","getPageButtonStyle","page","handlePrevClick","handleNextClick","handlePageClick","handlePageSizeChange","message","SearchInput","placeholder","debounceMs","localValue","setLocalValue","useState","inputStyle","React","timer","e"],"mappings":"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"}