@mieweb/ui 0.11.0-dev.5 → 0.11.0-dev.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/ag-grid.cjs +11 -2
  2. package/dist/ag-grid.cjs.map +1 -1
  3. package/dist/ag-grid.d.cts +8 -0
  4. package/dist/ag-grid.d.ts +8 -0
  5. package/dist/ag-grid.js +11 -2
  6. package/dist/ag-grid.js.map +1 -1
  7. package/dist/{chunk-IJYTASQQ.cjs → chunk-3AD4HFYI.cjs} +15 -7
  8. package/dist/chunk-3AD4HFYI.cjs.map +1 -0
  9. package/dist/{chunk-CFI3TQMA.cjs → chunk-56C7K4MV.cjs} +9 -4
  10. package/dist/chunk-56C7K4MV.cjs.map +1 -0
  11. package/dist/{chunk-TNUL4LGG.js → chunk-5ILCNY74.js} +15 -7
  12. package/dist/chunk-5ILCNY74.js.map +1 -0
  13. package/dist/{chunk-VJQSMFZW.cjs → chunk-5K7PRPSV.cjs} +3 -2
  14. package/dist/chunk-5K7PRPSV.cjs.map +1 -0
  15. package/dist/{chunk-QQCHM7BZ.cjs → chunk-5VA2HJ5B.cjs} +6 -6
  16. package/dist/{chunk-QQCHM7BZ.cjs.map → chunk-5VA2HJ5B.cjs.map} +1 -1
  17. package/dist/{chunk-JWPBFX6Y.js → chunk-EBQG3NGT.js} +3 -2
  18. package/dist/chunk-EBQG3NGT.js.map +1 -0
  19. package/dist/{chunk-7IBZA7G6.js → chunk-I6Y2KLTZ.js} +5 -2
  20. package/dist/chunk-I6Y2KLTZ.js.map +1 -0
  21. package/dist/{chunk-OHKO5THF.cjs → chunk-MGFRGPWI.cjs} +3 -2
  22. package/dist/chunk-MGFRGPWI.cjs.map +1 -0
  23. package/dist/{chunk-VYNFJVRZ.js → chunk-N6XBE47W.js} +3 -3
  24. package/dist/{chunk-VYNFJVRZ.js.map → chunk-N6XBE47W.js.map} +1 -1
  25. package/dist/{chunk-T5BBZQ66.js → chunk-OTIKWEFZ.js} +9 -4
  26. package/dist/chunk-OTIKWEFZ.js.map +1 -0
  27. package/dist/{chunk-ZSGEGISB.cjs → chunk-PHUTJKHL.cjs} +5 -2
  28. package/dist/chunk-PHUTJKHL.cjs.map +1 -0
  29. package/dist/{chunk-XOIIUO6O.js → chunk-QDNHN7R2.js} +3 -2
  30. package/dist/chunk-QDNHN7R2.js.map +1 -0
  31. package/dist/components/CountryCodeDropdown/index.cjs +4 -4
  32. package/dist/components/CountryCodeDropdown/index.js +1 -1
  33. package/dist/components/DateInput/index.cjs +2 -2
  34. package/dist/components/DateInput/index.js +1 -1
  35. package/dist/components/PhoneInput/index.cjs +3 -3
  36. package/dist/components/PhoneInput/index.js +1 -1
  37. package/dist/components/Table/index.cjs +9 -9
  38. package/dist/components/Table/index.d.cts +17 -1
  39. package/dist/components/Table/index.d.ts +17 -1
  40. package/dist/components/Table/index.js +1 -1
  41. package/dist/esheet.cjs +5 -5
  42. package/dist/esheet.js +2 -2
  43. package/dist/index.cjs +104 -103
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +17 -1
  46. package/dist/index.d.ts +17 -1
  47. package/dist/index.js +11 -10
  48. package/dist/index.js.map +1 -1
  49. package/dist/tailwind-preset.cjs +4 -4
  50. package/dist/tailwind-preset.js +1 -1
  51. package/package.json +1 -1
  52. package/dist/chunk-7IBZA7G6.js.map +0 -1
  53. package/dist/chunk-CFI3TQMA.cjs.map +0 -1
  54. package/dist/chunk-IJYTASQQ.cjs.map +0 -1
  55. package/dist/chunk-JWPBFX6Y.js.map +0 -1
  56. package/dist/chunk-OHKO5THF.cjs.map +0 -1
  57. package/dist/chunk-T5BBZQ66.js.map +0 -1
  58. package/dist/chunk-TNUL4LGG.js.map +0 -1
  59. package/dist/chunk-VJQSMFZW.cjs.map +0 -1
  60. package/dist/chunk-XOIIUO6O.js.map +0 -1
  61. package/dist/chunk-ZSGEGISB.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AGGrid/AGGrid.tsx","../src/components/AGGrid/CellRenderers.tsx"],"names":["jsx","formatted"],"mappings":"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","file":"ag-grid.js","sourcesContent":["import * as React from 'react';\nimport { AgGridReact, AgGridReactProps } from 'ag-grid-react';\nimport {\n ModuleRegistry,\n AllCommunityModule,\n type GridApi,\n type GridReadyEvent,\n type ColDef as AGColDef,\n type RowClickedEvent,\n type RowSelectionOptions,\n} from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { BrandConfig } from '../../brands/types';\n\n// Register AG Grid Community modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n// ============================================================================\n// AG Grid Wrapper Styles\n// ============================================================================\n\nconst agGridVariants = cva('ag-theme-custom w-full', {\n variants: {\n /**\n * Visual variant of the grid\n */\n variant: {\n default: '',\n bordered:\n '[&_.ag-root-wrapper]:border [&_.ag-root-wrapper]:border-border [&_.ag-root-wrapper]:rounded-lg',\n striped: '[&_.ag-row-odd]:bg-muted/50',\n card: '[&_.ag-root-wrapper]:shadow-card [&_.ag-root-wrapper]:rounded-lg [&_.ag-root-wrapper]:border-0',\n },\n /**\n * Size/density of the grid rows\n */\n size: {\n xs: '[&_.ag-row]:h-7 [&_.ag-header-row]:h-7 text-xs [&_.ag-cell]:px-2',\n sm: '[&_.ag-row]:h-8 [&_.ag-header-row]:h-8 text-xs [&_.ag-cell]:px-3',\n md: '[&_.ag-row]:h-10 [&_.ag-header-row]:h-10 text-sm [&_.ag-cell]:px-4',\n lg: '[&_.ag-row]:h-12 [&_.ag-header-row]:h-12 text-base [&_.ag-cell]:px-4',\n xl: '[&_.ag-row]:h-14 [&_.ag-header-row]:h-14 text-base [&_.ag-cell]:px-6',\n },\n /**\n * Brand theme variant\n */\n brand: {\n default: '',\n mieweb: 'ag-brand-mieweb',\n bluehive: 'ag-brand-bluehive',\n waggleline: 'ag-brand-waggleline',\n webchart: 'ag-brand-webchart',\n 'enterprise-health': 'ag-brand-enterprise-health',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n brand: 'default',\n },\n});\n\n// ============================================================================\n// AG Grid Component Types\n// ============================================================================\n\nexport interface AGGridProps<TData = unknown>\n extends\n Omit<AgGridReactProps<TData>, 'className' | 'rowSelection'>,\n VariantProps<typeof agGridVariants> {\n /** Additional CSS classes for the grid container */\n className?: string;\n /** Height of the grid container */\n height?: string | number;\n /** Loading state */\n loading?: boolean;\n /** Callback when a row is clicked */\n onRowClick?: (event: RowClickedEvent<TData>) => void;\n /** Reference to access the grid API */\n gridRef?: React.RefObject<AgGridReact<TData> | null>;\n /** Row selection configuration (v35+ object format or legacy string) */\n rowSelection?: RowSelectionOptions | 'single' | 'multiple';\n /** Brand configuration for theming */\n brandConfig?: BrandConfig;\n /** Show pagination controls */\n pagination?: boolean;\n /** Enable column resizing */\n resizable?: boolean;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable filtering */\n filterable?: boolean;\n /** Custom empty state message */\n noDataMessage?: string;\n /** Custom loading message */\n loadingMessage?: string;\n}\n\n// ============================================================================\n// Default Column Definitions\n// ============================================================================\n\n// Size to pixel height mapping for AG Grid (row heights + default container heights)\nconst sizeToRowHeight: Record<\n string,\n { rowHeight: number; headerHeight: number; containerHeight: number }\n> = {\n xs: { rowHeight: 28, headerHeight: 28, containerHeight: 280 },\n sm: { rowHeight: 32, headerHeight: 32, containerHeight: 320 },\n md: { rowHeight: 40, headerHeight: 40, containerHeight: 400 },\n lg: { rowHeight: 48, headerHeight: 48, containerHeight: 480 },\n xl: { rowHeight: 56, headerHeight: 56, containerHeight: 560 },\n};\n\n// Enhanced default column definitions with brand awareness\nconst getDefaultColDef = (\n sortable: boolean,\n filterable: boolean,\n resizable: boolean\n): AGColDef => ({\n sortable,\n filter: filterable,\n resizable,\n minWidth: 100,\n flex: 1,\n suppressMovable: false,\n headerClass: 'ag-header-cell-custom',\n cellClass: 'ag-cell-custom',\n});\n\n// ============================================================================\n// AG Grid Component\n// ============================================================================\n\n// Warn once per session (dev builds only) that AGGrid is deprecated.\n// Bundlers replace `process.env.NODE_ENV` at build time, so this entire\n// branch is dead-code-eliminated from production bundles.\nlet didWarnDeprecated = false;\nfunction warnDeprecatedOnce() {\n if (process.env.NODE_ENV === 'production' || didWarnDeprecated) return;\n didWarnDeprecated = true;\n console.warn(\n '[@mieweb/ui] AGGrid is deprecated. Use DataVis NITRO (@mieweb/ui/datavis) for all tables.'\n );\n}\n\n/**\n * A themed AG Grid wrapper component that integrates with the MIE Web UI design system.\n *\n * @deprecated Use DataVis NITRO (`@mieweb/ui/datavis`) for all tables. AGGrid\n * will be removed in a future major release.\n *\n * This component wraps AG Grid Community Edition and provides:\n * - Consistent theming with CSS variables\n * - Size variants (sm, md, lg)\n * - Visual variants (default, bordered, striped)\n * - Loading states\n * - Simplified API while maintaining full AG Grid capabilities\n *\n * @example\n * ```tsx\n * const columnDefs = [\n * { field: 'name', headerName: 'Name' },\n * { field: 'email', headerName: 'Email' },\n * { field: 'status', headerName: 'Status' },\n * ];\n *\n * const rowData = [\n * { name: 'John Doe', email: 'john@example.com', status: 'Active' },\n * { name: 'Jane Smith', email: 'jane@example.com', status: 'Pending' },\n * ];\n *\n * <AGGrid\n * columnDefs={columnDefs}\n * rowData={rowData}\n * variant=\"bordered\"\n * size=\"md\"\n * />\n * ```\n */\nfunction AGGridInner<TData = unknown>(\n {\n className,\n variant,\n size,\n brand,\n height,\n loading = false,\n columnDefs,\n rowData,\n defaultColDef: userDefaultColDef,\n onGridReady,\n onRowClick,\n gridRef,\n rowSelection,\n brandConfig,\n pagination = false,\n resizable = true,\n sortable = true,\n filterable = true,\n noDataMessage = 'No data to display',\n loadingMessage = 'Loading...',\n ...props\n }: AGGridProps<TData>,\n ref: React.ForwardedRef<AgGridReact<TData>>\n) {\n const internalRef = React.useRef<AgGridReact<TData>>(null);\n const gridApiRef = React.useRef<GridApi<TData> | null>(null);\n\n React.useEffect(() => {\n warnDeprecatedOnce();\n }, []);\n\n // Use provided ref or internal ref\n const resolvedRef = gridRef || ref || internalRef;\n\n // Handle grid ready\n const handleGridReady = React.useCallback(\n (event: GridReadyEvent<TData>) => {\n gridApiRef.current = event.api;\n onGridReady?.(event);\n },\n [onGridReady]\n );\n\n // Handle row click\n const handleRowClicked = React.useCallback(\n (event: RowClickedEvent<TData>) => {\n onRowClick?.(event);\n },\n [onRowClick]\n );\n\n // Merge default column definitions with feature toggles\n const mergedDefaultColDef = React.useMemo(\n () =>\n ({\n ...getDefaultColDef(sortable, filterable, resizable),\n ...userDefaultColDef,\n }) as AGColDef<TData>,\n [userDefaultColDef, sortable, filterable, resizable]\n );\n\n // Convert legacy rowSelection string to v35+ object format\n const resolvedRowSelection = React.useMemo(():\n | RowSelectionOptions\n | undefined => {\n if (!rowSelection) return undefined;\n\n // If already in object format, use as-is\n if (typeof rowSelection === 'object') {\n return rowSelection;\n }\n\n // Convert legacy string format to v35+ object format\n if (rowSelection === 'multiple') {\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n };\n }\n\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true,\n };\n }\n\n return undefined;\n }, [rowSelection]);\n\n // Show loading overlay when loading prop changes\n React.useEffect(() => {\n if (gridApiRef.current) {\n if (loading) {\n gridApiRef.current.showLoadingOverlay();\n } else {\n gridApiRef.current.hideOverlay();\n }\n }\n }, [loading]);\n\n // Get row/header heights based on size prop\n const sizeConfig = sizeToRowHeight[size || 'md'];\n\n // Use provided height or default based on size\n const resolvedHeight = height ?? sizeConfig.containerHeight;\n\n return (\n <div\n data-slot=\"ag-grid\"\n className={cn(agGridVariants({ variant, size, brand }), className)}\n style={{\n height:\n typeof resolvedHeight === 'number'\n ? `${resolvedHeight}px`\n : resolvedHeight,\n ...(brandConfig &&\n ({\n '--ag-primary-color': brandConfig.colors.primary[600],\n '--ag-font-family':\n brandConfig.typography.fontFamily.sans.join(', '),\n } as React.CSSProperties)),\n }}\n data-brand={brand}\n >\n <AgGridReact<TData>\n ref={resolvedRef as React.RefObject<AgGridReact<TData>>}\n columnDefs={columnDefs}\n rowData={rowData}\n defaultColDef={mergedDefaultColDef}\n onGridReady={handleGridReady}\n onRowClicked={handleRowClicked}\n animateRows={true}\n enableBrowserTooltips={true}\n rowSelection={resolvedRowSelection}\n pagination={pagination}\n paginationPageSize={pagination ? 50 : undefined}\n paginationPageSizeSelector={pagination ? [25, 50, 100, 200] : undefined}\n rowHeight={sizeConfig.rowHeight}\n headerHeight={sizeConfig.headerHeight}\n noRowsOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {noDataMessage}\n </div>\n )}\n loadingOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {loadingMessage}\n </div>\n )}\n theme=\"legacy\"\n {...props}\n />\n </div>\n );\n}\n\n// Forward ref with generic support\n/**\n * @deprecated Use DataVis NITRO (`@mieweb/ui/datavis`) for all tables. AGGrid\n * will be removed in a future major release.\n */\nexport const AGGrid = React.forwardRef(AGGridInner) as <TData = unknown>(\n props: AGGridProps<TData> & { ref?: React.ForwardedRef<AgGridReact<TData>> }\n) => React.ReactElement;\n\n// Display name for debugging\n(AGGrid as React.FC).displayName = 'AGGrid';\n\n// ============================================================================\n// Re-export AG Grid types for convenience\n// ============================================================================\n\n// Export ColDef with the original name for external use\nexport type { ColDef as AGColDef } from 'ag-grid-community';\n\n// Also export as ColDef for convenience\nexport type ColDef<TData = unknown, TValue = unknown> = AGColDef<TData, TValue>;\n\nexport type {\n GridApi,\n GridReadyEvent,\n RowClickedEvent,\n CellClickedEvent,\n CellValueChangedEvent,\n SelectionChangedEvent,\n FilterChangedEvent,\n SortChangedEvent,\n RowSelectedEvent,\n FirstDataRenderedEvent,\n} from 'ag-grid-community';\n\nexport { AgGridReact } from 'ag-grid-react';\n","/**\n * AG Grid Cell Renderers\n *\n * Rich, visually appealing cell renderers for AG Grid tables.\n * Based on Waggleline's production-tested implementations with\n * full dark mode support and design system integration.\n *\n * All renderers are memoized with React.memo for performance optimization.\n */\n\nimport * as React from 'react';\nimport { memo } from 'react';\nimport type { ICellRendererParams } from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport {\n MailIcon,\n PhoneIcon,\n GlobeIcon,\n CheckCircleIcon,\n ClockIcon,\n} from '../Icons';\nimport { Linkedin } from 'lucide-react';\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get a nested value from an object using dot notation (e.g., 'company.domain')\n */\nfunction getNestedValue(\n obj: Record<string, unknown> | undefined | null,\n path: string\n): unknown {\n if (!obj || !path) return undefined;\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Get favicon URL from a domain using Google's favicon service\n */\nfunction getFaviconUrl(domain: string | null | undefined): string | null {\n if (!domain || typeof domain !== 'string') return null;\n const cleanDomain = domain\n .replace(/^https?:\\/\\//, '')\n .split('/')[0]\n .trim();\n if (!cleanDomain) return null;\n return `https://www.google.com/s2/favicons?domain=${cleanDomain}&sz=64`;\n}\n\n/**\n * Format a phone number with dashes for display\n */\nexport function formatPhoneDisplay(phone: string | null | undefined): string {\n if (!phone) return '';\n const cleaned = phone.replace(/\\D/g, '');\n if (cleaned.length === 10) {\n return `${cleaned.slice(0, 3)}-${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;\n }\n if (cleaned.length === 11 && cleaned.startsWith('1')) {\n return `${cleaned[0]}-${cleaned.slice(1, 4)}-${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;\n }\n return phone;\n}\n\n/**\n * Generate initials from a name\n */\nfunction getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '??';\n const parts = name.split(' ').filter(Boolean);\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n}\n\n/**\n * Generate a consistent avatar color based on a name\n */\nfunction getAvatarColor(name: string): string {\n const colors = [\n 'bg-primary-800',\n 'bg-green-600',\n 'bg-orange-600',\n 'bg-secondary-600',\n 'bg-pink-600',\n 'bg-primary-700',\n 'bg-teal-600',\n 'bg-amber-600',\n ];\n if (!name || typeof name !== 'string') return colors[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n}\n\n/**\n * Custom comparison function for AG Grid cell renderers.\n */\nfunction cellRendererPropsAreEqual(\n prevProps: ICellRendererParams,\n nextProps: ICellRendererParams\n): boolean {\n if (prevProps.value !== nextProps.value) return false;\n if (prevProps.data !== nextProps.data) return false;\n if (prevProps.node?.rowIndex !== nextProps.node?.rowIndex) return false;\n return true;\n}\n\n// =============================================================================\n// Status Configuration Types\n// =============================================================================\n\nexport interface StatusConfig {\n label: string;\n bgClass: string;\n textClass: string;\n iconName?: string;\n}\n\n// =============================================================================\n// Default Status Colors\n// =============================================================================\n\nexport const statusColors: Record<string, StatusConfig> = {\n active: {\n label: 'Active',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n inactive: {\n label: 'Inactive',\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n },\n closed_won: {\n label: 'Closed Won',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n closed_lost: {\n label: 'Closed Lost',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n pending: {\n label: 'Pending',\n bgClass: 'bg-amber-100 dark:bg-amber-900/30',\n textClass: 'text-amber-700 dark:text-amber-400',\n },\n new: {\n label: 'New',\n bgClass: 'bg-primary-100 dark:bg-primary-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n verified: {\n label: 'Verified',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n flagged: {\n label: 'Flagged',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n};\n\n// =============================================================================\n// Avatar Name Renderer\n// =============================================================================\n\ninterface AvatarNameRendererProps extends ICellRendererParams {\n avatarField?: string;\n domainField?: string;\n}\n\n/**\n * Renders an avatar with name, suitable for contact/owner columns\n */\nexport function AvatarNameRenderer(\n props: AvatarNameRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!data && !value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayName = typeof value === 'string' && value ? value : 'Unknown';\n const isSystemValue = ['Unknown', 'Unassigned', 'System'].includes(\n displayName\n );\n\n const avatarUrl =\n props.avatarField && data\n ? (getNestedValue(data, props.avatarField) as string | undefined)\n : data?.avatarUrl;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n const initials = getInitials(displayName);\n const imageUrl = avatarUrl || faviconUrl;\n\n if (isSystemValue) {\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"dark:text-muted-foreground flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700\">\n {displayName === 'Unassigned' ? '—' : '??'}\n </div>\n <span className=\"dark:text-muted-foreground truncate text-gray-400 italic\">\n {displayName}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={displayName}\n className=\"h-7 w-7 rounded-full bg-white object-cover ring-2 ring-white dark:ring-gray-700\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold text-white',\n getAvatarColor(displayName)\n )}\n style={{ display: imageUrl ? 'none' : 'flex' }}\n >\n {initials}\n </div>\n <span className=\"text-foreground truncate font-medium\">\n {displayName}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Status Badge Renderer\n// =============================================================================\n\nexport interface StatusBadgeRendererProps extends ICellRendererParams {\n /** Custom status color configuration */\n statusConfig?: Record<string, StatusConfig>;\n}\n\n/**\n * Renders a colorful status badge\n */\nexport function StatusBadgeRenderer(\n props: StatusBadgeRendererProps\n): React.ReactElement {\n const { value, statusConfig = statusColors } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const normalizedValue = String(value).toLowerCase().replace(/\\s+/g, '_');\n const config = statusConfig[normalizedValue] || {\n label: value,\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n config.bgClass,\n config.textClass\n )}\n >\n {config.label}\n </span>\n );\n}\n\n// =============================================================================\n// Engagement Score Renderer\n// =============================================================================\n\n/**\n * Get engagement score colors based on threshold\n */\nfunction getEngagementScoreColors(score: number): {\n barColor: string;\n textColor: string;\n} {\n if (score >= 70)\n return {\n barColor: 'bg-green-500',\n textColor: 'text-green-700 dark:text-green-400',\n };\n if (score >= 40)\n return {\n barColor: 'bg-amber-500',\n textColor: 'text-amber-700 dark:text-amber-400',\n };\n if (score >= 20)\n return {\n barColor: 'bg-orange-500',\n textColor: 'text-orange-700 dark:text-orange-400',\n };\n return {\n barColor: 'bg-gray-400',\n textColor: 'text-muted-foreground',\n };\n}\n\n/**\n * Renders engagement score with color-coded progress bar\n */\nexport function EngagementScoreRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const score = Number(value);\n const percentage = Math.min(100, Math.max(0, score));\n const { barColor, textColor } = getEngagementScoreColors(score);\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-1.5 w-16 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className={cn('text-sm font-medium', textColor)}>{score}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Email Renderer\n// =============================================================================\n\n/**\n * Renders email with mailto link\n */\nexport function EmailRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={`mailto:${value}`}\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <MailIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{value}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Phone Renderer\n// =============================================================================\n\n/**\n * Renders phone with click-to-call\n */\nexport function PhoneRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayValue = formatPhoneDisplay(value);\n\n return (\n <a\n href={`tel:${value}`}\n className=\"text-foreground hover:text-primary-800 dark:hover:text-primary-400 inline-flex items-center gap-1.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <PhoneIcon className=\"h-3 w-3 text-green-500 opacity-70\" />\n <span>{displayValue}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Link Renderers\n// =============================================================================\n\n/**\n * Renders a domain/website URL with icon\n */\nexport function DomainRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const url = value.startsWith('http') ? value : `https://${value}`;\n const displayDomain = value.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <GlobeIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{displayDomain}</span>\n </a>\n );\n}\n\n/**\n * Renders a LinkedIn URL with icon\n */\nexport function LinkedInRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-[#0A66C2] hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <Linkedin className=\"h-4 w-4\" />\n <span className=\"truncate text-sm\">LinkedIn</span>\n </a>\n );\n}\n\n// =============================================================================\n// Currency Renderer\n// =============================================================================\n\n/**\n * Renders currency with proper formatting\n */\nexport function CurrencyRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n\n return (\n <span className=\"text-foreground font-medium tabular-nums\">\n {formatted}\n </span>\n );\n}\n\n// =============================================================================\n// Number Renderer\n// =============================================================================\n\n/**\n * Renders number with comma formatting\n */\nexport function NumberRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = Number(value).toLocaleString();\n\n return <span className=\"text-foreground tabular-nums\">{formatted}</span>;\n}\n\n// =============================================================================\n// Date Renderer\n// =============================================================================\n\nexport interface DateRendererProps extends ICellRendererParams {\n format?: 'short' | 'medium' | 'long' | 'relative' | 'datetime';\n}\n\n/**\n * Renders date with formatting options\n */\nexport function DateRenderer(props: DateRendererProps): React.ReactElement {\n const { value, format = 'medium' } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n if (format === 'relative') {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n let relativeText: string;\n if (days === 0) {\n relativeText = 'Today';\n } else if (days === 1) {\n relativeText = 'Yesterday';\n } else if (days < 7) {\n relativeText = `${days} days ago`;\n } else if (days < 30) {\n const weeks = Math.floor(days / 7);\n relativeText = `${weeks} week${weeks > 1 ? 's' : ''} ago`;\n } else if (days < 365) {\n const months = Math.floor(days / 30);\n relativeText = `${months} month${months > 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(days / 365);\n relativeText = `${years} year${years > 1 ? 's' : ''} ago`;\n }\n\n return <span className=\"text-muted-foreground\">{relativeText}</span>;\n }\n\n const dateOptions: Intl.DateTimeFormatOptions =\n format === 'short'\n ? { month: 'numeric', day: 'numeric' }\n : format === 'long'\n ? { month: 'long', day: 'numeric', year: 'numeric' }\n : { month: 'short', day: 'numeric', year: 'numeric' };\n\n if (format === 'datetime') {\n const formatted = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n return <span className=\"text-foreground\">{formatted}</span>;\n }\n\n const formatted = date.toLocaleDateString('en-US', dateOptions);\n\n return <span className=\"text-foreground\">{formatted}</span>;\n}\n\n// =============================================================================\n// Boolean/Yes-No Renderer\n// =============================================================================\n\n/**\n * Renders boolean as styled Yes/No badge\n */\nexport function BooleanRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const isTrue = Boolean(value);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n isTrue\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300'\n )}\n >\n {isTrue ? (\n <CheckCircleIcon className=\"h-3 w-3\" />\n ) : (\n <ClockIcon className=\"h-3 w-3\" />\n )}\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n}\n\n// =============================================================================\n// Company Renderer\n// =============================================================================\n\ninterface CompanyRendererProps extends ICellRendererParams {\n companyIdField?: string;\n domainField?: string;\n}\n\n/**\n * Renders company name with favicon\n */\nexport function CompanyRenderer(\n props: CompanyRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n {faviconUrl ? (\n <img\n src={faviconUrl}\n alt={value}\n className=\"h-5 w-5 rounded bg-white object-contain\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className=\"bg-primary-100 text-primary-800 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold\"\n style={{ display: faviconUrl ? 'none' : 'flex' }}\n >\n {getInitials(value)}\n </div>\n <span className=\"truncate font-medium\">{value}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Progress Renderer\n// =============================================================================\n\nexport interface ProgressRendererProps extends ICellRendererParams {\n /** Color of the progress bar */\n barColor?: string;\n /** Maximum value (default 100) */\n max?: number;\n}\n\n/**\n * Renders a progress bar\n */\nexport function ProgressRenderer(\n props: ProgressRendererProps\n): React.ReactElement {\n const { value, barColor = 'bg-primary-800', max = 100 } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const percentage = Math.min(100, Math.max(0, (Number(value) / max) * 100));\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-2 w-20 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium\">\n {Math.round(percentage)}%\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Tags Renderer\n// =============================================================================\n\n/**\n * Renders an array of tags as badges\n */\nexport function TagsRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value || !Array.isArray(value) || value.length === 0) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {value.slice(0, 3).map((tag: string, index: number) => (\n <span\n key={index}\n className=\"text-foreground inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium dark:bg-gray-800\"\n >\n {tag}\n </span>\n ))}\n {value.length > 3 && (\n <span className=\"text-muted-foreground text-xs\">\n +{value.length - 3}\n </span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Memoized Renderer Exports (for performance)\n// =============================================================================\n\nexport const MemoizedAvatarNameRenderer = memo(\n AvatarNameRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedStatusBadgeRenderer = memo(\n StatusBadgeRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEngagementScoreRenderer = memo(\n EngagementScoreRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEmailRenderer = memo(\n EmailRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedPhoneRenderer = memo(\n PhoneRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedLinkedInRenderer = memo(\n LinkedInRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDomainRenderer = memo(\n DomainRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCurrencyRenderer = memo(\n CurrencyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedNumberRenderer = memo(\n NumberRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDateRenderer = memo(\n DateRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedBooleanRenderer = memo(\n BooleanRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCompanyRenderer = memo(\n CompanyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedProgressRenderer = memo(\n ProgressRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedTagsRenderer = memo(\n TagsRenderer,\n cellRendererPropsAreEqual\n);\n\n// =============================================================================\n// Default Export\n// =============================================================================\n\nexport const CellRenderers = {\n // Original renderers\n AvatarNameRenderer,\n StatusBadgeRenderer,\n EngagementScoreRenderer,\n EmailRenderer,\n PhoneRenderer,\n LinkedInRenderer,\n DomainRenderer,\n CurrencyRenderer,\n NumberRenderer,\n DateRenderer,\n BooleanRenderer,\n CompanyRenderer,\n ProgressRenderer,\n TagsRenderer,\n\n // Memoized renderers (recommended for performance)\n MemoizedAvatarNameRenderer,\n MemoizedStatusBadgeRenderer,\n MemoizedEngagementScoreRenderer,\n MemoizedEmailRenderer,\n MemoizedPhoneRenderer,\n MemoizedLinkedInRenderer,\n MemoizedDomainRenderer,\n MemoizedCurrencyRenderer,\n MemoizedNumberRenderer,\n MemoizedDateRenderer,\n MemoizedBooleanRenderer,\n MemoizedCompanyRenderer,\n MemoizedProgressRenderer,\n MemoizedTagsRenderer,\n\n // Utility functions\n formatPhoneDisplay,\n};\n\nexport default CellRenderers;\n"]}
1
+ {"version":3,"sources":["../src/components/AGGrid/AGGrid.tsx","../src/components/AGGrid/CellRenderers.tsx"],"names":["jsx","formatted"],"mappings":"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","file":"ag-grid.js","sourcesContent":["import * as React from 'react';\nimport { AgGridReact, AgGridReactProps } from 'ag-grid-react';\nimport {\n ModuleRegistry,\n AllCommunityModule,\n type GridApi,\n type GridReadyEvent,\n type ColDef as AGColDef,\n type RowClickedEvent,\n type RowSelectionOptions,\n} from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useDirection } from '../../hooks/useDirection';\nimport type { BrandConfig } from '../../brands/types';\n\n// Register AG Grid Community modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n// ============================================================================\n// AG Grid Wrapper Styles\n// ============================================================================\n\nconst agGridVariants = cva('ag-theme-custom w-full', {\n variants: {\n /**\n * Visual variant of the grid\n */\n variant: {\n default: '',\n bordered:\n '[&_.ag-root-wrapper]:border [&_.ag-root-wrapper]:border-border [&_.ag-root-wrapper]:rounded-lg',\n striped: '[&_.ag-row-odd]:bg-muted/50',\n card: '[&_.ag-root-wrapper]:shadow-card [&_.ag-root-wrapper]:rounded-lg [&_.ag-root-wrapper]:border-0',\n },\n /**\n * Size/density of the grid rows\n */\n size: {\n xs: '[&_.ag-row]:h-7 [&_.ag-header-row]:h-7 text-xs [&_.ag-cell]:px-2',\n sm: '[&_.ag-row]:h-8 [&_.ag-header-row]:h-8 text-xs [&_.ag-cell]:px-3',\n md: '[&_.ag-row]:h-10 [&_.ag-header-row]:h-10 text-sm [&_.ag-cell]:px-4',\n lg: '[&_.ag-row]:h-12 [&_.ag-header-row]:h-12 text-base [&_.ag-cell]:px-4',\n xl: '[&_.ag-row]:h-14 [&_.ag-header-row]:h-14 text-base [&_.ag-cell]:px-6',\n },\n /**\n * Brand theme variant\n */\n brand: {\n default: '',\n mieweb: 'ag-brand-mieweb',\n bluehive: 'ag-brand-bluehive',\n waggleline: 'ag-brand-waggleline',\n webchart: 'ag-brand-webchart',\n 'enterprise-health': 'ag-brand-enterprise-health',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n brand: 'default',\n },\n});\n\n// ============================================================================\n// AG Grid Component Types\n// ============================================================================\n\nexport interface AGGridProps<TData = unknown>\n extends\n Omit<AgGridReactProps<TData>, 'className' | 'rowSelection'>,\n VariantProps<typeof agGridVariants> {\n /** Additional CSS classes for the grid container */\n className?: string;\n /** Height of the grid container */\n height?: string | number;\n /** Loading state */\n loading?: boolean;\n /** Callback when a row is clicked */\n onRowClick?: (event: RowClickedEvent<TData>) => void;\n /** Reference to access the grid API */\n gridRef?: React.RefObject<AgGridReact<TData> | null>;\n /** Row selection configuration (v35+ object format or legacy string) */\n rowSelection?: RowSelectionOptions | 'single' | 'multiple';\n /** Brand configuration for theming */\n brandConfig?: BrandConfig;\n /** Show pagination controls */\n pagination?: boolean;\n /** Enable column resizing */\n resizable?: boolean;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable filtering */\n filterable?: boolean;\n /** Custom empty state message */\n noDataMessage?: string;\n /** Custom loading message */\n loadingMessage?: string;\n /**\n * Render the grid right-to-left. Defaults to the direction inherited from\n * the nearest `dir` attribute (via `useDirection`), so the grid mirrors\n * automatically under `<html dir=\"rtl\">`. Pass explicitly to pin a\n * direction. `enableRtl` is an initial-only AG Grid option, so the grid\n * remounts (losing sort/filter state) when the resolved value changes.\n */\n enableRtl?: boolean;\n}\n\n// ============================================================================\n// Default Column Definitions\n// ============================================================================\n\n// Size to pixel height mapping for AG Grid (row heights + default container heights)\nconst sizeToRowHeight: Record<\n string,\n { rowHeight: number; headerHeight: number; containerHeight: number }\n> = {\n xs: { rowHeight: 28, headerHeight: 28, containerHeight: 280 },\n sm: { rowHeight: 32, headerHeight: 32, containerHeight: 320 },\n md: { rowHeight: 40, headerHeight: 40, containerHeight: 400 },\n lg: { rowHeight: 48, headerHeight: 48, containerHeight: 480 },\n xl: { rowHeight: 56, headerHeight: 56, containerHeight: 560 },\n};\n\n// Enhanced default column definitions with brand awareness\nconst getDefaultColDef = (\n sortable: boolean,\n filterable: boolean,\n resizable: boolean\n): AGColDef => ({\n sortable,\n filter: filterable,\n resizable,\n minWidth: 100,\n flex: 1,\n suppressMovable: false,\n headerClass: 'ag-header-cell-custom',\n cellClass: 'ag-cell-custom',\n});\n\n// ============================================================================\n// AG Grid Component\n// ============================================================================\n\n// Warn once per session (dev builds only) that AGGrid is deprecated.\n// Bundlers replace `process.env.NODE_ENV` at build time, so this entire\n// branch is dead-code-eliminated from production bundles.\nlet didWarnDeprecated = false;\nfunction warnDeprecatedOnce() {\n if (process.env.NODE_ENV === 'production' || didWarnDeprecated) return;\n didWarnDeprecated = true;\n console.warn(\n '[@mieweb/ui] AGGrid is deprecated. Use DataVis NITRO (@mieweb/ui/datavis) for all tables.'\n );\n}\n\n/**\n * A themed AG Grid wrapper component that integrates with the MIE Web UI design system.\n *\n * @deprecated Use DataVis NITRO (`@mieweb/ui/datavis`) for all tables. AGGrid\n * will be removed in a future major release.\n *\n * This component wraps AG Grid Community Edition and provides:\n * - Consistent theming with CSS variables\n * - Size variants (sm, md, lg)\n * - Visual variants (default, bordered, striped)\n * - Loading states\n * - Simplified API while maintaining full AG Grid capabilities\n *\n * @example\n * ```tsx\n * const columnDefs = [\n * { field: 'name', headerName: 'Name' },\n * { field: 'email', headerName: 'Email' },\n * { field: 'status', headerName: 'Status' },\n * ];\n *\n * const rowData = [\n * { name: 'John Doe', email: 'john@example.com', status: 'Active' },\n * { name: 'Jane Smith', email: 'jane@example.com', status: 'Pending' },\n * ];\n *\n * <AGGrid\n * columnDefs={columnDefs}\n * rowData={rowData}\n * variant=\"bordered\"\n * size=\"md\"\n * />\n * ```\n */\nfunction AGGridInner<TData = unknown>(\n {\n className,\n variant,\n size,\n brand,\n height,\n loading = false,\n columnDefs,\n rowData,\n defaultColDef: userDefaultColDef,\n onGridReady,\n onRowClick,\n gridRef,\n rowSelection,\n brandConfig,\n pagination = false,\n resizable = true,\n sortable = true,\n filterable = true,\n noDataMessage = 'No data to display',\n loadingMessage = 'Loading...',\n enableRtl,\n ...props\n }: AGGridProps<TData>,\n ref: React.ForwardedRef<AgGridReact<TData>>\n) {\n const internalRef = React.useRef<AgGridReact<TData>>(null);\n const gridApiRef = React.useRef<GridApi<TData> | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Mirror the grid under dir=\"rtl\" unless the caller pins a direction.\n const direction = useDirection(containerRef);\n const resolvedEnableRtl = enableRtl ?? direction === 'rtl';\n\n React.useEffect(() => {\n warnDeprecatedOnce();\n }, []);\n\n // Use provided ref or internal ref\n const resolvedRef = gridRef || ref || internalRef;\n\n // Handle grid ready\n const handleGridReady = React.useCallback(\n (event: GridReadyEvent<TData>) => {\n gridApiRef.current = event.api;\n // Re-apply the wrapper-managed loading overlay: the [loading] effect\n // does not rerun when only the grid instance changed (the enableRtl\n // direction-flip remount), so a grid flipped while loading would lose\n // its overlay. No hideOverlay() on the false path — that would suppress\n // AG Grid's automatic no-rows overlay on fresh mounts.\n if (loading) event.api.showLoadingOverlay();\n onGridReady?.(event);\n },\n [onGridReady, loading]\n );\n\n // Handle row click\n const handleRowClicked = React.useCallback(\n (event: RowClickedEvent<TData>) => {\n onRowClick?.(event);\n },\n [onRowClick]\n );\n\n // Merge default column definitions with feature toggles\n const mergedDefaultColDef = React.useMemo(\n () =>\n ({\n ...getDefaultColDef(sortable, filterable, resizable),\n ...userDefaultColDef,\n }) as AGColDef<TData>,\n [userDefaultColDef, sortable, filterable, resizable]\n );\n\n // Convert legacy rowSelection string to v35+ object format\n const resolvedRowSelection = React.useMemo(():\n | RowSelectionOptions\n | undefined => {\n if (!rowSelection) return undefined;\n\n // If already in object format, use as-is\n if (typeof rowSelection === 'object') {\n return rowSelection;\n }\n\n // Convert legacy string format to v35+ object format\n if (rowSelection === 'multiple') {\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n };\n }\n\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true,\n };\n }\n\n return undefined;\n }, [rowSelection]);\n\n // Show loading overlay when loading prop changes\n React.useEffect(() => {\n if (gridApiRef.current) {\n if (loading) {\n gridApiRef.current.showLoadingOverlay();\n } else {\n gridApiRef.current.hideOverlay();\n }\n }\n }, [loading]);\n\n // Get row/header heights based on size prop\n const sizeConfig = sizeToRowHeight[size || 'md'];\n\n // Use provided height or default based on size\n const resolvedHeight = height ?? sizeConfig.containerHeight;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"ag-grid\"\n className={cn(agGridVariants({ variant, size, brand }), className)}\n style={{\n height:\n typeof resolvedHeight === 'number'\n ? `${resolvedHeight}px`\n : resolvedHeight,\n ...(brandConfig &&\n ({\n '--ag-primary-color': brandConfig.colors.primary[600],\n '--ag-font-family':\n brandConfig.typography.fontFamily.sans.join(', '),\n } as React.CSSProperties)),\n }}\n data-brand={brand}\n >\n <AgGridReact<TData>\n // enableRtl is an initial-only AG Grid option — remount on change so\n // live dir flips (e.g. the Storybook direction toolbar) take effect.\n key={resolvedEnableRtl ? 'rtl' : 'ltr'}\n ref={resolvedRef as React.RefObject<AgGridReact<TData>>}\n enableRtl={resolvedEnableRtl}\n columnDefs={columnDefs}\n rowData={rowData}\n defaultColDef={mergedDefaultColDef}\n onGridReady={handleGridReady}\n onRowClicked={handleRowClicked}\n animateRows={true}\n enableBrowserTooltips={true}\n rowSelection={resolvedRowSelection}\n pagination={pagination}\n paginationPageSize={pagination ? 50 : undefined}\n paginationPageSizeSelector={pagination ? [25, 50, 100, 200] : undefined}\n rowHeight={sizeConfig.rowHeight}\n headerHeight={sizeConfig.headerHeight}\n noRowsOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {noDataMessage}\n </div>\n )}\n loadingOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {loadingMessage}\n </div>\n )}\n theme=\"legacy\"\n {...props}\n />\n </div>\n );\n}\n\n// Forward ref with generic support\n/**\n * @deprecated Use DataVis NITRO (`@mieweb/ui/datavis`) for all tables. AGGrid\n * will be removed in a future major release.\n */\nexport const AGGrid = React.forwardRef(AGGridInner) as <TData = unknown>(\n props: AGGridProps<TData> & { ref?: React.ForwardedRef<AgGridReact<TData>> }\n) => React.ReactElement;\n\n// Display name for debugging\n(AGGrid as React.FC).displayName = 'AGGrid';\n\n// ============================================================================\n// Re-export AG Grid types for convenience\n// ============================================================================\n\n// Export ColDef with the original name for external use\nexport type { ColDef as AGColDef } from 'ag-grid-community';\n\n// Also export as ColDef for convenience\nexport type ColDef<TData = unknown, TValue = unknown> = AGColDef<TData, TValue>;\n\nexport type {\n GridApi,\n GridReadyEvent,\n RowClickedEvent,\n CellClickedEvent,\n CellValueChangedEvent,\n SelectionChangedEvent,\n FilterChangedEvent,\n SortChangedEvent,\n RowSelectedEvent,\n FirstDataRenderedEvent,\n} from 'ag-grid-community';\n\nexport { AgGridReact } from 'ag-grid-react';\n","/**\n * AG Grid Cell Renderers\n *\n * Rich, visually appealing cell renderers for AG Grid tables.\n * Based on Waggleline's production-tested implementations with\n * full dark mode support and design system integration.\n *\n * All renderers are memoized with React.memo for performance optimization.\n */\n\nimport * as React from 'react';\nimport { memo } from 'react';\nimport type { ICellRendererParams } from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport {\n MailIcon,\n PhoneIcon,\n GlobeIcon,\n CheckCircleIcon,\n ClockIcon,\n} from '../Icons';\nimport { Linkedin } from 'lucide-react';\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get a nested value from an object using dot notation (e.g., 'company.domain')\n */\nfunction getNestedValue(\n obj: Record<string, unknown> | undefined | null,\n path: string\n): unknown {\n if (!obj || !path) return undefined;\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Get favicon URL from a domain using Google's favicon service\n */\nfunction getFaviconUrl(domain: string | null | undefined): string | null {\n if (!domain || typeof domain !== 'string') return null;\n const cleanDomain = domain\n .replace(/^https?:\\/\\//, '')\n .split('/')[0]\n .trim();\n if (!cleanDomain) return null;\n return `https://www.google.com/s2/favicons?domain=${cleanDomain}&sz=64`;\n}\n\n/**\n * Format a phone number with dashes for display\n */\nexport function formatPhoneDisplay(phone: string | null | undefined): string {\n if (!phone) return '';\n const cleaned = phone.replace(/\\D/g, '');\n if (cleaned.length === 10) {\n return `${cleaned.slice(0, 3)}-${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;\n }\n if (cleaned.length === 11 && cleaned.startsWith('1')) {\n return `${cleaned[0]}-${cleaned.slice(1, 4)}-${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;\n }\n return phone;\n}\n\n/**\n * Generate initials from a name\n */\nfunction getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '??';\n const parts = name.split(' ').filter(Boolean);\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n}\n\n/**\n * Generate a consistent avatar color based on a name\n */\nfunction getAvatarColor(name: string): string {\n const colors = [\n 'bg-primary-800',\n 'bg-green-600',\n 'bg-orange-600',\n 'bg-secondary-600',\n 'bg-pink-600',\n 'bg-primary-700',\n 'bg-teal-600',\n 'bg-amber-600',\n ];\n if (!name || typeof name !== 'string') return colors[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n}\n\n/**\n * Custom comparison function for AG Grid cell renderers.\n */\nfunction cellRendererPropsAreEqual(\n prevProps: ICellRendererParams,\n nextProps: ICellRendererParams\n): boolean {\n if (prevProps.value !== nextProps.value) return false;\n if (prevProps.data !== nextProps.data) return false;\n if (prevProps.node?.rowIndex !== nextProps.node?.rowIndex) return false;\n return true;\n}\n\n// =============================================================================\n// Status Configuration Types\n// =============================================================================\n\nexport interface StatusConfig {\n label: string;\n bgClass: string;\n textClass: string;\n iconName?: string;\n}\n\n// =============================================================================\n// Default Status Colors\n// =============================================================================\n\nexport const statusColors: Record<string, StatusConfig> = {\n active: {\n label: 'Active',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n inactive: {\n label: 'Inactive',\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n },\n closed_won: {\n label: 'Closed Won',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n closed_lost: {\n label: 'Closed Lost',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n pending: {\n label: 'Pending',\n bgClass: 'bg-amber-100 dark:bg-amber-900/30',\n textClass: 'text-amber-700 dark:text-amber-400',\n },\n new: {\n label: 'New',\n bgClass: 'bg-primary-100 dark:bg-primary-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n verified: {\n label: 'Verified',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n flagged: {\n label: 'Flagged',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n};\n\n// =============================================================================\n// Avatar Name Renderer\n// =============================================================================\n\ninterface AvatarNameRendererProps extends ICellRendererParams {\n avatarField?: string;\n domainField?: string;\n}\n\n/**\n * Renders an avatar with name, suitable for contact/owner columns\n */\nexport function AvatarNameRenderer(\n props: AvatarNameRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!data && !value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayName = typeof value === 'string' && value ? value : 'Unknown';\n const isSystemValue = ['Unknown', 'Unassigned', 'System'].includes(\n displayName\n );\n\n const avatarUrl =\n props.avatarField && data\n ? (getNestedValue(data, props.avatarField) as string | undefined)\n : data?.avatarUrl;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n const initials = getInitials(displayName);\n const imageUrl = avatarUrl || faviconUrl;\n\n if (isSystemValue) {\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"dark:text-muted-foreground flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700\">\n {displayName === 'Unassigned' ? '—' : '??'}\n </div>\n <span className=\"dark:text-muted-foreground truncate text-gray-400 italic\">\n {displayName}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={displayName}\n className=\"h-7 w-7 rounded-full bg-white object-cover ring-2 ring-white dark:ring-gray-700\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold text-white',\n getAvatarColor(displayName)\n )}\n style={{ display: imageUrl ? 'none' : 'flex' }}\n >\n {initials}\n </div>\n <span className=\"text-foreground truncate font-medium\">\n {displayName}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Status Badge Renderer\n// =============================================================================\n\nexport interface StatusBadgeRendererProps extends ICellRendererParams {\n /** Custom status color configuration */\n statusConfig?: Record<string, StatusConfig>;\n}\n\n/**\n * Renders a colorful status badge\n */\nexport function StatusBadgeRenderer(\n props: StatusBadgeRendererProps\n): React.ReactElement {\n const { value, statusConfig = statusColors } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const normalizedValue = String(value).toLowerCase().replace(/\\s+/g, '_');\n const config = statusConfig[normalizedValue] || {\n label: value,\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n config.bgClass,\n config.textClass\n )}\n >\n {config.label}\n </span>\n );\n}\n\n// =============================================================================\n// Engagement Score Renderer\n// =============================================================================\n\n/**\n * Get engagement score colors based on threshold\n */\nfunction getEngagementScoreColors(score: number): {\n barColor: string;\n textColor: string;\n} {\n if (score >= 70)\n return {\n barColor: 'bg-green-500',\n textColor: 'text-green-700 dark:text-green-400',\n };\n if (score >= 40)\n return {\n barColor: 'bg-amber-500',\n textColor: 'text-amber-700 dark:text-amber-400',\n };\n if (score >= 20)\n return {\n barColor: 'bg-orange-500',\n textColor: 'text-orange-700 dark:text-orange-400',\n };\n return {\n barColor: 'bg-gray-400',\n textColor: 'text-muted-foreground',\n };\n}\n\n/**\n * Renders engagement score with color-coded progress bar\n */\nexport function EngagementScoreRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const score = Number(value);\n const percentage = Math.min(100, Math.max(0, score));\n const { barColor, textColor } = getEngagementScoreColors(score);\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-1.5 w-16 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className={cn('text-sm font-medium', textColor)}>{score}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Email Renderer\n// =============================================================================\n\n/**\n * Renders email with mailto link\n */\nexport function EmailRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={`mailto:${value}`}\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <MailIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{value}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Phone Renderer\n// =============================================================================\n\n/**\n * Renders phone with click-to-call\n */\nexport function PhoneRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayValue = formatPhoneDisplay(value);\n\n return (\n <a\n href={`tel:${value}`}\n className=\"text-foreground hover:text-primary-800 dark:hover:text-primary-400 inline-flex items-center gap-1.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <PhoneIcon className=\"h-3 w-3 text-green-500 opacity-70\" />\n <span>{displayValue}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Link Renderers\n// =============================================================================\n\n/**\n * Renders a domain/website URL with icon\n */\nexport function DomainRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const url = value.startsWith('http') ? value : `https://${value}`;\n const displayDomain = value.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <GlobeIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{displayDomain}</span>\n </a>\n );\n}\n\n/**\n * Renders a LinkedIn URL with icon\n */\nexport function LinkedInRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-[#0A66C2] hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <Linkedin className=\"h-4 w-4\" />\n <span className=\"truncate text-sm\">LinkedIn</span>\n </a>\n );\n}\n\n// =============================================================================\n// Currency Renderer\n// =============================================================================\n\n/**\n * Renders currency with proper formatting\n */\nexport function CurrencyRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n\n return (\n <span className=\"text-foreground font-medium tabular-nums\">\n {formatted}\n </span>\n );\n}\n\n// =============================================================================\n// Number Renderer\n// =============================================================================\n\n/**\n * Renders number with comma formatting\n */\nexport function NumberRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = Number(value).toLocaleString();\n\n return <span className=\"text-foreground tabular-nums\">{formatted}</span>;\n}\n\n// =============================================================================\n// Date Renderer\n// =============================================================================\n\nexport interface DateRendererProps extends ICellRendererParams {\n format?: 'short' | 'medium' | 'long' | 'relative' | 'datetime';\n}\n\n/**\n * Renders date with formatting options\n */\nexport function DateRenderer(props: DateRendererProps): React.ReactElement {\n const { value, format = 'medium' } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n if (format === 'relative') {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n let relativeText: string;\n if (days === 0) {\n relativeText = 'Today';\n } else if (days === 1) {\n relativeText = 'Yesterday';\n } else if (days < 7) {\n relativeText = `${days} days ago`;\n } else if (days < 30) {\n const weeks = Math.floor(days / 7);\n relativeText = `${weeks} week${weeks > 1 ? 's' : ''} ago`;\n } else if (days < 365) {\n const months = Math.floor(days / 30);\n relativeText = `${months} month${months > 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(days / 365);\n relativeText = `${years} year${years > 1 ? 's' : ''} ago`;\n }\n\n return <span className=\"text-muted-foreground\">{relativeText}</span>;\n }\n\n const dateOptions: Intl.DateTimeFormatOptions =\n format === 'short'\n ? { month: 'numeric', day: 'numeric' }\n : format === 'long'\n ? { month: 'long', day: 'numeric', year: 'numeric' }\n : { month: 'short', day: 'numeric', year: 'numeric' };\n\n if (format === 'datetime') {\n const formatted = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n return <span className=\"text-foreground\">{formatted}</span>;\n }\n\n const formatted = date.toLocaleDateString('en-US', dateOptions);\n\n return <span className=\"text-foreground\">{formatted}</span>;\n}\n\n// =============================================================================\n// Boolean/Yes-No Renderer\n// =============================================================================\n\n/**\n * Renders boolean as styled Yes/No badge\n */\nexport function BooleanRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const isTrue = Boolean(value);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n isTrue\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300'\n )}\n >\n {isTrue ? (\n <CheckCircleIcon className=\"h-3 w-3\" />\n ) : (\n <ClockIcon className=\"h-3 w-3\" />\n )}\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n}\n\n// =============================================================================\n// Company Renderer\n// =============================================================================\n\ninterface CompanyRendererProps extends ICellRendererParams {\n companyIdField?: string;\n domainField?: string;\n}\n\n/**\n * Renders company name with favicon\n */\nexport function CompanyRenderer(\n props: CompanyRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n {faviconUrl ? (\n <img\n src={faviconUrl}\n alt={value}\n className=\"h-5 w-5 rounded bg-white object-contain\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className=\"bg-primary-100 text-primary-800 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold\"\n style={{ display: faviconUrl ? 'none' : 'flex' }}\n >\n {getInitials(value)}\n </div>\n <span className=\"truncate font-medium\">{value}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Progress Renderer\n// =============================================================================\n\nexport interface ProgressRendererProps extends ICellRendererParams {\n /** Color of the progress bar */\n barColor?: string;\n /** Maximum value (default 100) */\n max?: number;\n}\n\n/**\n * Renders a progress bar\n */\nexport function ProgressRenderer(\n props: ProgressRendererProps\n): React.ReactElement {\n const { value, barColor = 'bg-primary-800', max = 100 } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const percentage = Math.min(100, Math.max(0, (Number(value) / max) * 100));\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-2 w-20 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium\">\n {Math.round(percentage)}%\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Tags Renderer\n// =============================================================================\n\n/**\n * Renders an array of tags as badges\n */\nexport function TagsRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value || !Array.isArray(value) || value.length === 0) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {value.slice(0, 3).map((tag: string, index: number) => (\n <span\n key={index}\n className=\"text-foreground inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium dark:bg-gray-800\"\n >\n {tag}\n </span>\n ))}\n {value.length > 3 && (\n <span className=\"text-muted-foreground text-xs\">\n +{value.length - 3}\n </span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Memoized Renderer Exports (for performance)\n// =============================================================================\n\nexport const MemoizedAvatarNameRenderer = memo(\n AvatarNameRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedStatusBadgeRenderer = memo(\n StatusBadgeRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEngagementScoreRenderer = memo(\n EngagementScoreRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEmailRenderer = memo(\n EmailRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedPhoneRenderer = memo(\n PhoneRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedLinkedInRenderer = memo(\n LinkedInRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDomainRenderer = memo(\n DomainRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCurrencyRenderer = memo(\n CurrencyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedNumberRenderer = memo(\n NumberRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDateRenderer = memo(\n DateRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedBooleanRenderer = memo(\n BooleanRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCompanyRenderer = memo(\n CompanyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedProgressRenderer = memo(\n ProgressRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedTagsRenderer = memo(\n TagsRenderer,\n cellRendererPropsAreEqual\n);\n\n// =============================================================================\n// Default Export\n// =============================================================================\n\nexport const CellRenderers = {\n // Original renderers\n AvatarNameRenderer,\n StatusBadgeRenderer,\n EngagementScoreRenderer,\n EmailRenderer,\n PhoneRenderer,\n LinkedInRenderer,\n DomainRenderer,\n CurrencyRenderer,\n NumberRenderer,\n DateRenderer,\n BooleanRenderer,\n CompanyRenderer,\n ProgressRenderer,\n TagsRenderer,\n\n // Memoized renderers (recommended for performance)\n MemoizedAvatarNameRenderer,\n MemoizedStatusBadgeRenderer,\n MemoizedEngagementScoreRenderer,\n MemoizedEmailRenderer,\n MemoizedPhoneRenderer,\n MemoizedLinkedInRenderer,\n MemoizedDomainRenderer,\n MemoizedCurrencyRenderer,\n MemoizedNumberRenderer,\n MemoizedDateRenderer,\n MemoizedBooleanRenderer,\n MemoizedCompanyRenderer,\n MemoizedProgressRenderer,\n MemoizedTagsRenderer,\n\n // Utility functions\n formatPhoneDisplay,\n};\n\nexport default CellRenderers;\n"]}
@@ -101,7 +101,8 @@ var TableRow = React__namespace.forwardRef(
101
101
  );
102
102
  TableRow.displayName = "TableRow";
103
103
  var TableHead = React__namespace.forwardRef(
104
- ({ className, sortable, sortDirection, onSort, children, ...props }, ref) => {
104
+ ({ className, sortable, sortDirection, onSort, numeric, children, ...props }, ref) => {
105
+ const label = numeric ? /* @__PURE__ */ jsxRuntime.jsx("bdi", { children }) : children;
105
106
  const content = sortable ? /* @__PURE__ */ jsxRuntime.jsxs(
106
107
  "button",
107
108
  {
@@ -109,24 +110,28 @@ var TableHead = React__namespace.forwardRef(
109
110
  onClick: onSort,
110
111
  className: chunkS5RVSXDV_cjs.cn(
111
112
  "hover:text-foreground flex items-center gap-1 transition-colors",
112
- "focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none"
113
+ "focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none",
114
+ // Inside the dir="ltr" island, "end" is the physical right
115
+ numeric && "w-full justify-end"
113
116
  ),
114
117
  "aria-label": `Sort column ${sortDirection === "asc" ? "descending" : "ascending"}`,
115
118
  children: [
116
- children,
119
+ label,
117
120
  /* @__PURE__ */ jsxRuntime.jsx(SortIcon, { direction: sortDirection })
118
121
  ]
119
122
  }
120
- ) : children;
123
+ ) : label;
121
124
  return /* @__PURE__ */ jsxRuntime.jsx(
122
125
  "th",
123
126
  {
124
127
  ref,
125
128
  "data-slot": "table-head",
129
+ dir: numeric ? "ltr" : void 0,
126
130
  "aria-sort": sortable ? sortDirection === "asc" ? "ascending" : sortDirection === "desc" ? "descending" : "none" : void 0,
127
131
  className: chunkS5RVSXDV_cjs.cn(
128
132
  "text-muted-foreground h-12 px-4 text-start align-middle font-medium",
129
133
  "[&:has([role=checkbox])]:pe-0",
134
+ numeric && "text-end",
130
135
  className
131
136
  ),
132
137
  ...props,
@@ -137,13 +142,16 @@ var TableHead = React__namespace.forwardRef(
137
142
  );
138
143
  TableHead.displayName = "TableHead";
139
144
  var TableCell = React__namespace.forwardRef(
140
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
145
+ ({ className, numeric, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
141
146
  "td",
142
147
  {
143
148
  ref,
144
149
  "data-slot": "table-cell",
150
+ dir: numeric ? "ltr" : void 0,
145
151
  className: chunkS5RVSXDV_cjs.cn(
146
152
  "p-4 align-middle [&:has([role=checkbox])]:pe-0",
153
+ // Inside the dir="ltr" island, text-end is the physical right
154
+ numeric && "text-end tabular-nums",
147
155
  className
148
156
  ),
149
157
  ...props
@@ -230,5 +238,5 @@ exports.TableFooter = TableFooter;
230
238
  exports.TableHead = TableHead;
231
239
  exports.TableHeader = TableHeader;
232
240
  exports.TableRow = TableRow;
233
- //# sourceMappingURL=chunk-IJYTASQQ.cjs.map
234
- //# sourceMappingURL=chunk-IJYTASQQ.cjs.map
241
+ //# sourceMappingURL=chunk-3AD4HFYI.cjs.map
242
+ //# sourceMappingURL=chunk-3AD4HFYI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Table/Table.tsx"],"names":["React","jsx","cn","jsxs"],"mappings":"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","file":"chunk-3AD4HFYI.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Table Root\n// ============================================================================\n\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n /** Whether to make the table responsive with horizontal scroll */\n responsive?: boolean;\n}\n\n/**\n * An accessible table component.\n *\n * Prefer DataVis NITRO in most cases -- it is designed to be simple out of the box while\n * exposing power-user features for click-curious users. Use `Table` only in lightweight\n * situations where that overhead is genuinely unneeded.\n *\n * @example\n * ```tsx\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>Name</TableHead>\n * <TableHead>Email</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>John Doe</TableCell>\n * <TableCell>john@example.com</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * ```\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, responsive = true, children, ...props }, ref) => {\n const table = (\n <table\n ref={ref}\n data-slot=\"table\"\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n >\n {children}\n </table>\n );\n\n if (responsive) {\n return <div className=\"relative w-full overflow-auto\">{table}</div>;\n }\n\n return table;\n }\n);\n\nTable.displayName = 'Table';\n\n// ============================================================================\n// Table Header\n// ============================================================================\n\nexport type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead\n ref={ref}\n data-slot=\"table-header\"\n className={cn('[&_tr]:border-b', className)}\n {...props}\n />\n )\n);\n\nTableHeader.displayName = 'TableHeader';\n\n// ============================================================================\n// Table Body\n// ============================================================================\n\nexport type TableBodyProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n data-slot=\"table-body\"\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n )\n);\n\nTableBody.displayName = 'TableBody';\n\n// ============================================================================\n// Table Footer\n// ============================================================================\n\nexport type TableFooterProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n data-slot=\"table-footer\"\n className={cn(\n 'bg-muted/50 border-t font-medium [&>tr]:last:border-b-0',\n className\n )}\n {...props}\n />\n )\n);\n\nTableFooter.displayName = 'TableFooter';\n\n// ============================================================================\n// Table Row\n// ============================================================================\n\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /** Whether the row is selected */\n selected?: boolean;\n}\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, selected, ...props }, ref) => (\n <tr\n ref={ref}\n data-slot=\"table-row\"\n data-selected={selected}\n className={cn(\n 'border-border border-b transition-colors',\n 'hover:bg-muted/50',\n 'data-[selected=true]:bg-muted',\n className\n )}\n {...props}\n />\n )\n);\n\nTableRow.displayName = 'TableRow';\n\n// ============================================================================\n// Table Head\n// ============================================================================\n\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** Sortable column configuration */\n sortable?: boolean;\n /** Current sort direction */\n sortDirection?: 'asc' | 'desc' | null;\n /** Callback when sort is triggered */\n onSort?: () => void;\n /**\n * Marks the header of a numeric column. The cell becomes a `dir=\"ltr\"`\n * island aligned to the physical right, matching `TableCell numeric`,\n * so numeric columns line up the same way in LTR and RTL. The label is\n * wrapped in `<bdi>` so RTL-script header text keeps its natural\n * direction inside the island.\n */\n numeric?: boolean;\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n { className, sortable, sortDirection, onSort, numeric, children, ...props },\n ref\n ) => {\n // The th's dir=\"ltr\" island exists purely for alignment; <bdi> restores\n // the label's natural bidi direction so RTL-script headers read correctly.\n const label = numeric ? <bdi>{children}</bdi> : children;\n const content = sortable ? (\n <button\n type=\"button\"\n onClick={onSort}\n className={cn(\n 'hover:text-foreground flex items-center gap-1 transition-colors',\n 'focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none',\n // Inside the dir=\"ltr\" island, \"end\" is the physical right\n numeric && 'w-full justify-end'\n )}\n aria-label={`Sort column ${sortDirection === 'asc' ? 'descending' : 'ascending'}`}\n >\n {label}\n <SortIcon direction={sortDirection} />\n </button>\n ) : (\n label\n );\n\n return (\n <th\n ref={ref}\n data-slot=\"table-head\"\n dir={numeric ? 'ltr' : undefined}\n aria-sort={\n sortable\n ? sortDirection === 'asc'\n ? 'ascending'\n : sortDirection === 'desc'\n ? 'descending'\n : 'none'\n : undefined\n }\n className={cn(\n 'text-muted-foreground h-12 px-4 text-start align-middle font-medium',\n '[&:has([role=checkbox])]:pe-0',\n numeric && 'text-end',\n className\n )}\n {...props}\n >\n {content}\n </th>\n );\n }\n);\n\nTableHead.displayName = 'TableHead';\n\n// ============================================================================\n// Table Cell\n// ============================================================================\n\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n /**\n * Marks a numeric cell as a `dir=\"ltr\"` island: digits, minus signs, and\n * separators render left-to-right even in RTL, and the value aligns to the\n * physical right in both directions (with `tabular-nums` for column\n * alignment). Pair with `numeric` on the column's `TableHead`.\n */\n numeric?: boolean;\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, numeric, ...props }, ref) => (\n <td\n ref={ref}\n data-slot=\"table-cell\"\n dir={numeric ? 'ltr' : undefined}\n className={cn(\n 'p-4 align-middle [&:has([role=checkbox])]:pe-0',\n // Inside the dir=\"ltr\" island, text-end is the physical right\n numeric && 'text-end tabular-nums',\n className\n )}\n {...props}\n />\n )\n);\n\nTableCell.displayName = 'TableCell';\n\n// ============================================================================\n// Table Caption\n// ============================================================================\n\nexport type TableCaptionProps = React.HTMLAttributes<HTMLTableCaptionElement>;\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n TableCaptionProps\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n data-slot=\"table-caption\"\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n));\n\nTableCaption.displayName = 'TableCaption';\n\n// ============================================================================\n// Sort Icon\n// ============================================================================\n\nfunction SortIcon({ direction }: { direction?: 'asc' | 'desc' | null }) {\n if (direction === 'asc') {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"shrink-0\"\n >\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n );\n }\n\n if (direction === 'desc') {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"shrink-0\"\n >\n <path d=\"m19 12-7 7-7-7\" />\n </svg>\n );\n }\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"shrink-0 opacity-50\"\n >\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </svg>\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n};\n"]}
@@ -236,7 +236,10 @@ function CountryDropdownBase({
236
236
  className: "text-muted-foreground min-w-0 truncate",
237
237
  children: placeholder
238
238
  }
239
- ) : showDialCode ? /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "country-dropdown-dialcode", children: selected.dialCode }) : /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "country-dropdown-name", className: "min-w-0 truncate", children: selected.name }),
239
+ ) : showDialCode ? (
240
+ // LTR island: keeps the '+' before the digits under RTL bidi
241
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "country-dropdown-dialcode", dir: "ltr", children: selected.dialCode })
242
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "country-dropdown-name", className: "min-w-0 truncate", children: selected.name }),
240
243
  /* @__PURE__ */ jsxRuntime.jsx(
241
244
  "svg",
242
245
  {
@@ -345,10 +348,12 @@ function CountryDropdownBase({
345
348
  children: country.name
346
349
  }
347
350
  ),
348
- showDialCode && /* @__PURE__ */ jsxRuntime.jsx(
351
+ showDialCode && // LTR island: keeps the '+' before the digits under RTL bidi
352
+ /* @__PURE__ */ jsxRuntime.jsx(
349
353
  "span",
350
354
  {
351
355
  "data-slot": "country-dropdown-option-dialcode",
356
+ dir: "ltr",
352
357
  className: "text-muted-foreground shrink-0 text-xs",
353
358
  children: country.dialCode
354
359
  }
@@ -378,5 +383,5 @@ exports.CountryCodeDropdown = CountryCodeDropdown;
378
383
  exports.CountryDropdownBase = CountryDropdownBase;
379
384
  exports.formatE164 = formatE164;
380
385
  exports.validatePhoneNumber = validatePhoneNumber;
381
- //# sourceMappingURL=chunk-CFI3TQMA.cjs.map
382
- //# sourceMappingURL=chunk-CFI3TQMA.cjs.map
386
+ //# sourceMappingURL=chunk-56C7K4MV.cjs.map
387
+ //# sourceMappingURL=chunk-56C7K4MV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CountryCodeDropdown/CountryCodeDropdown.tsx"],"names":["PhoneNumberUtil","libphonenumber","PhoneNumberFormat","React","useAnchoredPosition","useClickOutside","useEscapeKey","jsxs","cn","jsx","createPortal"],"mappings":"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","file":"chunk-56C7K4MV.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport * as libphonenumber from 'google-libphonenumber';\nimport { cn } from '../../utils/cn';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\nconst PhoneNumberUtil =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberUtil ?? libphonenumber.PhoneNumberUtil;\nconst PhoneNumberFormat =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberFormat ?? libphonenumber.PhoneNumberFormat;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface CountryData {\n /** ISO 3166-1 alpha-2 country code (e.g. \"US\") */\n code: string;\n /** Country name (e.g. \"United States\") */\n name: string;\n /** Dial code (e.g. \"+1\") */\n dialCode: string;\n /** Emoji flag (e.g. \"🇺🇸\") */\n flag: string;\n}\n\nexport interface CountryCodeDropdownProps {\n /**\n * The currently selected country code (ISO alpha-2, e.g. \"US\").\n * Pass `\"\"` for a controlled component with no selection.\n */\n value?: string;\n /**\n * Initial selection when uncontrolled (`value` undefined).\n * `CountryCodeDropdown` defaults to \"US\"; `CountryDropdown` defaults to no selection.\n */\n defaultValue?: string;\n /** Trigger text shown when nothing is selected */\n placeholder?: string;\n /** Called when a country is selected */\n onChange?: (country: CountryData) => void;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Additional class name for the trigger button */\n className?: string;\n /** Placement of the dropdown panel */\n placement?: 'bottom-start' | 'bottom-end';\n /** Placeholder text for the search field */\n searchPlaceholder?: string;\n /** id for the trigger button, enabling `<label htmlFor>` association */\n id?: string;\n /** Label for accessibility — visually hidden */\n 'aria-label'?: string;\n}\n\n// =============================================================================\n// Country Data (generated from libphonenumber)\n// =============================================================================\n\n/** Convert an ISO alpha-2 code to an emoji flag. */\nfunction isoToEmoji(code: string): string {\n return [...code.toUpperCase()]\n .map((c) => String.fromCodePoint(0x1f1e6 - 65 + c.charCodeAt(0)))\n .join('');\n}\n\n/** Build the full sorted list of countries from libphonenumber. */\nfunction buildCountryList(): CountryData[] {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const regions = phoneUtil.getSupportedRegions() as string[];\n const list: CountryData[] = regions.map(countryFromCode);\n list.sort((a, b) => a.name.localeCompare(b.name));\n return list;\n}\n\n/** Build a single country's data without loading the full list. */\nfunction countryFromCode(code: string): CountryData {\n return {\n code,\n name: regionDisplayName(code),\n dialCode: `+${PhoneNumberUtil.getInstance().getCountryCodeForRegion(code)}`,\n flag: isoToEmoji(code),\n };\n}\n\n/** Whether libphonenumber knows this ISO alpha-2 region. */\nfunction isSupportedRegion(code: string): boolean {\n return (\n PhoneNumberUtil.getInstance().getSupportedRegions() as string[]\n ).includes(code);\n}\n\n/** Lazy singleton so we only build the list once. */\nlet _countries: CountryData[] | null = null;\nfunction getCountries(): CountryData[] {\n if (!_countries) _countries = buildCountryList();\n return _countries;\n}\n\n// =============================================================================\n// Region display name mapping\n// =============================================================================\n\n/** Lazy singleton for Intl.DisplayNames so we only construct it once. */\nlet _regionDisplayNames: Intl.DisplayNames | null = null;\n\nfunction getRegionDisplayNames(): Intl.DisplayNames | null {\n if (_regionDisplayNames === null) {\n try {\n const locales =\n typeof navigator !== 'undefined' && navigator.languages?.length\n ? [...navigator.languages]\n : ['en'];\n _regionDisplayNames = new Intl.DisplayNames(locales, { type: 'region' });\n } catch {\n return null;\n }\n }\n return _regionDisplayNames;\n}\n\n/**\n * Use the browser Intl API for display names where available,\n * falling back to the raw ISO code.\n */\nfunction regionDisplayName(code: string): string {\n const dn = getRegionDisplayNames();\n if (!dn) return code;\n return dn.of(code) ?? code;\n}\n\n// =============================================================================\n// Validation helper (exported for consumers)\n// =============================================================================\n\n/**\n * Validate a phone number string for a given country code using libphonenumber.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns Whether the number is valid for the given region.\n */\nexport function validatePhoneNumber(\n phoneNumber: string,\n countryCode: string\n): boolean {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.isValidNumberForRegion(parsed, countryCode);\n } catch {\n return false;\n }\n}\n\n/**\n * Format a phone number into E.164 international format.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns The formatted number (e.g. \"+15551234567\") or the original string if parsing fails.\n */\nexport function formatE164(phoneNumber: string, countryCode: string): string {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.format(parsed, PhoneNumberFormat.E164);\n } catch {\n return phoneNumber;\n }\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/** Internal base props — `showDialCode` is not part of the public API. */\ninterface CountryDropdownBaseProps extends CountryCodeDropdownProps {\n /** Show dial codes on the trigger and in the list (default: true) */\n showDialCode?: boolean;\n}\n\n/**\n * Shared implementation behind {@link CountryCodeDropdown} (dial-code mode)\n * and `CountryDropdown` (country-only mode). Not exported from the package.\n */\nfunction CountryDropdownBase({\n value,\n defaultValue = 'US',\n placeholder = 'Select country…',\n onChange,\n disabled = false,\n className,\n placement = 'bottom-start',\n searchPlaceholder = 'Search countries…',\n id,\n showDialCode = true,\n 'aria-label': ariaLabel = 'Select country code',\n}: CountryDropdownBaseProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [search, setSearch] = React.useState('');\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n\n const isControlled = value !== undefined;\n const activeValue = isControlled ? value : internalValue;\n\n // Defer building the full country list until the dropdown is first opened\n const [countriesLoaded, setCountriesLoaded] = React.useState(false);\n const countries = React.useMemo(\n () => (countriesLoaded ? getCountries() : []),\n [countriesLoaded]\n );\n\n React.useEffect(() => {\n if (isOpen && !countriesLoaded) setCountriesLoaded(true);\n }, [isOpen, countriesLoaded]);\n\n const selected = React.useMemo<CountryData | null>(() => {\n if (!activeValue) return null;\n if (countries.length) {\n return countries.find((c) => c.code === activeValue) ?? null;\n }\n // Lightweight fallback while list hasn't loaded yet\n return isSupportedRegion(activeValue) ? countryFromCode(activeValue) : null;\n }, [activeValue, countries]);\n\n const filtered = React.useMemo(() => {\n if (!search) return countries;\n const q = search.toLowerCase();\n return countries.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n (showDialCode && c.dialCode.includes(q)) ||\n c.code.toLowerCase().includes(q)\n );\n }, [search, countries, showDialCode]);\n\n // Close helpers\n const close = React.useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n // Portal + fixed positioning so the panel escapes overflow-hidden ancestors.\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLDivElement,\n HTMLDivElement\n >({ open: isOpen, placement });\n\n const outsideRefs = React.useMemo(\n () => [containerRef, floatingRef],\n [containerRef, floatingRef]\n );\n useClickOutside(outsideRefs, close, isOpen);\n useEscapeKey(close, isOpen);\n\n // Focus search input when opening\n React.useEffect(() => {\n if (isOpen) {\n // Defer to let the DOM render\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isOpen]);\n\n const handleToggle = React.useCallback(() => {\n if (!disabled) setIsOpen((prev) => !prev);\n }, [disabled]);\n\n const handleSelect = React.useCallback(\n (country: CountryData) => {\n if (!isControlled) {\n setInternalValue(country.code);\n }\n onChange?.(country);\n close();\n },\n [isControlled, onChange, close]\n );\n\n // Keyboard navigation inside the list\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const items =\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[role=\"option\"]'\n );\n if (!items?.length) return;\n\n const current = document.activeElement as HTMLElement;\n const idx = Array.from(items).indexOf(current as HTMLButtonElement);\n let next: number;\n if (e.key === 'ArrowDown') {\n next = idx < items.length - 1 ? idx + 1 : 0;\n } else {\n next = idx > 0 ? idx - 1 : items.length - 1;\n }\n items[next].focus();\n }\n },\n [isOpen]\n );\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node;\n anchorRef.current = node;\n }}\n data-slot=\"country-dropdown\"\n className=\"relative inline-flex\"\n >\n {/* Trigger button */}\n <button\n type=\"button\"\n id={id}\n data-slot=\"country-dropdown-trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm',\n 'border-input bg-background text-foreground',\n 'transition-colors duration-200',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n >\n <span\n data-slot=\"country-dropdown-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {selected?.flag ?? '🌐'}\n </span>\n {!selected ? (\n <span\n data-slot=\"country-dropdown-placeholder\"\n className=\"text-muted-foreground min-w-0 truncate\"\n >\n {placeholder}\n </span>\n ) : showDialCode ? (\n // LTR island: keeps the '+' before the digits under RTL bidi\n <span data-slot=\"country-dropdown-dialcode\" dir=\"ltr\">\n {selected.dialCode}\n </span>\n ) : (\n <span data-slot=\"country-dropdown-name\" className=\"min-w-0 truncate\">\n {selected.name}\n </span>\n )}\n <svg\n data-slot=\"country-dropdown-chevron\"\n className={cn(\n 'h-4 w-4 shrink-0 text-neutral-500 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {isOpen &&\n createPortal(\n <div\n ref={floatingRef}\n style={style}\n id={menuId}\n role=\"listbox\"\n data-slot=\"country-dropdown-panel\"\n aria-label={ariaLabel}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex w-72 flex-col overflow-hidden',\n 'rounded-xl border border-neutral-200 bg-white shadow-lg',\n 'dark:border-neutral-700 dark:bg-neutral-800',\n 'animate-in fade-in zoom-in-95 duration-100'\n )}\n >\n {/* Search input */}\n <div\n data-slot=\"country-dropdown-search\"\n className=\"shrink-0 border-b border-neutral-200 p-2 dark:border-neutral-700\"\n >\n <input\n ref={searchInputRef}\n type=\"text\"\n data-slot=\"country-dropdown-search-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label=\"Search countries\"\n className={cn(\n 'w-full rounded-lg border border-neutral-200 px-3 py-1.5 text-sm',\n 'text-foreground placeholder:text-muted-foreground bg-white',\n 'focus:ring-ring focus:border-transparent focus:ring-2 focus:outline-none',\n 'dark:border-neutral-600 dark:bg-neutral-700 dark:text-neutral-100'\n )}\n />\n </div>\n\n {/* Country list */}\n <div\n ref={listRef}\n data-slot=\"country-dropdown-list\"\n className=\"max-h-60 min-h-0 overflow-y-auto p-1\"\n >\n {filtered.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n No countries found\n </div>\n ) : (\n filtered.map((country) => (\n <button\n key={country.code}\n type=\"button\"\n role=\"option\"\n data-slot=\"country-dropdown-option\"\n aria-selected={country.code === selected?.code}\n onClick={() => handleSelect(country)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-start text-sm',\n 'transition-colors duration-150',\n 'focus:outline-none',\n country.code === selected?.code\n ? 'bg-neutral-100 font-medium text-neutral-900 dark:bg-neutral-700 dark:text-white'\n : 'text-neutral-700 hover:bg-neutral-50 dark:text-neutral-300 dark:hover:bg-neutral-700/50',\n 'focus:bg-neutral-100 dark:focus:bg-neutral-700'\n )}\n >\n <span\n data-slot=\"country-dropdown-option-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {country.flag}\n </span>\n <span\n data-slot=\"country-dropdown-option-name\"\n className=\"flex-1 truncate\"\n >\n {country.name}\n </span>\n {showDialCode && (\n // LTR island: keeps the '+' before the digits under RTL bidi\n <span\n data-slot=\"country-dropdown-option-dialcode\"\n dir=\"ltr\"\n className=\"text-muted-foreground shrink-0 text-xs\"\n >\n {country.dialCode}\n </span>\n )}\n </button>\n ))\n )}\n </div>\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nCountryDropdownBase.displayName = 'CountryDropdownBase';\n\n/**\n * A country-code selector dropdown designed to sit beside a phone number input.\n *\n * Defaults to United States (+1) with the 🇺🇸 flag. Clicking the trigger opens\n * a searchable list of all supported countries with their dial codes and flags.\n *\n * Uses Google's libphonenumber for the canonical country/code list and provides\n * a `validatePhoneNumber` helper for phone validation.\n *\n * For a country selector without dial codes, use `CountryDropdown`.\n *\n * @example\n * ```tsx\n * const [country, setCountry] = useState<CountryData>();\n *\n * <div className=\"flex gap-2\">\n * <CountryCodeDropdown value={country?.code} onChange={setCountry} />\n * <Input placeholder=\"Phone number\" />\n * </div>\n * ```\n */\nfunction CountryCodeDropdown(props: CountryCodeDropdownProps) {\n return <CountryDropdownBase {...props} />;\n}\n\nCountryCodeDropdown.displayName = 'CountryCodeDropdown';\n\nexport { CountryCodeDropdown, CountryDropdownBase };\n"]}
@@ -79,7 +79,8 @@ var TableRow = React.forwardRef(
79
79
  );
80
80
  TableRow.displayName = "TableRow";
81
81
  var TableHead = React.forwardRef(
82
- ({ className, sortable, sortDirection, onSort, children, ...props }, ref) => {
82
+ ({ className, sortable, sortDirection, onSort, numeric, children, ...props }, ref) => {
83
+ const label = numeric ? /* @__PURE__ */ jsx("bdi", { children }) : children;
83
84
  const content = sortable ? /* @__PURE__ */ jsxs(
84
85
  "button",
85
86
  {
@@ -87,24 +88,28 @@ var TableHead = React.forwardRef(
87
88
  onClick: onSort,
88
89
  className: cn(
89
90
  "hover:text-foreground flex items-center gap-1 transition-colors",
90
- "focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none"
91
+ "focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none",
92
+ // Inside the dir="ltr" island, "end" is the physical right
93
+ numeric && "w-full justify-end"
91
94
  ),
92
95
  "aria-label": `Sort column ${sortDirection === "asc" ? "descending" : "ascending"}`,
93
96
  children: [
94
- children,
97
+ label,
95
98
  /* @__PURE__ */ jsx(SortIcon, { direction: sortDirection })
96
99
  ]
97
100
  }
98
- ) : children;
101
+ ) : label;
99
102
  return /* @__PURE__ */ jsx(
100
103
  "th",
101
104
  {
102
105
  ref,
103
106
  "data-slot": "table-head",
107
+ dir: numeric ? "ltr" : void 0,
104
108
  "aria-sort": sortable ? sortDirection === "asc" ? "ascending" : sortDirection === "desc" ? "descending" : "none" : void 0,
105
109
  className: cn(
106
110
  "text-muted-foreground h-12 px-4 text-start align-middle font-medium",
107
111
  "[&:has([role=checkbox])]:pe-0",
112
+ numeric && "text-end",
108
113
  className
109
114
  ),
110
115
  ...props,
@@ -115,13 +120,16 @@ var TableHead = React.forwardRef(
115
120
  );
116
121
  TableHead.displayName = "TableHead";
117
122
  var TableCell = React.forwardRef(
118
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
123
+ ({ className, numeric, ...props }, ref) => /* @__PURE__ */ jsx(
119
124
  "td",
120
125
  {
121
126
  ref,
122
127
  "data-slot": "table-cell",
128
+ dir: numeric ? "ltr" : void 0,
123
129
  className: cn(
124
130
  "p-4 align-middle [&:has([role=checkbox])]:pe-0",
131
+ // Inside the dir="ltr" island, text-end is the physical right
132
+ numeric && "text-end tabular-nums",
125
133
  className
126
134
  ),
127
135
  ...props
@@ -201,5 +209,5 @@ function SortIcon({ direction }) {
201
209
  }
202
210
 
203
211
  export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
204
- //# sourceMappingURL=chunk-TNUL4LGG.js.map
205
- //# sourceMappingURL=chunk-TNUL4LGG.js.map
212
+ //# sourceMappingURL=chunk-5ILCNY74.js.map
213
+ //# sourceMappingURL=chunk-5ILCNY74.js.map