@smallwebco/tinypivot-react 1.0.20 → 1.0.21
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.
- package/dist/index.cjs +9 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/style.css +34 -4
- package/package.json +15 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/DataGrid.tsx","../src/hooks/useExcelGrid.ts","../src/hooks/usePivotTable.ts","../src/hooks/useLicense.ts","../src/hooks/useGridFeatures.ts","../src/components/ColumnFilter.tsx","../src/components/PivotConfig.tsx","../src/components/PivotSkeleton.tsx"],"sourcesContent":["/**\n * TinyPivot React\n * A powerful Excel-like data grid and pivot table component for React\n *\n * @packageDocumentation\n */\n\n// Components\nexport { DataGrid, ColumnFilter, PivotConfig, PivotSkeleton } from './components'\n\n// Hooks\nexport {\n useExcelGrid,\n usePivotTable,\n useLicense,\n setLicenseKey,\n configureLicenseSecret,\n enableDemoMode,\n getColumnUniqueValues,\n formatCellValue,\n getAggregationLabel,\n exportToCSV,\n exportPivotToCSV,\n copyToClipboard,\n formatSelectionForClipboard,\n usePagination,\n useGlobalSearch,\n useRowSelection,\n useColumnResize,\n} from './hooks'\n\n// Re-export types from core\nexport type {\n // Grid Types\n ColumnStats,\n GridOptions,\n\n // Pivot Types\n AggregationFunction,\n PivotField,\n PivotValueField,\n PivotConfig as PivotConfigType,\n PivotCell,\n PivotResult,\n FieldStats,\n\n // Component Props Types\n DataGridProps,\n PivotTableProps,\n\n // License Types\n LicenseType,\n LicenseInfo,\n\n // Event Types\n FilterEvent,\n SortEvent,\n CellClickEvent,\n SelectionChangeEvent,\n RowSelectionChangeEvent,\n ExportEvent,\n CopyEvent,\n\n // Feature Types\n PaginationOptions,\n ExportOptions,\n SelectionBounds,\n} from '@smallwebco/tinypivot-core'\n\n","/**\n * TinyPivot React - Main DataGrid Component\n * Excel-like data grid with optional pivot table functionality\n */\nimport React, { useState, useMemo, useCallback, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\nimport { useExcelGrid } from '../hooks/useExcelGrid'\nimport { usePivotTable } from '../hooks/usePivotTable'\nimport { useLicense } from '../hooks/useLicense'\nimport {\n exportToCSV,\n exportPivotToCSV,\n copyToClipboard,\n formatSelectionForClipboard,\n} from '../hooks/useGridFeatures'\nimport { ColumnFilter } from './ColumnFilter'\nimport { PivotConfig } from './PivotConfig'\nimport { PivotSkeleton } from './PivotSkeleton'\n\ninterface DataGridProps {\n data: Record<string, unknown>[]\n loading?: boolean\n rowHeight?: number\n headerHeight?: number\n fontSize?: 'xs' | 'sm' | 'base'\n showPivot?: boolean\n enableExport?: boolean\n enableSearch?: boolean\n enablePagination?: boolean\n pageSize?: number\n enableColumnResize?: boolean\n enableClipboard?: boolean\n theme?: 'light' | 'dark' | 'auto'\n stripedRows?: boolean\n exportFilename?: string\n enableVerticalResize?: boolean\n initialHeight?: number\n minHeight?: number\n maxHeight?: number\n onCellClick?: (payload: {\n row: number\n col: number\n value: unknown\n rowData: Record<string, unknown>\n }) => void\n onSelectionChange?: (payload: { cells: Array<{ row: number; col: number }>; values: unknown[] }) => void\n onExport?: (payload: { rowCount: number; filename: string }) => void\n onCopy?: (payload: { text: string; cellCount: number }) => void\n}\n\nconst MIN_COL_WIDTH = 120\nconst MAX_COL_WIDTH = 350\n\nexport function DataGrid({\n data,\n loading = false,\n fontSize: initialFontSize = 'xs',\n showPivot = true,\n enableExport = true,\n enableSearch = true,\n enablePagination = false,\n pageSize = 50,\n enableColumnResize = true,\n enableClipboard = true,\n theme = 'light',\n stripedRows = true,\n exportFilename = 'data-export.csv',\n enableVerticalResize = true,\n initialHeight = 600,\n minHeight = 300,\n maxHeight = 1200,\n onCellClick,\n onExport,\n onCopy,\n}: DataGridProps) {\n const { showWatermark, canUsePivot, isDemo } = useLicense()\n\n // Theme handling\n const currentTheme = useMemo(() => {\n if (theme === 'auto') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n return theme\n }, [theme])\n\n // State\n const [currentFontSize, setCurrentFontSize] = useState(initialFontSize)\n const [globalSearchTerm, setGlobalSearchTerm] = useState('')\n const [showSearchInput, setShowSearchInput] = useState(false)\n const [currentPage, setCurrentPage] = useState(1)\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({})\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null)\n const [resizeStartX, setResizeStartX] = useState(0)\n const [resizeStartWidth, setResizeStartWidth] = useState(0)\n const [gridHeight, setGridHeight] = useState(initialHeight)\n const [isResizingVertically, setIsResizingVertically] = useState(false)\n const [verticalResizeStartY, setVerticalResizeStartY] = useState(0)\n const [verticalResizeStartHeight, setVerticalResizeStartHeight] = useState(0)\n const [showCopyToast, setShowCopyToast] = useState(false)\n const [copyToastMessage, setCopyToastMessage] = useState('')\n const [viewMode, setViewMode] = useState<'grid' | 'pivot'>('grid')\n const [showPivotConfig, setShowPivotConfig] = useState(true)\n const [draggingField, setDraggingField] = useState<string | null>(null)\n const [activeFilterColumn, setActiveFilterColumn] = useState<string | null>(null)\n const [filterDropdownPosition, setFilterDropdownPosition] = useState({ top: 0, left: 0, maxHeight: 400 })\n const [selectedCell, setSelectedCell] = useState<{ row: number; col: number } | null>(null)\n const [selectionStart, setSelectionStart] = useState<{ row: number; col: number } | null>(null)\n const [selectionEnd, setSelectionEnd] = useState<{ row: number; col: number } | null>(null)\n const [isSelecting, setIsSelecting] = useState(false)\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n const tableBodyRef = useRef<HTMLTableSectionElement>(null)\n\n const fontSizeOptions = [\n { value: 'xs' as const, label: 'S' },\n { value: 'sm' as const, label: 'M' },\n { value: 'base' as const, label: 'L' },\n ]\n\n // Grid composable\n const {\n table,\n columnKeys,\n filteredRowCount,\n totalRowCount,\n getColumnStats,\n hasActiveFilter,\n setColumnFilter,\n getColumnFilterValues,\n clearAllFilters,\n toggleSort,\n getSortDirection,\n columnFilters,\n activeFilters,\n } = useExcelGrid({ data, enableSorting: true, enableFiltering: true })\n\n // Filtered data for pivot table\n const filteredDataForPivot = useMemo(() => {\n const filteredRows = table.getFilteredRowModel().rows\n return filteredRows.map(row => row.original)\n }, [table, columnFilters])\n\n // Pivot table composable\n const {\n rowFields: pivotRowFields,\n columnFields: pivotColumnFields,\n valueFields: pivotValueFields,\n showRowTotals: pivotShowRowTotals,\n showColumnTotals: pivotShowColumnTotals,\n availableFields: pivotAvailableFields,\n isConfigured: pivotIsConfigured,\n pivotResult,\n addRowField,\n removeRowField,\n addColumnField,\n removeColumnField,\n addValueField,\n removeValueField,\n updateValueFieldAggregation,\n clearConfig: clearPivotConfig,\n autoSuggestConfig,\n setShowRowTotals: setPivotShowRowTotals,\n setShowColumnTotals: setPivotShowColumnTotals,\n setRowFields,\n setColumnFields,\n } = usePivotTable(filteredDataForPivot)\n\n // Active filters info for display\n const activeFilterInfo = useMemo(() => {\n if (activeFilters.length === 0) return null\n return activeFilters.map(f => ({\n column: f.column,\n valueCount: f.values?.length || 0,\n values: f.values || [],\n }))\n }, [activeFilters])\n\n // Rows - depends on columnFilters to recompute when filters change\n const rows = useMemo(() => table.getFilteredRowModel().rows, [table, columnFilters])\n\n // Filtered data based on global search\n const searchFilteredData = useMemo(() => {\n if (!globalSearchTerm.trim() || !enableSearch) {\n return rows\n }\n const term = globalSearchTerm.toLowerCase().trim()\n return rows.filter(row => {\n for (const col of columnKeys) {\n const value = row.original[col]\n if (value === null || value === undefined) continue\n if (String(value).toLowerCase().includes(term)) {\n return true\n }\n }\n return false\n })\n }, [rows, globalSearchTerm, enableSearch, columnKeys])\n\n // Paginated rows\n const totalSearchedRows = searchFilteredData.length\n const totalPages = useMemo(() => {\n if (!enablePagination) return 1\n return Math.max(1, Math.ceil(totalSearchedRows / pageSize))\n }, [enablePagination, totalSearchedRows, pageSize])\n\n const paginatedRows = useMemo(() => {\n if (!enablePagination) return searchFilteredData\n const start = (currentPage - 1) * pageSize\n const end = start + pageSize\n return searchFilteredData.slice(start, end)\n }, [enablePagination, searchFilteredData, currentPage, pageSize])\n\n // Reset to page 1 when filters or search changes\n useEffect(() => {\n setCurrentPage(1)\n }, [columnFilters, globalSearchTerm])\n\n // Selection bounds\n const selectionBounds = useMemo(() => {\n if (!selectionStart || !selectionEnd) return null\n return {\n minRow: Math.min(selectionStart.row, selectionEnd.row),\n maxRow: Math.max(selectionStart.row, selectionEnd.row),\n minCol: Math.min(selectionStart.col, selectionEnd.col),\n maxCol: Math.max(selectionStart.col, selectionEnd.col),\n }\n }, [selectionStart, selectionEnd])\n\n // Selection stats\n const selectionStats = useMemo(() => {\n if (!selectionBounds) return null\n const { minRow, maxRow, minCol, maxCol } = selectionBounds\n\n const values: number[] = []\n let count = 0\n\n for (let r = minRow; r <= maxRow; r++) {\n const row = rows[r]\n if (!row) continue\n\n for (let c = minCol; c <= maxCol; c++) {\n const colId = columnKeys[c]\n if (!colId) continue\n\n const value = row.original[colId]\n count++\n\n if (value !== null && value !== undefined && value !== '') {\n const num = typeof value === 'number' ? value : Number.parseFloat(String(value))\n if (!Number.isNaN(num)) {\n values.push(num)\n }\n }\n }\n }\n\n if (values.length === 0) return { count, sum: null, avg: null, numericCount: 0 }\n\n const sum = values.reduce((a, b) => a + b, 0)\n const avg = sum / values.length\n\n return { count, sum, avg, numericCount: values.length }\n }, [selectionBounds, rows, columnKeys])\n\n // Calculate column widths\n useEffect(() => {\n if (data.length === 0) return\n\n const widths: Record<string, number> = {}\n const sampleSize = Math.min(100, data.length)\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n ctx.font = '13px system-ui, -apple-system, sans-serif'\n\n for (const key of columnKeys) {\n let maxWidth = ctx.measureText(key).width + 56\n\n for (let i = 0; i < sampleSize; i++) {\n const value = data[i][key]\n const text = value === null || value === undefined ? '' : String(value)\n const width = ctx.measureText(text).width + 28\n maxWidth = Math.max(maxWidth, width)\n }\n\n widths[key] = Math.min(Math.max(maxWidth, MIN_COL_WIDTH), MAX_COL_WIDTH)\n }\n\n setColumnWidths(widths)\n }, [data, columnKeys])\n\n // Column resize handlers\n const startColumnResize = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n if (!enableColumnResize) return\n event.preventDefault()\n event.stopPropagation()\n\n setResizingColumnId(columnId)\n setResizeStartX(event.clientX)\n setResizeStartWidth(columnWidths[columnId] || MIN_COL_WIDTH)\n },\n [enableColumnResize, columnWidths]\n )\n\n useEffect(() => {\n if (!resizingColumnId) return\n\n const handleResizeMove = (event: MouseEvent) => {\n const diff = event.clientX - resizeStartX\n const newWidth = Math.max(MIN_COL_WIDTH, Math.min(MAX_COL_WIDTH, resizeStartWidth + diff))\n setColumnWidths(prev => ({\n ...prev,\n [resizingColumnId]: newWidth,\n }))\n }\n\n const handleResizeEnd = () => {\n setResizingColumnId(null)\n }\n\n document.addEventListener('mousemove', handleResizeMove)\n document.addEventListener('mouseup', handleResizeEnd)\n return () => {\n document.removeEventListener('mousemove', handleResizeMove)\n document.removeEventListener('mouseup', handleResizeEnd)\n }\n }, [resizingColumnId, resizeStartX, resizeStartWidth])\n\n // Vertical resize handlers\n const startVerticalResize = useCallback(\n (event: React.MouseEvent) => {\n if (!enableVerticalResize) return\n event.preventDefault()\n\n setIsResizingVertically(true)\n setVerticalResizeStartY(event.clientY)\n setVerticalResizeStartHeight(gridHeight)\n },\n [enableVerticalResize, gridHeight]\n )\n\n useEffect(() => {\n if (!isResizingVertically) return\n\n const handleVerticalResizeMove = (event: MouseEvent) => {\n const diff = event.clientY - verticalResizeStartY\n const newHeight = Math.max(minHeight, Math.min(maxHeight, verticalResizeStartHeight + diff))\n setGridHeight(newHeight)\n }\n\n const handleVerticalResizeEnd = () => {\n setIsResizingVertically(false)\n }\n\n document.addEventListener('mousemove', handleVerticalResizeMove)\n document.addEventListener('mouseup', handleVerticalResizeEnd)\n return () => {\n document.removeEventListener('mousemove', handleVerticalResizeMove)\n document.removeEventListener('mouseup', handleVerticalResizeEnd)\n }\n }, [isResizingVertically, verticalResizeStartY, verticalResizeStartHeight, minHeight, maxHeight])\n\n // Export handlers\n const handleExport = useCallback(() => {\n if (viewMode === 'pivot') {\n if (!pivotResult) return\n\n const pivotFilename = exportFilename.replace('.csv', '-pivot.csv')\n exportPivotToCSV(\n {\n headers: pivotResult.headers,\n rowHeaders: pivotResult.rowHeaders,\n data: pivotResult.data,\n rowTotals: pivotResult.rowTotals,\n columnTotals: pivotResult.columnTotals,\n grandTotal: pivotResult.grandTotal,\n showRowTotals: pivotShowRowTotals,\n showColumnTotals: pivotShowColumnTotals,\n },\n pivotRowFields,\n pivotColumnFields,\n pivotValueFields,\n { filename: pivotFilename }\n )\n\n onExport?.({ rowCount: pivotResult.rowHeaders.length, filename: pivotFilename })\n return\n }\n\n const dataToExport =\n enableSearch && globalSearchTerm.trim()\n ? searchFilteredData.map(row => row.original)\n : rows.map(row => row.original)\n\n exportToCSV(dataToExport, columnKeys, {\n filename: exportFilename,\n includeHeaders: true,\n })\n\n onExport?.({ rowCount: dataToExport.length, filename: exportFilename })\n }, [\n viewMode,\n pivotResult,\n exportFilename,\n pivotShowRowTotals,\n pivotShowColumnTotals,\n pivotRowFields,\n pivotColumnFields,\n pivotValueFields,\n enableSearch,\n globalSearchTerm,\n searchFilteredData,\n rows,\n columnKeys,\n onExport,\n ])\n\n // Copy to clipboard\n const copySelectionToClipboard = useCallback(() => {\n if (!selectionBounds || !enableClipboard) return\n\n const text = formatSelectionForClipboard(\n rows.map(r => r.original),\n columnKeys,\n selectionBounds\n )\n\n copyToClipboard(\n text,\n () => {\n const cellCount =\n (selectionBounds.maxRow - selectionBounds.minRow + 1) *\n (selectionBounds.maxCol - selectionBounds.minCol + 1)\n setCopyToastMessage(`Copied ${cellCount} cell${cellCount > 1 ? 's' : ''}`)\n setShowCopyToast(true)\n setTimeout(() => setShowCopyToast(false), 2000)\n onCopy?.({ text, cellCount })\n },\n err => {\n setCopyToastMessage('Copy failed')\n setShowCopyToast(true)\n setTimeout(() => setShowCopyToast(false), 2000)\n console.error('Copy failed:', err)\n }\n )\n }, [selectionBounds, enableClipboard, rows, columnKeys, onCopy])\n\n // Cell selection handlers\n const handleMouseDown = useCallback(\n (rowIndex: number, colIndex: number, event: React.MouseEvent) => {\n event.preventDefault()\n\n if (event.shiftKey && selectedCell) {\n setSelectionEnd({ row: rowIndex, col: colIndex })\n } else {\n setSelectedCell({ row: rowIndex, col: colIndex })\n setSelectionStart({ row: rowIndex, col: colIndex })\n setSelectionEnd({ row: rowIndex, col: colIndex })\n setIsSelecting(true)\n }\n\n const row = rows[rowIndex]\n if (row) {\n const colId = columnKeys[colIndex]\n onCellClick?.({\n row: rowIndex,\n col: colIndex,\n value: row.original[colId],\n rowData: row.original,\n })\n }\n },\n [selectedCell, rows, columnKeys, onCellClick]\n )\n\n const handleMouseEnter = useCallback(\n (rowIndex: number, colIndex: number) => {\n if (isSelecting) {\n setSelectionEnd({ row: rowIndex, col: colIndex })\n }\n },\n [isSelecting]\n )\n\n useEffect(() => {\n const handleMouseUp = () => setIsSelecting(false)\n document.addEventListener('mouseup', handleMouseUp)\n return () => document.removeEventListener('mouseup', handleMouseUp)\n }, [])\n\n // Keyboard handling\n useEffect(() => {\n const handleKeydown = (event: KeyboardEvent) => {\n // Handle Ctrl+C / Cmd+C for clipboard\n if ((event.ctrlKey || event.metaKey) && event.key === 'c' && selectionBounds) {\n event.preventDefault()\n copySelectionToClipboard()\n return\n }\n\n // Handle Escape\n if (event.key === 'Escape') {\n setSelectedCell(null)\n setSelectionStart(null)\n setSelectionEnd(null)\n setShowSearchInput(false)\n setGlobalSearchTerm('')\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n return () => document.removeEventListener('keydown', handleKeydown)\n }, [selectionBounds, copySelectionToClipboard])\n\n // Filter dropdown\n const openFilterDropdown = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n event.stopPropagation()\n const target = event.currentTarget as HTMLElement\n const headerCell = target.closest('.vpg-header-cell') as HTMLElement\n const rect = headerCell?.getBoundingClientRect() || target.getBoundingClientRect()\n\n const dropdownWidth = 280\n const padding = 12\n\n let left = rect.left\n if (left + dropdownWidth > window.innerWidth - padding) {\n left = window.innerWidth - dropdownWidth - padding\n }\n left = Math.max(padding, left)\n\n const spaceBelow = window.innerHeight - rect.bottom - padding\n const spaceAbove = rect.top - padding\n\n let top: number\n let maxDropdownHeight: number\n\n if (spaceBelow >= 300 || spaceBelow >= spaceAbove) {\n top = rect.bottom + 4\n maxDropdownHeight = Math.min(400, spaceBelow - 4)\n } else {\n maxDropdownHeight = Math.min(400, spaceAbove - 4)\n top = rect.top - maxDropdownHeight - 4\n }\n\n setFilterDropdownPosition({ top, left, maxHeight: maxDropdownHeight })\n setActiveFilterColumn(columnId)\n },\n []\n )\n\n const closeFilterDropdown = useCallback(() => {\n setActiveFilterColumn(null)\n }, [])\n\n const handleFilter = useCallback(\n (columnId: string, values: string[]) => {\n setColumnFilter(columnId, values)\n },\n [setColumnFilter]\n )\n\n const handleSort = useCallback(\n (columnId: string, direction: 'asc' | 'desc' | null) => {\n if (direction === null) {\n const current = getSortDirection(columnId)\n if (current) {\n toggleSort(columnId)\n if (getSortDirection(columnId)) {\n toggleSort(columnId)\n }\n }\n } else {\n const current = getSortDirection(columnId)\n if (current === null) {\n toggleSort(columnId)\n if (direction === 'desc' && getSortDirection(columnId) === 'asc') {\n toggleSort(columnId)\n }\n } else if (current !== direction) {\n toggleSort(columnId)\n }\n }\n },\n [getSortDirection, toggleSort]\n )\n\n const isCellSelected = useCallback(\n (rowIndex: number, colIndex: number): boolean => {\n if (!selectionBounds) {\n return selectedCell?.row === rowIndex && selectedCell?.col === colIndex\n }\n const { minRow, maxRow, minCol, maxCol } = selectionBounds\n return rowIndex >= minRow && rowIndex <= maxRow && colIndex >= minCol && colIndex <= maxCol\n },\n [selectionBounds, selectedCell]\n )\n\n const formatStatValue = (value: number | null): string => {\n if (value === null) return '-'\n if (Math.abs(value) >= 1000) {\n return value.toLocaleString('en-US', { maximumFractionDigits: 2 })\n }\n return value.toLocaleString('en-US', { maximumFractionDigits: 4 })\n }\n\n // Format cell value\n const noFormatPatterns =\n /^(?:.*_)?(?:id|code|year|month|quarter|day|week|date|zip|phone|fax|ssn|ein|npi|ndc|gpi|hcpcs|icd|cpt|rx|bin|pcn|group|member|claim|rx_number|script|fill)(?:_.*)?$/i\n\n const shouldFormatNumber = (columnId: string): boolean => {\n return !noFormatPatterns.test(columnId)\n }\n\n const formatCellValueDisplay = (value: unknown, columnId: string): string => {\n if (value === null || value === undefined) return ''\n if (value === '') return ''\n\n const stats = getColumnStats(columnId)\n if (stats.type === 'number') {\n const num = typeof value === 'number' ? value : Number.parseFloat(String(value))\n if (Number.isNaN(num)) return String(value)\n\n if (shouldFormatNumber(columnId) && Math.abs(num) >= 1000) {\n return num.toLocaleString('en-US', { maximumFractionDigits: 2 })\n }\n\n if (Number.isInteger(num)) {\n return String(num)\n }\n return num.toLocaleString('en-US', { maximumFractionDigits: 4, useGrouping: false })\n }\n\n return String(value)\n }\n\n const totalTableWidth = useMemo(() => {\n return columnKeys.reduce((sum, key) => sum + (columnWidths[key] || MIN_COL_WIDTH), 0)\n }, [columnKeys, columnWidths])\n\n const activeFilterCount = columnFilters.length\n\n return (\n <div\n className={`vpg-data-grid vpg-font-${currentFontSize} vpg-theme-${currentTheme} ${stripedRows ? 'vpg-striped' : ''} ${resizingColumnId ? 'vpg-resizing' : ''} ${isResizingVertically ? 'vpg-resizing-vertical' : ''}`}\n style={{ height: `${gridHeight}px` }}\n >\n {/* Copy Toast */}\n {showCopyToast && (\n <div className=\"vpg-toast\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {copyToastMessage}\n </div>\n )}\n\n {/* Toolbar */}\n <div className=\"vpg-toolbar\">\n <div className=\"vpg-toolbar-left\">\n {/* View mode toggle */}\n {showPivot && (\n <div className=\"vpg-view-toggle\">\n <button\n className={`vpg-view-btn ${viewMode === 'grid' ? 'active' : ''}`}\n onClick={() => setViewMode('grid')}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n Grid\n </button>\n <button\n className={`vpg-view-btn vpg-pivot-btn ${viewMode === 'pivot' ? 'active' : ''}`}\n onClick={() => setViewMode('pivot')}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n Pivot\n </button>\n </div>\n )}\n\n {/* Grid mode controls */}\n {viewMode === 'grid' && (\n <>\n {/* Search */}\n {enableSearch && (\n <div className=\"vpg-search-container\">\n {!showSearchInput ? (\n <button\n className=\"vpg-icon-btn\"\n title=\"Search (Ctrl+F)\"\n onClick={() => setShowSearchInput(true)}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"vpg-search-box\">\n <svg\n className=\"vpg-search-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={globalSearchTerm}\n onChange={e => setGlobalSearchTerm(e.target.value)}\n className=\"vpg-search-input\"\n placeholder=\"Search all columns...\"\n onKeyDown={e => {\n if (e.key === 'Escape') {\n setShowSearchInput(false)\n setGlobalSearchTerm('')\n }\n }}\n autoFocus\n />\n {globalSearchTerm && (\n <button className=\"vpg-search-clear\" onClick={() => setGlobalSearchTerm('')}>\n <svg\n className=\"vpg-icon-xs\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"vpg-font-size-control\">\n <span className=\"vpg-label\">Size:</span>\n <div className=\"vpg-font-size-toggle\">\n {fontSizeOptions.map(opt => (\n <button\n key={opt.value}\n className={`vpg-font-size-btn ${currentFontSize === opt.value ? 'active' : ''}`}\n onClick={() => setCurrentFontSize(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {activeFilterCount > 0 && (\n <div className=\"vpg-filter-info\">\n <svg className=\"vpg-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>\n {activeFilterCount} filter{activeFilterCount > 1 ? 's' : ''}\n </span>\n </div>\n )}\n\n {globalSearchTerm && (\n <div className=\"vpg-search-info\">\n <span>\n {totalSearchedRows} match{totalSearchedRows !== 1 ? 'es' : ''}\n </span>\n </div>\n )}\n </>\n )}\n\n {/* Pivot mode controls */}\n {viewMode === 'pivot' && canUsePivot && (\n <>\n <button\n className={`vpg-config-toggle ${showPivotConfig ? 'active' : ''}`}\n onClick={() => setShowPivotConfig(!showPivotConfig)}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n {showPivotConfig ? 'Hide' : 'Show'} Config\n </button>\n\n {pivotIsConfigured && (\n <div className=\"vpg-pivot-status\">\n <svg className=\"vpg-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>Pivot configured</span>\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"vpg-toolbar-right\">\n {viewMode === 'grid' && activeFilterCount > 0 && (\n <button className=\"vpg-clear-filters\" onClick={clearAllFilters}>\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n Clear Filters\n </button>\n )}\n\n {/* Copy button */}\n {enableClipboard && selectionBounds && viewMode === 'grid' && (\n <button\n className=\"vpg-icon-btn\"\n title=\"Copy selection (Ctrl+C)\"\n onClick={copySelectionToClipboard}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n )}\n\n {/* Export button */}\n {enableExport && (viewMode === 'grid' || (viewMode === 'pivot' && pivotIsConfigured)) && (\n <button\n className=\"vpg-export-btn\"\n title={viewMode === 'pivot' ? 'Export Pivot to CSV' : 'Export to CSV'}\n onClick={handleExport}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Export{viewMode === 'pivot' ? ' Pivot' : ''}\n </button>\n )}\n </div>\n </div>\n\n {/* Grid View */}\n {viewMode === 'grid' && (\n <div ref={tableContainerRef} className=\"vpg-grid-container\" tabIndex={0}>\n {loading && (\n <div className=\"vpg-loading\">\n <div className=\"vpg-spinner\" />\n <span>Loading data...</span>\n </div>\n )}\n\n {!loading && data.length === 0 && (\n <div className=\"vpg-empty\">\n <div className=\"vpg-empty-icon\">\n <svg className=\"vpg-icon-lg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <span>No data available</span>\n </div>\n )}\n\n {!loading && data.length > 0 && filteredRowCount === 0 && (\n <div className=\"vpg-empty\">\n <div className=\"vpg-empty-icon vpg-warning\">\n <svg className=\"vpg-icon-lg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n </div>\n <span>No matching records</span>\n <button className=\"vpg-clear-link\" onClick={clearAllFilters}>\n Clear all filters\n </button>\n </div>\n )}\n\n {!loading && filteredRowCount > 0 && (\n <div className=\"vpg-table-wrapper\">\n <table className=\"vpg-table\" style={{ minWidth: `${totalTableWidth}px` }}>\n <thead>\n <tr>\n {columnKeys.map((colId, colIndex) => (\n <th\n key={colId}\n className={`vpg-header-cell ${hasActiveFilter(colId) ? 'vpg-has-filter' : ''} ${getSortDirection(colId) !== null ? 'vpg-is-sorted' : ''} ${activeFilterColumn === colId ? 'vpg-is-active' : ''}`}\n style={{\n width: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n minWidth: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n }}\n onClick={e => {\n const target = e.target as HTMLElement\n if (target.closest('.vpg-dropdown-arrow')) {\n openFilterDropdown(colId, e)\n }\n }}\n >\n <div className=\"vpg-header-content\">\n <span className=\"vpg-header-text\">{colId}</span>\n <div className=\"vpg-header-icons\">\n {getSortDirection(colId) && (\n <span className=\"vpg-sort-indicator\">\n {getSortDirection(colId) === 'asc' ? (\n <svg\n className=\"vpg-icon-sm\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <svg\n className=\"vpg-icon-sm\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </span>\n )}\n {hasActiveFilter(colId) && (\n <span className=\"vpg-filter-indicator\">\n <svg\n className=\"vpg-icon-xs\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n )}\n <span className=\"vpg-dropdown-arrow\" title=\"Filter & Sort\">\n <svg\n className=\"vpg-icon-sm\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </div>\n </div>\n {enableColumnResize && (\n <div\n className=\"vpg-resize-handle\"\n onMouseDown={e => startColumnResize(colId, e)}\n />\n )}\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody ref={tableBodyRef}>\n {paginatedRows.map((row, rowIndex) => (\n <tr key={row.id} className=\"vpg-row\">\n {columnKeys.map((colId, colIndex) => (\n <td\n key={colId}\n className={`vpg-cell ${isCellSelected(rowIndex, colIndex) ? 'vpg-selected' : ''} ${getColumnStats(colId).type === 'number' ? 'vpg-is-number' : ''}`}\n data-row={rowIndex}\n data-col={colIndex}\n style={{\n width: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n minWidth: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n }}\n onMouseDown={e => handleMouseDown(rowIndex, colIndex, e)}\n onMouseEnter={() => handleMouseEnter(rowIndex, colIndex)}\n >\n {formatCellValueDisplay(row.original[colId], colId)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n\n {/* Pivot View */}\n {viewMode === 'pivot' && (\n <div className=\"vpg-pivot-container\">\n {showPivotConfig && canUsePivot && (\n <div className=\"vpg-pivot-config-panel\">\n <PivotConfig\n availableFields={pivotAvailableFields}\n rowFields={pivotRowFields}\n columnFields={pivotColumnFields}\n valueFields={pivotValueFields}\n showRowTotals={pivotShowRowTotals}\n showColumnTotals={pivotShowColumnTotals}\n onShowRowTotalsChange={setPivotShowRowTotals}\n onShowColumnTotalsChange={setPivotShowColumnTotals}\n onClearConfig={clearPivotConfig}\n onAutoSuggest={autoSuggestConfig}\n onDragStart={(field, e) => setDraggingField(field)}\n onDragEnd={() => setDraggingField(null)}\n onUpdateAggregation={updateValueFieldAggregation}\n onAddRowField={addRowField}\n onRemoveRowField={removeRowField}\n onAddColumnField={addColumnField}\n onRemoveColumnField={removeColumnField}\n onAddValueField={addValueField}\n onRemoveValueField={removeValueField}\n />\n </div>\n )}\n\n <div className={`vpg-pivot-main ${!showPivotConfig ? 'vpg-full-width' : ''}`}>\n <PivotSkeleton\n rowFields={pivotRowFields}\n columnFields={pivotColumnFields}\n valueFields={pivotValueFields}\n isConfigured={pivotIsConfigured}\n draggingField={draggingField}\n pivotResult={pivotResult}\n fontSize={currentFontSize}\n activeFilters={activeFilterInfo}\n totalRowCount={totalRowCount}\n filteredRowCount={filteredRowCount}\n onAddRowField={addRowField}\n onRemoveRowField={removeRowField}\n onAddColumnField={addColumnField}\n onRemoveColumnField={removeColumnField}\n onAddValueField={addValueField}\n onRemoveValueField={removeValueField}\n onUpdateAggregation={updateValueFieldAggregation}\n onReorderRowFields={setRowFields}\n onReorderColumnFields={setColumnFields}\n />\n </div>\n </div>\n )}\n\n {/* Footer */}\n <div className=\"vpg-footer\">\n <div className=\"vpg-footer-left\">\n {viewMode === 'grid' ? (\n enablePagination ? (\n <>\n <span>\n {((currentPage - 1) * pageSize + 1).toLocaleString()}-\n {Math.min(currentPage * pageSize, totalSearchedRows).toLocaleString()}\n </span>\n <span className=\"vpg-separator\">of</span>\n <span>{totalSearchedRows.toLocaleString()}</span>\n {totalSearchedRows !== totalRowCount && (\n <span className=\"vpg-filtered-note\">({totalRowCount.toLocaleString()} total)</span>\n )}\n </>\n ) : filteredRowCount === totalRowCount && totalSearchedRows === totalRowCount ? (\n <span>{totalRowCount.toLocaleString()} records</span>\n ) : (\n <>\n <span className=\"vpg-filtered-count\">{totalSearchedRows.toLocaleString()}</span>\n <span className=\"vpg-separator\">of</span>\n <span>{totalRowCount.toLocaleString()}</span>\n <span className=\"vpg-separator\">records</span>\n </>\n )\n ) : (\n <>\n <span className=\"vpg-pivot-label\">Pivot Table</span>\n <span className=\"vpg-separator\">•</span>\n <span>{totalRowCount.toLocaleString()} source records</span>\n </>\n )}\n </div>\n\n {/* Pagination controls */}\n {enablePagination && viewMode === 'grid' && totalPages > 1 && (\n <div className=\"vpg-pagination\">\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === 1}\n onClick={() => setCurrentPage(1)}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\"\n />\n </svg>\n </button>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === 1}\n onClick={() => setCurrentPage(p => Math.max(1, p - 1))}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <span className=\"vpg-page-info\">\n Page {currentPage} of {totalPages}\n </span>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === totalPages}\n onClick={() => setCurrentPage(p => Math.min(totalPages, p + 1))}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === totalPages}\n onClick={() => setCurrentPage(totalPages)}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 5l7 7-7 7M5 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {viewMode === 'grid' && selectionStats && selectionStats.count > 1 && (\n <div className=\"vpg-selection-stats\">\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Count:</span>\n <span className=\"vpg-stat-value\">{selectionStats.count}</span>\n </span>\n {selectionStats.numericCount > 0 && (\n <>\n <span className=\"vpg-stat-divider\">|</span>\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Sum:</span>\n <span className=\"vpg-stat-value\">{formatStatValue(selectionStats.sum)}</span>\n </span>\n <span className=\"vpg-stat-divider\">|</span>\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Avg:</span>\n <span className=\"vpg-stat-value\">{formatStatValue(selectionStats.avg)}</span>\n </span>\n </>\n )}\n </div>\n )}\n\n <div className=\"vpg-footer-right\">\n {isDemo ? (\n <div className=\"vpg-demo-banner\">\n <span className=\"vpg-demo-badge\">DEMO</span>\n <span>Pro features enabled</span>\n <a href=\"https://tiny-pivot.com/#pricing\" target=\"_blank\" rel=\"noopener noreferrer\">\n Get License →\n </a>\n </div>\n ) : showWatermark ? (\n <span className=\"vpg-watermark-inline\">\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n TinyPivot\n </a>\n </span>\n ) : null}\n </div>\n </div>\n\n {/* Vertical Resize Handle */}\n {enableVerticalResize && (\n <div className=\"vpg-vertical-resize-handle\" onMouseDown={startVerticalResize}>\n <div className=\"vpg-resize-grip\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </div>\n )}\n\n {/* Filter Dropdown Portal */}\n {activeFilterColumn &&\n createPortal(\n <div\n className=\"vpg-filter-portal\"\n style={{\n position: 'fixed',\n top: `${filterDropdownPosition.top}px`,\n left: `${filterDropdownPosition.left}px`,\n maxHeight: `${filterDropdownPosition.maxHeight}px`,\n zIndex: 9999,\n }}\n >\n <ColumnFilter\n columnId={activeFilterColumn}\n columnName={activeFilterColumn}\n stats={getColumnStats(activeFilterColumn)}\n selectedValues={getColumnFilterValues(activeFilterColumn)}\n sortDirection={getSortDirection(activeFilterColumn)}\n onFilter={values => handleFilter(activeFilterColumn, values)}\n onSort={dir => handleSort(activeFilterColumn, dir)}\n onClose={closeFilterDropdown}\n />\n </div>,\n document.body\n )}\n </div>\n )\n}\n\n","/**\n * Excel-like Grid Hook for React\n * Provides Excel-like filtering, sorting, and data manipulation functionality\n */\nimport { useState, useMemo, useCallback, useEffect } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n type ColumnDef,\n type ColumnFiltersState,\n type SortingState,\n type VisibilityState,\n type FilterFn,\n} from '@tanstack/react-table'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\nimport { getColumnUniqueValues, formatCellValue } from '@smallwebco/tinypivot-core'\n\n// Re-export for convenience\nexport { getColumnUniqueValues, formatCellValue }\n\nexport interface ExcelGridOptions<T> {\n data: T[]\n columns?: string[]\n enableSorting?: boolean\n enableFiltering?: boolean\n pageSize?: number\n}\n\n/**\n * Multi-value filter function for Excel-style filtering\n */\nconst multiSelectFilter: FilterFn<unknown> = (row, columnId, filterValue) => {\n if (!filterValue || !Array.isArray(filterValue) || filterValue.length === 0) {\n return true\n }\n\n const cellValue = row.getValue(columnId)\n const cellString =\n cellValue === null || cellValue === undefined || cellValue === ''\n ? '(blank)'\n : String(cellValue)\n\n return filterValue.includes(cellString)\n}\n\n/**\n * Excel-like grid hook\n */\nexport function useExcelGrid<T extends Record<string, unknown>>(options: ExcelGridOptions<T>) {\n const { data, enableSorting = true, enableFiltering = true } = options\n\n // State\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [globalFilter, setGlobalFilter] = useState('')\n\n // Column statistics cache\n const [columnStatsCache, setColumnStatsCache] = useState<Record<string, ColumnStats>>({})\n\n const dataSignature = useMemo(\n () => `${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [data]\n )\n\n // Compute columns from data\n const columnKeys = useMemo(() => {\n if (data.length === 0) return []\n return Object.keys(data[0] as Record<string, unknown>)\n }, [data])\n\n // Get column stats (memoized)\n const getColumnStats = useCallback(\n (columnKey: string): ColumnStats => {\n const cacheKey = `${columnKey}-${dataSignature}`\n if (!columnStatsCache[cacheKey]) {\n const stats = getColumnUniqueValues(data, columnKey)\n setColumnStatsCache(prev => ({ ...prev, [cacheKey]: stats }))\n return stats\n }\n return columnStatsCache[cacheKey]\n },\n [data, columnStatsCache, dataSignature]\n )\n\n // Clear stats cache\n const clearStatsCache = useCallback(() => {\n setColumnStatsCache({})\n }, [])\n\n useEffect(() => {\n clearStatsCache()\n }, [dataSignature, clearStatsCache])\n\n // Create column definitions dynamically\n const columnDefs = useMemo<ColumnDef<T, unknown>[]>(() => {\n return columnKeys.map(key => {\n const stats = getColumnStats(key)\n\n return {\n id: key,\n accessorKey: key,\n header: key,\n cell: info => formatCellValue(info.getValue(), stats.type),\n filterFn: multiSelectFilter,\n meta: {\n type: stats.type,\n uniqueCount: stats.uniqueValues.length,\n },\n } as ColumnDef<T, unknown>\n })\n }, [columnKeys, getColumnStats])\n\n // Create table instance\n const table = useReactTable({\n data,\n columns: columnDefs,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n globalFilter,\n },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: enableFiltering ? getFilteredRowModel() : undefined,\n filterFns: {\n multiSelect: multiSelectFilter,\n },\n enableSorting,\n enableFilters: enableFiltering,\n })\n\n // Computed properties\n const filteredRowCount = table.getFilteredRowModel().rows.length\n const totalRowCount = data.length\n\n // Active filters\n const activeFilters = useMemo(() => {\n return columnFilters.map(f => ({\n column: f.id,\n values: f.value as string[],\n }))\n }, [columnFilters])\n\n // Check if column has active filter\n const hasActiveFilter = useCallback(\n (columnId: string): boolean => {\n const column = table.getColumn(columnId)\n if (!column) return false\n const filterValue = column.getFilterValue()\n return filterValue !== undefined && Array.isArray(filterValue) && filterValue.length > 0\n },\n [table]\n )\n\n // Set column filter\n const setColumnFilter = useCallback(\n (columnId: string, values: string[]) => {\n const column = table.getColumn(columnId)\n if (column) {\n // Let the table's onColumnFiltersChange handler update the state\n // Do NOT manually call setColumnFilters after - it causes a race condition\n // where the stale state overwrites the pending update\n column.setFilterValue(values.length === 0 ? undefined : values)\n }\n },\n [table]\n )\n\n // Clear all filters\n const clearAllFilters = useCallback(() => {\n table.resetColumnFilters()\n setGlobalFilter('')\n // Force sync columnFilters state\n setColumnFilters([])\n }, [table])\n\n // Get filter values for a specific column\n const getColumnFilterValues = useCallback(\n (columnId: string): string[] => {\n const column = table.getColumn(columnId)\n if (!column) return []\n const filterValue = column.getFilterValue()\n return Array.isArray(filterValue) ? filterValue : []\n },\n [table]\n )\n\n // Toggle column sort\n const toggleSort = useCallback((columnId: string) => {\n setSorting(prev => {\n const current = prev.find(s => s.id === columnId)\n if (!current) {\n return [{ id: columnId, desc: false }]\n } else if (!current.desc) {\n return [{ id: columnId, desc: true }]\n } else {\n return []\n }\n })\n }, [])\n\n // Get sort direction for column\n const getSortDirection = useCallback(\n (columnId: string): 'asc' | 'desc' | null => {\n const sort = sorting.find(s => s.id === columnId)\n if (!sort) return null\n return sort.desc ? 'desc' : 'asc'\n },\n [sorting]\n )\n\n return {\n // Table instance\n table,\n\n // State\n sorting,\n columnFilters,\n columnVisibility,\n globalFilter,\n columnKeys,\n setSorting,\n setColumnFilters,\n setGlobalFilter,\n\n // Computed\n filteredRowCount,\n totalRowCount,\n activeFilters,\n\n // Methods\n getColumnStats,\n clearStatsCache,\n hasActiveFilter,\n setColumnFilter,\n getColumnFilterValues,\n clearAllFilters,\n toggleSort,\n getSortDirection,\n }\n}\n\n","/**\n * Pivot Table Hook for React\n * Wraps core pivot logic with React state management\n */\nimport { useState, useMemo, useEffect, useCallback } from 'react'\nimport type {\n AggregationFunction,\n FieldStats,\n PivotConfig,\n PivotResult,\n PivotValueField,\n} from '@smallwebco/tinypivot-core'\nimport {\n computeAvailableFields,\n getUnassignedFields,\n isPivotConfigured,\n computePivotResult,\n generateStorageKey,\n savePivotConfig,\n loadPivotConfig,\n isConfigValidForFields,\n getAggregationLabel,\n} from '@smallwebco/tinypivot-core'\nimport { useLicense } from './useLicense'\n\n// Re-export for convenience\nexport { getAggregationLabel }\n\ninterface UsePivotTableReturn {\n // State\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n showRowTotals: boolean\n showColumnTotals: boolean\n\n // Computed\n availableFields: FieldStats[]\n unassignedFields: FieldStats[]\n isConfigured: boolean\n pivotResult: PivotResult | null\n\n // Actions\n addRowField: (field: string) => void\n removeRowField: (field: string) => void\n addColumnField: (field: string) => void\n removeColumnField: (field: string) => void\n addValueField: (field: string, aggregation?: AggregationFunction) => void\n removeValueField: (field: string, aggregation?: AggregationFunction) => void\n updateValueFieldAggregation: (\n field: string,\n oldAgg: AggregationFunction,\n newAgg: AggregationFunction\n ) => void\n clearConfig: () => void\n setShowRowTotals: (value: boolean) => void\n setShowColumnTotals: (value: boolean) => void\n autoSuggestConfig: () => void\n setRowFields: (fields: string[]) => void\n setColumnFields: (fields: string[]) => void\n}\n\n/**\n * Main pivot table hook\n */\nexport function usePivotTable(data: Record<string, unknown>[]): UsePivotTableReturn {\n const { canUsePivot, requirePro } = useLicense()\n\n // Configuration state\n const [rowFields, setRowFieldsState] = useState<string[]>([])\n const [columnFields, setColumnFieldsState] = useState<string[]>([])\n const [valueFields, setValueFields] = useState<PivotValueField[]>([])\n const [showRowTotals, setShowRowTotals] = useState(true)\n const [showColumnTotals, setShowColumnTotals] = useState(true)\n const [currentStorageKey, setCurrentStorageKey] = useState<string | null>(null)\n\n // Compute available fields from data\n const availableFields = useMemo((): FieldStats[] => {\n return computeAvailableFields(data)\n }, [data])\n\n // Get fields that haven't been assigned yet\n const unassignedFields = useMemo(() => {\n return getUnassignedFields(availableFields, rowFields, columnFields, valueFields)\n }, [availableFields, rowFields, columnFields, valueFields])\n\n // Check if pivot is configured\n const isConfigured = useMemo(() => {\n return isPivotConfigured({\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n })\n }, [rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Build pivot result\n const pivotResult = useMemo((): PivotResult | null => {\n if (!isConfigured) return null\n if (!canUsePivot) return null\n\n return computePivotResult(data, {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n })\n }, [data, isConfigured, canUsePivot, rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Load/save config from storage\n useEffect(() => {\n if (data.length === 0) return\n\n const newKeys = Object.keys(data[0])\n const storageKey = generateStorageKey(newKeys)\n\n if (storageKey !== currentStorageKey) {\n setCurrentStorageKey(storageKey)\n\n const savedConfig = loadPivotConfig(storageKey)\n if (savedConfig && isConfigValidForFields(savedConfig, newKeys)) {\n setRowFieldsState(savedConfig.rowFields)\n setColumnFieldsState(savedConfig.columnFields)\n setValueFields(savedConfig.valueFields)\n setShowRowTotals(savedConfig.showRowTotals)\n setShowColumnTotals(savedConfig.showColumnTotals)\n } else {\n // Validate current config\n const currentConfig: PivotConfig = {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n }\n if (!isConfigValidForFields(currentConfig, newKeys)) {\n setRowFieldsState([])\n setColumnFieldsState([])\n setValueFields([])\n }\n }\n }\n }, [data])\n\n // Save config when it changes\n useEffect(() => {\n if (!currentStorageKey) return\n\n const config: PivotConfig = {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n }\n savePivotConfig(currentStorageKey, config)\n }, [currentStorageKey, rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Actions\n const addRowField = useCallback(\n (field: string) => {\n if (!requirePro('Pivot Table - Row Fields')) return\n if (!rowFields.includes(field)) {\n setRowFieldsState(prev => [...prev, field])\n }\n },\n [rowFields, requirePro]\n )\n\n const removeRowField = useCallback((field: string) => {\n setRowFieldsState(prev => prev.filter(f => f !== field))\n }, [])\n\n const setRowFields = useCallback((fields: string[]) => {\n setRowFieldsState(fields)\n }, [])\n\n const addColumnField = useCallback(\n (field: string) => {\n if (!requirePro('Pivot Table - Column Fields')) return\n if (!columnFields.includes(field)) {\n setColumnFieldsState(prev => [...prev, field])\n }\n },\n [columnFields, requirePro]\n )\n\n const removeColumnField = useCallback((field: string) => {\n setColumnFieldsState(prev => prev.filter(f => f !== field))\n }, [])\n\n const setColumnFields = useCallback((fields: string[]) => {\n setColumnFieldsState(fields)\n }, [])\n\n const addValueField = useCallback(\n (field: string, aggregation: AggregationFunction = 'sum') => {\n if (!requirePro('Pivot Table - Value Fields')) return\n setValueFields(prev => {\n if (prev.some(v => v.field === field && v.aggregation === aggregation)) {\n return prev\n }\n return [...prev, { field, aggregation }]\n })\n },\n [requirePro]\n )\n\n const removeValueField = useCallback((field: string, aggregation?: AggregationFunction) => {\n setValueFields(prev => {\n if (aggregation) {\n return prev.filter(v => !(v.field === field && v.aggregation === aggregation))\n }\n return prev.filter(v => v.field !== field)\n })\n }, [])\n\n const updateValueFieldAggregation = useCallback(\n (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => {\n setValueFields(prev =>\n prev.map(v => {\n if (v.field === field && v.aggregation === oldAgg) {\n return { ...v, aggregation: newAgg }\n }\n return v\n })\n )\n },\n []\n )\n\n const clearConfig = useCallback(() => {\n setRowFieldsState([])\n setColumnFieldsState([])\n setValueFields([])\n }, [])\n\n const autoSuggestConfig = useCallback(() => {\n if (!requirePro('Pivot Table - Auto Suggest')) return\n if (availableFields.length === 0) return\n\n const categoricalFields = availableFields.filter(f => !f.isNumeric && f.uniqueCount < 50)\n const numericFields = availableFields.filter(f => f.isNumeric)\n\n if (categoricalFields.length > 0 && numericFields.length > 0) {\n setRowFieldsState([categoricalFields[0].field])\n setValueFields([{ field: numericFields[0].field, aggregation: 'sum' }])\n }\n }, [availableFields, requirePro])\n\n return {\n // State\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n\n // Computed\n availableFields,\n unassignedFields,\n isConfigured,\n pivotResult,\n\n // Actions\n addRowField,\n removeRowField,\n addColumnField,\n removeColumnField,\n addValueField,\n removeValueField,\n updateValueFieldAggregation,\n clearConfig,\n setShowRowTotals,\n setShowColumnTotals,\n autoSuggestConfig,\n setRowFields,\n setColumnFields,\n }\n}\n\n","/**\n * License Management Hook for React\n * Wraps core license logic with React state management\n */\nimport { useState, useCallback, useMemo } from 'react'\nimport type { LicenseInfo } from '@smallwebco/tinypivot-core'\nimport {\n validateLicenseKey,\n configureLicenseSecret as coreConfigureLicenseSecret,\n getDemoLicenseInfo,\n getFreeLicenseInfo,\n canUsePivot as coreCanUsePivot,\n isPro as coreIsPro,\n shouldShowWatermark as coreShouldShowWatermark,\n logProRequired,\n} from '@smallwebco/tinypivot-core'\n\n// Global state (shared across all hook instances)\nlet globalLicenseInfo: LicenseInfo = getFreeLicenseInfo()\nlet globalDemoMode = false\nconst listeners = new Set<() => void>()\n\nfunction notifyListeners() {\n listeners.forEach(listener => listener())\n}\n\n/**\n * Set the license key for the library\n */\nexport async function setLicenseKey(key: string): Promise<void> {\n globalLicenseInfo = await validateLicenseKey(key)\n\n if (!globalLicenseInfo.isValid) {\n console.warn('[TinyPivot] Invalid or expired license key. Running in free mode.')\n } else if (globalLicenseInfo.type !== 'free') {\n console.info(`[TinyPivot] Pro license activated (${globalLicenseInfo.type})`)\n }\n\n notifyListeners()\n}\n\n/**\n * Enable demo mode - requires the correct demo secret\n * Returns true if activation succeeded, false if secret was invalid\n */\nexport async function enableDemoMode(secret: string): Promise<boolean> {\n const demoLicense = await getDemoLicenseInfo(secret)\n if (!demoLicense) {\n console.warn('[TinyPivot] Demo mode activation failed - invalid secret')\n return false\n }\n globalDemoMode = true\n globalLicenseInfo = demoLicense\n console.info('[TinyPivot] Demo mode enabled - all Pro features unlocked for evaluation')\n notifyListeners()\n return true\n}\n\n/**\n * Configure the license secret\n */\nexport function configureLicenseSecret(secret: string): void {\n coreConfigureLicenseSecret(secret)\n}\n\n/**\n * Hook for accessing license information\n */\nexport function useLicense() {\n const [, forceUpdate] = useState({})\n\n // Subscribe to global state changes\n useState(() => {\n const update = () => forceUpdate({})\n listeners.add(update)\n return () => listeners.delete(update)\n })\n\n const isDemo = globalDemoMode\n const licenseInfo = globalLicenseInfo\n\n const isPro = useMemo(\n () => globalDemoMode || coreIsPro(licenseInfo),\n [licenseInfo]\n )\n\n const canUsePivot = useMemo(\n () => globalDemoMode || coreCanUsePivot(licenseInfo),\n [licenseInfo]\n )\n\n const canUseAdvancedAggregations = useMemo(\n () => globalDemoMode || licenseInfo.features.advancedAggregations,\n [licenseInfo]\n )\n\n const canUsePercentageMode = useMemo(\n () => globalDemoMode || licenseInfo.features.percentageMode,\n [licenseInfo]\n )\n\n const showWatermark = useMemo(\n () => coreShouldShowWatermark(licenseInfo, globalDemoMode),\n [licenseInfo]\n )\n\n const requirePro = useCallback((feature: string): boolean => {\n if (!isPro) {\n logProRequired(feature)\n return false\n }\n return true\n }, [isPro])\n\n return {\n licenseInfo,\n isDemo,\n isPro,\n canUsePivot,\n canUseAdvancedAggregations,\n canUsePercentageMode,\n showWatermark,\n requirePro,\n }\n}\n\n","/**\n * Grid Features Hook for React\n * Provides CSV export, clipboard, pagination, and other utility features\n */\nimport { useState, useMemo, useCallback } from 'react'\nimport type { PaginationOptions, SelectionBounds, PivotValueField } from '@smallwebco/tinypivot-core'\nimport {\n exportToCSV as coreExportToCSV,\n exportPivotToCSV as coreExportPivotToCSV,\n copyToClipboard as coreCopyToClipboard,\n formatSelectionForClipboard as coreFormatSelection,\n} from '@smallwebco/tinypivot-core'\nimport type { PivotExportData, ExportOptions } from '@smallwebco/tinypivot-core'\n\n// Re-export core functions\nexport function exportToCSV<T extends Record<string, unknown>>(\n data: T[],\n columns: string[],\n options?: ExportOptions\n): void {\n coreExportToCSV(data, columns, options)\n}\n\nexport function exportPivotToCSV(\n pivotData: PivotExportData,\n rowFields: string[],\n columnFields: string[],\n valueFields: PivotValueField[],\n options?: ExportOptions\n): void {\n coreExportPivotToCSV(pivotData, rowFields, columnFields, valueFields, options)\n}\n\nexport function copyToClipboard(\n text: string,\n onSuccess?: () => void,\n onError?: (err: Error) => void\n): void {\n coreCopyToClipboard(text, onSuccess, onError)\n}\n\nexport function formatSelectionForClipboard<T extends Record<string, unknown>>(\n rows: T[],\n columns: string[],\n selectionBounds: SelectionBounds\n): string {\n return coreFormatSelection(rows, columns, selectionBounds)\n}\n\n/**\n * Pagination hook\n */\nexport function usePagination<T>(data: T[], options: PaginationOptions = {}) {\n const [pageSize, setPageSize] = useState(options.pageSize ?? 50)\n const [currentPage, setCurrentPage] = useState(options.currentPage ?? 1)\n\n const totalPages = useMemo(\n () => Math.max(1, Math.ceil(data.length / pageSize)),\n [data.length, pageSize]\n )\n\n const paginatedData = useMemo(() => {\n const start = (currentPage - 1) * pageSize\n const end = start + pageSize\n return data.slice(start, end)\n }, [data, currentPage, pageSize])\n\n const startIndex = useMemo(() => (currentPage - 1) * pageSize + 1, [currentPage, pageSize])\n const endIndex = useMemo(\n () => Math.min(currentPage * pageSize, data.length),\n [currentPage, pageSize, data.length]\n )\n\n const goToPage = useCallback(\n (page: number) => {\n setCurrentPage(Math.max(1, Math.min(page, totalPages)))\n },\n [totalPages]\n )\n\n const nextPage = useCallback(() => {\n if (currentPage < totalPages) {\n setCurrentPage(prev => prev + 1)\n }\n }, [currentPage, totalPages])\n\n const prevPage = useCallback(() => {\n if (currentPage > 1) {\n setCurrentPage(prev => prev - 1)\n }\n }, [currentPage])\n\n const firstPage = useCallback(() => {\n setCurrentPage(1)\n }, [])\n\n const lastPage = useCallback(() => {\n setCurrentPage(totalPages)\n }, [totalPages])\n\n const updatePageSize = useCallback((size: number) => {\n setPageSize(size)\n setCurrentPage(1)\n }, [])\n\n return {\n pageSize,\n currentPage,\n totalPages,\n paginatedData,\n startIndex,\n endIndex,\n goToPage,\n nextPage,\n prevPage,\n firstPage,\n lastPage,\n setPageSize: updatePageSize,\n }\n}\n\n/**\n * Global search/filter hook\n */\nexport function useGlobalSearch<T extends Record<string, unknown>>(data: T[], columns: string[]) {\n const [searchTerm, setSearchTerm] = useState('')\n const [caseSensitive, setCaseSensitive] = useState(false)\n\n const filteredData = useMemo(() => {\n if (!searchTerm.trim()) {\n return data\n }\n\n const term = caseSensitive ? searchTerm.trim() : searchTerm.trim().toLowerCase()\n\n return data.filter(row => {\n for (const col of columns) {\n const value = row[col]\n if (value === null || value === undefined) continue\n\n const strValue = caseSensitive ? String(value) : String(value).toLowerCase()\n\n if (strValue.includes(term)) {\n return true\n }\n }\n return false\n })\n }, [data, columns, searchTerm, caseSensitive])\n\n const clearSearch = useCallback(() => {\n setSearchTerm('')\n }, [])\n\n return {\n searchTerm,\n setSearchTerm,\n caseSensitive,\n setCaseSensitive,\n filteredData,\n clearSearch,\n }\n}\n\n/**\n * Row selection hook\n */\nexport function useRowSelection<T>(data: T[]) {\n const [selectedRowIndices, setSelectedRowIndices] = useState<Set<number>>(new Set())\n\n const selectedRows = useMemo(() => {\n return Array.from(selectedRowIndices)\n .sort((a, b) => a - b)\n .map(idx => data[idx])\n .filter(Boolean)\n }, [data, selectedRowIndices])\n\n const allSelected = useMemo(() => {\n return data.length > 0 && selectedRowIndices.size === data.length\n }, [data.length, selectedRowIndices.size])\n\n const someSelected = useMemo(() => {\n return selectedRowIndices.size > 0 && selectedRowIndices.size < data.length\n }, [data.length, selectedRowIndices.size])\n\n const toggleRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n if (next.has(index)) {\n next.delete(index)\n } else {\n next.add(index)\n }\n return next\n })\n }, [])\n\n const selectRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => new Set([...prev, index]))\n }, [])\n\n const deselectRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n next.delete(index)\n return next\n })\n }, [])\n\n const selectAll = useCallback(() => {\n setSelectedRowIndices(new Set(data.map((_, idx) => idx)))\n }, [data])\n\n const deselectAll = useCallback(() => {\n setSelectedRowIndices(new Set())\n }, [])\n\n const toggleAll = useCallback(() => {\n if (allSelected) {\n deselectAll()\n } else {\n selectAll()\n }\n }, [allSelected, selectAll, deselectAll])\n\n const isSelected = useCallback(\n (index: number): boolean => {\n return selectedRowIndices.has(index)\n },\n [selectedRowIndices]\n )\n\n const selectRange = useCallback((startIndex: number, endIndex: number) => {\n const min = Math.min(startIndex, endIndex)\n const max = Math.max(startIndex, endIndex)\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n for (let i = min; i <= max; i++) {\n next.add(i)\n }\n return next\n })\n }, [])\n\n return {\n selectedRowIndices,\n selectedRows,\n allSelected,\n someSelected,\n toggleRow,\n selectRow,\n deselectRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n selectRange,\n }\n}\n\n/**\n * Column resizing hook\n */\nexport function useColumnResize(\n initialWidths: Record<string, number>,\n minWidth = 60,\n maxWidth = 600\n) {\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({ ...initialWidths })\n const [isResizing, setIsResizing] = useState(false)\n const [resizingColumn, setResizingColumn] = useState<string | null>(null)\n\n const startResize = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n setIsResizing(true)\n setResizingColumn(columnId)\n const startX = event.clientX\n const startWidth = columnWidths[columnId] || 150\n\n const handleMouseMove = (e: MouseEvent) => {\n const diff = e.clientX - startX\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + diff))\n setColumnWidths(prev => ({\n ...prev,\n [columnId]: newWidth,\n }))\n }\n\n const handleMouseUp = () => {\n setIsResizing(false)\n setResizingColumn(null)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n },\n [columnWidths, minWidth, maxWidth]\n )\n\n const resetColumnWidth = useCallback(\n (columnId: string) => {\n if (initialWidths[columnId]) {\n setColumnWidths(prev => ({\n ...prev,\n [columnId]: initialWidths[columnId],\n }))\n }\n },\n [initialWidths]\n )\n\n const resetAllWidths = useCallback(() => {\n setColumnWidths({ ...initialWidths })\n }, [initialWidths])\n\n return {\n columnWidths,\n setColumnWidths,\n isResizing,\n resizingColumn,\n startResize,\n resetColumnWidth,\n resetAllWidths,\n }\n}\n\n","/**\n * Column Filter Dropdown Component for React\n * Shows unique values with checkboxes, search, and sort controls\n */\nimport React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\n\ninterface ColumnFilterProps {\n columnId: string\n columnName: string\n stats: ColumnStats\n selectedValues: string[]\n sortDirection: 'asc' | 'desc' | null\n onFilter: (values: string[]) => void\n onSort: (direction: 'asc' | 'desc' | null) => void\n onClose: () => void\n}\n\nexport function ColumnFilter({\n columnName,\n stats,\n selectedValues,\n sortDirection,\n onFilter,\n onSort,\n onClose,\n}: ColumnFilterProps) {\n const [searchQuery, setSearchQuery] = useState('')\n const [localSelected, setLocalSelected] = useState<Set<string>>(new Set(selectedValues))\n const dropdownRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n // Include blank option if there are null values\n const hasBlankValues = stats.nullCount > 0\n\n // Filtered unique values based on search\n const filteredValues = useMemo(() => {\n const values = stats.uniqueValues\n if (!searchQuery) return values\n\n const query = searchQuery.toLowerCase()\n return values.filter(v => v.toLowerCase().includes(query))\n }, [stats.uniqueValues, searchQuery])\n\n // All values including blank\n const allValues = useMemo(() => {\n const values = [...filteredValues]\n if (hasBlankValues && (!searchQuery || '(blank)'.includes(searchQuery.toLowerCase()))) {\n values.unshift('(blank)')\n }\n return values\n }, [filteredValues, hasBlankValues, searchQuery])\n\n // Check states\n const isAllSelected = useMemo(\n () => allValues.every(v => localSelected.has(v)),\n [allValues, localSelected]\n )\n\n // Toggle single value\n const toggleValue = useCallback((value: string) => {\n setLocalSelected(prev => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n next.add(value)\n }\n return next\n })\n }, [])\n\n // Select all visible\n const selectAll = useCallback(() => {\n setLocalSelected(prev => {\n const next = new Set(prev)\n for (const value of allValues) {\n next.add(value)\n }\n return next\n })\n }, [allValues])\n\n // Clear all\n const clearAll = useCallback(() => {\n setLocalSelected(new Set())\n }, [])\n\n // Apply filter\n const applyFilter = useCallback(() => {\n if (localSelected.size === 0) {\n onFilter([])\n } else {\n onFilter(Array.from(localSelected))\n }\n onClose()\n }, [localSelected, onFilter, onClose])\n\n // Sort handlers\n const sortAscending = useCallback(() => {\n onSort(sortDirection === 'asc' ? null : 'asc')\n }, [sortDirection, onSort])\n\n const sortDescending = useCallback(() => {\n onSort(sortDirection === 'desc' ? null : 'desc')\n }, [sortDirection, onSort])\n\n // Clear filter only\n const clearFilter = useCallback(() => {\n setLocalSelected(new Set())\n onFilter([])\n onClose()\n }, [onFilter, onClose])\n\n // Click outside handler\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n onClose()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [onClose])\n\n // Keyboard handling\n useEffect(() => {\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n } else if (event.key === 'Enter' && event.ctrlKey) {\n applyFilter()\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n return () => document.removeEventListener('keydown', handleKeydown)\n }, [onClose, applyFilter])\n\n // Focus search on mount\n useEffect(() => {\n searchInputRef.current?.focus()\n }, [])\n\n // Sync with props\n useEffect(() => {\n setLocalSelected(new Set(selectedValues))\n }, [selectedValues])\n\n return (\n <div ref={dropdownRef} className=\"vpg-filter-dropdown\">\n {/* Header */}\n <div className=\"vpg-filter-header\">\n <span className=\"vpg-filter-title\">{columnName}</span>\n <span className=\"vpg-filter-count\">{stats.uniqueValues.length.toLocaleString()} unique</span>\n </div>\n\n {/* Sort Controls */}\n <div className=\"vpg-sort-controls\">\n <button\n className={`vpg-sort-btn ${sortDirection === 'asc' ? 'active' : ''}`}\n title=\"Sort A to Z\"\n onClick={sortAscending}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\"\n />\n </svg>\n <span>A→Z</span>\n </button>\n <button\n className={`vpg-sort-btn ${sortDirection === 'desc' ? 'active' : ''}`}\n title=\"Sort Z to A\"\n onClick={sortDescending}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\"\n />\n </svg>\n <span>Z→A</span>\n </button>\n </div>\n\n <div className=\"vpg-divider\" />\n\n {/* Search */}\n <div className=\"vpg-search-container\">\n <svg className=\"vpg-search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n placeholder=\"Search values...\"\n className=\"vpg-search-input\"\n />\n {searchQuery && (\n <button className=\"vpg-clear-search\" onClick={() => setSearchQuery('')}>\n ×\n </button>\n )}\n </div>\n\n {/* Select All / Clear All */}\n <div className=\"vpg-bulk-actions\">\n <button className=\"vpg-bulk-btn\" onClick={selectAll}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n Select All\n </button>\n <button className=\"vpg-bulk-btn\" onClick={clearAll}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n Clear All\n </button>\n </div>\n\n {/* Values List */}\n <div className=\"vpg-values-list\">\n {allValues.map(value => (\n <label\n key={value}\n className={`vpg-value-item ${localSelected.has(value) ? 'selected' : ''}`}\n >\n <input\n type=\"checkbox\"\n checked={localSelected.has(value)}\n onChange={() => toggleValue(value)}\n className=\"vpg-value-checkbox\"\n />\n <span className={`vpg-value-text ${value === '(blank)' ? 'vpg-blank' : ''}`}>\n {value}\n </span>\n </label>\n ))}\n\n {allValues.length === 0 && <div className=\"vpg-no-results\">No matching values</div>}\n </div>\n\n {/* Footer */}\n <div className=\"vpg-filter-footer\">\n <button className=\"vpg-btn-clear\" onClick={clearFilter}>\n Clear Filter\n </button>\n <button className=\"vpg-btn-apply\" onClick={applyFilter}>\n Apply\n </button>\n </div>\n </div>\n )\n}\n\n","/**\n * Pivot Table Configuration Panel for React\n * Draggable fields with aggregation selection\n */\nimport React, { useState, useMemo, useCallback } from 'react'\nimport type { AggregationFunction, PivotValueField, FieldStats } from '@smallwebco/tinypivot-core'\nimport { AGGREGATION_OPTIONS, getAggregationSymbol } from '@smallwebco/tinypivot-core'\nimport { useLicense } from '../hooks/useLicense'\n\ninterface PivotConfigProps {\n availableFields: FieldStats[]\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n showRowTotals: boolean\n showColumnTotals: boolean\n onShowRowTotalsChange: (value: boolean) => void\n onShowColumnTotalsChange: (value: boolean) => void\n onClearConfig: () => void\n onAutoSuggest: () => void\n onDragStart: (field: string, event: React.DragEvent) => void\n onDragEnd: () => void\n onUpdateAggregation: (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => void\n onAddRowField: (field: string) => void\n onRemoveRowField: (field: string) => void\n onAddColumnField: (field: string) => void\n onRemoveColumnField: (field: string) => void\n onAddValueField: (field: string, aggregation: AggregationFunction) => void\n onRemoveValueField: (field: string, aggregation: AggregationFunction) => void\n}\n\nfunction getFieldIcon(type: FieldStats['type']): string {\n switch (type) {\n case 'number':\n return '#'\n case 'date':\n return '📅'\n case 'boolean':\n return '✓'\n default:\n return 'Aa'\n }\n}\n\nexport function PivotConfig({\n availableFields,\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n onShowRowTotalsChange,\n onClearConfig,\n onAutoSuggest,\n onDragStart,\n onDragEnd,\n onUpdateAggregation,\n onRemoveRowField,\n onRemoveColumnField,\n onRemoveValueField,\n onAddRowField,\n onAddColumnField,\n}: PivotConfigProps) {\n const { showWatermark } = useLicense()\n const [fieldSearch, setFieldSearch] = useState('')\n\n // Assigned fields\n const assignedFields = useMemo(() => {\n const rowSet = new Set(rowFields)\n const colSet = new Set(columnFields)\n const valueMap = new Map(valueFields.map(v => [v.field, v]))\n\n return availableFields\n .filter(f => rowSet.has(f.field) || colSet.has(f.field) || valueMap.has(f.field))\n .map(f => ({\n ...f,\n assignedTo: rowSet.has(f.field)\n ? ('row' as const)\n : colSet.has(f.field)\n ? ('column' as const)\n : ('value' as const),\n valueConfig: valueMap.get(f.field),\n }))\n }, [availableFields, rowFields, columnFields, valueFields])\n\n // Unassigned fields\n const unassignedFields = useMemo(() => {\n const rowSet = new Set(rowFields)\n const colSet = new Set(columnFields)\n const valSet = new Set(valueFields.map(v => v.field))\n\n return availableFields.filter(\n f => !rowSet.has(f.field) && !colSet.has(f.field) && !valSet.has(f.field)\n )\n }, [availableFields, rowFields, columnFields, valueFields])\n\n const filteredUnassignedFields = useMemo(() => {\n if (!fieldSearch.trim()) return unassignedFields\n const search = fieldSearch.toLowerCase().trim()\n return unassignedFields.filter(f => f.field.toLowerCase().includes(search))\n }, [unassignedFields, fieldSearch])\n\n const assignedCount = assignedFields.length\n\n const handleDragStart = useCallback(\n (field: string, event: React.DragEvent) => {\n event.dataTransfer?.setData('text/plain', field)\n event.dataTransfer!.effectAllowed = 'move'\n onDragStart(field, event)\n },\n [onDragStart]\n )\n\n const handleAggregationChange = useCallback(\n (field: string, currentAgg: AggregationFunction, newAgg: AggregationFunction) => {\n onUpdateAggregation(field, currentAgg, newAgg)\n },\n [onUpdateAggregation]\n )\n\n const toggleRowColumn = useCallback(\n (field: string, currentAssignment: 'row' | 'column') => {\n if (currentAssignment === 'row') {\n onRemoveRowField(field)\n onAddColumnField(field)\n } else {\n onRemoveColumnField(field)\n onAddRowField(field)\n }\n },\n [onRemoveRowField, onAddColumnField, onRemoveColumnField, onAddRowField]\n )\n\n const removeField = useCallback(\n (field: string, assignedTo: 'row' | 'column' | 'value', valueConfig?: PivotValueField) => {\n if (assignedTo === 'row') {\n onRemoveRowField(field)\n } else if (assignedTo === 'column') {\n onRemoveColumnField(field)\n } else if (valueConfig) {\n onRemoveValueField(field, valueConfig.aggregation)\n }\n },\n [onRemoveRowField, onRemoveColumnField, onRemoveValueField]\n )\n\n return (\n <div className=\"vpg-pivot-config\">\n {/* Header */}\n <div className=\"vpg-config-header\">\n <h3 className=\"vpg-config-title\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n Fields\n </h3>\n <div className=\"vpg-header-actions\">\n {assignedCount > 0 && (\n <button\n className=\"vpg-action-btn vpg-clear-btn\"\n title=\"Clear all\"\n onClick={onClearConfig}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n\n {/* Assigned Fields */}\n {assignedCount > 0 && (\n <div className=\"vpg-assigned-section\">\n <div className=\"vpg-section-label\">Active</div>\n <div className=\"vpg-assigned-list\">\n {assignedFields.map(field => (\n <div\n key={field.field}\n className={`vpg-assigned-item vpg-type-${field.assignedTo}`}\n title={field.field}\n draggable\n onDragStart={e => handleDragStart(field.field, e)}\n onDragEnd={onDragEnd}\n >\n <div className=\"vpg-item-main\">\n <span className={`vpg-item-badge ${field.assignedTo}`}>\n {field.assignedTo === 'row'\n ? 'R'\n : field.assignedTo === 'column'\n ? 'C'\n : getAggregationSymbol(field.valueConfig?.aggregation || 'sum')}\n </span>\n <span className=\"vpg-item-name\">{field.field}</span>\n </div>\n\n <div className=\"vpg-item-actions\">\n {(field.assignedTo === 'row' || field.assignedTo === 'column') && (\n <button\n className=\"vpg-toggle-btn\"\n title={field.assignedTo === 'row' ? 'Move to Columns' : 'Move to Rows'}\n onClick={e => {\n e.stopPropagation()\n toggleRowColumn(field.field, field.assignedTo as 'row' | 'column')\n }}\n >\n <svg\n className=\"vpg-icon-xs\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\"\n />\n </svg>\n </button>\n )}\n\n {field.assignedTo === 'value' && field.valueConfig && (\n <select\n className=\"vpg-agg-select\"\n value={field.valueConfig.aggregation}\n onChange={e => {\n e.stopPropagation()\n handleAggregationChange(\n field.field,\n field.valueConfig!.aggregation,\n e.target.value as AggregationFunction\n )\n }}\n onClick={e => e.stopPropagation()}\n >\n {AGGREGATION_OPTIONS.map(agg => (\n <option key={agg.value} value={agg.value}>\n {agg.symbol} {agg.label}\n </option>\n ))}\n </select>\n )}\n\n <button\n className=\"vpg-remove-btn\"\n title=\"Remove\"\n onClick={e => {\n e.stopPropagation()\n removeField(field.field, field.assignedTo, field.valueConfig)\n }}\n >\n ×\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Unassigned Fields */}\n <div className=\"vpg-unassigned-section\">\n <div className=\"vpg-section-header\">\n <div className=\"vpg-section-label\">\n Available <span className=\"vpg-count\">{unassignedFields.length}</span>\n </div>\n </div>\n\n {/* Field Search */}\n <div className=\"vpg-field-search\">\n <svg className=\"vpg-search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={fieldSearch}\n onChange={e => setFieldSearch(e.target.value)}\n placeholder=\"Search fields...\"\n className=\"vpg-search-input\"\n />\n {fieldSearch && (\n <button className=\"vpg-clear-search\" onClick={() => setFieldSearch('')}>\n <svg className=\"vpg-icon-xs\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n\n <div className=\"vpg-field-list\">\n {filteredUnassignedFields.map(field => (\n <div\n key={field.field}\n className={`vpg-field-item ${field.isNumeric ? 'vpg-is-numeric' : ''}`}\n title={field.field}\n draggable\n onDragStart={e => handleDragStart(field.field, e)}\n onDragEnd={onDragEnd}\n >\n <span className=\"vpg-field-type-icon\" title={field.type}>\n {getFieldIcon(field.type)}\n </span>\n <span className=\"vpg-field-name\">{field.field}</span>\n <span className=\"vpg-unique-count\">{field.uniqueCount}</span>\n </div>\n ))}\n {filteredUnassignedFields.length === 0 && fieldSearch && (\n <div className=\"vpg-empty-hint\">No fields match \"{fieldSearch}\"</div>\n )}\n {unassignedFields.length === 0 && <div className=\"vpg-empty-hint\">All fields assigned</div>}\n </div>\n </div>\n\n {/* Options */}\n <div className=\"vpg-options-section\">\n <label className=\"vpg-option-toggle\">\n <input\n type=\"checkbox\"\n checked={showRowTotals}\n onChange={e => onShowRowTotalsChange(e.target.checked)}\n />\n <span>Totals</span>\n </label>\n <button className=\"vpg-auto-btn\" onClick={onAutoSuggest}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n Auto\n </button>\n </div>\n\n {/* Watermark */}\n {showWatermark && (\n <div className=\"vpg-watermark\">\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n TinyPivot\n </a>\n </div>\n )}\n </div>\n )\n}\n\n","/**\n * Pivot Table Skeleton + Data Display for React\n * Visual layout for pivot configuration and results\n */\nimport React, { useState, useMemo, useCallback } from 'react'\nimport type { AggregationFunction, PivotResult, PivotValueField } from '@smallwebco/tinypivot-core'\nimport { getAggregationLabel, getAggregationSymbol } from '@smallwebco/tinypivot-core'\nimport { useLicense } from '../hooks/useLicense'\n\ninterface ActiveFilter {\n column: string\n valueCount: number\n values: string[]\n}\n\ninterface PivotSkeletonProps {\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n isConfigured: boolean\n draggingField: string | null\n pivotResult: PivotResult | null\n fontSize?: 'xs' | 'sm' | 'base'\n activeFilters?: ActiveFilter[] | null\n totalRowCount?: number\n filteredRowCount?: number\n onAddRowField: (field: string) => void\n onRemoveRowField: (field: string) => void\n onAddColumnField: (field: string) => void\n onRemoveColumnField: (field: string) => void\n onAddValueField: (field: string, aggregation: AggregationFunction) => void\n onRemoveValueField: (field: string, aggregation: AggregationFunction) => void\n onUpdateAggregation: (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => void\n onReorderRowFields: (fields: string[]) => void\n onReorderColumnFields: (fields: string[]) => void\n}\n\nexport function PivotSkeleton({\n rowFields,\n columnFields,\n valueFields,\n isConfigured,\n draggingField,\n pivotResult,\n fontSize = 'xs',\n activeFilters,\n totalRowCount,\n filteredRowCount,\n onAddRowField,\n onRemoveRowField,\n onAddColumnField,\n onRemoveColumnField,\n onAddValueField,\n onRemoveValueField,\n onReorderRowFields,\n onReorderColumnFields,\n}: PivotSkeletonProps) {\n const { showWatermark, canUsePivot, isDemo } = useLicense()\n\n // Drag state\n const [dragOverArea, setDragOverArea] = useState<'row' | 'column' | 'value' | null>(null)\n \n // Reorder drag state\n const [reorderDragSource, setReorderDragSource] = useState<{ zone: 'row' | 'column'; index: number } | null>(null)\n const [reorderDropTarget, setReorderDropTarget] = useState<{ zone: 'row' | 'column'; index: number } | null>(null)\n\n // Sorting\n type SortTarget = 'row' | number\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')\n const [sortTarget, setSortTarget] = useState<SortTarget>('row')\n\n const toggleSort = useCallback((target: SortTarget = 'row') => {\n if (sortTarget === target) {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'))\n } else {\n setSortTarget(target)\n setSortDirection('asc')\n }\n }, [sortTarget])\n\n // Sorted row indices\n const sortedRowIndices = useMemo(() => {\n if (!pivotResult) return []\n\n const indices = pivotResult.rowHeaders.map((_, i) => i)\n const headers = pivotResult.rowHeaders\n const data = pivotResult.data\n\n indices.sort((a, b) => {\n let cmp: number\n\n if (sortTarget === 'row') {\n const aHeader = headers[a]?.join(' / ') || ''\n const bHeader = headers[b]?.join(' / ') || ''\n cmp = aHeader.localeCompare(bHeader, undefined, { numeric: true, sensitivity: 'base' })\n } else {\n const colIdx = sortTarget as number\n const aVal = data[a]?.[colIdx]?.value ?? null\n const bVal = data[b]?.[colIdx]?.value ?? null\n\n if (aVal === null && bVal === null) cmp = 0\n else if (aVal === null) cmp = 1\n else if (bVal === null) cmp = -1\n else cmp = aVal - bVal\n }\n\n return sortDirection === 'asc' ? cmp : -cmp\n })\n\n return indices\n }, [pivotResult, sortTarget, sortDirection])\n\n // Column headers\n const columnHeaderCells = useMemo(() => {\n if (!pivotResult || pivotResult.headers.length === 0) {\n return [\n valueFields.map(vf => ({\n label: `${vf.field} (${getAggregationLabel(vf.aggregation)})`,\n colspan: 1,\n })),\n ]\n }\n\n const result: Array<Array<{ label: string; colspan: number }>> = []\n\n for (let level = 0; level < pivotResult.headers.length; level++) {\n const headerRow = pivotResult.headers[level]\n const cells: Array<{ label: string; colspan: number }> = []\n\n let i = 0\n while (i < headerRow.length) {\n const value = headerRow[i]\n let colspan = 1\n\n while (i + colspan < headerRow.length && headerRow[i + colspan] === value) {\n colspan++\n }\n\n cells.push({ label: value, colspan })\n i += colspan\n }\n\n result.push(cells)\n }\n\n return result\n }, [pivotResult, valueFields])\n\n // Filter status\n const hasActiveFilters = activeFilters && activeFilters.length > 0\n const filterSummary = useMemo(() => {\n if (!activeFilters || activeFilters.length === 0) return ''\n return activeFilters.map(f => f.column).join(', ')\n }, [activeFilters])\n\n // Detailed filter tooltip\n const [showFilterTooltip, setShowFilterTooltip] = useState(false)\n const filterTooltipDetails = useMemo(() => {\n if (!activeFilters || activeFilters.length === 0) return []\n return activeFilters.map(f => {\n const maxDisplay = 5\n const displayValues = f.values.slice(0, maxDisplay)\n const remaining = f.values.length - maxDisplay\n return {\n column: f.column,\n values: displayValues,\n remaining: remaining > 0 ? remaining : 0,\n }\n })\n }, [activeFilters])\n\n // Drag handlers\n const handleDragOver = useCallback(\n (area: 'row' | 'column' | 'value', event: React.DragEvent) => {\n event.preventDefault()\n event.dataTransfer!.dropEffect = 'move'\n setDragOverArea(area)\n },\n []\n )\n\n const handleDragLeave = useCallback(() => {\n setDragOverArea(null)\n }, [])\n\n const handleDrop = useCallback(\n (area: 'row' | 'column' | 'value', event: React.DragEvent) => {\n event.preventDefault()\n const field = event.dataTransfer?.getData('text/plain')\n\n if (!field || field.startsWith('reorder:')) {\n setDragOverArea(null)\n return\n }\n\n if (rowFields.includes(field)) onRemoveRowField(field)\n if (columnFields.includes(field)) onRemoveColumnField(field)\n const existingValue = valueFields.find(v => v.field === field)\n if (existingValue) onRemoveValueField(field, existingValue.aggregation)\n\n switch (area) {\n case 'row':\n onAddRowField(field)\n break\n case 'column':\n onAddColumnField(field)\n break\n case 'value':\n onAddValueField(field, 'sum')\n break\n }\n setDragOverArea(null)\n },\n [rowFields, columnFields, valueFields, onAddRowField, onRemoveRowField, onAddColumnField, onRemoveColumnField, onAddValueField, onRemoveValueField]\n )\n\n // Reorder handlers for chips within zones\n const handleChipDragStart = useCallback(\n (zone: 'row' | 'column', index: number, event: React.DragEvent) => {\n setReorderDragSource({ zone, index })\n event.dataTransfer!.effectAllowed = 'move'\n event.dataTransfer!.setData('text/plain', `reorder:${zone}:${index}`)\n // Clear any zone drag-over state\n requestAnimationFrame(() => {\n setDragOverArea(null)\n })\n },\n []\n )\n\n const handleChipDragEnd = useCallback(() => {\n setReorderDragSource(null)\n setReorderDropTarget(null)\n }, [])\n\n const handleChipDragOver = useCallback(\n (zone: 'row' | 'column', index: number, event: React.DragEvent) => {\n event.preventDefault()\n // Only handle reorder within same zone\n if (reorderDragSource && reorderDragSource.zone === zone) {\n event.dataTransfer!.dropEffect = 'move'\n setReorderDropTarget({ zone, index })\n }\n },\n [reorderDragSource]\n )\n\n const handleChipDragLeave = useCallback(() => {\n setReorderDropTarget(null)\n }, [])\n\n const handleChipDrop = useCallback(\n (zone: 'row' | 'column', targetIndex: number, event: React.DragEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!reorderDragSource || reorderDragSource.zone !== zone) {\n return\n }\n\n const sourceIndex = reorderDragSource.index\n if (sourceIndex === targetIndex) {\n setReorderDragSource(null)\n setReorderDropTarget(null)\n return\n }\n\n // Create reordered array\n const fields = zone === 'row' ? [...rowFields] : [...columnFields]\n const [movedField] = fields.splice(sourceIndex, 1)\n fields.splice(targetIndex, 0, movedField)\n\n // Emit reorder event\n if (zone === 'row') {\n onReorderRowFields(fields)\n } else {\n onReorderColumnFields(fields)\n }\n\n setReorderDragSource(null)\n setReorderDropTarget(null)\n },\n [reorderDragSource, rowFields, columnFields, onReorderRowFields, onReorderColumnFields]\n )\n\n const isChipDragSource = useCallback(\n (zone: 'row' | 'column', index: number): boolean => {\n return reorderDragSource?.zone === zone && reorderDragSource?.index === index\n },\n [reorderDragSource]\n )\n\n const isChipDropTarget = useCallback(\n (zone: 'row' | 'column', index: number): boolean => {\n return reorderDropTarget?.zone === zone && reorderDropTarget?.index === index\n },\n [reorderDropTarget]\n )\n\n const currentFontSize = fontSize\n\n return (\n <div\n className={`vpg-pivot-skeleton vpg-font-${currentFontSize} ${draggingField ? 'vpg-is-dragging' : ''}`}\n >\n {/* Header Bar */}\n <div className=\"vpg-skeleton-header\">\n <div className=\"vpg-skeleton-title\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n <span>Pivot Table</span>\n </div>\n\n <div className=\"vpg-header-right\">\n {hasActiveFilters && (\n <div\n className=\"vpg-filter-indicator\"\n onMouseEnter={() => setShowFilterTooltip(true)}\n onMouseLeave={() => setShowFilterTooltip(false)}\n >\n <svg\n className=\"vpg-filter-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n <span className=\"vpg-filter-text\">\n Filtered: <strong>{filterSummary}</strong>\n {filteredRowCount !== undefined && totalRowCount !== undefined && (\n <span className=\"vpg-filter-count\">\n ({filteredRowCount.toLocaleString()} of {totalRowCount.toLocaleString()} rows)\n </span>\n )}\n </span>\n\n {/* Tooltip */}\n {showFilterTooltip && (\n <div className=\"vpg-filter-tooltip\">\n <div className=\"vpg-tooltip-header\">Active Filters</div>\n {filterTooltipDetails.map(filter => (\n <div key={filter.column} className=\"vpg-tooltip-filter\">\n <div className=\"vpg-tooltip-column\">{filter.column}</div>\n <div className=\"vpg-tooltip-values\">\n {filter.values.map((val, idx) => (\n <span key={idx} className=\"vpg-tooltip-value\">\n {val}\n </span>\n ))}\n {filter.remaining > 0 && (\n <span className=\"vpg-tooltip-more\">+{filter.remaining} more</span>\n )}\n </div>\n </div>\n ))}\n {filteredRowCount !== undefined && totalRowCount !== undefined && (\n <div className=\"vpg-tooltip-summary\">\n Showing {filteredRowCount.toLocaleString()} of {totalRowCount.toLocaleString()} rows\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {isConfigured && (\n <div className=\"vpg-config-summary\">\n <span className=\"vpg-summary-badge vpg-rows\">\n {rowFields.length} row{rowFields.length !== 1 ? 's' : ''}\n </span>\n <span className=\"vpg-summary-badge vpg-cols\">\n {columnFields.length} col{columnFields.length !== 1 ? 's' : ''}\n </span>\n <span className=\"vpg-summary-badge vpg-vals\">\n {valueFields.length} val{valueFields.length !== 1 ? 's' : ''}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* License Required Message */}\n {!canUsePivot ? (\n <div className=\"vpg-pro-required\">\n <div className=\"vpg-pro-content\">\n <svg className=\"vpg-pro-icon\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <h3>Pro Feature</h3>\n <p>Pivot Table functionality requires a Pro license.</p>\n <a href=\"https://tiny-pivot.com/#pricing\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"vpg-pro-link\">\n Get Pro License →\n </a>\n </div>\n </div>\n ) : (\n <>\n {/* Config Bar */}\n <div className=\"vpg-config-bar\">\n {/* Row drop zone */}\n <div\n className={`vpg-drop-zone vpg-row-zone ${dragOverArea === 'row' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('row', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('row', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-row-icon\">↓</span>\n <span className=\"vpg-zone-label\">Rows</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {rowFields.map((field, idx) => (\n <div\n key={field}\n className={`vpg-mini-chip vpg-row-chip ${isChipDragSource('row', idx) ? 'vpg-chip-dragging' : ''} ${isChipDropTarget('row', idx) ? 'vpg-chip-drop-target' : ''}`}\n draggable\n onDragStart={e => handleChipDragStart('row', idx, e)}\n onDragEnd={handleChipDragEnd}\n onDragOver={e => handleChipDragOver('row', idx, e)}\n onDragLeave={handleChipDragLeave}\n onDrop={e => handleChipDrop('row', idx, e)}\n >\n <span className=\"vpg-drag-handle\">⋮⋮</span>\n <span className=\"vpg-mini-name\">{field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={e => { e.stopPropagation(); onRemoveRowField(field) }}\n >\n ×\n </button>\n </div>\n ))}\n {rowFields.length === 0 && <span className=\"vpg-zone-hint\">Drop here</span>}\n </div>\n </div>\n\n {/* Column drop zone */}\n <div\n className={`vpg-drop-zone vpg-column-zone ${dragOverArea === 'column' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('column', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('column', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-column-icon\">→</span>\n <span className=\"vpg-zone-label\">Columns</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {columnFields.map((field, idx) => (\n <div\n key={field}\n className={`vpg-mini-chip vpg-column-chip ${isChipDragSource('column', idx) ? 'vpg-chip-dragging' : ''} ${isChipDropTarget('column', idx) ? 'vpg-chip-drop-target' : ''}`}\n draggable\n onDragStart={e => handleChipDragStart('column', idx, e)}\n onDragEnd={handleChipDragEnd}\n onDragOver={e => handleChipDragOver('column', idx, e)}\n onDragLeave={handleChipDragLeave}\n onDrop={e => handleChipDrop('column', idx, e)}\n >\n <span className=\"vpg-drag-handle\">⋮⋮</span>\n <span className=\"vpg-mini-name\">{field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={e => { e.stopPropagation(); onRemoveColumnField(field) }}\n >\n ×\n </button>\n </div>\n ))}\n {columnFields.length === 0 && <span className=\"vpg-zone-hint\">Drop here</span>}\n </div>\n </div>\n\n {/* Values drop zone */}\n <div\n className={`vpg-drop-zone vpg-value-zone ${dragOverArea === 'value' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('value', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('value', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-value-icon\">Σ</span>\n <span className=\"vpg-zone-label\">Values</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {valueFields.map(vf => (\n <div\n key={`${vf.field}-${vf.aggregation}`}\n className=\"vpg-mini-chip vpg-value-chip\"\n >\n <span className=\"vpg-agg-symbol\">{getAggregationSymbol(vf.aggregation)}</span>\n <span className=\"vpg-mini-name\">{vf.field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={() => onRemoveValueField(vf.field, vf.aggregation)}\n >\n ×\n </button>\n </div>\n ))}\n {valueFields.length === 0 && <span className=\"vpg-zone-hint\">Drop numeric</span>}\n </div>\n </div>\n </div>\n\n {/* Placeholder when not configured */}\n {(!isConfigured || !pivotResult) && (\n <div className=\"vpg-placeholder\">\n <div className=\"vpg-placeholder-content\">\n <svg\n className=\"vpg-placeholder-icon\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <span className=\"vpg-placeholder-text\">\n {valueFields.length === 0 ? (\n <>\n Add a <strong>Values</strong> field to see your pivot table\n </>\n ) : rowFields.length === 0 && columnFields.length === 0 ? (\n <>\n Add <strong>Row</strong> or <strong>Column</strong> fields to group your data\n </>\n ) : (\n 'Your pivot table will appear here'\n )}\n </span>\n </div>\n </div>\n )}\n\n {/* Data Table */}\n {isConfigured && pivotResult && (\n <div className=\"vpg-table-container\">\n <table className=\"vpg-pivot-table\">\n <thead>\n {columnHeaderCells.map((headerRow, levelIdx) => (\n <tr key={`header-${levelIdx}`} className=\"vpg-column-header-row\">\n {levelIdx === 0 && (\n <th\n className=\"vpg-row-header-label\"\n rowSpan={columnHeaderCells.length}\n onClick={() => toggleSort('row')}\n >\n <div className=\"vpg-header-content\">\n <span>{rowFields.join(' / ') || 'Rows'}</span>\n <span className={`vpg-sort-indicator ${sortTarget === 'row' ? 'active' : ''}`}>\n {sortTarget === 'row' ? (sortDirection === 'asc' ? '↑' : '↓') : '⇅'}\n </span>\n </div>\n </th>\n )}\n {headerRow.map((cell, idx) => (\n <th\n key={idx}\n className=\"vpg-column-header-cell\"\n colSpan={cell.colspan}\n onClick={() =>\n levelIdx === columnHeaderCells.length - 1 && toggleSort(idx)\n }\n >\n <div className=\"vpg-header-content\">\n <span>{cell.label}</span>\n {levelIdx === columnHeaderCells.length - 1 && (\n <span className={`vpg-sort-indicator ${sortTarget === idx ? 'active' : ''}`}>\n {sortTarget === idx\n ? sortDirection === 'asc'\n ? '↑'\n : '↓'\n : '⇅'}\n </span>\n )}\n </div>\n </th>\n ))}\n {pivotResult.rowTotals.length > 0 && levelIdx === 0 && (\n <th className=\"vpg-total-header\" rowSpan={columnHeaderCells.length}>\n Total\n </th>\n )}\n </tr>\n ))}\n </thead>\n\n <tbody>\n {sortedRowIndices.map(sortedIdx => (\n <tr key={sortedIdx} className=\"vpg-data-row\">\n <th className=\"vpg-row-header-cell\">\n {pivotResult.rowHeaders[sortedIdx].map((val, idx) => (\n <span key={idx} className=\"vpg-row-value\">\n {val}\n </span>\n ))}\n </th>\n\n {pivotResult.data[sortedIdx].map((cell, colIdx) => (\n <td\n key={colIdx}\n className={`vpg-data-cell ${cell.value === null ? 'vpg-is-null' : ''}`}\n >\n {cell.formattedValue}\n </td>\n ))}\n\n {pivotResult.rowTotals[sortedIdx] && (\n <td className=\"vpg-data-cell vpg-total-cell\">\n {pivotResult.rowTotals[sortedIdx].formattedValue}\n </td>\n )}\n </tr>\n ))}\n\n {pivotResult.columnTotals.length > 0 && (\n <tr className=\"vpg-totals-row\">\n <th className=\"vpg-row-header-cell vpg-total-label\">Total</th>\n {pivotResult.columnTotals.map((cell, colIdx) => (\n <td key={colIdx} className=\"vpg-data-cell vpg-total-cell\">\n {cell.formattedValue}\n </td>\n ))}\n {pivotResult.rowTotals.length > 0 && (\n <td className=\"vpg-data-cell vpg-grand-total-cell\">\n {pivotResult.grandTotal.formattedValue}\n </td>\n )}\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Footer */}\n {isConfigured && pivotResult && (\n <div className=\"vpg-skeleton-footer\">\n <span>\n {pivotResult.rowHeaders.length} rows × {pivotResult.data[0]?.length || 0} columns\n </span>\n </div>\n )}\n </>\n )}\n\n {/* Watermark / Demo Banner */}\n {showWatermark && canUsePivot && (\n <div className={`vpg-watermark ${isDemo ? 'vpg-demo-mode' : ''}`}>\n {isDemo ? (\n <>\n <span className=\"vpg-demo-badge\">DEMO</span>\n <span>Pro features unlocked for evaluation</span>\n <a\n href=\"https://tiny-pivot.com/#pricing\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"vpg-get-pro\"\n >\n Get Pro License →\n </a>\n </>\n ) : (\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n Powered by TinyPivot\n </a>\n )}\n </div>\n )}\n </div>\n )\n}\n\n"],"mappings":"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","names":["import_react","import_react","import_tinypivot_core","import_react","import_tinypivot_core","coreConfigureLicenseSecret","coreIsPro","coreCanUsePivot","coreShouldShowWatermark","import_react","import_tinypivot_core","coreExportToCSV","coreExportPivotToCSV","coreCopyToClipboard","coreFormatSelection","import_react","import_react","import_tinypivot_core","import_jsx_runtime","import_react","import_tinypivot_core","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/DataGrid.tsx","../src/hooks/useExcelGrid.ts","../src/hooks/usePivotTable.ts","../src/hooks/useLicense.ts","../src/hooks/useGridFeatures.ts","../src/components/ColumnFilter.tsx","../src/components/PivotConfig.tsx","../src/components/PivotSkeleton.tsx"],"sourcesContent":["/**\n * TinyPivot React\n * A powerful Excel-like data grid and pivot table component for React\n *\n * @packageDocumentation\n */\n\n// Components\nexport { DataGrid, ColumnFilter, PivotConfig, PivotSkeleton } from './components'\n\n// Hooks\nexport {\n useExcelGrid,\n usePivotTable,\n useLicense,\n setLicenseKey,\n configureLicenseSecret,\n enableDemoMode,\n getColumnUniqueValues,\n formatCellValue,\n getAggregationLabel,\n exportToCSV,\n exportPivotToCSV,\n copyToClipboard,\n formatSelectionForClipboard,\n usePagination,\n useGlobalSearch,\n useRowSelection,\n useColumnResize,\n} from './hooks'\n\n// Re-export types from core\nexport type {\n // Grid Types\n ColumnStats,\n GridOptions,\n\n // Pivot Types\n AggregationFunction,\n PivotField,\n PivotValueField,\n PivotConfig as PivotConfigType,\n PivotCell,\n PivotResult,\n FieldStats,\n\n // Component Props Types\n DataGridProps,\n PivotTableProps,\n\n // License Types\n LicenseType,\n LicenseInfo,\n\n // Event Types\n FilterEvent,\n SortEvent,\n CellClickEvent,\n SelectionChangeEvent,\n RowSelectionChangeEvent,\n ExportEvent,\n CopyEvent,\n\n // Feature Types\n PaginationOptions,\n ExportOptions,\n SelectionBounds,\n} from '@smallwebco/tinypivot-core'\n\n","/**\n * TinyPivot React - Main DataGrid Component\n * Excel-like data grid with optional pivot table functionality\n */\nimport React, { useState, useMemo, useCallback, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\nimport { useExcelGrid } from '../hooks/useExcelGrid'\nimport { usePivotTable } from '../hooks/usePivotTable'\nimport { useLicense } from '../hooks/useLicense'\nimport {\n exportToCSV,\n exportPivotToCSV,\n copyToClipboard,\n formatSelectionForClipboard,\n} from '../hooks/useGridFeatures'\nimport { ColumnFilter } from './ColumnFilter'\nimport { PivotConfig } from './PivotConfig'\nimport { PivotSkeleton } from './PivotSkeleton'\n\ninterface DataGridProps {\n data: Record<string, unknown>[]\n loading?: boolean\n rowHeight?: number\n headerHeight?: number\n fontSize?: 'xs' | 'sm' | 'base'\n showPivot?: boolean\n enableExport?: boolean\n enableSearch?: boolean\n enablePagination?: boolean\n pageSize?: number\n enableColumnResize?: boolean\n enableClipboard?: boolean\n theme?: 'light' | 'dark' | 'auto'\n stripedRows?: boolean\n exportFilename?: string\n enableVerticalResize?: boolean\n initialHeight?: number\n minHeight?: number\n maxHeight?: number\n onCellClick?: (payload: {\n row: number\n col: number\n value: unknown\n rowData: Record<string, unknown>\n }) => void\n onSelectionChange?: (payload: { cells: Array<{ row: number; col: number }>; values: unknown[] }) => void\n onExport?: (payload: { rowCount: number; filename: string }) => void\n onCopy?: (payload: { text: string; cellCount: number }) => void\n}\n\nconst MIN_COL_WIDTH = 120\nconst MAX_COL_WIDTH = 350\n\nexport function DataGrid({\n data,\n loading = false,\n fontSize: initialFontSize = 'xs',\n showPivot = true,\n enableExport = true,\n enableSearch = true,\n enablePagination = false,\n pageSize = 50,\n enableColumnResize = true,\n enableClipboard = true,\n theme = 'light',\n stripedRows = true,\n exportFilename = 'data-export.csv',\n enableVerticalResize = true,\n initialHeight = 600,\n minHeight = 300,\n maxHeight = 1200,\n onCellClick,\n onExport,\n onCopy,\n}: DataGridProps) {\n const { showWatermark, canUsePivot, isDemo } = useLicense()\n\n // Theme handling\n const currentTheme = useMemo(() => {\n if (theme === 'auto') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n return theme\n }, [theme])\n\n // State\n const [currentFontSize, setCurrentFontSize] = useState(initialFontSize)\n const [globalSearchTerm, setGlobalSearchTerm] = useState('')\n const [showSearchInput, setShowSearchInput] = useState(false)\n const [currentPage, setCurrentPage] = useState(1)\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({})\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null)\n const [resizeStartX, setResizeStartX] = useState(0)\n const [resizeStartWidth, setResizeStartWidth] = useState(0)\n const [gridHeight, setGridHeight] = useState(initialHeight)\n const [isResizingVertically, setIsResizingVertically] = useState(false)\n const [verticalResizeStartY, setVerticalResizeStartY] = useState(0)\n const [verticalResizeStartHeight, setVerticalResizeStartHeight] = useState(0)\n const [showCopyToast, setShowCopyToast] = useState(false)\n const [copyToastMessage, setCopyToastMessage] = useState('')\n const [viewMode, setViewMode] = useState<'grid' | 'pivot'>('grid')\n const [showPivotConfig, setShowPivotConfig] = useState(true)\n const [draggingField, setDraggingField] = useState<string | null>(null)\n const [activeFilterColumn, setActiveFilterColumn] = useState<string | null>(null)\n const [filterDropdownPosition, setFilterDropdownPosition] = useState({ top: 0, left: 0, maxHeight: 400 })\n const [selectedCell, setSelectedCell] = useState<{ row: number; col: number } | null>(null)\n const [selectionStart, setSelectionStart] = useState<{ row: number; col: number } | null>(null)\n const [selectionEnd, setSelectionEnd] = useState<{ row: number; col: number } | null>(null)\n const [isSelecting, setIsSelecting] = useState(false)\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n const tableBodyRef = useRef<HTMLTableSectionElement>(null)\n\n const fontSizeOptions = [\n { value: 'xs' as const, label: 'S' },\n { value: 'sm' as const, label: 'M' },\n { value: 'base' as const, label: 'L' },\n ]\n\n // Grid composable\n const {\n table,\n columnKeys,\n filteredRowCount,\n totalRowCount,\n getColumnStats,\n hasActiveFilter,\n setColumnFilter,\n getColumnFilterValues,\n clearAllFilters,\n toggleSort,\n getSortDirection,\n columnFilters,\n activeFilters,\n } = useExcelGrid({ data, enableSorting: true, enableFiltering: true })\n\n // Filtered data for pivot table\n const filteredDataForPivot = useMemo(() => {\n const filteredRows = table.getFilteredRowModel().rows\n return filteredRows.map(row => row.original)\n }, [table, columnFilters])\n\n // Pivot table composable\n const {\n rowFields: pivotRowFields,\n columnFields: pivotColumnFields,\n valueFields: pivotValueFields,\n showRowTotals: pivotShowRowTotals,\n showColumnTotals: pivotShowColumnTotals,\n availableFields: pivotAvailableFields,\n isConfigured: pivotIsConfigured,\n pivotResult,\n addRowField,\n removeRowField,\n addColumnField,\n removeColumnField,\n addValueField,\n removeValueField,\n updateValueFieldAggregation,\n clearConfig: clearPivotConfig,\n autoSuggestConfig,\n setShowRowTotals: setPivotShowRowTotals,\n setShowColumnTotals: setPivotShowColumnTotals,\n setRowFields,\n setColumnFields,\n } = usePivotTable(filteredDataForPivot)\n\n // Active filters info for display\n const activeFilterInfo = useMemo(() => {\n if (activeFilters.length === 0) return null\n return activeFilters.map(f => ({\n column: f.column,\n valueCount: f.values?.length || 0,\n values: f.values || [],\n }))\n }, [activeFilters])\n\n // Rows - depends on columnFilters to recompute when filters change\n const rows = useMemo(() => table.getFilteredRowModel().rows, [table, columnFilters])\n\n // Filtered data based on global search\n const searchFilteredData = useMemo(() => {\n if (!globalSearchTerm.trim() || !enableSearch) {\n return rows\n }\n const term = globalSearchTerm.toLowerCase().trim()\n return rows.filter(row => {\n for (const col of columnKeys) {\n const value = row.original[col]\n if (value === null || value === undefined) continue\n if (String(value).toLowerCase().includes(term)) {\n return true\n }\n }\n return false\n })\n }, [rows, globalSearchTerm, enableSearch, columnKeys])\n\n // Paginated rows\n const totalSearchedRows = searchFilteredData.length\n const totalPages = useMemo(() => {\n if (!enablePagination) return 1\n return Math.max(1, Math.ceil(totalSearchedRows / pageSize))\n }, [enablePagination, totalSearchedRows, pageSize])\n\n const paginatedRows = useMemo(() => {\n if (!enablePagination) return searchFilteredData\n const start = (currentPage - 1) * pageSize\n const end = start + pageSize\n return searchFilteredData.slice(start, end)\n }, [enablePagination, searchFilteredData, currentPage, pageSize])\n\n // Reset to page 1 when filters or search changes\n useEffect(() => {\n setCurrentPage(1)\n }, [columnFilters, globalSearchTerm])\n\n // Selection bounds\n const selectionBounds = useMemo(() => {\n if (!selectionStart || !selectionEnd) return null\n return {\n minRow: Math.min(selectionStart.row, selectionEnd.row),\n maxRow: Math.max(selectionStart.row, selectionEnd.row),\n minCol: Math.min(selectionStart.col, selectionEnd.col),\n maxCol: Math.max(selectionStart.col, selectionEnd.col),\n }\n }, [selectionStart, selectionEnd])\n\n // Selection stats\n const selectionStats = useMemo(() => {\n if (!selectionBounds) return null\n const { minRow, maxRow, minCol, maxCol } = selectionBounds\n\n const values: number[] = []\n let count = 0\n\n for (let r = minRow; r <= maxRow; r++) {\n const row = rows[r]\n if (!row) continue\n\n for (let c = minCol; c <= maxCol; c++) {\n const colId = columnKeys[c]\n if (!colId) continue\n\n const value = row.original[colId]\n count++\n\n if (value !== null && value !== undefined && value !== '') {\n const num = typeof value === 'number' ? value : Number.parseFloat(String(value))\n if (!Number.isNaN(num)) {\n values.push(num)\n }\n }\n }\n }\n\n if (values.length === 0) return { count, sum: null, avg: null, numericCount: 0 }\n\n const sum = values.reduce((a, b) => a + b, 0)\n const avg = sum / values.length\n\n return { count, sum, avg, numericCount: values.length }\n }, [selectionBounds, rows, columnKeys])\n\n // Calculate column widths\n useEffect(() => {\n if (data.length === 0) return\n\n const widths: Record<string, number> = {}\n const sampleSize = Math.min(100, data.length)\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n ctx.font = '13px system-ui, -apple-system, sans-serif'\n\n for (const key of columnKeys) {\n let maxWidth = ctx.measureText(key).width + 56\n\n for (let i = 0; i < sampleSize; i++) {\n const value = data[i][key]\n const text = value === null || value === undefined ? '' : String(value)\n const width = ctx.measureText(text).width + 28\n maxWidth = Math.max(maxWidth, width)\n }\n\n widths[key] = Math.min(Math.max(maxWidth, MIN_COL_WIDTH), MAX_COL_WIDTH)\n }\n\n setColumnWidths(widths)\n }, [data, columnKeys])\n\n // Column resize handlers\n const startColumnResize = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n if (!enableColumnResize) return\n event.preventDefault()\n event.stopPropagation()\n\n setResizingColumnId(columnId)\n setResizeStartX(event.clientX)\n setResizeStartWidth(columnWidths[columnId] || MIN_COL_WIDTH)\n },\n [enableColumnResize, columnWidths]\n )\n\n useEffect(() => {\n if (!resizingColumnId) return\n\n const handleResizeMove = (event: MouseEvent) => {\n const diff = event.clientX - resizeStartX\n const newWidth = Math.max(MIN_COL_WIDTH, Math.min(MAX_COL_WIDTH, resizeStartWidth + diff))\n setColumnWidths(prev => ({\n ...prev,\n [resizingColumnId]: newWidth,\n }))\n }\n\n const handleResizeEnd = () => {\n setResizingColumnId(null)\n }\n\n document.addEventListener('mousemove', handleResizeMove)\n document.addEventListener('mouseup', handleResizeEnd)\n return () => {\n document.removeEventListener('mousemove', handleResizeMove)\n document.removeEventListener('mouseup', handleResizeEnd)\n }\n }, [resizingColumnId, resizeStartX, resizeStartWidth])\n\n // Vertical resize handlers\n const startVerticalResize = useCallback(\n (event: React.MouseEvent) => {\n if (!enableVerticalResize) return\n event.preventDefault()\n\n setIsResizingVertically(true)\n setVerticalResizeStartY(event.clientY)\n setVerticalResizeStartHeight(gridHeight)\n },\n [enableVerticalResize, gridHeight]\n )\n\n useEffect(() => {\n if (!isResizingVertically) return\n\n const handleVerticalResizeMove = (event: MouseEvent) => {\n const diff = event.clientY - verticalResizeStartY\n const newHeight = Math.max(minHeight, Math.min(maxHeight, verticalResizeStartHeight + diff))\n setGridHeight(newHeight)\n }\n\n const handleVerticalResizeEnd = () => {\n setIsResizingVertically(false)\n }\n\n document.addEventListener('mousemove', handleVerticalResizeMove)\n document.addEventListener('mouseup', handleVerticalResizeEnd)\n return () => {\n document.removeEventListener('mousemove', handleVerticalResizeMove)\n document.removeEventListener('mouseup', handleVerticalResizeEnd)\n }\n }, [isResizingVertically, verticalResizeStartY, verticalResizeStartHeight, minHeight, maxHeight])\n\n // Export handlers\n const handleExport = useCallback(() => {\n if (viewMode === 'pivot') {\n if (!pivotResult) return\n\n const pivotFilename = exportFilename.replace('.csv', '-pivot.csv')\n exportPivotToCSV(\n {\n headers: pivotResult.headers,\n rowHeaders: pivotResult.rowHeaders,\n data: pivotResult.data,\n rowTotals: pivotResult.rowTotals,\n columnTotals: pivotResult.columnTotals,\n grandTotal: pivotResult.grandTotal,\n showRowTotals: pivotShowRowTotals,\n showColumnTotals: pivotShowColumnTotals,\n },\n pivotRowFields,\n pivotColumnFields,\n pivotValueFields,\n { filename: pivotFilename }\n )\n\n onExport?.({ rowCount: pivotResult.rowHeaders.length, filename: pivotFilename })\n return\n }\n\n const dataToExport =\n enableSearch && globalSearchTerm.trim()\n ? searchFilteredData.map(row => row.original)\n : rows.map(row => row.original)\n\n exportToCSV(dataToExport, columnKeys, {\n filename: exportFilename,\n includeHeaders: true,\n })\n\n onExport?.({ rowCount: dataToExport.length, filename: exportFilename })\n }, [\n viewMode,\n pivotResult,\n exportFilename,\n pivotShowRowTotals,\n pivotShowColumnTotals,\n pivotRowFields,\n pivotColumnFields,\n pivotValueFields,\n enableSearch,\n globalSearchTerm,\n searchFilteredData,\n rows,\n columnKeys,\n onExport,\n ])\n\n // Copy to clipboard\n const copySelectionToClipboard = useCallback(() => {\n if (!selectionBounds || !enableClipboard) return\n\n const text = formatSelectionForClipboard(\n rows.map(r => r.original),\n columnKeys,\n selectionBounds\n )\n\n copyToClipboard(\n text,\n () => {\n const cellCount =\n (selectionBounds.maxRow - selectionBounds.minRow + 1) *\n (selectionBounds.maxCol - selectionBounds.minCol + 1)\n setCopyToastMessage(`Copied ${cellCount} cell${cellCount > 1 ? 's' : ''}`)\n setShowCopyToast(true)\n setTimeout(() => setShowCopyToast(false), 2000)\n onCopy?.({ text, cellCount })\n },\n err => {\n setCopyToastMessage('Copy failed')\n setShowCopyToast(true)\n setTimeout(() => setShowCopyToast(false), 2000)\n console.error('Copy failed:', err)\n }\n )\n }, [selectionBounds, enableClipboard, rows, columnKeys, onCopy])\n\n // Cell selection handlers\n const handleMouseDown = useCallback(\n (rowIndex: number, colIndex: number, event: React.MouseEvent) => {\n event.preventDefault()\n\n if (event.shiftKey && selectedCell) {\n setSelectionEnd({ row: rowIndex, col: colIndex })\n } else {\n setSelectedCell({ row: rowIndex, col: colIndex })\n setSelectionStart({ row: rowIndex, col: colIndex })\n setSelectionEnd({ row: rowIndex, col: colIndex })\n setIsSelecting(true)\n }\n\n const row = rows[rowIndex]\n if (row) {\n const colId = columnKeys[colIndex]\n onCellClick?.({\n row: rowIndex,\n col: colIndex,\n value: row.original[colId],\n rowData: row.original,\n })\n }\n },\n [selectedCell, rows, columnKeys, onCellClick]\n )\n\n const handleMouseEnter = useCallback(\n (rowIndex: number, colIndex: number) => {\n if (isSelecting) {\n setSelectionEnd({ row: rowIndex, col: colIndex })\n }\n },\n [isSelecting]\n )\n\n useEffect(() => {\n const handleMouseUp = () => setIsSelecting(false)\n document.addEventListener('mouseup', handleMouseUp)\n return () => document.removeEventListener('mouseup', handleMouseUp)\n }, [])\n\n // Keyboard handling\n useEffect(() => {\n const handleKeydown = (event: KeyboardEvent) => {\n // Handle Ctrl+C / Cmd+C for clipboard\n if ((event.ctrlKey || event.metaKey) && event.key === 'c' && selectionBounds) {\n event.preventDefault()\n copySelectionToClipboard()\n return\n }\n\n // Handle Escape\n if (event.key === 'Escape') {\n setSelectedCell(null)\n setSelectionStart(null)\n setSelectionEnd(null)\n setShowSearchInput(false)\n setGlobalSearchTerm('')\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n return () => document.removeEventListener('keydown', handleKeydown)\n }, [selectionBounds, copySelectionToClipboard])\n\n // Filter dropdown\n const openFilterDropdown = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n event.stopPropagation()\n const target = event.currentTarget as HTMLElement\n const headerCell = target.closest('.vpg-header-cell') as HTMLElement\n const rect = headerCell?.getBoundingClientRect() || target.getBoundingClientRect()\n\n const dropdownWidth = 280\n const padding = 12\n\n let left = rect.left\n if (left + dropdownWidth > window.innerWidth - padding) {\n left = window.innerWidth - dropdownWidth - padding\n }\n left = Math.max(padding, left)\n\n const spaceBelow = window.innerHeight - rect.bottom - padding\n const spaceAbove = rect.top - padding\n\n let top: number\n let maxDropdownHeight: number\n\n if (spaceBelow >= 300 || spaceBelow >= spaceAbove) {\n top = rect.bottom + 4\n maxDropdownHeight = Math.min(400, spaceBelow - 4)\n } else {\n maxDropdownHeight = Math.min(400, spaceAbove - 4)\n top = rect.top - maxDropdownHeight - 4\n }\n\n setFilterDropdownPosition({ top, left, maxHeight: maxDropdownHeight })\n setActiveFilterColumn(columnId)\n },\n []\n )\n\n const closeFilterDropdown = useCallback(() => {\n setActiveFilterColumn(null)\n }, [])\n\n const handleFilter = useCallback(\n (columnId: string, values: string[]) => {\n setColumnFilter(columnId, values)\n },\n [setColumnFilter]\n )\n\n const handleSort = useCallback(\n (columnId: string, direction: 'asc' | 'desc' | null) => {\n if (direction === null) {\n const current = getSortDirection(columnId)\n if (current) {\n toggleSort(columnId)\n if (getSortDirection(columnId)) {\n toggleSort(columnId)\n }\n }\n } else {\n const current = getSortDirection(columnId)\n if (current === null) {\n toggleSort(columnId)\n if (direction === 'desc' && getSortDirection(columnId) === 'asc') {\n toggleSort(columnId)\n }\n } else if (current !== direction) {\n toggleSort(columnId)\n }\n }\n },\n [getSortDirection, toggleSort]\n )\n\n const isCellSelected = useCallback(\n (rowIndex: number, colIndex: number): boolean => {\n if (!selectionBounds) {\n return selectedCell?.row === rowIndex && selectedCell?.col === colIndex\n }\n const { minRow, maxRow, minCol, maxCol } = selectionBounds\n return rowIndex >= minRow && rowIndex <= maxRow && colIndex >= minCol && colIndex <= maxCol\n },\n [selectionBounds, selectedCell]\n )\n\n const formatStatValue = (value: number | null): string => {\n if (value === null) return '-'\n if (Math.abs(value) >= 1000) {\n return value.toLocaleString('en-US', { maximumFractionDigits: 2 })\n }\n return value.toLocaleString('en-US', { maximumFractionDigits: 4 })\n }\n\n // Format cell value\n const noFormatPatterns =\n /^(?:.*_)?(?:id|code|year|month|quarter|day|week|date|zip|phone|fax|ssn|ein|npi|ndc|gpi|hcpcs|icd|cpt|rx|bin|pcn|group|member|claim|rx_number|script|fill)(?:_.*)?$/i\n\n const shouldFormatNumber = (columnId: string): boolean => {\n return !noFormatPatterns.test(columnId)\n }\n\n const formatCellValueDisplay = (value: unknown, columnId: string): string => {\n if (value === null || value === undefined) return ''\n if (value === '') return ''\n\n const stats = getColumnStats(columnId)\n if (stats.type === 'number') {\n const num = typeof value === 'number' ? value : Number.parseFloat(String(value))\n if (Number.isNaN(num)) return String(value)\n\n if (shouldFormatNumber(columnId) && Math.abs(num) >= 1000) {\n return num.toLocaleString('en-US', { maximumFractionDigits: 2 })\n }\n\n if (Number.isInteger(num)) {\n return String(num)\n }\n return num.toLocaleString('en-US', { maximumFractionDigits: 4, useGrouping: false })\n }\n\n return String(value)\n }\n\n const totalTableWidth = useMemo(() => {\n return columnKeys.reduce((sum, key) => sum + (columnWidths[key] || MIN_COL_WIDTH), 0)\n }, [columnKeys, columnWidths])\n\n const activeFilterCount = columnFilters.length\n\n return (\n <div\n className={`vpg-data-grid vpg-font-${currentFontSize} vpg-theme-${currentTheme} ${stripedRows ? 'vpg-striped' : ''} ${resizingColumnId ? 'vpg-resizing' : ''} ${isResizingVertically ? 'vpg-resizing-vertical' : ''}`}\n style={{ height: `${gridHeight}px` }}\n >\n {/* Copy Toast */}\n {showCopyToast && (\n <div className=\"vpg-toast\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {copyToastMessage}\n </div>\n )}\n\n {/* Toolbar */}\n <div className=\"vpg-toolbar\">\n <div className=\"vpg-toolbar-left\">\n {/* View mode toggle */}\n {showPivot && (\n <div className=\"vpg-view-toggle\">\n <button\n className={`vpg-view-btn ${viewMode === 'grid' ? 'active' : ''}`}\n onClick={() => setViewMode('grid')}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n Grid\n </button>\n <button\n className={`vpg-view-btn vpg-pivot-btn ${viewMode === 'pivot' ? 'active' : ''}`}\n onClick={() => setViewMode('pivot')}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n Pivot\n </button>\n </div>\n )}\n\n {/* Grid mode controls */}\n {viewMode === 'grid' && (\n <>\n {/* Search */}\n {enableSearch && (\n <div className=\"vpg-search-container\">\n {!showSearchInput ? (\n <button\n className=\"vpg-icon-btn\"\n title=\"Search (Ctrl+F)\"\n onClick={() => setShowSearchInput(true)}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"vpg-search-box\">\n <svg\n className=\"vpg-search-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={globalSearchTerm}\n onChange={e => setGlobalSearchTerm(e.target.value)}\n className=\"vpg-search-input\"\n placeholder=\"Search all columns...\"\n onKeyDown={e => {\n if (e.key === 'Escape') {\n setShowSearchInput(false)\n setGlobalSearchTerm('')\n }\n }}\n autoFocus\n />\n {globalSearchTerm && (\n <button className=\"vpg-search-clear\" onClick={() => setGlobalSearchTerm('')}>\n <svg\n className=\"vpg-icon-xs\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"vpg-font-size-control\">\n <span className=\"vpg-label\">Size:</span>\n <div className=\"vpg-font-size-toggle\">\n {fontSizeOptions.map(opt => (\n <button\n key={opt.value}\n className={`vpg-font-size-btn ${currentFontSize === opt.value ? 'active' : ''}`}\n onClick={() => setCurrentFontSize(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {activeFilterCount > 0 && (\n <div className=\"vpg-filter-info\">\n <svg className=\"vpg-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>\n {activeFilterCount} filter{activeFilterCount > 1 ? 's' : ''}\n </span>\n </div>\n )}\n\n {globalSearchTerm && (\n <div className=\"vpg-search-info\">\n <span>\n {totalSearchedRows} match{totalSearchedRows !== 1 ? 'es' : ''}\n </span>\n </div>\n )}\n </>\n )}\n\n {/* Pivot mode controls */}\n {viewMode === 'pivot' && canUsePivot && (\n <>\n <button\n className={`vpg-config-toggle ${showPivotConfig ? 'active' : ''}`}\n onClick={() => setShowPivotConfig(!showPivotConfig)}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n {showPivotConfig ? 'Hide' : 'Show'} Config\n </button>\n\n {pivotIsConfigured && (\n <div className=\"vpg-pivot-status\">\n <svg className=\"vpg-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>Pivot configured</span>\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"vpg-toolbar-right\">\n {viewMode === 'grid' && activeFilterCount > 0 && (\n <button className=\"vpg-clear-filters\" onClick={clearAllFilters}>\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n Clear Filters\n </button>\n )}\n\n {/* Copy button */}\n {enableClipboard && selectionBounds && viewMode === 'grid' && (\n <button\n className=\"vpg-icon-btn\"\n title=\"Copy selection (Ctrl+C)\"\n onClick={copySelectionToClipboard}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n )}\n\n {/* Export button */}\n {enableExport && (viewMode === 'grid' || (viewMode === 'pivot' && pivotIsConfigured)) && (\n <button\n className=\"vpg-export-btn\"\n title={viewMode === 'pivot' ? 'Export Pivot to CSV' : 'Export to CSV'}\n onClick={handleExport}\n >\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Export{viewMode === 'pivot' ? ' Pivot' : ''}\n </button>\n )}\n </div>\n </div>\n\n {/* Grid View */}\n {viewMode === 'grid' && (\n <div ref={tableContainerRef} className=\"vpg-grid-container\" tabIndex={0}>\n {loading && (\n <div className=\"vpg-loading\">\n <div className=\"vpg-spinner\" />\n <span>Loading data...</span>\n </div>\n )}\n\n {!loading && data.length === 0 && (\n <div className=\"vpg-empty\">\n <div className=\"vpg-empty-icon\">\n <svg className=\"vpg-icon-lg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <span>No data available</span>\n </div>\n )}\n\n {!loading && data.length > 0 && filteredRowCount === 0 && (\n <div className=\"vpg-empty\">\n <div className=\"vpg-empty-icon vpg-warning\">\n <svg className=\"vpg-icon-lg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n </div>\n <span>No matching records</span>\n <button className=\"vpg-clear-link\" onClick={clearAllFilters}>\n Clear all filters\n </button>\n </div>\n )}\n\n {!loading && filteredRowCount > 0 && (\n <div className=\"vpg-table-wrapper\">\n <table className=\"vpg-table\" style={{ minWidth: `${totalTableWidth}px` }}>\n <thead>\n <tr>\n {columnKeys.map((colId, colIndex) => (\n <th\n key={colId}\n className={`vpg-header-cell ${hasActiveFilter(colId) ? 'vpg-has-filter' : ''} ${getSortDirection(colId) !== null ? 'vpg-is-sorted' : ''} ${activeFilterColumn === colId ? 'vpg-is-active' : ''}`}\n style={{\n width: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n minWidth: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n }}\n onClick={e => {\n const target = e.target as HTMLElement\n if (target.closest('.vpg-dropdown-arrow')) {\n openFilterDropdown(colId, e)\n }\n }}\n >\n <div className=\"vpg-header-content\">\n <span className=\"vpg-header-text\">{colId}</span>\n <div className=\"vpg-header-icons\">\n {getSortDirection(colId) && (\n <span className=\"vpg-sort-indicator\">\n {getSortDirection(colId) === 'asc' ? (\n <svg\n className=\"vpg-icon-sm\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <svg\n className=\"vpg-icon-sm\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </span>\n )}\n {hasActiveFilter(colId) && (\n <span className=\"vpg-filter-indicator\">\n <svg\n className=\"vpg-icon-xs\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n )}\n <span className=\"vpg-dropdown-arrow\" title=\"Filter & Sort\">\n <svg\n className=\"vpg-icon-sm\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </div>\n </div>\n {enableColumnResize && (\n <div\n className=\"vpg-resize-handle\"\n onMouseDown={e => startColumnResize(colId, e)}\n />\n )}\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody ref={tableBodyRef}>\n {paginatedRows.map((row, rowIndex) => (\n <tr key={row.id} className=\"vpg-row\">\n {columnKeys.map((colId, colIndex) => (\n <td\n key={colId}\n className={`vpg-cell ${isCellSelected(rowIndex, colIndex) ? 'vpg-selected' : ''} ${getColumnStats(colId).type === 'number' ? 'vpg-is-number' : ''}`}\n data-row={rowIndex}\n data-col={colIndex}\n style={{\n width: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n minWidth: `${columnWidths[colId] || MIN_COL_WIDTH}px`,\n }}\n onMouseDown={e => handleMouseDown(rowIndex, colIndex, e)}\n onMouseEnter={() => handleMouseEnter(rowIndex, colIndex)}\n >\n {formatCellValueDisplay(row.original[colId], colId)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n\n {/* Pivot View */}\n {viewMode === 'pivot' && (\n <div className=\"vpg-pivot-container\">\n {showPivotConfig && canUsePivot && (\n <div className=\"vpg-pivot-config-panel\">\n <PivotConfig\n availableFields={pivotAvailableFields}\n rowFields={pivotRowFields}\n columnFields={pivotColumnFields}\n valueFields={pivotValueFields}\n showRowTotals={pivotShowRowTotals}\n showColumnTotals={pivotShowColumnTotals}\n onShowRowTotalsChange={setPivotShowRowTotals}\n onShowColumnTotalsChange={setPivotShowColumnTotals}\n onClearConfig={clearPivotConfig}\n onAutoSuggest={autoSuggestConfig}\n onDragStart={(field, e) => setDraggingField(field)}\n onDragEnd={() => setDraggingField(null)}\n onUpdateAggregation={updateValueFieldAggregation}\n onAddRowField={addRowField}\n onRemoveRowField={removeRowField}\n onAddColumnField={addColumnField}\n onRemoveColumnField={removeColumnField}\n onAddValueField={addValueField}\n onRemoveValueField={removeValueField}\n />\n </div>\n )}\n\n <div className={`vpg-pivot-main ${!showPivotConfig ? 'vpg-full-width' : ''}`}>\n <PivotSkeleton\n rowFields={pivotRowFields}\n columnFields={pivotColumnFields}\n valueFields={pivotValueFields}\n isConfigured={pivotIsConfigured}\n draggingField={draggingField}\n pivotResult={pivotResult}\n fontSize={currentFontSize}\n activeFilters={activeFilterInfo}\n totalRowCount={totalRowCount}\n filteredRowCount={filteredRowCount}\n onAddRowField={addRowField}\n onRemoveRowField={removeRowField}\n onAddColumnField={addColumnField}\n onRemoveColumnField={removeColumnField}\n onAddValueField={addValueField}\n onRemoveValueField={removeValueField}\n onUpdateAggregation={updateValueFieldAggregation}\n onReorderRowFields={setRowFields}\n onReorderColumnFields={setColumnFields}\n />\n </div>\n </div>\n )}\n\n {/* Footer */}\n <div className=\"vpg-footer\">\n <div className=\"vpg-footer-left\">\n {viewMode === 'grid' ? (\n enablePagination ? (\n <>\n <span>\n {((currentPage - 1) * pageSize + 1).toLocaleString()}-\n {Math.min(currentPage * pageSize, totalSearchedRows).toLocaleString()}\n </span>\n <span className=\"vpg-separator\">of</span>\n <span>{totalSearchedRows.toLocaleString()}</span>\n {totalSearchedRows !== totalRowCount && (\n <span className=\"vpg-filtered-note\">({totalRowCount.toLocaleString()} total)</span>\n )}\n </>\n ) : filteredRowCount === totalRowCount && totalSearchedRows === totalRowCount ? (\n <span>{totalRowCount.toLocaleString()} records</span>\n ) : (\n <>\n <span className=\"vpg-filtered-count\">{totalSearchedRows.toLocaleString()}</span>\n <span className=\"vpg-separator\">of</span>\n <span>{totalRowCount.toLocaleString()}</span>\n <span className=\"vpg-separator\">records</span>\n </>\n )\n ) : (\n <>\n <span className=\"vpg-pivot-label\">Pivot Table</span>\n <span className=\"vpg-separator\">•</span>\n <span>{totalRowCount.toLocaleString()} source records</span>\n </>\n )}\n </div>\n\n {/* Pagination controls */}\n {enablePagination && viewMode === 'grid' && totalPages > 1 && (\n <div className=\"vpg-pagination\">\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === 1}\n onClick={() => setCurrentPage(1)}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\"\n />\n </svg>\n </button>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === 1}\n onClick={() => setCurrentPage(p => Math.max(1, p - 1))}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <span className=\"vpg-page-info\">\n Page {currentPage} of {totalPages}\n </span>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === totalPages}\n onClick={() => setCurrentPage(p => Math.min(totalPages, p + 1))}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n <button\n className=\"vpg-page-btn\"\n disabled={currentPage === totalPages}\n onClick={() => setCurrentPage(totalPages)}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 5l7 7-7 7M5 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {viewMode === 'grid' && selectionStats && selectionStats.count > 1 && (\n <div className=\"vpg-selection-stats\">\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Count:</span>\n <span className=\"vpg-stat-value\">{selectionStats.count}</span>\n </span>\n {selectionStats.numericCount > 0 && (\n <>\n <span className=\"vpg-stat-divider\">|</span>\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Sum:</span>\n <span className=\"vpg-stat-value\">{formatStatValue(selectionStats.sum)}</span>\n </span>\n <span className=\"vpg-stat-divider\">|</span>\n <span className=\"vpg-stat\">\n <span className=\"vpg-stat-label\">Avg:</span>\n <span className=\"vpg-stat-value\">{formatStatValue(selectionStats.avg)}</span>\n </span>\n </>\n )}\n </div>\n )}\n\n <div className=\"vpg-footer-right\">\n {isDemo ? (\n <div className=\"vpg-demo-banner\">\n <span className=\"vpg-demo-badge\">DEMO</span>\n <span>Pro features enabled</span>\n <a href=\"https://tiny-pivot.com/#pricing\" target=\"_blank\" rel=\"noopener noreferrer\">\n Get License →\n </a>\n </div>\n ) : showWatermark ? (\n <span className=\"vpg-watermark-inline\">\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></svg>\n Powered by TinyPivot\n </a>\n </span>\n ) : null}\n </div>\n </div>\n\n {/* Vertical Resize Handle */}\n {enableVerticalResize && (\n <div className=\"vpg-vertical-resize-handle\" onMouseDown={startVerticalResize}>\n <div className=\"vpg-resize-grip\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </div>\n )}\n\n {/* Filter Dropdown Portal */}\n {activeFilterColumn &&\n createPortal(\n <div\n className=\"vpg-filter-portal\"\n style={{\n position: 'fixed',\n top: `${filterDropdownPosition.top}px`,\n left: `${filterDropdownPosition.left}px`,\n maxHeight: `${filterDropdownPosition.maxHeight}px`,\n zIndex: 9999,\n }}\n >\n <ColumnFilter\n columnId={activeFilterColumn}\n columnName={activeFilterColumn}\n stats={getColumnStats(activeFilterColumn)}\n selectedValues={getColumnFilterValues(activeFilterColumn)}\n sortDirection={getSortDirection(activeFilterColumn)}\n onFilter={values => handleFilter(activeFilterColumn, values)}\n onSort={dir => handleSort(activeFilterColumn, dir)}\n onClose={closeFilterDropdown}\n />\n </div>,\n document.body\n )}\n </div>\n )\n}\n\n","/**\n * Excel-like Grid Hook for React\n * Provides Excel-like filtering, sorting, and data manipulation functionality\n */\nimport { useState, useMemo, useCallback, useEffect } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n type ColumnDef,\n type ColumnFiltersState,\n type SortingState,\n type VisibilityState,\n type FilterFn,\n} from '@tanstack/react-table'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\nimport { getColumnUniqueValues, formatCellValue } from '@smallwebco/tinypivot-core'\n\n// Re-export for convenience\nexport { getColumnUniqueValues, formatCellValue }\n\nexport interface ExcelGridOptions<T> {\n data: T[]\n columns?: string[]\n enableSorting?: boolean\n enableFiltering?: boolean\n pageSize?: number\n}\n\n/**\n * Multi-value filter function for Excel-style filtering\n */\nconst multiSelectFilter: FilterFn<unknown> = (row, columnId, filterValue) => {\n if (!filterValue || !Array.isArray(filterValue) || filterValue.length === 0) {\n return true\n }\n\n const cellValue = row.getValue(columnId)\n const cellString =\n cellValue === null || cellValue === undefined || cellValue === ''\n ? '(blank)'\n : String(cellValue)\n\n return filterValue.includes(cellString)\n}\n\n/**\n * Excel-like grid hook\n */\nexport function useExcelGrid<T extends Record<string, unknown>>(options: ExcelGridOptions<T>) {\n const { data, enableSorting = true, enableFiltering = true } = options\n\n // State\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [globalFilter, setGlobalFilter] = useState('')\n\n // Column statistics cache\n const [columnStatsCache, setColumnStatsCache] = useState<Record<string, ColumnStats>>({})\n\n const dataSignature = useMemo(\n () => `${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [data]\n )\n\n // Compute columns from data\n const columnKeys = useMemo(() => {\n if (data.length === 0) return []\n return Object.keys(data[0] as Record<string, unknown>)\n }, [data])\n\n // Get column stats (memoized)\n const getColumnStats = useCallback(\n (columnKey: string): ColumnStats => {\n const cacheKey = `${columnKey}-${dataSignature}`\n if (!columnStatsCache[cacheKey]) {\n const stats = getColumnUniqueValues(data, columnKey)\n setColumnStatsCache(prev => ({ ...prev, [cacheKey]: stats }))\n return stats\n }\n return columnStatsCache[cacheKey]\n },\n [data, columnStatsCache, dataSignature]\n )\n\n // Clear stats cache\n const clearStatsCache = useCallback(() => {\n setColumnStatsCache({})\n }, [])\n\n useEffect(() => {\n clearStatsCache()\n }, [dataSignature, clearStatsCache])\n\n // Create column definitions dynamically\n const columnDefs = useMemo<ColumnDef<T, unknown>[]>(() => {\n return columnKeys.map(key => {\n const stats = getColumnStats(key)\n\n return {\n id: key,\n accessorKey: key,\n header: key,\n cell: info => formatCellValue(info.getValue(), stats.type),\n filterFn: multiSelectFilter,\n meta: {\n type: stats.type,\n uniqueCount: stats.uniqueValues.length,\n },\n } as ColumnDef<T, unknown>\n })\n }, [columnKeys, getColumnStats])\n\n // Create table instance\n const table = useReactTable({\n data,\n columns: columnDefs,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n globalFilter,\n },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: enableFiltering ? getFilteredRowModel() : undefined,\n filterFns: {\n multiSelect: multiSelectFilter,\n },\n enableSorting,\n enableFilters: enableFiltering,\n })\n\n // Computed properties\n const filteredRowCount = table.getFilteredRowModel().rows.length\n const totalRowCount = data.length\n\n // Active filters\n const activeFilters = useMemo(() => {\n return columnFilters.map(f => ({\n column: f.id,\n values: f.value as string[],\n }))\n }, [columnFilters])\n\n // Check if column has active filter\n const hasActiveFilter = useCallback(\n (columnId: string): boolean => {\n const column = table.getColumn(columnId)\n if (!column) return false\n const filterValue = column.getFilterValue()\n return filterValue !== undefined && Array.isArray(filterValue) && filterValue.length > 0\n },\n [table]\n )\n\n // Set column filter\n const setColumnFilter = useCallback(\n (columnId: string, values: string[]) => {\n const column = table.getColumn(columnId)\n if (column) {\n // Let the table's onColumnFiltersChange handler update the state\n // Do NOT manually call setColumnFilters after - it causes a race condition\n // where the stale state overwrites the pending update\n column.setFilterValue(values.length === 0 ? undefined : values)\n }\n },\n [table]\n )\n\n // Clear all filters\n const clearAllFilters = useCallback(() => {\n table.resetColumnFilters()\n setGlobalFilter('')\n // Force sync columnFilters state\n setColumnFilters([])\n }, [table])\n\n // Get filter values for a specific column\n const getColumnFilterValues = useCallback(\n (columnId: string): string[] => {\n const column = table.getColumn(columnId)\n if (!column) return []\n const filterValue = column.getFilterValue()\n return Array.isArray(filterValue) ? filterValue : []\n },\n [table]\n )\n\n // Toggle column sort\n const toggleSort = useCallback((columnId: string) => {\n setSorting(prev => {\n const current = prev.find(s => s.id === columnId)\n if (!current) {\n return [{ id: columnId, desc: false }]\n } else if (!current.desc) {\n return [{ id: columnId, desc: true }]\n } else {\n return []\n }\n })\n }, [])\n\n // Get sort direction for column\n const getSortDirection = useCallback(\n (columnId: string): 'asc' | 'desc' | null => {\n const sort = sorting.find(s => s.id === columnId)\n if (!sort) return null\n return sort.desc ? 'desc' : 'asc'\n },\n [sorting]\n )\n\n return {\n // Table instance\n table,\n\n // State\n sorting,\n columnFilters,\n columnVisibility,\n globalFilter,\n columnKeys,\n setSorting,\n setColumnFilters,\n setGlobalFilter,\n\n // Computed\n filteredRowCount,\n totalRowCount,\n activeFilters,\n\n // Methods\n getColumnStats,\n clearStatsCache,\n hasActiveFilter,\n setColumnFilter,\n getColumnFilterValues,\n clearAllFilters,\n toggleSort,\n getSortDirection,\n }\n}\n\n","/**\n * Pivot Table Hook for React\n * Wraps core pivot logic with React state management\n */\nimport { useState, useMemo, useEffect, useCallback } from 'react'\nimport type {\n AggregationFunction,\n FieldStats,\n PivotConfig,\n PivotResult,\n PivotValueField,\n} from '@smallwebco/tinypivot-core'\nimport {\n computeAvailableFields,\n getUnassignedFields,\n isPivotConfigured,\n computePivotResult,\n generateStorageKey,\n savePivotConfig,\n loadPivotConfig,\n isConfigValidForFields,\n getAggregationLabel,\n} from '@smallwebco/tinypivot-core'\nimport { useLicense } from './useLicense'\n\n// Re-export for convenience\nexport { getAggregationLabel }\n\ninterface UsePivotTableReturn {\n // State\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n showRowTotals: boolean\n showColumnTotals: boolean\n\n // Computed\n availableFields: FieldStats[]\n unassignedFields: FieldStats[]\n isConfigured: boolean\n pivotResult: PivotResult | null\n\n // Actions\n addRowField: (field: string) => void\n removeRowField: (field: string) => void\n addColumnField: (field: string) => void\n removeColumnField: (field: string) => void\n addValueField: (field: string, aggregation?: AggregationFunction) => void\n removeValueField: (field: string, aggregation?: AggregationFunction) => void\n updateValueFieldAggregation: (\n field: string,\n oldAgg: AggregationFunction,\n newAgg: AggregationFunction\n ) => void\n clearConfig: () => void\n setShowRowTotals: (value: boolean) => void\n setShowColumnTotals: (value: boolean) => void\n autoSuggestConfig: () => void\n setRowFields: (fields: string[]) => void\n setColumnFields: (fields: string[]) => void\n}\n\n/**\n * Main pivot table hook\n */\nexport function usePivotTable(data: Record<string, unknown>[]): UsePivotTableReturn {\n const { canUsePivot, requirePro } = useLicense()\n\n // Configuration state\n const [rowFields, setRowFieldsState] = useState<string[]>([])\n const [columnFields, setColumnFieldsState] = useState<string[]>([])\n const [valueFields, setValueFields] = useState<PivotValueField[]>([])\n const [showRowTotals, setShowRowTotals] = useState(true)\n const [showColumnTotals, setShowColumnTotals] = useState(true)\n const [currentStorageKey, setCurrentStorageKey] = useState<string | null>(null)\n\n // Compute available fields from data\n const availableFields = useMemo((): FieldStats[] => {\n return computeAvailableFields(data)\n }, [data])\n\n // Get fields that haven't been assigned yet\n const unassignedFields = useMemo(() => {\n return getUnassignedFields(availableFields, rowFields, columnFields, valueFields)\n }, [availableFields, rowFields, columnFields, valueFields])\n\n // Check if pivot is configured\n const isConfigured = useMemo(() => {\n return isPivotConfigured({\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n })\n }, [rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Build pivot result\n const pivotResult = useMemo((): PivotResult | null => {\n if (!isConfigured) return null\n if (!canUsePivot) return null\n\n return computePivotResult(data, {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n })\n }, [data, isConfigured, canUsePivot, rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Load/save config from storage\n useEffect(() => {\n if (data.length === 0) return\n\n const newKeys = Object.keys(data[0])\n const storageKey = generateStorageKey(newKeys)\n\n if (storageKey !== currentStorageKey) {\n setCurrentStorageKey(storageKey)\n\n const savedConfig = loadPivotConfig(storageKey)\n if (savedConfig && isConfigValidForFields(savedConfig, newKeys)) {\n setRowFieldsState(savedConfig.rowFields)\n setColumnFieldsState(savedConfig.columnFields)\n setValueFields(savedConfig.valueFields)\n setShowRowTotals(savedConfig.showRowTotals)\n setShowColumnTotals(savedConfig.showColumnTotals)\n } else {\n // Validate current config\n const currentConfig: PivotConfig = {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n }\n if (!isConfigValidForFields(currentConfig, newKeys)) {\n setRowFieldsState([])\n setColumnFieldsState([])\n setValueFields([])\n }\n }\n }\n }, [data])\n\n // Save config when it changes\n useEffect(() => {\n if (!currentStorageKey) return\n\n const config: PivotConfig = {\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n }\n savePivotConfig(currentStorageKey, config)\n }, [currentStorageKey, rowFields, columnFields, valueFields, showRowTotals, showColumnTotals])\n\n // Actions\n const addRowField = useCallback(\n (field: string) => {\n if (!requirePro('Pivot Table - Row Fields')) return\n if (!rowFields.includes(field)) {\n setRowFieldsState(prev => [...prev, field])\n }\n },\n [rowFields, requirePro]\n )\n\n const removeRowField = useCallback((field: string) => {\n setRowFieldsState(prev => prev.filter(f => f !== field))\n }, [])\n\n const setRowFields = useCallback((fields: string[]) => {\n setRowFieldsState(fields)\n }, [])\n\n const addColumnField = useCallback(\n (field: string) => {\n if (!requirePro('Pivot Table - Column Fields')) return\n if (!columnFields.includes(field)) {\n setColumnFieldsState(prev => [...prev, field])\n }\n },\n [columnFields, requirePro]\n )\n\n const removeColumnField = useCallback((field: string) => {\n setColumnFieldsState(prev => prev.filter(f => f !== field))\n }, [])\n\n const setColumnFields = useCallback((fields: string[]) => {\n setColumnFieldsState(fields)\n }, [])\n\n const addValueField = useCallback(\n (field: string, aggregation: AggregationFunction = 'sum') => {\n if (!requirePro('Pivot Table - Value Fields')) return\n setValueFields(prev => {\n if (prev.some(v => v.field === field && v.aggregation === aggregation)) {\n return prev\n }\n return [...prev, { field, aggregation }]\n })\n },\n [requirePro]\n )\n\n const removeValueField = useCallback((field: string, aggregation?: AggregationFunction) => {\n setValueFields(prev => {\n if (aggregation) {\n return prev.filter(v => !(v.field === field && v.aggregation === aggregation))\n }\n return prev.filter(v => v.field !== field)\n })\n }, [])\n\n const updateValueFieldAggregation = useCallback(\n (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => {\n setValueFields(prev =>\n prev.map(v => {\n if (v.field === field && v.aggregation === oldAgg) {\n return { ...v, aggregation: newAgg }\n }\n return v\n })\n )\n },\n []\n )\n\n const clearConfig = useCallback(() => {\n setRowFieldsState([])\n setColumnFieldsState([])\n setValueFields([])\n }, [])\n\n const autoSuggestConfig = useCallback(() => {\n if (!requirePro('Pivot Table - Auto Suggest')) return\n if (availableFields.length === 0) return\n\n const categoricalFields = availableFields.filter(f => !f.isNumeric && f.uniqueCount < 50)\n const numericFields = availableFields.filter(f => f.isNumeric)\n\n if (categoricalFields.length > 0 && numericFields.length > 0) {\n setRowFieldsState([categoricalFields[0].field])\n setValueFields([{ field: numericFields[0].field, aggregation: 'sum' }])\n }\n }, [availableFields, requirePro])\n\n return {\n // State\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n showColumnTotals,\n\n // Computed\n availableFields,\n unassignedFields,\n isConfigured,\n pivotResult,\n\n // Actions\n addRowField,\n removeRowField,\n addColumnField,\n removeColumnField,\n addValueField,\n removeValueField,\n updateValueFieldAggregation,\n clearConfig,\n setShowRowTotals,\n setShowColumnTotals,\n autoSuggestConfig,\n setRowFields,\n setColumnFields,\n }\n}\n\n","/**\n * License Management Hook for React\n * Wraps core license logic with React state management\n */\nimport { useState, useCallback, useMemo } from 'react'\nimport type { LicenseInfo } from '@smallwebco/tinypivot-core'\nimport {\n validateLicenseKey,\n configureLicenseSecret as coreConfigureLicenseSecret,\n getDemoLicenseInfo,\n getFreeLicenseInfo,\n canUsePivot as coreCanUsePivot,\n isPro as coreIsPro,\n shouldShowWatermark as coreShouldShowWatermark,\n logProRequired,\n} from '@smallwebco/tinypivot-core'\n\n// Global state (shared across all hook instances)\nlet globalLicenseInfo: LicenseInfo = getFreeLicenseInfo()\nlet globalDemoMode = false\nconst listeners = new Set<() => void>()\n\nfunction notifyListeners() {\n listeners.forEach(listener => listener())\n}\n\n/**\n * Set the license key for the library\n */\nexport async function setLicenseKey(key: string): Promise<void> {\n globalLicenseInfo = await validateLicenseKey(key)\n\n if (!globalLicenseInfo.isValid) {\n console.warn('[TinyPivot] Invalid or expired license key. Running in free mode.')\n } else if (globalLicenseInfo.type !== 'free') {\n console.info(`[TinyPivot] Pro license activated (${globalLicenseInfo.type})`)\n }\n\n notifyListeners()\n}\n\n/**\n * Enable demo mode - requires the correct demo secret\n * Returns true if activation succeeded, false if secret was invalid\n */\nexport async function enableDemoMode(secret: string): Promise<boolean> {\n const demoLicense = await getDemoLicenseInfo(secret)\n if (!demoLicense) {\n console.warn('[TinyPivot] Demo mode activation failed - invalid secret')\n return false\n }\n globalDemoMode = true\n globalLicenseInfo = demoLicense\n console.info('[TinyPivot] Demo mode enabled - all Pro features unlocked for evaluation')\n notifyListeners()\n return true\n}\n\n/**\n * Configure the license secret\n */\nexport function configureLicenseSecret(secret: string): void {\n coreConfigureLicenseSecret(secret)\n}\n\n/**\n * Hook for accessing license information\n */\nexport function useLicense() {\n const [, forceUpdate] = useState({})\n\n // Subscribe to global state changes\n useState(() => {\n const update = () => forceUpdate({})\n listeners.add(update)\n return () => listeners.delete(update)\n })\n\n const isDemo = globalDemoMode\n const licenseInfo = globalLicenseInfo\n\n const isPro = useMemo(\n () => globalDemoMode || coreIsPro(licenseInfo),\n [licenseInfo]\n )\n\n const canUsePivot = useMemo(\n () => globalDemoMode || coreCanUsePivot(licenseInfo),\n [licenseInfo]\n )\n\n const canUseAdvancedAggregations = useMemo(\n () => globalDemoMode || licenseInfo.features.advancedAggregations,\n [licenseInfo]\n )\n\n const canUsePercentageMode = useMemo(\n () => globalDemoMode || licenseInfo.features.percentageMode,\n [licenseInfo]\n )\n\n const showWatermark = useMemo(\n () => coreShouldShowWatermark(licenseInfo, globalDemoMode),\n [licenseInfo]\n )\n\n const requirePro = useCallback((feature: string): boolean => {\n if (!isPro) {\n logProRequired(feature)\n return false\n }\n return true\n }, [isPro])\n\n return {\n licenseInfo,\n isDemo,\n isPro,\n canUsePivot,\n canUseAdvancedAggregations,\n canUsePercentageMode,\n showWatermark,\n requirePro,\n }\n}\n\n","/**\n * Grid Features Hook for React\n * Provides CSV export, clipboard, pagination, and other utility features\n */\nimport { useState, useMemo, useCallback } from 'react'\nimport type { PaginationOptions, SelectionBounds, PivotValueField } from '@smallwebco/tinypivot-core'\nimport {\n exportToCSV as coreExportToCSV,\n exportPivotToCSV as coreExportPivotToCSV,\n copyToClipboard as coreCopyToClipboard,\n formatSelectionForClipboard as coreFormatSelection,\n} from '@smallwebco/tinypivot-core'\nimport type { PivotExportData, ExportOptions } from '@smallwebco/tinypivot-core'\n\n// Re-export core functions\nexport function exportToCSV<T extends Record<string, unknown>>(\n data: T[],\n columns: string[],\n options?: ExportOptions\n): void {\n coreExportToCSV(data, columns, options)\n}\n\nexport function exportPivotToCSV(\n pivotData: PivotExportData,\n rowFields: string[],\n columnFields: string[],\n valueFields: PivotValueField[],\n options?: ExportOptions\n): void {\n coreExportPivotToCSV(pivotData, rowFields, columnFields, valueFields, options)\n}\n\nexport function copyToClipboard(\n text: string,\n onSuccess?: () => void,\n onError?: (err: Error) => void\n): void {\n coreCopyToClipboard(text, onSuccess, onError)\n}\n\nexport function formatSelectionForClipboard<T extends Record<string, unknown>>(\n rows: T[],\n columns: string[],\n selectionBounds: SelectionBounds\n): string {\n return coreFormatSelection(rows, columns, selectionBounds)\n}\n\n/**\n * Pagination hook\n */\nexport function usePagination<T>(data: T[], options: PaginationOptions = {}) {\n const [pageSize, setPageSize] = useState(options.pageSize ?? 50)\n const [currentPage, setCurrentPage] = useState(options.currentPage ?? 1)\n\n const totalPages = useMemo(\n () => Math.max(1, Math.ceil(data.length / pageSize)),\n [data.length, pageSize]\n )\n\n const paginatedData = useMemo(() => {\n const start = (currentPage - 1) * pageSize\n const end = start + pageSize\n return data.slice(start, end)\n }, [data, currentPage, pageSize])\n\n const startIndex = useMemo(() => (currentPage - 1) * pageSize + 1, [currentPage, pageSize])\n const endIndex = useMemo(\n () => Math.min(currentPage * pageSize, data.length),\n [currentPage, pageSize, data.length]\n )\n\n const goToPage = useCallback(\n (page: number) => {\n setCurrentPage(Math.max(1, Math.min(page, totalPages)))\n },\n [totalPages]\n )\n\n const nextPage = useCallback(() => {\n if (currentPage < totalPages) {\n setCurrentPage(prev => prev + 1)\n }\n }, [currentPage, totalPages])\n\n const prevPage = useCallback(() => {\n if (currentPage > 1) {\n setCurrentPage(prev => prev - 1)\n }\n }, [currentPage])\n\n const firstPage = useCallback(() => {\n setCurrentPage(1)\n }, [])\n\n const lastPage = useCallback(() => {\n setCurrentPage(totalPages)\n }, [totalPages])\n\n const updatePageSize = useCallback((size: number) => {\n setPageSize(size)\n setCurrentPage(1)\n }, [])\n\n return {\n pageSize,\n currentPage,\n totalPages,\n paginatedData,\n startIndex,\n endIndex,\n goToPage,\n nextPage,\n prevPage,\n firstPage,\n lastPage,\n setPageSize: updatePageSize,\n }\n}\n\n/**\n * Global search/filter hook\n */\nexport function useGlobalSearch<T extends Record<string, unknown>>(data: T[], columns: string[]) {\n const [searchTerm, setSearchTerm] = useState('')\n const [caseSensitive, setCaseSensitive] = useState(false)\n\n const filteredData = useMemo(() => {\n if (!searchTerm.trim()) {\n return data\n }\n\n const term = caseSensitive ? searchTerm.trim() : searchTerm.trim().toLowerCase()\n\n return data.filter(row => {\n for (const col of columns) {\n const value = row[col]\n if (value === null || value === undefined) continue\n\n const strValue = caseSensitive ? String(value) : String(value).toLowerCase()\n\n if (strValue.includes(term)) {\n return true\n }\n }\n return false\n })\n }, [data, columns, searchTerm, caseSensitive])\n\n const clearSearch = useCallback(() => {\n setSearchTerm('')\n }, [])\n\n return {\n searchTerm,\n setSearchTerm,\n caseSensitive,\n setCaseSensitive,\n filteredData,\n clearSearch,\n }\n}\n\n/**\n * Row selection hook\n */\nexport function useRowSelection<T>(data: T[]) {\n const [selectedRowIndices, setSelectedRowIndices] = useState<Set<number>>(new Set())\n\n const selectedRows = useMemo(() => {\n return Array.from(selectedRowIndices)\n .sort((a, b) => a - b)\n .map(idx => data[idx])\n .filter(Boolean)\n }, [data, selectedRowIndices])\n\n const allSelected = useMemo(() => {\n return data.length > 0 && selectedRowIndices.size === data.length\n }, [data.length, selectedRowIndices.size])\n\n const someSelected = useMemo(() => {\n return selectedRowIndices.size > 0 && selectedRowIndices.size < data.length\n }, [data.length, selectedRowIndices.size])\n\n const toggleRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n if (next.has(index)) {\n next.delete(index)\n } else {\n next.add(index)\n }\n return next\n })\n }, [])\n\n const selectRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => new Set([...prev, index]))\n }, [])\n\n const deselectRow = useCallback((index: number) => {\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n next.delete(index)\n return next\n })\n }, [])\n\n const selectAll = useCallback(() => {\n setSelectedRowIndices(new Set(data.map((_, idx) => idx)))\n }, [data])\n\n const deselectAll = useCallback(() => {\n setSelectedRowIndices(new Set())\n }, [])\n\n const toggleAll = useCallback(() => {\n if (allSelected) {\n deselectAll()\n } else {\n selectAll()\n }\n }, [allSelected, selectAll, deselectAll])\n\n const isSelected = useCallback(\n (index: number): boolean => {\n return selectedRowIndices.has(index)\n },\n [selectedRowIndices]\n )\n\n const selectRange = useCallback((startIndex: number, endIndex: number) => {\n const min = Math.min(startIndex, endIndex)\n const max = Math.max(startIndex, endIndex)\n setSelectedRowIndices(prev => {\n const next = new Set(prev)\n for (let i = min; i <= max; i++) {\n next.add(i)\n }\n return next\n })\n }, [])\n\n return {\n selectedRowIndices,\n selectedRows,\n allSelected,\n someSelected,\n toggleRow,\n selectRow,\n deselectRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n selectRange,\n }\n}\n\n/**\n * Column resizing hook\n */\nexport function useColumnResize(\n initialWidths: Record<string, number>,\n minWidth = 60,\n maxWidth = 600\n) {\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({ ...initialWidths })\n const [isResizing, setIsResizing] = useState(false)\n const [resizingColumn, setResizingColumn] = useState<string | null>(null)\n\n const startResize = useCallback(\n (columnId: string, event: React.MouseEvent) => {\n setIsResizing(true)\n setResizingColumn(columnId)\n const startX = event.clientX\n const startWidth = columnWidths[columnId] || 150\n\n const handleMouseMove = (e: MouseEvent) => {\n const diff = e.clientX - startX\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + diff))\n setColumnWidths(prev => ({\n ...prev,\n [columnId]: newWidth,\n }))\n }\n\n const handleMouseUp = () => {\n setIsResizing(false)\n setResizingColumn(null)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n },\n [columnWidths, minWidth, maxWidth]\n )\n\n const resetColumnWidth = useCallback(\n (columnId: string) => {\n if (initialWidths[columnId]) {\n setColumnWidths(prev => ({\n ...prev,\n [columnId]: initialWidths[columnId],\n }))\n }\n },\n [initialWidths]\n )\n\n const resetAllWidths = useCallback(() => {\n setColumnWidths({ ...initialWidths })\n }, [initialWidths])\n\n return {\n columnWidths,\n setColumnWidths,\n isResizing,\n resizingColumn,\n startResize,\n resetColumnWidth,\n resetAllWidths,\n }\n}\n\n","/**\n * Column Filter Dropdown Component for React\n * Shows unique values with checkboxes, search, and sort controls\n */\nimport React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport type { ColumnStats } from '@smallwebco/tinypivot-core'\n\ninterface ColumnFilterProps {\n columnId: string\n columnName: string\n stats: ColumnStats\n selectedValues: string[]\n sortDirection: 'asc' | 'desc' | null\n onFilter: (values: string[]) => void\n onSort: (direction: 'asc' | 'desc' | null) => void\n onClose: () => void\n}\n\nexport function ColumnFilter({\n columnName,\n stats,\n selectedValues,\n sortDirection,\n onFilter,\n onSort,\n onClose,\n}: ColumnFilterProps) {\n const [searchQuery, setSearchQuery] = useState('')\n const [localSelected, setLocalSelected] = useState<Set<string>>(new Set(selectedValues))\n const dropdownRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n // Include blank option if there are null values\n const hasBlankValues = stats.nullCount > 0\n\n // Filtered unique values based on search\n const filteredValues = useMemo(() => {\n const values = stats.uniqueValues\n if (!searchQuery) return values\n\n const query = searchQuery.toLowerCase()\n return values.filter(v => v.toLowerCase().includes(query))\n }, [stats.uniqueValues, searchQuery])\n\n // All values including blank\n const allValues = useMemo(() => {\n const values = [...filteredValues]\n if (hasBlankValues && (!searchQuery || '(blank)'.includes(searchQuery.toLowerCase()))) {\n values.unshift('(blank)')\n }\n return values\n }, [filteredValues, hasBlankValues, searchQuery])\n\n // Check states\n const isAllSelected = useMemo(\n () => allValues.every(v => localSelected.has(v)),\n [allValues, localSelected]\n )\n\n // Toggle single value\n const toggleValue = useCallback((value: string) => {\n setLocalSelected(prev => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n next.add(value)\n }\n return next\n })\n }, [])\n\n // Select all visible\n const selectAll = useCallback(() => {\n setLocalSelected(prev => {\n const next = new Set(prev)\n for (const value of allValues) {\n next.add(value)\n }\n return next\n })\n }, [allValues])\n\n // Clear all\n const clearAll = useCallback(() => {\n setLocalSelected(new Set())\n }, [])\n\n // Apply filter\n const applyFilter = useCallback(() => {\n if (localSelected.size === 0) {\n onFilter([])\n } else {\n onFilter(Array.from(localSelected))\n }\n onClose()\n }, [localSelected, onFilter, onClose])\n\n // Sort handlers\n const sortAscending = useCallback(() => {\n onSort(sortDirection === 'asc' ? null : 'asc')\n }, [sortDirection, onSort])\n\n const sortDescending = useCallback(() => {\n onSort(sortDirection === 'desc' ? null : 'desc')\n }, [sortDirection, onSort])\n\n // Clear filter only\n const clearFilter = useCallback(() => {\n setLocalSelected(new Set())\n onFilter([])\n onClose()\n }, [onFilter, onClose])\n\n // Click outside handler\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n onClose()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [onClose])\n\n // Keyboard handling\n useEffect(() => {\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n } else if (event.key === 'Enter' && event.ctrlKey) {\n applyFilter()\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n return () => document.removeEventListener('keydown', handleKeydown)\n }, [onClose, applyFilter])\n\n // Focus search on mount\n useEffect(() => {\n searchInputRef.current?.focus()\n }, [])\n\n // Sync with props\n useEffect(() => {\n setLocalSelected(new Set(selectedValues))\n }, [selectedValues])\n\n return (\n <div ref={dropdownRef} className=\"vpg-filter-dropdown\">\n {/* Header */}\n <div className=\"vpg-filter-header\">\n <span className=\"vpg-filter-title\">{columnName}</span>\n <span className=\"vpg-filter-count\">{stats.uniqueValues.length.toLocaleString()} unique</span>\n </div>\n\n {/* Sort Controls */}\n <div className=\"vpg-sort-controls\">\n <button\n className={`vpg-sort-btn ${sortDirection === 'asc' ? 'active' : ''}`}\n title=\"Sort A to Z\"\n onClick={sortAscending}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\"\n />\n </svg>\n <span>A→Z</span>\n </button>\n <button\n className={`vpg-sort-btn ${sortDirection === 'desc' ? 'active' : ''}`}\n title=\"Sort Z to A\"\n onClick={sortDescending}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\"\n />\n </svg>\n <span>Z→A</span>\n </button>\n </div>\n\n <div className=\"vpg-divider\" />\n\n {/* Search */}\n <div className=\"vpg-search-container\">\n <svg className=\"vpg-search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n placeholder=\"Search values...\"\n className=\"vpg-search-input\"\n />\n {searchQuery && (\n <button className=\"vpg-clear-search\" onClick={() => setSearchQuery('')}>\n ×\n </button>\n )}\n </div>\n\n {/* Select All / Clear All */}\n <div className=\"vpg-bulk-actions\">\n <button className=\"vpg-bulk-btn\" onClick={selectAll}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n Select All\n </button>\n <button className=\"vpg-bulk-btn\" onClick={clearAll}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n Clear All\n </button>\n </div>\n\n {/* Values List */}\n <div className=\"vpg-values-list\">\n {allValues.map(value => (\n <label\n key={value}\n className={`vpg-value-item ${localSelected.has(value) ? 'selected' : ''}`}\n >\n <input\n type=\"checkbox\"\n checked={localSelected.has(value)}\n onChange={() => toggleValue(value)}\n className=\"vpg-value-checkbox\"\n />\n <span className={`vpg-value-text ${value === '(blank)' ? 'vpg-blank' : ''}`}>\n {value}\n </span>\n </label>\n ))}\n\n {allValues.length === 0 && <div className=\"vpg-no-results\">No matching values</div>}\n </div>\n\n {/* Footer */}\n <div className=\"vpg-filter-footer\">\n <button className=\"vpg-btn-clear\" onClick={clearFilter}>\n Clear Filter\n </button>\n <button className=\"vpg-btn-apply\" onClick={applyFilter}>\n Apply\n </button>\n </div>\n </div>\n )\n}\n\n","/**\n * Pivot Table Configuration Panel for React\n * Draggable fields with aggregation selection\n */\nimport React, { useState, useMemo, useCallback } from 'react'\nimport type { AggregationFunction, PivotValueField, FieldStats } from '@smallwebco/tinypivot-core'\nimport { AGGREGATION_OPTIONS, getAggregationSymbol } from '@smallwebco/tinypivot-core'\nimport { useLicense } from '../hooks/useLicense'\n\ninterface PivotConfigProps {\n availableFields: FieldStats[]\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n showRowTotals: boolean\n showColumnTotals: boolean\n onShowRowTotalsChange: (value: boolean) => void\n onShowColumnTotalsChange: (value: boolean) => void\n onClearConfig: () => void\n onAutoSuggest: () => void\n onDragStart: (field: string, event: React.DragEvent) => void\n onDragEnd: () => void\n onUpdateAggregation: (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => void\n onAddRowField: (field: string) => void\n onRemoveRowField: (field: string) => void\n onAddColumnField: (field: string) => void\n onRemoveColumnField: (field: string) => void\n onAddValueField: (field: string, aggregation: AggregationFunction) => void\n onRemoveValueField: (field: string, aggregation: AggregationFunction) => void\n}\n\nfunction getFieldIcon(type: FieldStats['type']): string {\n switch (type) {\n case 'number':\n return '#'\n case 'date':\n return '📅'\n case 'boolean':\n return '✓'\n default:\n return 'Aa'\n }\n}\n\nexport function PivotConfig({\n availableFields,\n rowFields,\n columnFields,\n valueFields,\n showRowTotals,\n onShowRowTotalsChange,\n onClearConfig,\n onAutoSuggest,\n onDragStart,\n onDragEnd,\n onUpdateAggregation,\n onRemoveRowField,\n onRemoveColumnField,\n onRemoveValueField,\n onAddRowField,\n onAddColumnField,\n}: PivotConfigProps) {\n const { showWatermark } = useLicense()\n const [fieldSearch, setFieldSearch] = useState('')\n\n // Assigned fields\n const assignedFields = useMemo(() => {\n const rowSet = new Set(rowFields)\n const colSet = new Set(columnFields)\n const valueMap = new Map(valueFields.map(v => [v.field, v]))\n\n return availableFields\n .filter(f => rowSet.has(f.field) || colSet.has(f.field) || valueMap.has(f.field))\n .map(f => ({\n ...f,\n assignedTo: rowSet.has(f.field)\n ? ('row' as const)\n : colSet.has(f.field)\n ? ('column' as const)\n : ('value' as const),\n valueConfig: valueMap.get(f.field),\n }))\n }, [availableFields, rowFields, columnFields, valueFields])\n\n // Unassigned fields\n const unassignedFields = useMemo(() => {\n const rowSet = new Set(rowFields)\n const colSet = new Set(columnFields)\n const valSet = new Set(valueFields.map(v => v.field))\n\n return availableFields.filter(\n f => !rowSet.has(f.field) && !colSet.has(f.field) && !valSet.has(f.field)\n )\n }, [availableFields, rowFields, columnFields, valueFields])\n\n const filteredUnassignedFields = useMemo(() => {\n if (!fieldSearch.trim()) return unassignedFields\n const search = fieldSearch.toLowerCase().trim()\n return unassignedFields.filter(f => f.field.toLowerCase().includes(search))\n }, [unassignedFields, fieldSearch])\n\n const assignedCount = assignedFields.length\n\n const handleDragStart = useCallback(\n (field: string, event: React.DragEvent) => {\n event.dataTransfer?.setData('text/plain', field)\n event.dataTransfer!.effectAllowed = 'move'\n onDragStart(field, event)\n },\n [onDragStart]\n )\n\n const handleAggregationChange = useCallback(\n (field: string, currentAgg: AggregationFunction, newAgg: AggregationFunction) => {\n onUpdateAggregation(field, currentAgg, newAgg)\n },\n [onUpdateAggregation]\n )\n\n const toggleRowColumn = useCallback(\n (field: string, currentAssignment: 'row' | 'column') => {\n if (currentAssignment === 'row') {\n onRemoveRowField(field)\n onAddColumnField(field)\n } else {\n onRemoveColumnField(field)\n onAddRowField(field)\n }\n },\n [onRemoveRowField, onAddColumnField, onRemoveColumnField, onAddRowField]\n )\n\n const removeField = useCallback(\n (field: string, assignedTo: 'row' | 'column' | 'value', valueConfig?: PivotValueField) => {\n if (assignedTo === 'row') {\n onRemoveRowField(field)\n } else if (assignedTo === 'column') {\n onRemoveColumnField(field)\n } else if (valueConfig) {\n onRemoveValueField(field, valueConfig.aggregation)\n }\n },\n [onRemoveRowField, onRemoveColumnField, onRemoveValueField]\n )\n\n return (\n <div className=\"vpg-pivot-config\">\n {/* Header */}\n <div className=\"vpg-config-header\">\n <h3 className=\"vpg-config-title\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n Fields\n </h3>\n <div className=\"vpg-header-actions\">\n {assignedCount > 0 && (\n <button\n className=\"vpg-action-btn vpg-clear-btn\"\n title=\"Clear all\"\n onClick={onClearConfig}\n >\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n\n {/* Assigned Fields */}\n {assignedCount > 0 && (\n <div className=\"vpg-assigned-section\">\n <div className=\"vpg-section-label\">Active</div>\n <div className=\"vpg-assigned-list\">\n {assignedFields.map(field => (\n <div\n key={field.field}\n className={`vpg-assigned-item vpg-type-${field.assignedTo}`}\n title={field.field}\n draggable\n onDragStart={e => handleDragStart(field.field, e)}\n onDragEnd={onDragEnd}\n >\n <div className=\"vpg-item-main\">\n <span className={`vpg-item-badge ${field.assignedTo}`}>\n {field.assignedTo === 'row'\n ? 'R'\n : field.assignedTo === 'column'\n ? 'C'\n : getAggregationSymbol(field.valueConfig?.aggregation || 'sum')}\n </span>\n <span className=\"vpg-item-name\">{field.field}</span>\n </div>\n\n <div className=\"vpg-item-actions\">\n {(field.assignedTo === 'row' || field.assignedTo === 'column') && (\n <button\n className=\"vpg-toggle-btn\"\n title={field.assignedTo === 'row' ? 'Move to Columns' : 'Move to Rows'}\n onClick={e => {\n e.stopPropagation()\n toggleRowColumn(field.field, field.assignedTo as 'row' | 'column')\n }}\n >\n <svg\n className=\"vpg-icon-xs\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\"\n />\n </svg>\n </button>\n )}\n\n {field.assignedTo === 'value' && field.valueConfig && (\n <select\n className=\"vpg-agg-select\"\n value={field.valueConfig.aggregation}\n onChange={e => {\n e.stopPropagation()\n handleAggregationChange(\n field.field,\n field.valueConfig!.aggregation,\n e.target.value as AggregationFunction\n )\n }}\n onClick={e => e.stopPropagation()}\n >\n {AGGREGATION_OPTIONS.map(agg => (\n <option key={agg.value} value={agg.value}>\n {agg.symbol} {agg.label}\n </option>\n ))}\n </select>\n )}\n\n <button\n className=\"vpg-remove-btn\"\n title=\"Remove\"\n onClick={e => {\n e.stopPropagation()\n removeField(field.field, field.assignedTo, field.valueConfig)\n }}\n >\n ×\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Unassigned Fields */}\n <div className=\"vpg-unassigned-section\">\n <div className=\"vpg-section-header\">\n <div className=\"vpg-section-label\">\n Available <span className=\"vpg-count\">{unassignedFields.length}</span>\n </div>\n </div>\n\n {/* Field Search */}\n <div className=\"vpg-field-search\">\n <svg className=\"vpg-search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={fieldSearch}\n onChange={e => setFieldSearch(e.target.value)}\n placeholder=\"Search fields...\"\n className=\"vpg-search-input\"\n />\n {fieldSearch && (\n <button className=\"vpg-clear-search\" onClick={() => setFieldSearch('')}>\n <svg className=\"vpg-icon-xs\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n\n <div className=\"vpg-field-list\">\n {filteredUnassignedFields.map(field => (\n <div\n key={field.field}\n className={`vpg-field-item ${field.isNumeric ? 'vpg-is-numeric' : ''}`}\n title={field.field}\n draggable\n onDragStart={e => handleDragStart(field.field, e)}\n onDragEnd={onDragEnd}\n >\n <span className=\"vpg-field-type-icon\" title={field.type}>\n {getFieldIcon(field.type)}\n </span>\n <span className=\"vpg-field-name\">{field.field}</span>\n <span className=\"vpg-unique-count\">{field.uniqueCount}</span>\n </div>\n ))}\n {filteredUnassignedFields.length === 0 && fieldSearch && (\n <div className=\"vpg-empty-hint\">No fields match \"{fieldSearch}\"</div>\n )}\n {unassignedFields.length === 0 && <div className=\"vpg-empty-hint\">All fields assigned</div>}\n </div>\n </div>\n\n {/* Options */}\n <div className=\"vpg-options-section\">\n <label className=\"vpg-option-toggle\">\n <input\n type=\"checkbox\"\n checked={showRowTotals}\n onChange={e => onShowRowTotalsChange(e.target.checked)}\n />\n <span>Totals</span>\n </label>\n <button className=\"vpg-auto-btn\" onClick={onAutoSuggest}>\n <svg className=\"vpg-icon-sm\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n Auto\n </button>\n </div>\n\n {/* Watermark */}\n {showWatermark && (\n <div className=\"vpg-watermark\">\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n TinyPivot\n </a>\n </div>\n )}\n </div>\n )\n}\n\n","/**\n * Pivot Table Skeleton + Data Display for React\n * Visual layout for pivot configuration and results\n */\nimport React, { useState, useMemo, useCallback } from 'react'\nimport type { AggregationFunction, PivotResult, PivotValueField } from '@smallwebco/tinypivot-core'\nimport { getAggregationLabel, getAggregationSymbol } from '@smallwebco/tinypivot-core'\nimport { useLicense } from '../hooks/useLicense'\n\ninterface ActiveFilter {\n column: string\n valueCount: number\n values: string[]\n}\n\ninterface PivotSkeletonProps {\n rowFields: string[]\n columnFields: string[]\n valueFields: PivotValueField[]\n isConfigured: boolean\n draggingField: string | null\n pivotResult: PivotResult | null\n fontSize?: 'xs' | 'sm' | 'base'\n activeFilters?: ActiveFilter[] | null\n totalRowCount?: number\n filteredRowCount?: number\n onAddRowField: (field: string) => void\n onRemoveRowField: (field: string) => void\n onAddColumnField: (field: string) => void\n onRemoveColumnField: (field: string) => void\n onAddValueField: (field: string, aggregation: AggregationFunction) => void\n onRemoveValueField: (field: string, aggregation: AggregationFunction) => void\n onUpdateAggregation: (field: string, oldAgg: AggregationFunction, newAgg: AggregationFunction) => void\n onReorderRowFields: (fields: string[]) => void\n onReorderColumnFields: (fields: string[]) => void\n}\n\nexport function PivotSkeleton({\n rowFields,\n columnFields,\n valueFields,\n isConfigured,\n draggingField,\n pivotResult,\n fontSize = 'xs',\n activeFilters,\n totalRowCount,\n filteredRowCount,\n onAddRowField,\n onRemoveRowField,\n onAddColumnField,\n onRemoveColumnField,\n onAddValueField,\n onRemoveValueField,\n onReorderRowFields,\n onReorderColumnFields,\n}: PivotSkeletonProps) {\n const { showWatermark, canUsePivot, isDemo } = useLicense()\n\n // Drag state\n const [dragOverArea, setDragOverArea] = useState<'row' | 'column' | 'value' | null>(null)\n \n // Reorder drag state\n const [reorderDragSource, setReorderDragSource] = useState<{ zone: 'row' | 'column'; index: number } | null>(null)\n const [reorderDropTarget, setReorderDropTarget] = useState<{ zone: 'row' | 'column'; index: number } | null>(null)\n\n // Sorting\n type SortTarget = 'row' | number\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')\n const [sortTarget, setSortTarget] = useState<SortTarget>('row')\n\n const toggleSort = useCallback((target: SortTarget = 'row') => {\n if (sortTarget === target) {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'))\n } else {\n setSortTarget(target)\n setSortDirection('asc')\n }\n }, [sortTarget])\n\n // Sorted row indices\n const sortedRowIndices = useMemo(() => {\n if (!pivotResult) return []\n\n const indices = pivotResult.rowHeaders.map((_, i) => i)\n const headers = pivotResult.rowHeaders\n const data = pivotResult.data\n\n indices.sort((a, b) => {\n let cmp: number\n\n if (sortTarget === 'row') {\n const aHeader = headers[a]?.join(' / ') || ''\n const bHeader = headers[b]?.join(' / ') || ''\n cmp = aHeader.localeCompare(bHeader, undefined, { numeric: true, sensitivity: 'base' })\n } else {\n const colIdx = sortTarget as number\n const aVal = data[a]?.[colIdx]?.value ?? null\n const bVal = data[b]?.[colIdx]?.value ?? null\n\n if (aVal === null && bVal === null) cmp = 0\n else if (aVal === null) cmp = 1\n else if (bVal === null) cmp = -1\n else cmp = aVal - bVal\n }\n\n return sortDirection === 'asc' ? cmp : -cmp\n })\n\n return indices\n }, [pivotResult, sortTarget, sortDirection])\n\n // Column headers\n const columnHeaderCells = useMemo(() => {\n if (!pivotResult || pivotResult.headers.length === 0) {\n return [\n valueFields.map(vf => ({\n label: `${vf.field} (${getAggregationLabel(vf.aggregation)})`,\n colspan: 1,\n })),\n ]\n }\n\n const result: Array<Array<{ label: string; colspan: number }>> = []\n\n for (let level = 0; level < pivotResult.headers.length; level++) {\n const headerRow = pivotResult.headers[level]\n const cells: Array<{ label: string; colspan: number }> = []\n\n let i = 0\n while (i < headerRow.length) {\n const value = headerRow[i]\n let colspan = 1\n\n while (i + colspan < headerRow.length && headerRow[i + colspan] === value) {\n colspan++\n }\n\n cells.push({ label: value, colspan })\n i += colspan\n }\n\n result.push(cells)\n }\n\n return result\n }, [pivotResult, valueFields])\n\n // Filter status\n const hasActiveFilters = activeFilters && activeFilters.length > 0\n const filterSummary = useMemo(() => {\n if (!activeFilters || activeFilters.length === 0) return ''\n return activeFilters.map(f => f.column).join(', ')\n }, [activeFilters])\n\n // Detailed filter tooltip\n const [showFilterTooltip, setShowFilterTooltip] = useState(false)\n const filterTooltipDetails = useMemo(() => {\n if (!activeFilters || activeFilters.length === 0) return []\n return activeFilters.map(f => {\n const maxDisplay = 5\n const displayValues = f.values.slice(0, maxDisplay)\n const remaining = f.values.length - maxDisplay\n return {\n column: f.column,\n values: displayValues,\n remaining: remaining > 0 ? remaining : 0,\n }\n })\n }, [activeFilters])\n\n // Drag handlers\n const handleDragOver = useCallback(\n (area: 'row' | 'column' | 'value', event: React.DragEvent) => {\n event.preventDefault()\n event.dataTransfer!.dropEffect = 'move'\n setDragOverArea(area)\n },\n []\n )\n\n const handleDragLeave = useCallback(() => {\n setDragOverArea(null)\n }, [])\n\n const handleDrop = useCallback(\n (area: 'row' | 'column' | 'value', event: React.DragEvent) => {\n event.preventDefault()\n const field = event.dataTransfer?.getData('text/plain')\n\n if (!field || field.startsWith('reorder:')) {\n setDragOverArea(null)\n return\n }\n\n if (rowFields.includes(field)) onRemoveRowField(field)\n if (columnFields.includes(field)) onRemoveColumnField(field)\n const existingValue = valueFields.find(v => v.field === field)\n if (existingValue) onRemoveValueField(field, existingValue.aggregation)\n\n switch (area) {\n case 'row':\n onAddRowField(field)\n break\n case 'column':\n onAddColumnField(field)\n break\n case 'value':\n onAddValueField(field, 'sum')\n break\n }\n setDragOverArea(null)\n },\n [rowFields, columnFields, valueFields, onAddRowField, onRemoveRowField, onAddColumnField, onRemoveColumnField, onAddValueField, onRemoveValueField]\n )\n\n // Reorder handlers for chips within zones\n const handleChipDragStart = useCallback(\n (zone: 'row' | 'column', index: number, event: React.DragEvent) => {\n setReorderDragSource({ zone, index })\n event.dataTransfer!.effectAllowed = 'move'\n event.dataTransfer!.setData('text/plain', `reorder:${zone}:${index}`)\n // Clear any zone drag-over state\n requestAnimationFrame(() => {\n setDragOverArea(null)\n })\n },\n []\n )\n\n const handleChipDragEnd = useCallback(() => {\n setReorderDragSource(null)\n setReorderDropTarget(null)\n }, [])\n\n const handleChipDragOver = useCallback(\n (zone: 'row' | 'column', index: number, event: React.DragEvent) => {\n event.preventDefault()\n // Only handle reorder within same zone\n if (reorderDragSource && reorderDragSource.zone === zone) {\n event.dataTransfer!.dropEffect = 'move'\n setReorderDropTarget({ zone, index })\n }\n },\n [reorderDragSource]\n )\n\n const handleChipDragLeave = useCallback(() => {\n setReorderDropTarget(null)\n }, [])\n\n const handleChipDrop = useCallback(\n (zone: 'row' | 'column', targetIndex: number, event: React.DragEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!reorderDragSource || reorderDragSource.zone !== zone) {\n return\n }\n\n const sourceIndex = reorderDragSource.index\n if (sourceIndex === targetIndex) {\n setReorderDragSource(null)\n setReorderDropTarget(null)\n return\n }\n\n // Create reordered array\n const fields = zone === 'row' ? [...rowFields] : [...columnFields]\n const [movedField] = fields.splice(sourceIndex, 1)\n fields.splice(targetIndex, 0, movedField)\n\n // Emit reorder event\n if (zone === 'row') {\n onReorderRowFields(fields)\n } else {\n onReorderColumnFields(fields)\n }\n\n setReorderDragSource(null)\n setReorderDropTarget(null)\n },\n [reorderDragSource, rowFields, columnFields, onReorderRowFields, onReorderColumnFields]\n )\n\n const isChipDragSource = useCallback(\n (zone: 'row' | 'column', index: number): boolean => {\n return reorderDragSource?.zone === zone && reorderDragSource?.index === index\n },\n [reorderDragSource]\n )\n\n const isChipDropTarget = useCallback(\n (zone: 'row' | 'column', index: number): boolean => {\n return reorderDropTarget?.zone === zone && reorderDropTarget?.index === index\n },\n [reorderDropTarget]\n )\n\n const currentFontSize = fontSize\n\n return (\n <div\n className={`vpg-pivot-skeleton vpg-font-${currentFontSize} ${draggingField ? 'vpg-is-dragging' : ''}`}\n >\n {/* Header Bar */}\n <div className=\"vpg-skeleton-header\">\n <div className=\"vpg-skeleton-title\">\n <svg className=\"vpg-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n <span>Pivot Table</span>\n </div>\n\n <div className=\"vpg-header-right\">\n {hasActiveFilters && (\n <div\n className=\"vpg-filter-indicator\"\n onMouseEnter={() => setShowFilterTooltip(true)}\n onMouseLeave={() => setShowFilterTooltip(false)}\n >\n <svg\n className=\"vpg-filter-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n <span className=\"vpg-filter-text\">\n Filtered: <strong>{filterSummary}</strong>\n {filteredRowCount !== undefined && totalRowCount !== undefined && (\n <span className=\"vpg-filter-count\">\n ({filteredRowCount.toLocaleString()} of {totalRowCount.toLocaleString()} rows)\n </span>\n )}\n </span>\n\n {/* Tooltip */}\n {showFilterTooltip && (\n <div className=\"vpg-filter-tooltip\">\n <div className=\"vpg-tooltip-header\">Active Filters</div>\n {filterTooltipDetails.map(filter => (\n <div key={filter.column} className=\"vpg-tooltip-filter\">\n <div className=\"vpg-tooltip-column\">{filter.column}</div>\n <div className=\"vpg-tooltip-values\">\n {filter.values.map((val, idx) => (\n <span key={idx} className=\"vpg-tooltip-value\">\n {val}\n </span>\n ))}\n {filter.remaining > 0 && (\n <span className=\"vpg-tooltip-more\">+{filter.remaining} more</span>\n )}\n </div>\n </div>\n ))}\n {filteredRowCount !== undefined && totalRowCount !== undefined && (\n <div className=\"vpg-tooltip-summary\">\n Showing {filteredRowCount.toLocaleString()} of {totalRowCount.toLocaleString()} rows\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {isConfigured && (\n <div className=\"vpg-config-summary\">\n <span className=\"vpg-summary-badge vpg-rows\">\n {rowFields.length} row{rowFields.length !== 1 ? 's' : ''}\n </span>\n <span className=\"vpg-summary-badge vpg-cols\">\n {columnFields.length} col{columnFields.length !== 1 ? 's' : ''}\n </span>\n <span className=\"vpg-summary-badge vpg-vals\">\n {valueFields.length} val{valueFields.length !== 1 ? 's' : ''}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* License Required Message */}\n {!canUsePivot ? (\n <div className=\"vpg-pro-required\">\n <div className=\"vpg-pro-content\">\n <svg className=\"vpg-pro-icon\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <h3>Pro Feature</h3>\n <p>Pivot Table functionality requires a Pro license.</p>\n <a href=\"https://tiny-pivot.com/#pricing\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"vpg-pro-link\">\n Get Pro License →\n </a>\n </div>\n </div>\n ) : (\n <>\n {/* Config Bar */}\n <div className=\"vpg-config-bar\">\n {/* Row drop zone */}\n <div\n className={`vpg-drop-zone vpg-row-zone ${dragOverArea === 'row' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('row', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('row', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-row-icon\">↓</span>\n <span className=\"vpg-zone-label\">Rows</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {rowFields.map((field, idx) => (\n <div\n key={field}\n className={`vpg-mini-chip vpg-row-chip ${isChipDragSource('row', idx) ? 'vpg-chip-dragging' : ''} ${isChipDropTarget('row', idx) ? 'vpg-chip-drop-target' : ''}`}\n draggable\n onDragStart={e => handleChipDragStart('row', idx, e)}\n onDragEnd={handleChipDragEnd}\n onDragOver={e => handleChipDragOver('row', idx, e)}\n onDragLeave={handleChipDragLeave}\n onDrop={e => handleChipDrop('row', idx, e)}\n >\n <span className=\"vpg-drag-handle\">⋮⋮</span>\n <span className=\"vpg-mini-name\">{field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={e => { e.stopPropagation(); onRemoveRowField(field) }}\n >\n ×\n </button>\n </div>\n ))}\n {rowFields.length === 0 && <span className=\"vpg-zone-hint\">Drop here</span>}\n </div>\n </div>\n\n {/* Column drop zone */}\n <div\n className={`vpg-drop-zone vpg-column-zone ${dragOverArea === 'column' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('column', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('column', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-column-icon\">→</span>\n <span className=\"vpg-zone-label\">Columns</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {columnFields.map((field, idx) => (\n <div\n key={field}\n className={`vpg-mini-chip vpg-column-chip ${isChipDragSource('column', idx) ? 'vpg-chip-dragging' : ''} ${isChipDropTarget('column', idx) ? 'vpg-chip-drop-target' : ''}`}\n draggable\n onDragStart={e => handleChipDragStart('column', idx, e)}\n onDragEnd={handleChipDragEnd}\n onDragOver={e => handleChipDragOver('column', idx, e)}\n onDragLeave={handleChipDragLeave}\n onDrop={e => handleChipDrop('column', idx, e)}\n >\n <span className=\"vpg-drag-handle\">⋮⋮</span>\n <span className=\"vpg-mini-name\">{field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={e => { e.stopPropagation(); onRemoveColumnField(field) }}\n >\n ×\n </button>\n </div>\n ))}\n {columnFields.length === 0 && <span className=\"vpg-zone-hint\">Drop here</span>}\n </div>\n </div>\n\n {/* Values drop zone */}\n <div\n className={`vpg-drop-zone vpg-value-zone ${dragOverArea === 'value' ? 'vpg-drag-over' : ''}`}\n onDragOver={e => handleDragOver('value', e)}\n onDragLeave={handleDragLeave}\n onDrop={e => handleDrop('value', e)}\n >\n <div className=\"vpg-zone-header\">\n <span className=\"vpg-zone-icon vpg-value-icon\">Σ</span>\n <span className=\"vpg-zone-label\">Values</span>\n </div>\n <div className=\"vpg-zone-chips\">\n {valueFields.map(vf => (\n <div\n key={`${vf.field}-${vf.aggregation}`}\n className=\"vpg-mini-chip vpg-value-chip\"\n >\n <span className=\"vpg-agg-symbol\">{getAggregationSymbol(vf.aggregation)}</span>\n <span className=\"vpg-mini-name\">{vf.field}</span>\n <button\n className=\"vpg-mini-remove\"\n onClick={() => onRemoveValueField(vf.field, vf.aggregation)}\n >\n ×\n </button>\n </div>\n ))}\n {valueFields.length === 0 && <span className=\"vpg-zone-hint\">Drop numeric</span>}\n </div>\n </div>\n </div>\n\n {/* Placeholder when not configured */}\n {(!isConfigured || !pivotResult) && (\n <div className=\"vpg-placeholder\">\n <div className=\"vpg-placeholder-content\">\n <svg\n className=\"vpg-placeholder-icon\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <span className=\"vpg-placeholder-text\">\n {valueFields.length === 0 ? (\n <>\n Add a <strong>Values</strong> field to see your pivot table\n </>\n ) : rowFields.length === 0 && columnFields.length === 0 ? (\n <>\n Add <strong>Row</strong> or <strong>Column</strong> fields to group your data\n </>\n ) : (\n 'Your pivot table will appear here'\n )}\n </span>\n </div>\n </div>\n )}\n\n {/* Data Table */}\n {isConfigured && pivotResult && (\n <div className=\"vpg-table-container\">\n <table className=\"vpg-pivot-table\">\n <thead>\n {columnHeaderCells.map((headerRow, levelIdx) => (\n <tr key={`header-${levelIdx}`} className=\"vpg-column-header-row\">\n {levelIdx === 0 && (\n <th\n className=\"vpg-row-header-label\"\n rowSpan={columnHeaderCells.length}\n onClick={() => toggleSort('row')}\n >\n <div className=\"vpg-header-content\">\n <span>{rowFields.join(' / ') || 'Rows'}</span>\n <span className={`vpg-sort-indicator ${sortTarget === 'row' ? 'active' : ''}`}>\n {sortTarget === 'row' ? (sortDirection === 'asc' ? '↑' : '↓') : '⇅'}\n </span>\n </div>\n </th>\n )}\n {headerRow.map((cell, idx) => (\n <th\n key={idx}\n className=\"vpg-column-header-cell\"\n colSpan={cell.colspan}\n onClick={() =>\n levelIdx === columnHeaderCells.length - 1 && toggleSort(idx)\n }\n >\n <div className=\"vpg-header-content\">\n <span>{cell.label}</span>\n {levelIdx === columnHeaderCells.length - 1 && (\n <span className={`vpg-sort-indicator ${sortTarget === idx ? 'active' : ''}`}>\n {sortTarget === idx\n ? sortDirection === 'asc'\n ? '↑'\n : '↓'\n : '⇅'}\n </span>\n )}\n </div>\n </th>\n ))}\n {pivotResult.rowTotals.length > 0 && levelIdx === 0 && (\n <th className=\"vpg-total-header\" rowSpan={columnHeaderCells.length}>\n Total\n </th>\n )}\n </tr>\n ))}\n </thead>\n\n <tbody>\n {sortedRowIndices.map(sortedIdx => (\n <tr key={sortedIdx} className=\"vpg-data-row\">\n <th className=\"vpg-row-header-cell\">\n {pivotResult.rowHeaders[sortedIdx].map((val, idx) => (\n <span key={idx} className=\"vpg-row-value\">\n {val}\n </span>\n ))}\n </th>\n\n {pivotResult.data[sortedIdx].map((cell, colIdx) => (\n <td\n key={colIdx}\n className={`vpg-data-cell ${cell.value === null ? 'vpg-is-null' : ''}`}\n >\n {cell.formattedValue}\n </td>\n ))}\n\n {pivotResult.rowTotals[sortedIdx] && (\n <td className=\"vpg-data-cell vpg-total-cell\">\n {pivotResult.rowTotals[sortedIdx].formattedValue}\n </td>\n )}\n </tr>\n ))}\n\n {pivotResult.columnTotals.length > 0 && (\n <tr className=\"vpg-totals-row\">\n <th className=\"vpg-row-header-cell vpg-total-label\">Total</th>\n {pivotResult.columnTotals.map((cell, colIdx) => (\n <td key={colIdx} className=\"vpg-data-cell vpg-total-cell\">\n {cell.formattedValue}\n </td>\n ))}\n {pivotResult.rowTotals.length > 0 && (\n <td className=\"vpg-data-cell vpg-grand-total-cell\">\n {pivotResult.grandTotal.formattedValue}\n </td>\n )}\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Footer */}\n {isConfigured && pivotResult && (\n <div className=\"vpg-skeleton-footer\">\n <span>\n {pivotResult.rowHeaders.length} rows × {pivotResult.data[0]?.length || 0} columns\n </span>\n </div>\n )}\n </>\n )}\n\n {/* Watermark / Demo Banner */}\n {showWatermark && canUsePivot && (\n <div className={`vpg-watermark ${isDemo ? 'vpg-demo-mode' : ''}`}>\n {isDemo ? (\n <>\n <span className=\"vpg-demo-badge\">DEMO</span>\n <span>Pro features unlocked for evaluation</span>\n <a\n href=\"https://tiny-pivot.com/#pricing\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"vpg-get-pro\"\n >\n Get Pro License →\n </a>\n </>\n ) : (\n <a href=\"https://tiny-pivot.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n Powered by TinyPivot\n </a>\n )}\n </div>\n )}\n </div>\n )\n}\n\n"],"mappings":"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","names":["import_react","import_react","import_tinypivot_core","import_react","import_tinypivot_core","coreConfigureLicenseSecret","coreIsPro","coreCanUsePivot","coreShouldShowWatermark","import_react","import_tinypivot_core","coreExportToCSV","coreExportPivotToCSV","coreCopyToClipboard","coreFormatSelection","import_react","import_react","import_tinypivot_core","import_jsx_runtime","import_react","import_tinypivot_core","import_jsx_runtime","import_jsx_runtime"]}
|