@smallwebco/tinypivot-react 1.0.14 → 1.0.15
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 +80 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +80 -31
- package/dist/index.js.map +1 -1
- package/dist/style.css +119 -3
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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 - 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\n */\nexport function enableDemoMode(): void {\n globalDemoMode = true\n globalLicenseInfo = getDemoLicenseInfo()\n console.info('[TinyPivot] Demo mode enabled - all Pro features unlocked for evaluation')\n notifyListeners()\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 // 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 className=\"vpg-filter-indicator\">\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 </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":["useState","useMemo","useCallback","useEffect","useRef","useState","useMemo","useEffect","useCallback","useState","useCallback","useMemo","useState","useMemo","useEffect","useCallback","useState","useMemo","useCallback","useState","useEffect","useCallback","useMemo","useState","useMemo","useCallback","jsx","jsxs","useState","useMemo","useCallback","useState","useMemo","useCallback","getAggregationLabel","getAggregationSymbol","jsx","jsxs","useState","useCallback","useMemo","getAggregationLabel","getAggregationSymbol","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../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 - 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":["useState","useMemo","useCallback","useEffect","useRef","useState","useMemo","useEffect","useCallback","useState","useCallback","useMemo","useState","useMemo","useEffect","useCallback","useState","useMemo","useCallback","useState","useEffect","useCallback","useMemo","useState","useMemo","useCallback","jsx","jsxs","useState","useMemo","useCallback","useState","useMemo","useCallback","getAggregationLabel","getAggregationSymbol","jsx","jsxs","useState","useCallback","useMemo","getAggregationLabel","getAggregationSymbol","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback"]}
|