exploreda 0.0.5 → 0.0.6
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/ExplorEda.cjs +521 -91
- package/dist/ExplorEda.cjs.map +1 -1
- package/dist/ExplorEda.css +86 -0
- package/dist/ExplorEda.css.map +1 -1
- package/dist/ExplorEda.d.cts +6 -5
- package/dist/ExplorEda.d.ts +6 -5
- package/dist/ExplorEda.js +519 -93
- package/dist/ExplorEda.js.map +1 -1
- package/package.json +4 -2
package/dist/ExplorEda.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/applyFilter.ts","../src/utils/defaultSettings.ts","../src/hooks/useColorScales.ts","../src/hooks/getAxisFilter.ts","../src/providers/FacetAxisProvider.tsx","../src/components/charts/Axis/Axis.tsx","../src/hooks/useBrush.tsx","../src/lib/utils.ts","../src/hooks/useFilterExtent.ts","../src/components/charts/BaseChart.tsx","../src/components/charts/useGetColumnData.tsx","../src/components/charts/useGetLiveData.tsx","../src/components/charts/BarChart/BarChart.tsx","../src/components/ui/button.tsx","../src/components/ui/dialog.tsx","../src/components/ui/command.tsx","../src/components/ui/popover.tsx","../src/components/ComboBox.tsx","../src/components/ui/label.tsx","../src/components/FieldSelector.tsx","../src/components/ui/slider.tsx","../src/components/ui/switch.tsx","../src/components/charts/BarChart/BarChartSettingsPanel.tsx","../src/components/charts/BarChart/definition.ts","../src/components/charts/ScatterPlot/ScatterPlotSettingsPanel.tsx","../src/components/charts/ScatterPlot/ScatterPlot.tsx","../src/components/charts/ScatterPlot/definition.ts","../src/components/charts/ThreeDScatter/ThreeDScatterAxes.tsx","../src/components/charts/ThreeDScatter/ThreeDScatterPoints.tsx","../src/components/charts/ThreeDScatter/useThreeDScatterData.ts","../src/components/charts/ThreeDScatter/ThreeDScatterChart.tsx","../src/components/ui/input.tsx","../src/components/NumericInputEnter.tsx","../src/components/charts/ThreeDScatter/ThreeDScatterSettingsPanel.tsx","../src/components/charts/ThreeDScatter/definition.ts","../src/components/charts/PivotTable/utils/calculations.ts","../src/components/charts/PivotTable/PivotTable.tsx","../src/components/ui/badge.tsx","../src/components/ui/multi-select.tsx","../src/components/charts/PivotTable/useColumnNames.tsx","../src/components/charts/PivotTable/PivotTableSettingsPanel.tsx","../src/components/charts/PivotTable/definition.ts","../src/components/ui/table.tsx","../src/types/FilterTypes.ts","../src/components/charts/DataTable/DataTableBody.tsx","../src/components/ui/select.tsx","../src/components/charts/DataTable/components/ColumnFilter.tsx","../src/components/charts/DataTable/DataTableHeader.tsx","../src/components/charts/DataTable/DataTablePagination.tsx","../src/components/charts/DataTable/DataTableToolbar.tsx","../src/components/charts/DataTable/DataTable.tsx","../src/components/charts/DataTable/DataTableSettingsPanel.tsx","../src/components/charts/DataTable/definition.ts","../src/components/ui/progress.tsx","../src/components/SummaryTable/utils/dataTypeDetection.ts","../src/components/SummaryTable/utils/samplingStrategy.ts","../src/components/SummaryTable/utils/statisticsCalculator.ts","../src/components/SummaryTable/components/DataTypeIcon.tsx","../src/components/ui/tooltip.tsx","../src/components/SummaryTable/components/StatBadge.tsx","../src/hooks/useCreateCharts.ts","../src/components/SummaryTable/components/ChartActions.tsx","../src/components/SummaryTable/components/CompactSummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTableSettingsPanel.tsx","../src/components/charts/SummaryTable/definition.ts","../src/components/ui/textarea.tsx","../src/components/charts/Markdown/Markdown.tsx","../src/components/charts/Markdown/definition.ts","../src/components/charts/BoxPlot/boxPlotCalculations.ts","../src/components/charts/BoxPlot/BoxPlot.tsx","../src/components/charts/BoxPlot/BoxPlotSettingsPanel.tsx","../src/components/charts/BoxPlot/BoxPlotIcon.tsx","../src/components/charts/BoxPlot/definition.ts","../src/components/ui/card.tsx","../src/components/ui/scroll-area.tsx","../src/components/charts/ColorLegend/getContrastTextColor.tsx","../src/components/charts/ColorLegend/ColorScale.tsx","../src/components/charts/ColorLegend/ColorLegendChart.tsx","../src/components/charts/ColorLegend/ColorLegendSettingsPanel.tsx","../src/components/charts/ColorLegend/definition.ts","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/constant.js","../../../node_modules/.pnpm/d3-path@3.1.0/node_modules/d3-path/src/path.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/path.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/array.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/point.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/line.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/step.js","../src/lib/chartUtils.ts","../src/components/charts/LineChart/LineChart.tsx","../src/components/charts/LineChart/LineSeriesSettings.tsx","../src/components/ui/tabs.tsx","../src/components/charts/LineChart/LineChartSettingsPanel.tsx","../src/components/charts/LineChart/definition.ts","../src/components/charts/RowChart/RowChart.tsx","../src/components/charts/RowChart/RowChartSettingsPanel.tsx","../src/components/charts/RowChart/definition.ts","../src/charts/registry.ts","../src/hooks/CrossfilterWrapper.ts","../src/lib/calculations/engine/Calculator.ts","../src/lib/calculations/CalculationState.ts","../src/utils/localStorage.ts","../src/providers/DataLayerProvider.tsx","../src/components/ColorScaleManager.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/plot/ChartCreationButtons.tsx","../src/utils/saveDataUtils.ts","../src/components/GridBackground.tsx","../src/components/ChartGridLayout.tsx","../src/components/charts/ChartRenderer.tsx","../src/components/charts/FacetRelated/FacetGridLayout.tsx","../src/components/charts/FacetRelated/FacetWrapLayout.tsx","../src/components/charts/FacetRelated/FacetContainer.tsx","../src/components/settings/AdvancedSettingsTab.tsx","../src/components/settings/AxisSettingsTab.tsx","../src/components/settings/FacetSettingsTab.tsx","../src/components/settings/LabelsSettingsTab.tsx","../src/components/settings/MainSettingsTab.tsx","../src/components/settings/TabContainer.tsx","../src/components/ChartSettingsContent.tsx","../src/stores/alertStore.ts","../src/components/PlotChartPanel.tsx","../src/lib/calculations/parser/semantics.ts","../src/components/calculations/CalculationForm.tsx","../src/components/calculations/CalculationPreview.tsx","../src/components/calculations/CalculationManager.tsx","../src/components/settings/GridSettingsPanel.tsx","../src/components/PlotManager.tsx","../src/components/ui/sonner.tsx","../src/components/ui/alert-dialog.tsx","../src/components/GlobalAlertDialog.tsx","../src/components/ExplorEda.tsx"],"names":["jsx","x","y","useRef","extent","useCallback","useMemo","jsxs","isNumeric","min","max","isEqual","useEffect","newFilters","CommandPrimitive","useState","CommandList","React","scaleLinear","Fragment","THREE","point","THREE3","THREE4","FilterIcon","cva","Slot","CommandEmpty","forwardRef","X","value","Table","e","PAGE_SIZE_OPTIONS","Icon","Hash","BarChart","ScatterChart","Table2","toast","Download","Y_SCALE_PADDING","result","scaleBand","path","LineChart","LineChartIcon","createStore","crossfilterWrapper","chart","columnData","createContext","useContext","useStore","interpolateViridis","interpolateInferno","interpolateMagma","interpolatePlasma","interpolateWarm","interpolateCool","schemeCategory10","schemeSet3","Palette","rows","columns","grid","DEFAULT_AXIS_SETTINGS","grammar","CalculationManager","Calculator","FilterX","Copy","Sonner"],"mappings":"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","file":"ExplorEda.js","sourcesContent":["import { datum, Filter } from \"@/types/FilterTypes\";\n\nexport function applyFilter(value: datum, filter: Filter): boolean {\n switch (filter.type) {\n case \"value\":\n return filter.values.includes(value as string | number);\n case \"range\":\n if (typeof value === \"number\") {\n return (\n (filter.min === undefined || value >= filter.min) &&\n (filter.max === undefined || value <= filter.max)\n );\n }\n break;\n case \"text\":\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n const search = filter.value.toLowerCase();\n\n switch (filter.operator) {\n case \"contains\":\n return lower.includes(search);\n case \"equals\":\n return lower === search;\n case \"startsWith\":\n return lower.startsWith(search);\n case \"endsWith\":\n return lower.endsWith(search);\n }\n }\n }\n\n return false;\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { ThreeDScatterSettings } from \"@/components/charts/ThreeDScatter/types\";\nimport {\n AxisSettings,\n BaseChartSettings,\n ChartSettings,\n DataTableSettings,\n MarginSettings,\n PivotTableSettings,\n RowChartSettings,\n ScatterChartSettings,\n SummaryChartSettings,\n WrapFacetSettings,\n} from \"@/types/ChartTypes\";\nimport { Vector3 } from \"three\";\nimport { Filter } from \"@/types/FilterTypes\";\n\nexport const DEFAULT_AXIS_SETTINGS: AxisSettings = {\n scaleType: \"linear\",\n grid: false,\n min: 0,\n max: 100,\n};\n\nexport const DEFAULT_MARGIN_SETTINGS: MarginSettings = {\n top: 20,\n right: 20,\n bottom: 20,\n left: 20,\n};\n\nexport const DEFAULT_FACET_SETTINGS: WrapFacetSettings = {\n enabled: false,\n type: \"wrap\",\n rowVariable: \"\",\n columnCount: 2,\n};\n\nexport const DEFAULT_CHART_SETTINGS: Omit<BaseChartSettings, \"id\"> = {\n title: \"\",\n type: \"row\",\n field: \"\",\n layout: { x: 0, y: 0, w: 12, h: 7 },\n xAxis: DEFAULT_AXIS_SETTINGS,\n yAxis: DEFAULT_AXIS_SETTINGS,\n margin: DEFAULT_MARGIN_SETTINGS,\n facet: DEFAULT_FACET_SETTINGS,\n colorScaleId: undefined,\n colorField: undefined,\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n filters: [] as Filter[],\n};\n\nexport const DEFAULT_PIVOT_SETTINGS: Omit<PivotTableSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"pivot\",\n rowFields: [],\n columnFields: [],\n valueFields: [],\n showTotals: { row: false, column: false, grand: false },\n};\n\nexport const DEFAULT_ROW_SETTINGS: Omit<RowChartSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"row\",\n minRowHeight: 30,\n maxRowHeight: 50,\n filters: [],\n};\n\nexport const DEFAULT_SCATTER_SETTINGS: Omit<ScatterChartSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"scatter\",\n xField: \"\",\n yField: \"\",\n filters: [],\n};\n\nexport const DEFAULT_3D_SCATTER_SETTINGS: Omit<ThreeDScatterSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"3d-scatter\",\n xField: \"\",\n yField: \"\",\n zField: \"\",\n colorField: undefined,\n sizeField: undefined,\n cameraPosition: new Vector3(10, 10, 10),\n cameraTarget: new Vector3(0, 0, 0),\n pointSize: 0.1,\n pointOpacity: 0.8,\n showGrid: true,\n showAxes: true,\n xAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n yAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n zAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n};\n\nexport const DEFAULT_SUMMARY_SETTINGS: Omit<SummaryChartSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"summary\",\n title: \"Data Summary\",\n layout: { x: 0, y: 0, w: 12, h: 8 },\n};\n\nexport const DEFAULT_DATA_TABLE_SETTINGS: Omit<DataTableSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"data-table\",\n columns: [],\n pageSize: 10,\n currentPage: 1,\n sortDirection: \"asc\",\n filters: [] as Filter[],\n globalSearch: \"\",\n tableHeight: 600,\n};\n\nexport function mergeWithDefaultSettings<T extends ChartSettings>(\n settings: T\n): T {\n const def = getChartDefinition(settings.type);\n const defaults = def.createDefaultSettings(settings.layout, settings.field);\n return {\n ...defaults,\n ...settings,\n xAxis: { ...DEFAULT_AXIS_SETTINGS, ...settings.xAxis },\n yAxis: { ...DEFAULT_AXIS_SETTINGS, ...settings.yAxis },\n margin: { ...DEFAULT_MARGIN_SETTINGS, ...settings.margin },\n facet: { ...DEFAULT_FACET_SETTINGS, ...settings.facet },\n } as T;\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport {\n CategoricalColorScale,\n ColorScaleType,\n NumericalColorScale,\n UseColorScalesReturn,\n} from \"@/types/ColorScaleTypes\";\nimport {\n interpolateCool,\n interpolateInferno,\n interpolateMagma,\n interpolatePlasma,\n interpolateViridis,\n interpolateWarm,\n schemeCategory10,\n schemeSet3,\n} from \"d3-scale-chromatic\";\nimport { scaleOrdinal, scaleSequential } from \"d3-scale\";\n\nimport { useCallback, useMemo } from \"react\";\n\nconst DEFAULT_NUMERICAL_PALETTES = [\n { name: \"Viridis\", interpolator: interpolateViridis },\n { name: \"Inferno\", interpolator: interpolateInferno },\n { name: \"Magma\", interpolator: interpolateMagma },\n { name: \"Plasma\", interpolator: interpolatePlasma },\n { name: \"Warm\", interpolator: interpolateWarm },\n { name: \"Cool\", interpolator: interpolateCool },\n];\n\nconst DEFAULT_CATEGORICAL_PALETTES = [\n { name: \"Category10\", colors: schemeCategory10 },\n { name: \"Set3\", colors: schemeSet3 },\n];\n\nexport function useColorScales(): UseColorScalesReturn {\n const colorScales = useDataLayer((state) => state.colorScales);\n const addColorScale = useDataLayer((state) => state.addColorScale);\n const removeColorScale = useDataLayer((state) => state.removeColorScale);\n const updateColorScale = useDataLayer((state) => state.updateColorScale);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n\n // Memoized d3 scale objects\n const d3Scales = useMemo(() => {\n const scales = new Map();\n\n colorScales.forEach((scale) => {\n if (scale.type === \"numerical\") {\n const numericalScale = scale as NumericalColorScale;\n const interpolator =\n DEFAULT_NUMERICAL_PALETTES.find(\n (p) => p.name === numericalScale.palette\n )?.interpolator || interpolateViridis;\n\n scales.set(\n scale.id,\n scaleSequential(interpolator).domain([\n numericalScale.min,\n numericalScale.max,\n ])\n );\n } else {\n const categoricalScale = scale as CategoricalColorScale;\n scales.set(\n scale.id,\n scaleOrdinal<string>()\n .domain(Array.from(categoricalScale.mapping.keys()))\n .range(categoricalScale.palette)\n );\n }\n });\n\n return scales;\n }, [colorScales]);\n\n const getColorForValue = useCallback(\n (\n scaleId: string | undefined,\n value: string | number,\n defaultColor: string = \"#000000\"\n ): string => {\n if (!scaleId) {\n return defaultColor;\n }\n\n const scale = colorScales.find((s) => s.id === scaleId);\n if (!scale) {\n // console.warn(`Color scale ${scaleId} not found`);\n return \"#000000\";\n }\n\n const d3Scale = d3Scales.get(scaleId);\n if (!d3Scale) {\n console.warn(`D3 scale for ${scaleId} not found`);\n return \"#000000\";\n }\n\n try {\n return d3Scale(value);\n } catch (error) {\n console.error(\"Error getting color for value\", {\n scaleId,\n value,\n error,\n });\n return \"#000000\";\n }\n },\n [colorScales, d3Scales]\n );\n\n const getScaleById = (id: string): ColorScaleType | undefined => {\n return colorScales.find((s) => s.id === id);\n };\n\n const createDefaultNumericalScale = (\n name: string,\n min: number,\n max: number\n ): ColorScaleType => {\n const scale: Omit<NumericalColorScale, \"id\"> = {\n name,\n type: \"numerical\",\n palette: \"Viridis\",\n min,\n max,\n };\n return addColorScale(scale);\n };\n\n const createDefaultCategoricalScale = (\n name: string,\n values: string[]\n ): ColorScaleType => {\n const defaultPalette = DEFAULT_CATEGORICAL_PALETTES[0].colors;\n const mapping = new Map<string, string>();\n values.forEach((value, i) => {\n mapping.set(value, defaultPalette[i % defaultPalette.length]);\n });\n\n const scale: Omit<CategoricalColorScale, \"id\"> = {\n name,\n type: \"categorical\",\n palette: Array.from(mapping.values()),\n mapping,\n };\n return addColorScale(scale);\n };\n\n const getD3Scale = (scaleId: string) => {\n return d3Scales.get(scaleId);\n };\n\n const getOrCreateScaleForField = (field: string, name?: string): string => {\n // First check if a scale already exists for this field\n const existingScale = colorScales.find((s) => s.name === (name ?? field));\n if (existingScale) {\n return existingScale.id;\n }\n\n // Get all values for the field\n const values = Object.values(getColumnData(field));\n\n // Filter out null and undefined\n const cleanValues = values.filter((v): v is string | number => v != null);\n\n // Check if values are numerical\n const isNumerical = cleanValues.every((v) => !isNaN(Number(v)));\n\n let newScale: ColorScaleType;\n if (isNumerical) {\n const numericValues = cleanValues.map(Number);\n const min = Math.min(...numericValues);\n const max = Math.max(...numericValues);\n newScale = createDefaultNumericalScale(name ?? field, min, max);\n } else {\n const uniqueValues = Array.from(new Set(cleanValues.map(String)));\n newScale = createDefaultCategoricalScale(name ?? field, uniqueValues);\n }\n\n return newScale.id;\n };\n\n return {\n addColorScale,\n removeColorScale,\n updateColorScale,\n getColorForValue,\n getScaleById,\n colorScales,\n createDefaultNumericalScale,\n createDefaultCategoricalScale,\n getD3Scale,\n getOrCreateScaleForField,\n };\n}\n","import { Filter, RangeFilter } from \"@/types/FilterTypes\";\n\nexport function getRangeFilterForField(\n filters: Filter[],\n field: string\n): RangeFilter | undefined {\n return filters.find(\n (f): f is RangeFilter => f.type === \"range\" && f.field === field\n );\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\";\nimport isEqual from \"react-fast-compare\";\nimport { createStore, useStore } from \"zustand\";\n\n// Numerical axis limits\ninterface NumericalAxisLimits {\n type: \"numerical\";\n min: number;\n max: number;\n}\n\n// Categorical axis limits\ninterface CategoricalAxisLimits {\n type: \"categorical\";\n categories: Set<string>;\n}\n\n// Union type for axis limits\ntype AxisLimits = NumericalAxisLimits | CategoricalAxisLimits;\n\ninterface FacetAxisState {\n axisLimits: {\n x: Record<string, AxisLimits>;\n y: Record<string, AxisLimits>;\n };\n registerAxisLimits: (\n chartId: string,\n axis: \"x\" | \"y\",\n limits: AxisLimits\n ) => void;\n getGlobalAxisLimits: (axis: \"x\" | \"y\") => AxisLimits | null;\n}\n\n// Create the Zustand store\nconst createFacetAxisStore = () => {\n return createStore<FacetAxisState>()((set, get) => ({\n axisLimits: { x: {}, y: {} },\n\n registerAxisLimits: (\n chartId: string,\n axis: \"x\" | \"y\",\n limits: AxisLimits\n ) => {\n const before = get().axisLimits[axis][chartId];\n const after = limits;\n\n if (before && after && isEqual(before, after)) {\n return;\n }\n\n // call new function to determine new limits\n const newLimits = determineNewLimits(before, after);\n\n requestAnimationFrame(() => {\n set((state) => ({\n axisLimits: {\n ...state.axisLimits,\n [axis]: {\n ...state.axisLimits[axis],\n [chartId]: newLimits,\n },\n },\n }));\n });\n },\n\n getGlobalAxisLimits: (axis: \"x\" | \"y\"): AxisLimits | null => {\n const limits = Object.values(get().axisLimits[axis]);\n if (limits.length === 0) {\n return null;\n }\n\n // Check if all limits are of the same type\n const firstLimitType = limits[0].type;\n const allSameType = limits.every(\n (limit) => limit.type === firstLimitType\n );\n\n if (!allSameType) {\n console.warn(\"Mixed axis types detected in facets. Using first type.\");\n }\n\n if (firstLimitType === \"numerical\") {\n // For numerical limits, find min and max across all charts\n const numericalLimits = limits.filter(\n (limit): limit is NumericalAxisLimits => limit.type === \"numerical\"\n );\n\n return {\n type: \"numerical\",\n min: Math.min(...numericalLimits.map((l) => l.min)),\n max: Math.max(...numericalLimits.map((l) => l.max)),\n };\n } else {\n // For categorical limits, create a union of all categories\n const categoricalLimits = limits.filter(\n (limit): limit is CategoricalAxisLimits =>\n limit.type === \"categorical\"\n );\n\n const allCategories = new Set<string>();\n categoricalLimits.forEach((limit) => {\n limit.categories.forEach((category) => {\n allCategories.add(category);\n });\n });\n\n return {\n type: \"categorical\",\n categories: allCategories,\n };\n }\n },\n }));\n};\n\n// Store type\ntype FacetAxisStore = ReturnType<typeof createFacetAxisStore>;\n\n// Create a context for the store\nconst FacetAxisContext = createContext<FacetAxisStore | null>(null);\n\n// Provider component\nexport function FacetAxisProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<FacetAxisStore | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = createFacetAxisStore();\n }\n\n return (\n <FacetAxisContext.Provider value={storeRef.current}>\n {children}\n </FacetAxisContext.Provider>\n );\n}\n\n// Hook to use the facet axis store\nexport function useFacetAxis<T>(selector: (state: FacetAxisState) => T): T {\n const store = useContext(FacetAxisContext);\n if (!store) {\n throw new Error(\"useFacetAxis must be used within a FacetAxisProvider\");\n }\n\n return useStore(store, selector);\n}\nfunction determineNewLimits(before: AxisLimits | undefined, after: AxisLimits) {\n // determine new limits by taking extremes\n // min of mins\n // max of maxes\n\n // if categorical, take union of categories\n if (!before) {\n return after;\n }\n\n if (before.type === \"numerical\" && after.type === \"numerical\") {\n return {\n type: \"numerical\",\n min: Math.min(before.min, after.min),\n max: Math.max(before.max, after.max),\n };\n }\n\n if (before.type === \"categorical\" && after.type === \"categorical\") {\n return {\n type: \"categorical\",\n categories: new Set([...before.categories, ...after.categories]),\n };\n }\n\n if (before.type === \"numerical\" && after.type === \"categorical\") {\n return {\n type: \"categorical\",\n categories: new Set([...after.categories]),\n };\n }\n\n if (before.type === \"categorical\" && after.type === \"numerical\") {\n return {\n type: \"categorical\",\n categories: new Set([...before.categories]),\n };\n }\n\n throw new Error(\"Invalid axis limits\");\n}\n","import { ScaleBand, ScaleLinear } from \"d3-scale\";\n\ntype Scale = ScaleLinear<number, number> | ScaleBand<string>;\n\ninterface AxisProps {\n scale: Scale;\n transform: string;\n className?: string;\n tickCount?: number;\n showGridLines?: boolean;\n axisLabel?: string;\n}\n\nexport function XAxis({\n scale,\n transform,\n tickCount = 5,\n showGridLines = false,\n axisLabel,\n}: AxisProps) {\n // Helper function to get ticks\n const getTicks = () => {\n if (\"ticks\" in scale) {\n // For linear scales\n return scale.ticks(tickCount);\n } else {\n // For band scales\n return scale.domain();\n }\n };\n\n const ticks = getTicks();\n const range = scale.range();\n const axisLength = range[1] - range[0];\n\n return (\n <g transform={transform} className=\"text-sm fill-foreground\">\n {/* Main axis line */}\n <line\n x1={range[0]}\n x2={range[1]}\n y1={0}\n y2={0}\n className=\"stroke-border\"\n />\n\n {/* Ticks and labels */}\n {ticks.map((tick, i) => {\n const x =\n \"bandwidth\" in scale\n ? scale(tick as string)! + scale.bandwidth() / 2\n : scale(tick as number);\n\n return (\n <g key={i} transform={`translate(${x}, 0)`}>\n {/* Tick line */}\n <line x1={0} x2={0} y1={0} y2={6} className=\"stroke-border\" />\n {/* Grid line */}\n {showGridLines && (\n <line\n x1={0}\n x2={0}\n y1={0}\n y2={-axisLength}\n className=\"stroke-border/20 stroke-dasharray-2\"\n />\n )}\n {/* Label */}\n <text\n x={0}\n y={20}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-xs\"\n >\n {tick}\n </text>\n </g>\n );\n })}\n\n {/* Axis label */}\n {axisLabel && (\n <text\n x={range[0] + axisLength / 2}\n y={30}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-sm font-medium\"\n >\n {axisLabel}\n </text>\n )}\n </g>\n );\n}\n\nexport function YAxis({\n scale,\n transform,\n tickCount = 5,\n showGridLines = false,\n axisLabel,\n}: AxisProps) {\n // Helper function to get ticks\n const getTicks = () => {\n if (\"ticks\" in scale) {\n // For linear scales\n return scale.ticks(tickCount);\n } else {\n // For band scales\n return scale.domain();\n }\n };\n\n const ticks = getTicks();\n const range = scale.range();\n const axisLength = range[0] - range[1];\n\n return (\n <g transform={transform} className=\"text-sm fill-foreground\">\n {/* Main axis line */}\n <line\n x1={0}\n x2={0}\n y1={range[1]}\n y2={range[0]}\n className=\"stroke-border\"\n />\n\n {/* Ticks and labels */}\n {ticks.map((tick, i) => {\n const y =\n \"bandwidth\" in scale\n ? scale(tick as string)! + scale.bandwidth() / 2\n : scale(tick as number);\n\n return (\n <g key={i} transform={`translate(0, ${y})`}>\n {/* Tick line */}\n <line x1={0} x2={-6} y1={0} y2={0} className=\"stroke-border\" />\n {/* Grid line */}\n {showGridLines && (\n <line\n x1={0}\n x2={axisLength}\n y1={0}\n y2={0}\n className=\"stroke-border/20 stroke-dasharray-2\"\n />\n )}\n {/* Label */}\n <text\n x={-12}\n y={0}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-xs\"\n >\n {tick}\n </text>\n </g>\n );\n })}\n\n {/* Axis label */}\n {axisLabel && (\n <text\n x={-(range[1] + (range[0] - range[1]) / 2)}\n y={0}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n className=\"fill-muted-foreground text-sm font-medium\"\n >\n {axisLabel}\n </text>\n )}\n </g>\n );\n}\n","import {\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { usePrevious } from \"react-use\";\ninterface Point {\n x: number;\n y: number;\n}\n\ntype BrushState =\n | { state: \"idle\" }\n | {\n state: \"dragging\";\n start: Point;\n current: Point;\n }\n | {\n state: \"moving\";\n start: Point;\n brushStart: Point;\n brushEnd: Point;\n }\n | {\n state: \"resizing\";\n edge:\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\";\n start: Point;\n brushStart: Point;\n brushEnd: Point;\n }\n | {\n state: \"brushed\";\n brushStart: Point;\n brushEnd: Point;\n };\n\ninterface BrushOptions {\n svgRef: RefObject<SVGSVGElement | null>;\n marginLeft: number;\n marginTop: number;\n innerWidth: number;\n innerHeight: number;\n mode: \"horizontal\" | \"2d\" | \"none\";\n onBrushChange?: (extent: [[number, number], [number, number]] | null) => void;\n defaultExtent?: [[number, number], [number, number]] | null;\n}\n\ninterface BrushRenderProps {\n x: number;\n y: number;\n width: number;\n height: number;\n state: BrushState[\"state\"];\n}\n\nconst BRUSH_EDGE_THRESHOLD_PX = 5;\n\nexport function useBrush({\n svgRef,\n marginLeft,\n marginTop,\n innerWidth,\n innerHeight,\n mode,\n onBrushChange,\n defaultExtent,\n}: BrushOptions) {\n const [brushState, setBrushState] = useState<BrushState>(() => {\n if (defaultExtent) {\n return {\n state: \"brushed\",\n brushStart: { x: defaultExtent[0][0], y: defaultExtent[0][1] },\n brushEnd: { x: defaultExtent[1][0], y: defaultExtent[1][1] },\n };\n }\n return { state: \"idle\" };\n });\n\n // Track the last external update to prevent infinite loops\n const lastExternalUpdateRef = useRef<string | null>(null);\n\n // Update brush state when defaultExtent changes\n useEffect(() => {\n if (!defaultExtent) {\n if (brushState.state !== \"idle\") {\n setBrushState({ state: \"idle\" });\n }\n return;\n }\n\n // Round coordinates to prevent floating point issues\n const roundedExtent: [[number, number], [number, number]] = [\n [\n Math.round(defaultExtent[0][0] * 10000) / 10000,\n Math.round(defaultExtent[0][1] * 10000) / 10000,\n ],\n [\n Math.round(defaultExtent[1][0] * 10000) / 10000,\n Math.round(defaultExtent[1][1] * 10000) / 10000,\n ],\n ];\n\n const newExtentKey = JSON.stringify(roundedExtent);\n if (newExtentKey === lastExternalUpdateRef.current) {\n return; // Skip if this update was triggered by our own brush change\n }\n\n setBrushState({\n state: \"brushed\",\n brushStart: { x: roundedExtent[0][0], y: roundedExtent[0][1] },\n brushEnd: { x: roundedExtent[1][0], y: roundedExtent[1][1] },\n });\n }, [defaultExtent]);\n\n // Call onBrushChange when brush state changes\n\n useEffect(() => {\n if (!onBrushChange) {\n return;\n }\n\n if (brushState.state === \"brushed\") {\n // Round coordinates to prevent floating point issues\n const extent: [[number, number], [number, number]] = [\n [\n Math.round(brushState.brushStart.x * 10000) / 10000,\n Math.round(brushState.brushStart.y * 10000) / 10000,\n ],\n [\n Math.round(brushState.brushEnd.x * 10000) / 10000,\n Math.round(brushState.brushEnd.y * 10000) / 10000,\n ],\n ];\n const extentKey = JSON.stringify(extent);\n\n if (extentKey === lastExternalUpdateRef.current) {\n // prevent infinite loop\n return;\n }\n\n lastExternalUpdateRef.current = extentKey;\n onBrushChange(extent);\n } else if (brushState.state === \"idle\") {\n if (lastExternalUpdateRef.current == null) {\n // prevent infinite loop on non-change\n return;\n }\n lastExternalUpdateRef.current = null;\n onBrushChange(null);\n }\n }, [brushState, onBrushChange, brushState?.state]);\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (mode === \"none\") {\n return;\n }\n e.stopPropagation();\n\n if (!svgRef.current) {\n return;\n }\n\n const rect = svgRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left - marginLeft;\n const y = e.clientY - rect.top - marginTop;\n\n // Check if we're clicking near the brush edges or in the middle\n if (brushState.state === \"idle\") {\n setBrushState({\n state: \"dragging\",\n start: { x, y },\n current: { x, y },\n });\n return;\n }\n\n if (brushState.state === \"brushed\") {\n const brushStart = brushState.brushStart;\n const brushEnd = brushState.brushEnd;\n\n // First check corners (only in 2D mode)\n if (mode === \"2d\") {\n const nearTopLeft =\n Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearTopRight =\n Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearBottomLeft =\n Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearBottomRight =\n Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX;\n\n if (nearTopLeft) {\n setBrushState({\n state: \"resizing\",\n edge: \"topLeft\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearTopRight) {\n setBrushState({\n state: \"resizing\",\n edge: \"topRight\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearBottomLeft) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottomLeft\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearBottomRight) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottomRight\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n }\n }\n\n // Then check edges as before\n if (Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX) {\n setBrushState({\n state: \"resizing\",\n edge: \"left\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX) {\n setBrushState({\n state: \"resizing\",\n edge: \"right\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX &&\n mode === \"2d\"\n ) {\n setBrushState({\n state: \"resizing\",\n edge: \"top\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX &&\n mode === \"2d\"\n ) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottom\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n x >= brushStart.x &&\n x <= brushEnd.x &&\n (mode === \"horizontal\" || (y >= brushStart.y && y <= brushEnd.y))\n ) {\n setBrushState({\n state: \"moving\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else {\n setBrushState({ state: \"idle\" });\n }\n }\n },\n [brushState, marginLeft, marginTop, mode, svgRef]\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (mode === \"none\") {\n return;\n }\n if (brushState.state === \"idle\" || brushState.state === \"brushed\") {\n return;\n }\n\n if (!svgRef.current) {\n return;\n }\n\n const rect = svgRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left - marginLeft;\n const y = e.clientY - rect.top - marginTop;\n const clampedX = Math.max(0, Math.min(x, innerWidth));\n const clampedY = Math.max(0, Math.min(y, innerHeight));\n\n switch (brushState.state) {\n case \"dragging\":\n setBrushState({\n ...brushState,\n current: {\n x: clampedX,\n y: mode === \"2d\" ? clampedY : innerHeight,\n },\n });\n break;\n case \"moving\": {\n const brushWidth = brushState.brushEnd.x - brushState.brushStart.x;\n const brushHeight = brushState.brushEnd.y - brushState.brushStart.y;\n const deltaX = clampedX - brushState.start.x;\n const deltaY = mode === \"2d\" ? clampedY - brushState.start.y : 0;\n\n const newStartX = Math.max(\n 0,\n Math.min(brushState.brushStart.x + deltaX, innerWidth - brushWidth)\n );\n const newStartY = Math.max(\n 0,\n Math.min(\n brushState.brushStart.y + deltaY,\n innerHeight - brushHeight\n )\n );\n\n setBrushState({\n state: \"moving\",\n start: { x: clampedX, y: clampedY },\n brushStart: {\n x: newStartX,\n y: mode === \"2d\" ? newStartY : 0,\n },\n brushEnd: {\n x: newStartX + brushWidth,\n y: mode === \"2d\" ? newStartY + brushHeight : innerHeight,\n },\n });\n break;\n }\n case \"resizing\":\n if (brushState.edge === \"left\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: clampedX,\n y: brushState.brushStart.y,\n },\n });\n } else if (brushState.edge === \"right\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: clampedX, y: brushState.brushEnd.y },\n });\n } else if (brushState.edge === \"top\" && mode === \"2d\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: brushState.brushStart.x,\n y: clampedY,\n },\n });\n } else if (brushState.edge === \"bottom\" && mode === \"2d\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: brushState.brushEnd.x, y: clampedY },\n });\n } else if (mode === \"2d\") {\n // Handle corner resizing\n if (brushState.edge === \"topLeft\") {\n setBrushState({\n ...brushState,\n brushStart: { x: clampedX, y: clampedY },\n });\n } else if (brushState.edge === \"topRight\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: brushState.brushStart.x,\n y: clampedY,\n },\n brushEnd: {\n x: clampedX,\n y: brushState.brushEnd.y,\n },\n });\n } else if (brushState.edge === \"bottomLeft\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: clampedX,\n y: brushState.brushStart.y,\n },\n brushEnd: {\n x: brushState.brushEnd.x,\n y: clampedY,\n },\n });\n } else if (brushState.edge === \"bottomRight\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: clampedX, y: clampedY },\n });\n }\n }\n break;\n }\n },\n [brushState, innerWidth, innerHeight, marginLeft, marginTop, mode, svgRef]\n );\n\n const handleMouseUp = useCallback(() => {\n if (mode === \"none\") {\n return;\n }\n if (brushState.state === \"dragging\") {\n const width = Math.abs(brushState.current.x - brushState.start.x);\n const height = Math.abs(brushState.current.y - brushState.start.y);\n\n if (width < 5 || (mode === \"2d\" && height < 5)) {\n setBrushState({\n state: \"idle\",\n });\n } else {\n const brushStartX = Math.min(brushState.start.x, brushState.current.x);\n const brushEndX = Math.max(brushState.start.x, brushState.current.x);\n const brushStartY =\n mode === \"2d\"\n ? Math.min(brushState.start.y, brushState.current.y)\n : 0;\n const brushEndY =\n mode === \"2d\"\n ? Math.max(brushState.start.y, brushState.current.y)\n : innerHeight;\n\n setBrushState({\n state: \"brushed\",\n brushStart: { x: brushStartX, y: brushStartY },\n brushEnd: { x: brushEndX, y: brushEndY },\n });\n }\n } else if (\n brushState.state === \"moving\" ||\n brushState.state === \"resizing\"\n ) {\n const start = brushState.brushStart;\n const end = brushState.brushEnd;\n\n setBrushState({\n state: \"brushed\",\n brushStart: {\n x: Math.min(start.x, end.x),\n y: Math.min(start.y, end.y),\n },\n brushEnd: {\n x: Math.max(start.x, end.x),\n y: Math.max(start.y, end.y),\n },\n });\n }\n }, [brushState, mode, innerHeight]);\n\n const getBrushRenderProps = useCallback((): BrushRenderProps | null => {\n if (brushState.state === \"idle\") {\n return null;\n }\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (brushState.state === \"dragging\") {\n x = Math.min(brushState.start.x, brushState.current.x);\n y =\n mode === \"2d\" ? Math.min(brushState.start.y, brushState.current.y) : 0;\n width = Math.abs(brushState.current.x - brushState.start.x);\n height =\n mode === \"2d\"\n ? Math.abs(brushState.current.y - brushState.start.y)\n : innerHeight;\n } else if (brushState.state === \"moving\") {\n x = brushState.brushStart.x;\n y = brushState.brushStart.y;\n width = Math.abs(brushState.brushEnd.x - brushState.brushStart.x);\n height = Math.abs(brushState.brushEnd.y - brushState.brushStart.y);\n } else if (brushState.state === \"resizing\") {\n x = Math.min(brushState.brushStart.x, brushState.brushEnd.x);\n y = Math.min(brushState.brushStart.y, brushState.brushEnd.y);\n width = Math.abs(brushState.brushEnd.x - brushState.brushStart.x);\n height = Math.abs(brushState.brushEnd.y - brushState.brushStart.y);\n } else if (brushState.state === \"brushed\") {\n x = brushState.brushStart.x;\n y = brushState.brushStart.y;\n width = brushState.brushEnd.x - brushState.brushStart.x;\n height = brushState.brushEnd.y - brushState.brushStart.y;\n } else {\n return null;\n }\n\n return {\n x,\n y,\n width,\n height,\n state: brushState.state,\n };\n }, [brushState, mode, innerHeight]);\n\n const getCursor = useCallback(() => {\n if (mode === \"none\") {\n return \"default\";\n }\n if (brushState.state === \"idle\") {\n return \"default\";\n }\n if (brushState.state === \"moving\") {\n return \"move\";\n }\n if (brushState.state === \"resizing\") {\n if (mode === \"2d\") {\n switch (brushState.edge) {\n case \"left\":\n case \"right\":\n return \"ew-resize\";\n case \"top\":\n case \"bottom\":\n return \"ns-resize\";\n case \"topLeft\":\n case \"bottomRight\":\n return \"nwse-resize\";\n case \"topRight\":\n case \"bottomLeft\":\n return \"nesw-resize\";\n }\n }\n return \"ew-resize\";\n }\n return undefined;\n }, [mode, brushState]);\n\n const brushProps = getBrushRenderProps();\n\n const renderBrush = useMemo(() => {\n if (mode === \"none\" || brushState.state === \"idle\") {\n return null;\n }\n if (!brushProps) {\n return null;\n }\n\n const { x, y, width, height, state } = brushProps;\n\n if (width < 1 || height < 1) {\n return null;\n }\n\n return (\n <>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill=\"rgba(255, 0, 0, 0.2)\"\n stroke=\"rgba(255, 0, 0, 0.8)\"\n strokeWidth={1}\n style={{ cursor: \"move\" }}\n />\n\n {state === \"brushed\" && (\n <>\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={height}\n fill=\"transparent\"\n style={{ cursor: \"ew-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={height}\n fill=\"transparent\"\n style={{ cursor: \"ew-resize\" }}\n />\n {mode === \"2d\" && (\n <>\n <rect\n x={x}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={width}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"ns-resize\" }}\n />\n <rect\n x={x}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={width}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"ns-resize\" }}\n />\n {/* Corner handles */}\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nwse-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nesw-resize\" }}\n />\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nesw-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nwse-resize\" }}\n />\n </>\n )}\n </>\n )}\n </>\n );\n }, [brushProps, brushState.state, mode]);\n\n return {\n brushState,\n handleMouseDown,\n handleMouseMove,\n handleMouseUp,\n getCursor,\n renderBrush,\n };\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { ScaleLinear } from \"d3-scale\";\nimport { useCallback, useMemo } from \"react\";\nimport { getRangeFilterForField } from \"./getAxisFilter\";\nimport { RangeFilter } from \"@/types/FilterTypes\";\n\ninterface UseFilterExtentProps {\n settings: ChartSettings;\n xScale: ScaleLinear<number, number>;\n yScale: ScaleLinear<number, number>;\n innerHeight: number;\n}\n\nexport function useFilterExtent({\n settings,\n xScale,\n yScale,\n innerHeight,\n}: UseFilterExtentProps) {\n const convertFilterRangeToExtent = useCallback(\n (filter: RangeFilter, scale: ScaleLinear<number, number>) => {\n if (!filter || filter.min === undefined || filter.max === undefined) {\n return null;\n }\n\n // Round to 4 decimal places to avoid floating point issues\n const min = Math.round(scale(filter.min) * 10000) / 10000;\n const max = Math.round(scale(filter.max) * 10000) / 10000;\n\n return [min, max] as [number, number];\n },\n []\n );\n\n const extent = useMemo(() => {\n switch (settings.type) {\n case \"scatter\": {\n const xFilter = getRangeFilterForField(\n settings.filters,\n settings.xField\n );\n const yFilter = getRangeFilterForField(\n settings.filters,\n settings.yField\n );\n\n if (!xFilter || !yFilter) {\n return null;\n }\n\n const xExtent = convertFilterRangeToExtent(xFilter, xScale);\n const yExtent = convertFilterRangeToExtent(yFilter, yScale);\n\n if (!xExtent || !yExtent) {\n return null;\n }\n\n return [\n [xExtent[0], yExtent[1]],\n [xExtent[1], yExtent[0]],\n ] as [[number, number], [number, number]];\n }\n\n case \"bar\": {\n if (\"bandwidth\" in xScale) {\n return null;\n }\n\n const rangeFilter = getRangeFilterForField(\n settings.filters,\n settings.field\n );\n if (!rangeFilter) {\n return null;\n }\n\n const xExtent = convertFilterRangeToExtent(rangeFilter, xScale);\n\n if (!xExtent) {\n return null;\n }\n\n return [\n [xExtent[0], 0],\n [xExtent[1], innerHeight],\n ] as [[number, number], [number, number]];\n }\n\n case \"row\":\n return null;\n }\n }, [settings, xScale, yScale, innerHeight, convertFilterRangeToExtent]);\n\n return extent;\n}\n","import { ReactNode, useRef } from \"react\";\nimport { ScaleBand, ScaleLinear } from \"d3-scale\";\nimport { XAxis, YAxis } from \"./Axis/Axis\";\nimport { useBrush } from \"@/hooks/useBrush\";\nimport { cn } from \"@/lib/utils\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { useFilterExtent } from \"@/hooks/useFilterExtent\";\n\ninterface Margin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\ntype BrushMode = \"horizontal\" | \"2d\" | \"none\";\n\ninterface BaseChartProps {\n width: number;\n height: number;\n margin?: Margin;\n xScale: ScaleLinear<number, number> | ScaleBand<string>;\n yScale: ScaleLinear<number, number> | ScaleBand<string>;\n brushingMode?: BrushMode;\n onBrushChange?: (extent: [[number, number], [number, number]] | null) => void;\n children: ReactNode;\n className?: string;\n settings: ChartSettings;\n}\n\nconst defaultMargin: Margin = { top: 20, right: 20, bottom: 30, left: 60 };\n\nexport function BaseChart({\n width,\n height,\n margin = defaultMargin,\n xScale,\n yScale,\n brushingMode = \"none\",\n onBrushChange,\n children,\n className,\n settings,\n}: BaseChartProps) {\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n const svgRef = useRef<SVGSVGElement>(null);\n\n const extent = useFilterExtent({\n settings,\n xScale,\n yScale,\n innerHeight,\n });\n\n const brush = useBrush({\n svgRef,\n marginLeft: margin.left,\n marginTop: margin.top,\n innerWidth,\n innerHeight,\n mode: brushingMode as \"horizontal\" | \"2d\" | \"none\",\n onBrushChange,\n defaultExtent: extent,\n });\n\n if (width < 1 || height < 1) {\n return null;\n }\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn(\"select-none\", className)}\n style={{ cursor: brush.getCursor() }}\n onMouseDownCapture={brush.handleMouseDown}\n onMouseMoveCapture={brush.handleMouseMove}\n onMouseUpCapture={brush.handleMouseUp}\n onMouseLeave={brush.handleMouseUp}\n >\n <g transform={`translate(${margin.left},${margin.top})`}>\n {/* Main content */}\n {children}\n\n {/* Brush overlay */}\n {brush.renderBrush}\n\n {/* Axes */}\n <XAxis\n scale={xScale}\n transform={`translate(0,${innerHeight})`}\n axisLabel={settings.xAxisLabel}\n />\n <YAxis\n scale={yScale}\n transform=\"translate(0,0)\"\n axisLabel={settings.yAxisLabel}\n />\n </g>\n </svg>\n );\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\n\nexport function useGetColumnData(field: string | undefined) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n return getColumnData(field);\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, field, getColumnData]);\n}\n\nexport function useGetColumnDataForIds(\n field: string | undefined,\n ids?: IdType[]\n) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n const data = getColumnData(field);\n\n if (!ids) {\n return Object.values(data);\n }\n\n return ids.map((id) => data[id]);\n\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, field, getColumnData, ids]);\n}\n\nexport function useGetColumnDataForMultipleIds(\n fields: string[] | undefined,\n ids?: IdType[]\n) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n if (!fields) {\n return {};\n }\n\n const result: Record<string, any[]> = {};\n\n for (const field of fields) {\n const data = getColumnData(field);\n\n if (!ids) {\n result[field] = Object.values(data);\n } else {\n result[field] = ids.map((id) => data[id]);\n }\n }\n\n return result;\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, fields, getColumnData, ids]);\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { useGetColumnDataForIds } from \"./useGetColumnData\";\n\nexport function useGetLiveData(\n settings: ChartSettings,\n field: string | undefined,\n facetIds?: IdType[]\n) {\n const getLiveItems = useDataLayer((s) => s.getLiveItems);\n\n // WARNING: this must live outside the hook below\n // need to see new items on every render\n const liveItems = getLiveItems(settings);\n\n const liveIdsPerFacet = useMemo(() => {\n if (!liveItems) {\n return [];\n }\n\n const facetIdSet = new Set(facetIds);\n\n const liveIds = liveItems.items\n .filter((c) => c.value > 0)\n .filter((c) =>\n facetIds && facetIds.length > 0 ? facetIdSet.has(c.key) : true\n )\n .map((d) => d.key);\n\n return liveIds;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [facetIds, liveItems?.nonce]);\n\n const data = useGetColumnDataForIds(field, liveIdsPerFacet);\n\n if (!field) {\n return [];\n }\n\n return data;\n}\n\nexport function useGetLiveIds(settings: ChartSettings) {\n const getLiveItems = useDataLayer((s) => s.getLiveItems);\n const nonce = useDataLayer((s) => s.nonce);\n\n const liveItems = getLiveItems(settings);\n\n // useMemo against the nonce\n return useMemo(() => {\n if (!liveItems) {\n return [];\n }\n\n return liveItems.items.filter((c) => c.value > 0).map((d) => d.key);\n\n // need the nonce to trigger a re-render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, liveItems?.items]);\n}\n\nexport function useGetAllIds() {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n\n const allIds = useMemo(() => {\n const data = getColumnData(\"__ID\") as Record<IdType, datum>;\n return Object.values(data) as IdType[];\n }, [getColumnData]);\n\n return allIds;\n}\n","import { useColorScales } from \"@/hooks/useColorScales\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand, ScaleBand, scaleLinear, ScaleLinear } from \"d3-scale\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport isEqual from \"react-fast-compare\";\nimport { useCustomCompareMemo } from \"use-custom-compare\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { BarChartSettings } from \"./definition\";\n\nconst X_SCALE_PADDING = 0.05; // 5% padding on each side\nconst Y_SCALE_PADDING = 0.1; // 10% padding for top of bars\n\ntype NumericBin = {\n label: string;\n start: number;\n end: number;\n value: number;\n isNumeric: true;\n};\n\ntype CategoryBin = {\n label: string;\n value: number;\n isNumeric: false;\n};\n\ntype BarChartProps = BaseChartProps<BarChartSettings>;\n\nexport function BarChart({ settings, width, height, facetIds }: BarChartProps) {\n // Get all data for axis limits calculation (not filtered by current selections)\n const allColData = useGetColumnDataForIds(settings.field);\n // Get filtered data for rendering\n const liveColData = useGetLiveData(settings, settings.field, facetIds);\n\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Chart dimensions\n const margin = { top: 20, right: 20, bottom: 30, left: 60 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n const isNumeric = useMemo(\n () => allColData.every((d) => !isNaN(Number(d))),\n [allColData]\n );\n\n // Calculate chart data from live (filtered) data for rendering\n const chartData = useMemo(() => {\n if (isNumeric) {\n const numericData = liveColData.map(Number);\n const allNumericData = allColData.map(Number);\n\n // Create bins using full data range\n const binCount = settings.binCount || 10;\n const min = Math.min(...allNumericData);\n const max = Math.max(...allNumericData);\n const binWidth = (max - min) / binCount;\n\n const bins = Array.from({ length: binCount }, (_, i) => {\n const start = min + i * binWidth;\n const end = start + binWidth;\n const value = numericData.filter((d) => d >= start && d < end).length;\n return { start, end, value, isNumeric: true } as NumericBin;\n });\n\n return bins;\n } else {\n // Handle categorical data using all possible categories\n const uniqueCats = new Set(allColData.map(String));\n const countMap = new Map<string, number>();\n\n // Initialize all categories with 0\n uniqueCats.forEach((cat) => countMap.set(cat, 0));\n\n // Count occurrences from live data\n liveColData.forEach((value) => {\n const key = String(value);\n countMap.set(key, (countMap.get(key) || 0) + 1);\n });\n\n return Array.from(countMap.entries()).map(\n ([label, value]) =>\n ({\n label,\n value,\n isNumeric: false,\n }) as CategoryBin\n );\n }\n }, [liveColData, allColData, isNumeric, settings.binCount]);\n\n // Calculate min/max from ALL data for axis limits\n const { min, max, uniqueValues } = useMemo(() => {\n if (isNumeric) {\n const numericData = allColData.map(Number);\n const binCount = settings.binCount || 10;\n const dataMin = Math.min(...numericData);\n const dataMax = Math.max(...numericData);\n const binWidth = (dataMax - dataMin) / binCount;\n\n return {\n min: dataMin,\n max: dataMax + binWidth, // Add one bin width to include the last bin's end\n uniqueValues: undefined,\n };\n }\n\n return {\n min: undefined,\n max: undefined,\n uniqueValues: Array.from(new Set(allColData.map(String))),\n };\n }, [allColData, isNumeric, settings.binCount]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales with synchronized limits if in a facet\n const xScale = useCustomCompareMemo(\n () => {\n if (min !== undefined && max !== undefined) {\n // Numerical x-axis\n const globalMin =\n globalXLimits?.type === \"numerical\" ? globalXLimits.min : min;\n const globalMax =\n globalXLimits?.type === \"numerical\" ? globalXLimits.max : max;\n\n // Only pad if using local limits\n const range = max - min;\n const padding = range * X_SCALE_PADDING;\n const minToUse = globalXLimits ? globalMin : min - padding;\n const maxToUse = globalXLimits ? globalMax : max + padding;\n\n return scaleLinear()\n .domain([minToUse, maxToUse])\n .range([0, innerWidth]);\n } else {\n const globalCategories =\n globalXLimits?.type === \"categorical\"\n ? globalXLimits.categories\n : uniqueValues;\n\n const allCategories = Array.from(globalCategories);\n\n return scaleBand()\n .domain(allCategories)\n .range([0, innerWidth])\n .padding(0.3);\n }\n },\n [innerWidth, max, min, uniqueValues, globalXLimits],\n isEqual\n ) as ScaleLinear<number, number> | ScaleBand<string>;\n\n const yScale = useMemo(() => {\n const maxValue = Math.max(...chartData.map((d) => d.value));\n const paddedMax = maxValue * (1 + Y_SCALE_PADDING);\n\n // take larger of global or padded max\n const globalMax =\n globalYLimits?.type === \"numerical\" ? globalYLimits.max : paddedMax;\n\n const limitToUse = Math.max(globalMax, paddedMax);\n\n return scaleLinear().domain([0, limitToUse]).range([innerHeight, 0]);\n }, [chartData, innerHeight, globalYLimits]);\n\n // Register axis limits with the facet context if in a facet\n useEffect(() => {\n if (facetIds && chartData.length > 0) {\n // determine x limits based on data type\n if (isNumeric) {\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: Number(xScale.domain()[0]),\n max: Number(xScale.domain()[1]),\n });\n } else {\n registerAxisLimits(settings.id, \"x\", {\n type: \"categorical\",\n categories: new Set(chartData.map((d) => d.label)),\n });\n }\n // Register y-axis limits (numerical for bar chart)\n const maxValue = yScale.domain()[1];\n\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: 0,\n max: maxValue,\n });\n }\n }, [\n settings.id,\n facetIds,\n chartData,\n registerAxisLimits,\n isNumeric,\n min,\n max,\n yScale,\n xScale,\n ]);\n\n const isBandScale = \"bandwidth\" in xScale;\n\n const valueFilter = settings.filters.find(\n (f): f is ValueFilter => f.type === \"value\" && f.field === settings.field\n );\n const rangeFilter = getRangeFilterForField(settings.filters, settings.field);\n const hasActiveFilters = valueFilter || rangeFilter;\n\n const handleBarClick = useCallback(\n (label: string) => {\n if (!isBandScale) {\n return;\n }\n\n const filterValues = valueFilter?.values ?? [];\n const newValues = filterValues.includes(label)\n ? filterValues.filter((f) => f !== label)\n : [...filterValues, label];\n\n // Create new filters array with updated value filter\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n isBandScale,\n settings.id,\n settings.field,\n updateChart,\n valueFilter,\n settings.filters,\n ]\n );\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n // Remove both value and range filters for the field\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.field\n );\n updateChart(settings.id, {\n filters: newFilters,\n });\n return;\n }\n\n if (isBandScale) {\n return;\n }\n\n const xStart = extent?.[0]?.[0];\n const xEnd = extent?.[1]?.[0];\n\n const linearScale = xScale as ScaleLinear<number, number>;\n const start = linearScale.invert(xStart);\n const end = linearScale.invert(xEnd);\n\n // Create new filters array with updated range filter\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.field\n );\n\n newFilters.push({\n type: \"range\",\n field: settings.field,\n min: start,\n max: end,\n });\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n isBandScale,\n settings.id,\n settings.field,\n updateChart,\n xScale,\n settings.filters,\n ]\n );\n\n return (\n <div style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n margin={margin}\n xScale={xScale}\n yScale={yScale}\n brushingMode={isBandScale ? \"none\" : \"horizontal\"}\n onBrushChange={handleBrushChange}\n settings={settings}\n >\n <g>\n {chartData.map((d, i) => {\n const isNumeric = d.isNumeric;\n let x: number;\n let barWidth: number;\n\n if (isNumeric) {\n const numericBin = d as NumericBin;\n const linearScale = xScale as ScaleLinear<number, number>;\n x = linearScale(numericBin.start);\n barWidth =\n linearScale(numericBin.end) - linearScale(numericBin.start);\n } else {\n const categoryBin = d as CategoryBin;\n const bandScale = xScale as ScaleBand<string>;\n x = bandScale(categoryBin.label) || 0;\n barWidth = bandScale.bandwidth();\n }\n\n const value = isNumeric\n ? (d as NumericBin).start\n : (d as CategoryBin).label;\n let isFiltered = true;\n\n // Apply value and range filters using applyFilter\n if (valueFilter) {\n isFiltered = applyFilter(value, valueFilter);\n }\n\n if (rangeFilter && isNumeric) {\n isFiltered = applyFilter(value, rangeFilter);\n }\n\n const color =\n hasActiveFilters && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n value,\n \"hsl(217.2 91.2% 59.8%)\"\n );\n\n const barHeight = innerHeight - yScale(d.value);\n\n if (barWidth < 1 || barHeight < 1) {\n return null;\n }\n\n return (\n <rect\n key={i}\n x={x}\n y={yScale(d.value)}\n width={barWidth}\n height={barHeight}\n className={isBandScale ? \"cursor-pointer\" : \"\"}\n style={{ fill: color }}\n onClick={() =>\n isBandScale && handleBarClick((d as CategoryBin).label)\n }\n >\n <title>\n {isNumeric\n ? `Range: ${(d as NumericBin).start.toFixed(2)} - ${(\n d as NumericBin\n ).end.toFixed(2)}, Count: ${d.value}`\n : `${(d as CategoryBin).label}, Count: ${d.value}`}\n </title>\n </rect>\n );\n })}\n </g>\n </BaseChart>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-lg leading-none font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-hidden\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","\"use client\";\n\nimport { Check, ChevronsUpDown } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n} from \"@/components/ui/command\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { cn } from \"@/lib/utils\";\nimport { useState } from \"react\";\nimport { CommandList } from \"cmdk\";\n\ninterface ComboBoxProps<T> {\n value: T | undefined;\n options: T[];\n onChange: (value: T | undefined) => void;\n optionToString?: (option: T) => string;\n optionToNode?: (option: T) => React.ReactNode;\n placeholder?: string;\n className?: string;\n}\n\nexport function ComboBox<T>({\n value,\n options,\n onChange,\n optionToString = (option) => String(option),\n optionToNode,\n placeholder = \"Select option...\",\n className,\n}: ComboBoxProps<T>) {\n const [open, setOpen] = useState(false);\n\n const renderOption = (option: T) => {\n if (optionToNode) {\n return optionToNode(option);\n }\n return optionToString(option);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\"w-full justify-between\", className)}\n >\n {value ? renderOption(value) : placeholder}\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\">\n <Command>\n <CommandInput placeholder={placeholder} />\n <CommandGroup>\n <CommandList>\n <CommandEmpty>No options found.</CommandEmpty>\n {options.map((option, index) => {\n return (\n <CommandItem\n key={index}\n onSelect={() => {\n onChange(option === value ? undefined : option);\n setOpen(false);\n }}\n value={optionToString(option)}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {renderOption(option)}\n </CommandItem>\n );\n })}\n </CommandList>\n </CommandGroup>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import { Button } from \"@/components/ui/button\";\nimport { ComboBox } from \"./ComboBox\";\nimport { Label } from \"./ui/label\";\nimport { X } from \"lucide-react\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\n\ninterface FieldSelectorProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n allowClear?: boolean;\n}\n\nexport function FieldSelector({\n label,\n value,\n onChange,\n placeholder = \"Select field\",\n allowClear = false,\n}: FieldSelectorProps) {\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const availableFields = getColumnNames();\n\n const fieldOptions = availableFields.map((field) => ({\n value: field,\n label: field,\n }));\n\n const selectedOption = fieldOptions.find((option) => option.value === value);\n\n return (\n <div className=\"flex gap-2 items-center\">\n <div className=\"flex-1\">\n <Label htmlFor={label}>{label}</Label>\n <ComboBox\n value={selectedOption}\n options={fieldOptions}\n onChange={(option) => onChange(option?.value || value)}\n optionToString={(option) => option.label}\n placeholder={placeholder}\n />\n </div>\n {allowClear && value && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onChange(\"\")}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n );\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n \"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n \"bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n )}\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n \"bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n )}\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary bg-background ring-ring/20 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n );\n}\n\nexport { Slider };\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-hidden focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Slider } from \"@/components/ui/slider\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { BarChartSettings } from \"./definition\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\n\nexport function BarChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<BarChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label>Bin Count</Label>\n <Slider\n value={[settings.binCount ?? 10]}\n min={2}\n max={50}\n step={1}\n onValueChange={([value]) =>\n onSettingsChange({ ...settings, binCount: value })\n }\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"forceString\"\n checked={settings.forceString}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n forceString: checked,\n })\n }\n />\n <Label htmlFor=\"forceString\">Force String Values</Label>\n </div>\n </div>\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"colorField\"\n checked={settings.field === settings.colorField}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n colorField: checked ? settings.field : undefined,\n colorScaleId:\n checked && settings.field\n ? getOrCreateScaleForField(settings.field)\n : undefined,\n })\n }\n />\n <Label htmlFor=\"colorField\">Use as color field</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { ChartBarBig } from \"lucide-react\";\nimport { BarChart } from \"./BarChart\";\nimport { BarChartSettingsPanel } from \"./BarChartSettingsPanel\";\n\nexport interface BarChartSettings extends BaseChartSettings {\n type: \"bar\";\n binCount?: number;\n forceString?: boolean;\n filters: Filter[];\n}\n\nexport const barChartDefinition: ChartDefinition<BarChartSettings> = {\n type: \"bar\",\n name: \"Bar Chart\",\n description: \"Display data as vertical bars\",\n icon: ChartBarBig,\n\n component: BarChart,\n settingsPanel: BarChartSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n field: field ?? \"\",\n binCount: 10,\n type: \"bar\",\n title: \"Bar Chart\",\n layout,\n margin: {},\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return !!settings.field;\n },\n\n getFilterFunction: (\n settings: BarChartSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const dataHash = fieldGetter(settings.field);\n\n const filter = settings.filters.find(\n (f): f is Filter => f.field === settings.field\n );\n\n return (d: IdType) => {\n const value = dataHash[d];\n\n if (filter) {\n if (!applyFilter(value, filter)) {\n return false;\n }\n }\n\n return true;\n };\n },\n};\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ScatterPlotSettings } from \"./definition\";\nimport { Label } from \"@/components/ui/label\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\n\nexport function ScatterPlotSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ScatterPlotSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => onSettingsChange({ ...settings, xField: value })}\n />\n\n <Label>Y Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.yField}\n onChange={(value) => onSettingsChange({ ...settings, yField: value })}\n />\n\n <Label>Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n colorScaleId: value ? getOrCreateScaleForField(value) : undefined,\n })\n }\n />\n </div>\n </div>\n );\n}\n","import { applyFilter } from \"@/hooks/applyFilter\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ScaleLinear, scaleLinear } from \"d3-scale\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { ScatterPlotSettings } from \"./definition\";\n\n// Configurable constant for axis buffer (10%)\nconst AXIS_BUFFER_PERCENTAGE = 0.1;\n\ninterface ScatterPlotProps extends BaseChartProps {\n settings: ScatterPlotSettings;\n}\n\nexport function ScatterPlot({\n settings,\n width,\n height,\n facetIds,\n}: ScatterPlotProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Get all data for axis limits calculation (not filtered by current selections)\n const allXData = useGetColumnDataForIds(settings.xField, facetIds);\n const allYData = useGetColumnDataForIds(settings.yField, facetIds);\n\n // Get filtered data for rendering\n const xData = useGetLiveData(settings, settings.xField, facetIds);\n const yData = useGetLiveData(settings, settings.yField, facetIds);\n const colorData = useGetLiveData(settings, settings.colorField, facetIds);\n\n // Convert object to array and map to numbers\n const xValues = xData.map(Number);\n const yValues = yData.map(Number);\n\n // Calculate data bounds from ALL data (not just filtered data)\n const xMin = Math.min(...(allXData as number[]));\n const xMax = Math.max(...(allXData as number[]));\n const yMin = Math.min(...(allYData as number[]));\n const yMax = Math.max(...(allYData as number[]));\n\n // Calculate buffered bounds for scales\n const xRange = xMax - xMin;\n const yRange = yMax - yMin;\n const xBuffer = xRange * AXIS_BUFFER_PERCENTAGE;\n const yBuffer = yRange * AXIS_BUFFER_PERCENTAGE;\n\n const bufferedXMin = xMin - xBuffer;\n const bufferedXMax = xMax + xBuffer;\n const bufferedYMin = yMin - yBuffer;\n const bufferedYMax = yMax + yBuffer;\n\n // Register axis limits with the facet context if in a facet using requestAnimationFrame\n useEffect(() => {\n if (facetIds && allXData.length > 0) {\n // Register x-axis limits\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: xMin,\n max: xMax,\n });\n\n // Register y-axis limits\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: yMin,\n max: yMax,\n });\n }\n }, [\n settings.id,\n facetIds,\n allXData,\n allYData,\n xMin,\n xMax,\n yMin,\n yMax,\n registerAxisLimits,\n ]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales for BaseChart with synchronized limits if in a facet\n const xScale = useMemo(() => {\n if (globalXLimits && globalXLimits.type === \"numerical\" && facetIds) {\n // Apply buffer to global limits\n const globalRange = globalXLimits.max - globalXLimits.min;\n const globalBuffer = globalRange * AXIS_BUFFER_PERCENTAGE;\n\n return scaleLinear()\n .domain([\n globalXLimits.min - globalBuffer,\n globalXLimits.max + globalBuffer,\n ])\n .range([0, width - 80]);\n }\n\n return scaleLinear()\n .domain([bufferedXMin, bufferedXMax])\n .range([0, width - 80]);\n }, [\n bufferedXMin,\n bufferedXMax,\n width,\n globalXLimits,\n facetIds,\n ]) as ScaleLinear<number, number>;\n\n const yScale = useMemo(() => {\n if (globalYLimits && globalYLimits.type === \"numerical\" && facetIds) {\n // Apply buffer to global limits\n const globalRange = globalYLimits.max - globalYLimits.min;\n const globalBuffer = globalRange * AXIS_BUFFER_PERCENTAGE;\n\n return scaleLinear()\n .domain([\n globalYLimits.min - globalBuffer,\n globalYLimits.max + globalBuffer,\n ])\n .range([height - 50, 20]);\n }\n\n return scaleLinear()\n .domain([bufferedYMin, bufferedYMax])\n .range([height - 50, 20]);\n }, [\n bufferedYMin,\n bufferedYMax,\n height,\n globalYLimits,\n facetIds,\n ]) as ScaleLinear<number, number>;\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || xValues.length === 0) {\n return;\n }\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n\n // Use provided width and height instead of getBoundingClientRect\n const dpr = window.devicePixelRatio || 1;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Clear canvas using provided dimensions\n ctx.clearRect(0, 0, width, height);\n\n // Draw points using the same scales as BaseChart\n ctx.translate(60, 20); // Match the margin from BaseChart\n\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n\n for (let i = 0; i < xValues.length; i++) {\n const x = xScale(xValues[i]);\n const y = yScale(yValues[i]);\n\n const isFiltered =\n (!xFilter || applyFilter(xValues[i], xFilter)) &&\n (!yFilter || applyFilter(yValues[i], yFilter));\n\n ctx.fillStyle =\n (xFilter || yFilter) && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n colorData[i] ?? \"hsl(217.2 91.2% 59.8%)\"\n );\n\n ctx.beginPath();\n ctx.arc(x, y, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }, [\n xValues,\n yValues,\n settings.xField,\n settings.yField,\n settings.filters,\n settings.colorScaleId,\n width,\n height,\n xScale,\n yScale,\n getColorForValue,\n colorData,\n ]);\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n updateChart(settings.id, {\n filters: settings.filters.filter(\n (f) => f.field !== settings.xField && f.field !== settings.yField\n ),\n });\n return;\n }\n\n const [[x0, y0], [x1, y1]] = extent;\n\n // Convert pixel coordinates back to data values\n const xStart = xScale.invert(x0);\n const xEnd = xScale.invert(x1);\n const yStart = yScale.invert(y0);\n const yEnd = yScale.invert(y1);\n\n // Create new filters array with updated x and y filters\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.xField && f.field !== settings.yField\n );\n\n // Add x filter\n newFilters.push({\n type: \"range\",\n field: settings.xField,\n min: Math.min(xStart, xEnd),\n max: Math.max(xStart, xEnd),\n });\n\n // Add y filter\n newFilters.push({\n type: \"range\",\n field: settings.yField,\n min: Math.min(yStart, yEnd),\n max: Math.max(yStart, yEnd),\n });\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n settings.id,\n settings.xField,\n settings.yField,\n settings.filters,\n updateChart,\n xScale,\n yScale,\n ]\n );\n\n return (\n <div style={{ width, height }} className=\"relative\">\n {xValues.length > 0 ? (\n <>\n <canvas\n ref={canvasRef}\n className=\"absolute inset-0 pointer-events-none\"\n style={{ width, height }}\n />\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n brushingMode=\"2d\"\n onBrushChange={handleBrushChange}\n className=\"absolute\"\n settings={settings}\n >\n <g /> {/* Empty group element as children */}\n </BaseChart>\n </>\n ) : (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n No data available\n </div>\n )}\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { ScatterChart } from \"lucide-react\";\n\nimport { ScatterPlotSettingsPanel } from \"./ScatterPlotSettingsPanel\";\nimport { ScatterPlot } from \"./ScatterPlot\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { Filter } from \"@/types/FilterTypes\";\n\nexport interface ScatterPlotSettings extends BaseChartSettings {\n type: \"scatter\";\n xField: string;\n yField: string;\n filters: Filter[];\n}\n\nexport const scatterPlotDefinition: ChartDefinition<ScatterPlotSettings> = {\n type: \"scatter\",\n name: \"Scatter Plot\",\n description: \"Display data as points in a 2D space\",\n icon: ScatterChart,\n\n component: ScatterPlot,\n settingsPanel: ScatterPlotSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"scatter\",\n title: \"Scatter Plot\",\n layout,\n margin: {},\n xField: \"__ID\",\n yField: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return !!settings.xField && !!settings.yField;\n },\n\n getFilterFunction: (\n settings: ScatterPlotSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const xDataHash = fieldGetter(settings.xField);\n const yDataHash = fieldGetter(settings.yField);\n\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n\n return (d: IdType) => {\n if (!xFilter && !yFilter) {\n return true;\n }\n\n const xValue = xDataHash[d];\n const yValue = yDataHash[d];\n\n // check both for exclusion -- if OK, then return true\n // we need both to be true to return true\n if (xFilter && !applyFilter(xValue, xFilter)) {\n return false;\n }\n\n if (yFilter && !applyFilter(yValue, yFilter)) {\n return false;\n }\n\n return true;\n };\n },\n};\n","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterSettings } from \"./types\";\n\ninterface ThreeDScatterAxesProps {\n scene: THREE.Scene;\n settings: ThreeDScatterSettings;\n}\n\nexport function ThreeDScatterAxes({ scene, settings }: ThreeDScatterAxesProps) {\n // Create axes helper\n const axesHelper = useMemo(() => {\n return new THREE.AxesHelper(10);\n }, []);\n\n // Create grid helper\n const gridHelpers = useMemo(() => {\n const size = 10;\n const divisions = 10;\n\n return {\n xy: new THREE.GridHelper(size, divisions),\n xz: new THREE.GridHelper(size, divisions),\n yz: new THREE.GridHelper(size, divisions),\n };\n }, []);\n\n // Setup grid positions and rotations\n useEffect(() => {\n if (settings.showGrid) {\n // XY plane (blue)\n gridHelpers.xy.rotation.x = Math.PI / 2;\n scene.add(gridHelpers.xy);\n\n // XZ plane (red)\n gridHelpers.xz.position.y = 0;\n scene.add(gridHelpers.xz);\n\n // YZ plane (green)\n gridHelpers.yz.rotation.z = Math.PI / 2;\n scene.add(gridHelpers.yz);\n }\n\n if (settings.showAxes) {\n scene.add(axesHelper);\n }\n\n return () => {\n scene.remove(gridHelpers.xy);\n scene.remove(gridHelpers.xz);\n scene.remove(gridHelpers.yz);\n scene.remove(axesHelper);\n\n gridHelpers.xy.dispose();\n gridHelpers.xz.dispose();\n gridHelpers.yz.dispose();\n axesHelper.dispose();\n };\n }, [scene, settings.showGrid, settings.showAxes, gridHelpers, axesHelper]);\n\n return null;\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterSettings } from \"./types\";\n\ninterface Point3D {\n x: number;\n y: number;\n z: number;\n color?: number | string;\n size?: number;\n}\n\ninterface ThreeDScatterPointsProps {\n scene: THREE.Scene;\n data: Point3D[];\n settings: ThreeDScatterSettings;\n}\n\nexport function ThreeDScatterPoints({\n scene,\n data,\n settings,\n}: ThreeDScatterPointsProps) {\n const pointsRef = useRef<THREE.Points | null>(null);\n\n // Create points geometry\n const pointsGeometry = useMemo(() => {\n const positions = new Float32Array(data.length * 3);\n const colors = new Float32Array(data.length * 3);\n\n data.forEach((point, i) => {\n positions[i * 3] = point.x || 0;\n positions[i * 3 + 1] = point.y || 0;\n positions[i * 3 + 2] = point.z || 0;\n\n // Handle color from point data\n if (point.color) {\n if (typeof point.color === \"string\") {\n // Convert hex string to RGB\n const color = new THREE.Color(point.color);\n colors[i * 3] = color.r;\n colors[i * 3 + 1] = color.g;\n colors[i * 3 + 2] = color.b;\n } else {\n // Handle numeric color\n const color = new THREE.Color(point.color);\n colors[i * 3] = color.r;\n colors[i * 3 + 1] = color.g;\n colors[i * 3 + 2] = color.b;\n }\n } else {\n // Default color (white)\n colors[i * 3] = 1;\n colors[i * 3 + 1] = 1;\n colors[i * 3 + 2] = 1;\n }\n });\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n return geometry;\n }, [data]);\n\n // Create points material\n const pointsMaterial = useMemo(() => {\n return new THREE.PointsMaterial({\n size: settings.pointSize,\n vertexColors: true,\n transparent: true,\n opacity: settings.pointOpacity,\n sizeAttenuation: true,\n });\n }, [settings.pointSize, settings.pointOpacity]);\n\n // Add points to scene\n useEffect(() => {\n const points = new THREE.Points(pointsGeometry, pointsMaterial);\n pointsRef.current = points;\n scene.add(points);\n\n return () => {\n if (pointsRef.current) {\n scene.remove(pointsRef.current);\n }\n pointsGeometry.dispose();\n pointsMaterial.dispose();\n };\n }, [scene, pointsGeometry, pointsMaterial]);\n\n return null;\n}\n","import { useColorScales } from \"@/hooks/useColorScales\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { ThreeDScatterSettings } from \"./types\";\n\nexport function useThreeDScatterData(\n settings: ThreeDScatterSettings,\n facetIds?: IdType[]\n) {\n const is3DScatter = settings.type === \"3d-scatter\";\n\n const xData = useGetLiveData(settings, settings.xField, facetIds);\n const yData = useGetLiveData(settings, settings.yField, facetIds);\n const zData = useGetLiveData(settings, settings.zField, facetIds);\n const colorData = useGetLiveData(settings, settings.colorField, facetIds);\n const sizeData = useGetLiveData(settings, settings.sizeField, facetIds);\n\n const { getColorForValue } = useColorScales();\n const colorScaleId = settings.colorScaleId;\n\n return useMemo(() => {\n if (!is3DScatter) {\n return [];\n }\n\n const result = [];\n for (let i = 0; i < xData.length; i++) {\n result.push({\n x: xData[i],\n y: yData[i],\n z: zData[i],\n color: getColorForValue(colorScaleId, colorData[i]),\n size: sizeData[i],\n });\n }\n return result;\n }, [\n is3DScatter,\n xData,\n yData,\n zData,\n getColorForValue,\n colorScaleId,\n colorData,\n sizeData,\n ]);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterChartProps } from \"./types\";\n\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { OrbitControls } from \"three/addons/controls/OrbitControls.js\";\nimport { ThreeDScatterAxes } from \"./ThreeDScatterAxes\";\nimport { ThreeDScatterPoints } from \"./ThreeDScatterPoints\";\nimport { useThreeDScatterData } from \"./useThreeDScatterData\";\n\ninterface CameraState {\n position: THREE.Vector3;\n target: THREE.Vector3;\n}\n\nexport function ThreeDScatterChart({\n settings,\n width,\n height,\n facetIds,\n}: ThreeDScatterChartProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const animationFrameRef = useRef<number>(null);\n const cameraStateRef = useRef<CameraState>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateChart = useDataLayer((state) => state.updateChart);\n const data = useThreeDScatterData(settings, facetIds);\n const [nonce, setNonce] = useState(0);\n\n // Initialize Three.js scene\n useEffect(() => {\n if (!containerRef.current || width <= 0 || height <= 0) {\n return;\n }\n\n // Create scene\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0x000000);\n sceneRef.current = scene;\n\n // Create camera\n const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);\n camera.position.copy(settings.cameraPosition);\n camera.lookAt(settings.cameraTarget);\n cameraRef.current = camera;\n\n // Create renderer\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n powerPreference: \"high-performance\",\n });\n renderer.setSize(width, height);\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n containerRef.current.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // Add orbit controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controlsRef.current = controls;\n controls.addEventListener(\"change\", () => {\n if (!controls.object || !controls.target) {\n return;\n }\n cameraStateRef.current = {\n position: controls.object.position.clone(),\n target: controls.target.clone(),\n };\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = setTimeout(() => {\n if (cameraStateRef.current) {\n updateChart(settings.id, {\n cameraPosition: cameraStateRef.current.position,\n cameraTarget: cameraStateRef.current.target,\n });\n }\n }, 1000);\n });\n\n // Add ambient light\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);\n scene.add(ambientLight);\n\n // Add directional light\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);\n directionalLight.position.set(10, 10, 10);\n scene.add(directionalLight);\n\n // Force initial render\n renderer.render(scene, camera);\n\n // Animation loop\n const animate = () => {\n animationFrameRef.current = requestAnimationFrame(animate);\n controls.update();\n renderer.render(scene, camera);\n };\n animate();\n\n setNonce((state) => state + 1);\n\n // Cleanup\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n if (controls) {\n controls.dispose();\n }\n if (renderer) {\n renderer.dispose();\n renderer.forceContextLoss();\n renderer.domElement.remove();\n }\n if (containerRef.current) {\n containerRef.current.innerHTML = \"\";\n }\n };\n }, [\n width,\n height,\n settings.cameraPosition,\n settings.cameraTarget,\n settings.id,\n updateChart,\n ]);\n\n // Handle window resize\n useEffect(() => {\n const handleResize = () => {\n if (\n !rendererRef.current ||\n !cameraRef.current ||\n !sceneRef.current ||\n width <= 0 ||\n height <= 0\n ) {\n return;\n }\n\n cameraRef.current.aspect = width / height;\n cameraRef.current.updateProjectionMatrix();\n rendererRef.current.setSize(width, height);\n // Force render on resize\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [width, height]);\n\n // Render points and axes immediately when scene is ready\n useEffect(() => {\n // Force a render after adding points and axes\n if (\n !sceneRef.current ||\n !rendererRef.current ||\n !cameraRef.current ||\n width <= 0 ||\n height <= 0\n ) {\n return;\n }\n\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }, [data, width, height]);\n\n return (\n <div ref={containerRef} style={{ width, height }}>\n {sceneRef.current && (\n <>\n <ThreeDScatterPoints\n scene={sceneRef.current}\n data={data}\n settings={settings}\n key={\"points-\" + nonce}\n />\n <ThreeDScatterAxes\n scene={sceneRef.current}\n settings={settings}\n key={\"axes-\" + nonce}\n />\n </>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground aria-invalid:outline-destructive/60 aria-invalid:ring-destructive/20 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/50 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 aria-invalid:outline-destructive/60 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/40 aria-invalid:ring-destructive/20 aria-invalid:border-destructive/60 dark:aria-invalid:border-destructive flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-[3px] aria-invalid:focus-visible:outline-none md:text-sm dark:aria-invalid:focus-visible:ring-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import { cn } from \"@/lib/utils\";\nimport { Input } from \"./ui/input\";\nimport { KeyboardEvent, useState } from \"react\";\n\nexport interface NumericInputEnterProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n stepSmall?: number;\n stepMedium?: number;\n stepLarge?: number;\n placeholder?: string;\n className?: string;\n}\n\nexport function NumericInputEnter({\n value,\n onChange,\n stepSmall = 1,\n stepMedium = 10,\n stepLarge = 100,\n min,\n max,\n placeholder,\n className,\n}: NumericInputEnterProps) {\n const [localValue, setLocalValue] = useState<string>(value.toString());\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n let delta = 0;\n\n // Handle arrow keys with modifiers\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const direction = e.key === \"ArrowUp\" ? 1 : -1;\n\n if (e.shiftKey && e.altKey) {\n delta = stepLarge * direction;\n } else if (e.shiftKey) {\n delta = stepMedium * direction;\n } else {\n delta = stepSmall * direction;\n }\n\n const newValue = Number(value) + delta;\n\n // Clamp value within min/max bounds\n const clampedValue = Math.min(\n max ?? Infinity,\n Math.max(min ?? -Infinity, newValue)\n );\n\n onChange(clampedValue);\n setLocalValue(clampedValue.toString());\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n\n const newValue = parseFloat(e.target.value);\n if (!isNaN(newValue)) {\n // Only update if within bounds\n if (\n (min === undefined || newValue >= min) &&\n (max === undefined || newValue <= max)\n ) {\n onChange(newValue);\n }\n }\n };\n\n const handleBlur = () => {\n // Reset to last valid value if input is empty or invalid\n if (!localValue || isNaN(parseFloat(localValue))) {\n setLocalValue(value.toString());\n }\n };\n\n return (\n <div className={cn(\"relative max-w-[160px]\", className)}>\n <Input\n type=\"number\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`w-full`}\n />\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ThreeDScatterSettings } from \"./types\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\n\nexport function ThreeDScatterSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ThreeDScatterSettings>) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => onSettingsChange({ ...settings, xField: value })}\n />\n\n <Label>Y Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.yField}\n onChange={(value) => onSettingsChange({ ...settings, yField: value })}\n />\n\n <Label>Z Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.zField}\n onChange={(value) => onSettingsChange({ ...settings, zField: value })}\n />\n\n <Label>Size Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.sizeField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n sizeField: value || undefined,\n })\n }\n />\n\n <Label>Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n })\n }\n />\n\n <Label>Point Size</Label>\n <NumericInputEnter\n value={settings.pointSize}\n onChange={(value) =>\n onSettingsChange({ ...settings, pointSize: value })\n }\n min={0.01}\n max={10}\n stepSmall={0.1}\n stepMedium={0.5}\n stepLarge={1}\n />\n\n <Label>Point Opacity</Label>\n <NumericInputEnter\n value={settings.pointOpacity}\n onChange={(value) =>\n onSettingsChange({ ...settings, pointOpacity: value })\n }\n min={0}\n max={1}\n stepSmall={0.1}\n stepMedium={0.2}\n stepLarge={0.3}\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"showGrid\"\n checked={settings.showGrid}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n showGrid: checked,\n })\n }\n />\n <Label htmlFor=\"showGrid\">Show Grid</Label>\n </div>\n </div>\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"showAxes\"\n checked={settings.showAxes}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n showAxes: checked,\n })\n }\n />\n <Label htmlFor=\"showAxes\">Show Axes</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { ChartDefinition, Filter, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Box } from \"lucide-react\";\n\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterChart } from \"./ThreeDScatterChart\";\nimport { ThreeDScatterSettingsPanel } from \"./ThreeDScatterSettingsPanel\";\nimport { ThreeDScatterSettings } from \"./types\";\n\nexport const threeDScatterDefinition: ChartDefinition<ThreeDScatterSettings> = {\n type: \"3d-scatter\",\n name: \"3D Scatter Plot\",\n description: \"Display data as points in a 3D space\",\n icon: Box,\n\n component: ThreeDScatterChart,\n settingsPanel: ThreeDScatterSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"3d-scatter\",\n title: \"3D Scatter Plot\",\n layout,\n margin: {},\n xField: \"\",\n yField: \"\",\n zField: \"\",\n colorField: undefined,\n sizeField: undefined,\n pointSize: 5,\n pointOpacity: 0.8,\n showGrid: true,\n showAxes: true,\n cameraPosition: new THREE.Vector3(0, 0, 0),\n cameraTarget: new THREE.Vector3(0, 0, 0),\n xAxis: { ...DEFAULT_CHART_SETTINGS.xAxis, zoomLevel: 1 },\n yAxis: { ...DEFAULT_CHART_SETTINGS.yAxis, zoomLevel: 1 },\n zAxis: { ...DEFAULT_CHART_SETTINGS.yAxis, zoomLevel: 1 },\n }),\n\n validateSettings: (settings) => {\n return !!settings.xField && !!settings.yField && !!settings.zField;\n },\n\n getFilterFunction: (\n settings: ThreeDScatterSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Currently no filtering implemented for 3D scatter\n return (d: IdType) => true;\n },\n};\n","import { datum } from \"@/types/FilterTypes\";\nimport { PivotCell, PivotHeader, PivotRow, PivotTableData } from \"../types\";\nimport { PivotTableSettings } from \"../definition\";\n\ntype AggregationFunction = (values: any[]) => number | string;\n\nconst aggregationFunctions: Record<string, AggregationFunction> = {\n sum: (values) => values.reduce((a, b) => a + (Number(b) || 0), 0),\n count: (values) => values.length,\n avg: (values) => {\n const sum = values.reduce((a, b) => a + (Number(b) || 0), 0);\n return values.length ? sum / values.length : 0;\n },\n min: (values) => Math.min(...values.map((v) => Number(v) || 0)),\n max: (values) => Math.max(...values.map((v) => Number(v) || 0)),\n median: (values) => {\n const sorted = values.map((v) => Number(v) || 0).sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n },\n mode: (values) => {\n const counts = new Map<number | string, number>();\n values.forEach((v) => counts.set(v, (counts.get(v) || 0) + 1));\n let maxCount = 0;\n let mode: number | string = 0;\n counts.forEach((count, value) => {\n if (count > maxCount) {\n maxCount = count;\n mode = value;\n }\n });\n return mode;\n },\n stddev: (values) => {\n const avg = aggregationFunctions.avg(values) as number;\n const squareDiffs = values.map((v) => {\n const diff = (Number(v) || 0) - avg;\n return diff * diff;\n });\n return Math.sqrt(aggregationFunctions.avg(squareDiffs) as number);\n },\n variance: (values) => {\n const avg = aggregationFunctions.avg(values) as number;\n const squareDiffs = values.map((v) => {\n const diff = (Number(v) || 0) - avg;\n return diff * diff;\n });\n return aggregationFunctions.avg(squareDiffs) as number;\n },\n countUnique: (values) => new Set(values).size,\n singleValue: (values) => {\n const uniqueValues = new Set(values);\n if (uniqueValues.size !== 1) {\n throw new Error(\"Multiple values found when single value expected\");\n }\n return values[0];\n },\n};\n\nfunction flattenHeaders(headers: PivotHeader[]): PivotHeader[] {\n const result: PivotHeader[] = [];\n headers.forEach((header) => {\n if (!header.children?.length) {\n result.push(header);\n } else {\n result.push(...flattenHeaders(header.children));\n }\n });\n return result;\n}\n\nfunction generateHeaders(data: any[], field: string): PivotHeader[] {\n if (!field) {\n return [];\n }\n\n // Get unique values for the column field\n const uniqueValues = new Set(data.map((d) => d[field]));\n const values = Array.from(uniqueValues).sort();\n\n return values.map((value) => ({\n label: String(value),\n field,\n value,\n children: [],\n span: 1,\n depth: 0,\n }));\n}\n\nfunction generateCells(\n rowData: any[],\n columnHeaders: PivotHeader[],\n valueFields: PivotTableSettings[\"valueFields\"]\n): PivotCell[] {\n const cells: PivotCell[] = [];\n\n // If there are no columns defined, create a single cell for the total\n if (columnHeaders.length === 0) {\n for (const valueField of valueFields) {\n const values = rowData.map((d) => d[valueField.field]);\n const value = aggregationFunctions[valueField.aggregation](values);\n\n cells.push({\n key: {\n columnField: \"total\",\n columnValue: \"total\" as datum,\n valueField: valueField.field,\n },\n value,\n rawValue: value,\n sourceRows: rowData,\n });\n }\n return cells;\n }\n\n // Generate cells for each column header\n for (const header of columnHeaders) {\n const columnData = rowData.filter((d) => d[header.field] === header.value);\n\n for (const valueField of valueFields) {\n const values = columnData.map((d) => d[valueField.field]);\n const value = aggregationFunctions[valueField.aggregation](values);\n\n cells.push({\n key: {\n columnField: header.field,\n columnValue: header.value,\n valueField: valueField.field,\n },\n value,\n rawValue: value,\n sourceRows: columnData,\n });\n }\n }\n\n return cells;\n}\n\nfunction generateRows(\n data: any[],\n rowFields: string[],\n columnField: string,\n valueFields: PivotTableSettings[\"valueFields\"],\n showTotals: PivotTableSettings[\"showTotals\"]\n): PivotRow[] {\n const rows: PivotRow[] = [];\n const columnHeaders = generateHeaders(data, columnField);\n\n // Pre-compute row groups for better performance\n const rowGroups = new Map<string, any[]>();\n data.forEach((item) => {\n // Create a composite key for grouping, but store the individual values\n const keyString = rowFields.map((field) => item[field]).join(\":\");\n if (!rowGroups.has(keyString)) {\n rowGroups.set(keyString, []);\n }\n rowGroups.get(keyString)!.push(item);\n });\n\n // Generate rows\n rowGroups.forEach((groupData, keyString) => {\n // Create properly typed keys and headers\n const keys = rowFields.map((field, index) => {\n const value = groupData[0][field];\n return {\n field,\n value,\n };\n });\n\n const headers = keys.map((key, index) => ({\n label: String(key.value),\n field: key.field,\n value: key.value,\n span: 1,\n depth: index,\n }));\n\n const cells = generateCells(groupData, columnHeaders, valueFields);\n\n rows.push({\n keys,\n headers,\n cells,\n });\n });\n\n return rows;\n}\n\nexport function calculatePivotData(\n data: any[],\n settings: PivotTableSettings\n): PivotTableData {\n const headers = generateHeaders(data, settings.columnField);\n const rows = generateRows(\n data,\n settings.rowFields,\n settings.columnField,\n settings.valueFields,\n settings.showTotals\n );\n\n return {\n headers,\n rows,\n };\n}\n","import { calculatePivotData } from \"@/components/charts/PivotTable/utils/calculations\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { Filter, ValueFilter, datum } from \"@/types/FilterTypes\";\nimport { Filter as FilterIcon } from \"lucide-react\";\nimport { useCallback, useMemo } from \"react\";\nimport { toast } from \"sonner\";\nimport { useGetLiveIds } from \"../useGetLiveData\";\nimport { PivotCell, PivotHeader, PivotRow, CellKey, RowKey } from \"./types\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { PivotTableSettings } from \"./definition\";\n\ntype PivotTableProps = BaseChartProps & {\n settings: PivotTableSettings;\n};\n\nexport function PivotTable({\n settings,\n width,\n height,\n facetIds,\n}: PivotTableProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const updateChart = useDataLayer((state) => state.updateChart);\n\n const allLiveIds = useGetLiveIds(settings);\n\n // Get all required field data\n const pivotData = useMemo(() => {\n // Use facetIds if provided, otherwise use liveItems\n const liveIds = facetIds || allLiveIds;\n\n // Gather all required fields\n const allFields = new Set([\n ...settings.rowFields,\n settings.columnField,\n ...settings.valueFields.map((f) => f.field),\n ]);\n\n // Get column data for each field\n const fieldData: Record<string, Record<string | number, any>> = {};\n allFields.forEach((field) => {\n fieldData[field] = getColumnData(field);\n });\n\n // Create data array for pivot calculations\n const data = liveIds.map((id: string | number) => {\n const row: Record<string, any> = {};\n allFields.forEach((field) => {\n row[field] = fieldData[field][id];\n });\n return row;\n });\n\n return calculatePivotData(data, settings);\n }, [facetIds, allLiveIds, settings, getColumnData]);\n\n const handleFilterClick = useCallback(\n (field: string, value: datum) => {\n const currentFilters = settings.filters || [];\n const existingFilterIndex = currentFilters.findIndex(\n (f): f is ValueFilter =>\n f.type === \"value\" &&\n f.field === field &&\n f.values.includes(value as string | number)\n );\n\n let newFilters: Filter[];\n if (existingFilterIndex >= 0) {\n // Remove the filter if it exists\n newFilters = [\n ...currentFilters.slice(0, existingFilterIndex),\n ...currentFilters.slice(existingFilterIndex + 1),\n ];\n } else {\n // Add new filter\n const newFilter: ValueFilter = {\n type: \"value\",\n field,\n values: [value as string | number],\n };\n newFilters = [...currentFilters, newFilter];\n }\n\n updateChart(settings.id, {\n ...settings,\n filters: newFilters,\n });\n },\n [settings, updateChart]\n );\n\n const handleCellClick = useCallback(\n (cell: PivotCell, rowKeys: RowKey[], colKey: CellKey) => {\n if (!cell.sourceRows) {\n return;\n }\n\n // TODO: Implement drill-down modal with source rows\n toast(\n `Showing details for ${cell.value} (${cell.sourceRows.length} rows)`\n );\n },\n []\n );\n\n const isValueFiltered = useCallback(\n (field: string, value: datum) => {\n const currentFilters = settings.filters || [];\n const fieldFilters = currentFilters.filter((f) => f.field === field);\n\n // If no filters for this field, return false\n if (fieldFilters.length === 0) {\n return false;\n }\n\n // Check if the value matches any of the filters for this field\n return fieldFilters.some((filter) => applyFilter(value, filter));\n },\n [settings.filters]\n );\n\n const isCellFiltered = useCallback(\n (rowHeaders: PivotHeader[], cellKey: CellKey) => {\n const currentFilters = settings.filters || [];\n\n if (currentFilters.length === 0) {\n return false;\n }\n\n // Get all row field filters\n const rowFieldFilters = rowHeaders.map((header) => {\n const fieldFilters = currentFilters.filter(\n (f) => f.field === header.field\n );\n return {\n header,\n filters: fieldFilters,\n };\n });\n\n // Check if any row header matches its field's filters\n const hasRowFilters = rowFieldFilters.some((rf) => rf.filters.length > 0);\n const rowMatches =\n !hasRowFilters ||\n rowFieldFilters.some(\n ({ header, filters }) =>\n filters.length > 0 &&\n filters.some((filter) => applyFilter(header.value, filter))\n );\n\n // Get column filters\n const columnFilters = currentFilters.filter(\n (f) => f.field === cellKey.columnField\n );\n\n // Check if column matches its filters\n const hasColumnFilters = columnFilters.length > 0;\n const columnMatches =\n !hasColumnFilters ||\n columnFilters.some((filter) =>\n applyFilter(cellKey.columnValue, filter)\n );\n\n // Cell is highlighted if both row and column conditions are met\n return rowMatches && columnMatches;\n },\n [settings.filters]\n );\n\n const renderHeader = useCallback(\n (header: PivotHeader) => {\n const isFiltered = isValueFiltered(header.field, header.value);\n return (\n <th\n key={`${header.field}-${header.value}`}\n colSpan={settings.valueFields.length}\n className={cn(\n \"border p-2\",\n header.depth === 0 && \"font-semibold\",\n isFiltered ? \"bg-yellow-100\" : \"bg-muted/50\"\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => handleFilterClick(header.field, header.value)}\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n <span>{header.label}</span>\n </div>\n </th>\n );\n },\n [handleFilterClick, settings.valueFields.length, isValueFiltered]\n );\n\n // Calculate the number of header rows needed\n\n return (\n <div\n className={cn(\"w-full h-full border rounded-md flex flex-col\")}\n style={{ height }}\n >\n <div className=\"overflow-auto flex-1\">\n <table className=\"w-full border-collapse relative\">\n <thead className=\"sticky top-0 bg-background z-40\">\n {/* First row: Row field headers and column field headers */}\n <tr>\n {/* Row field headers */}\n {settings.rowFields.map((field, i) => {\n const leftPosition = i * 150; // Match the body's width\n return (\n <th\n key={field}\n rowSpan={settings.columnField ? 2 : 1}\n className={cn(\n \"border p-2 bg-muted/50 font-semibold sticky\",\n // Add z-index that decreases as we go right to ensure proper layering\n `z-[${30 - i}]` // Higher z-index than body to stay on top\n )}\n style={{\n left: `${leftPosition}px`,\n minWidth: \"150px\",\n maxWidth: \"150px\",\n }}\n >\n {field}\n </th>\n );\n })}\n\n {/* Column headers or value fields if no columns */}\n {!settings.columnField\n ? settings.valueFields.map((valueField) => (\n <th\n key={valueField.field}\n className=\"border p-2 bg-muted/50 font-semibold\"\n >\n {valueField.label ||\n `${valueField.field} (${valueField.aggregation})`}\n </th>\n ))\n : pivotData.headers.map(renderHeader)}\n </tr>\n\n {/* Value field headers when column field exists */}\n {settings.columnField && (\n <tr>\n {pivotData.headers.map((header) =>\n settings.valueFields.map((valueField) => (\n <th\n key={`${header.field}-${header.value}-${valueField.field}`}\n className=\"border p-2 bg-muted/50\"\n >\n {valueField.label ||\n `${valueField.field} (${valueField.aggregation})`}\n </th>\n ))\n )}\n </tr>\n )}\n </thead>\n <tbody>\n {pivotData.rows.map((row: PivotRow) => (\n <tr key={row.keys.map((k) => `${k.field}-${k.value}`).join(\":\")}>\n {row.headers.map((header: PivotHeader, i) => {\n // Calculate cumulative width of previous headers\n const leftPosition = i * 150; // Using fixed width for consistency\n const isFiltered = isValueFiltered(\n header.field,\n header.value\n );\n return (\n <th\n key={`${header.field}-${header.value}`}\n className={cn(\n \"border p-2 text-left font-normal sticky\",\n isFiltered ? \"bg-yellow-100\" : \"bg-white\",\n // Add z-index that decreases as we go right to ensure proper layering\n `z-[${20 - i}]`\n )}\n style={{\n left: `${leftPosition}px`,\n minWidth: \"150px\", // Fixed width for consistency\n maxWidth: \"150px\",\n }}\n >\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() =>\n handleFilterClick(header.field, header.value)\n }\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n <span>{header.label}</span>\n </div>\n </th>\n );\n })}\n {row.cells.map((cell: PivotCell) => (\n <td\n key={`${cell.key.columnField}-${cell.key.columnValue}${cell.key.valueField ? `-${cell.key.valueField}` : \"\"}`}\n className={cn(\n \"border p-2 text-right\",\n cell.sourceRows && \"cursor-pointer hover:bg-muted/20\",\n isCellFiltered(row.headers, cell.key) && \"bg-yellow-50\"\n )}\n onClick={() =>\n cell.sourceRows &&\n handleCellClick(cell, row.keys, cell.key)\n }\n >\n {typeof cell.value === \"number\"\n ? cell.value.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n })\n : cell.value}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0 transition-[color,box-shadow]\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow-sm [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow-sm [a&]:hover:bg-destructive/90\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Command as CommandPrimitive, useCommandState } from \"cmdk\";\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { forwardRef, useEffect } from \"react\";\n\nimport { Badge } from \"./badge\";\nimport {\n Command,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"./command\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport interface Option {\n value: string;\n label: string;\n disable?: boolean;\n /** fixed option that can't be removed. */\n fixed?: boolean;\n /** Group the options by providing key. */\n [key: string]: string | boolean | undefined;\n}\ntype GroupOption = Record<string, Option[]>;\n\ninterface MultipleSelectorProps {\n value?: Option[];\n defaultOptions?: Option[];\n /** manually controlled options */\n options?: Option[];\n placeholder?: string;\n /** Loading component. */\n loadingIndicator?: React.ReactNode;\n /** Empty component. */\n emptyIndicator?: React.ReactNode;\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number;\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n **/\n triggerSearchOnFocus?: boolean;\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>;\n /**\n * sync search. This search will not showing loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: creatable, groupBy, delay.\n **/\n onSearchSync?: (value: string) => Option[];\n onChange?: (options: Option[]) => void;\n /** Limit the maximum number of selected options. */\n maxSelected?: number;\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void;\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean;\n disabled?: boolean;\n /** Group the options base on provided key. */\n groupBy?: string;\n className?: string;\n badgeClassName?: string;\n /**\n * First item selected is a default behavior by cmdk. That is why the default is true.\n * This is a workaround solution by add a dummy item.\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean;\n /** Allow user to create option when there is no option matched. */\n creatable?: boolean;\n /** Props of `Command` */\n commandProps?: React.ComponentPropsWithoutRef<typeof Command>;\n /** Props of `CommandInput` */\n inputProps?: Omit<\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>,\n \"value\" | \"placeholder\" | \"disabled\"\n >;\n /** hide the clear all button. */\n hideClearAllButton?: boolean;\n}\n\nexport interface MultipleSelectorRef {\n selectedValue: Option[];\n input: HTMLInputElement;\n focus: () => void;\n reset: () => void;\n}\n\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = React.useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {};\n }\n if (!groupBy) {\n return {\n \"\": options,\n };\n }\n\n const groupOption: GroupOption = {};\n options.forEach((option) => {\n const key = (option[groupBy] as string) || \"\";\n if (!groupOption[key]) {\n groupOption[key] = [];\n }\n groupOption[key].push(option);\n });\n return groupOption;\n}\n\nfunction removePickedOption(groupOption: GroupOption, picked: Option[]) {\n const cloneOption = JSON.parse(JSON.stringify(groupOption)) as GroupOption;\n\n for (const [key, value] of Object.entries(cloneOption)) {\n cloneOption[key] = value.filter(\n (val) => !picked.find((p) => p.value === val.value)\n );\n }\n return cloneOption;\n}\n\nfunction isOptionsExist(groupOption: GroupOption, targetOption: Option[]) {\n for (const [, value] of Object.entries(groupOption)) {\n if (\n value.some((option) => targetOption.find((p) => p.value === option.value))\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n **/\nconst CommandEmpty = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof CommandPrimitive.Empty>\n>(({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0);\n\n if (!render) {\n return null;\n }\n\n return (\n <div\n ref={forwardedRef}\n className={cn(\"py-6 text-center text-sm\", className)}\n cmdk-empty=\"\"\n role=\"presentation\"\n {...props}\n />\n );\n});\n\nCommandEmpty.displayName = \"CommandEmpty\";\n\ninterface SortableBadgeProps {\n option: Option;\n disabled?: boolean;\n onUnselect: (option: Option) => void;\n badgeClassName?: string;\n}\n\nconst SortableBadge = ({\n option,\n disabled,\n onUnselect,\n badgeClassName,\n}: SortableBadgeProps) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: option.value });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 1 : 0,\n };\n\n return (\n <Badge\n ref={setNodeRef}\n style={style}\n className={cn(\n \"data-[disabled]:bg-muted-foreground data-[disabled]:text-muted data-[disabled]:hover:bg-muted-foreground\",\n \"data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground\",\n \"flex items-center gap-1\",\n isDragging && \"opacity-50\",\n badgeClassName\n )}\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n <button\n className={cn(\n \"flex cursor-grab items-center gap-1\",\n disabled && \"hidden\"\n )}\n {...attributes}\n {...listeners}\n >\n {option.label}\n </button>\n <button\n className={cn(\n \"ml-1 rounded-full outline-none ring-offset-background focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n (disabled || option.fixed) && \"hidden\"\n )}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n onUnselect(option);\n }\n }}\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={() => onUnselect(option)}\n >\n <X className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </Badge>\n );\n};\n\nconst MultipleSelector = React.forwardRef<\n MultipleSelectorRef,\n MultipleSelectorProps\n>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator,\n emptyIndicator,\n maxSelected = Number.MAX_SAFE_INTEGER,\n onMaxSelected,\n hidePlaceholderWhenSelected,\n disabled,\n groupBy,\n className,\n badgeClassName,\n selectFirstItem = true,\n creatable = false,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n hideClearAllButton = false,\n }: MultipleSelectorProps,\n ref: React.Ref<MultipleSelectorRef>\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [open, setOpen] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(false);\n\n const [selected, setSelected] = React.useState<Option[]>(value || []);\n const [options, setOptions] = React.useState<GroupOption>(\n transToGroupOption(arrayDefaultOptions, groupBy)\n );\n const [inputValue, setInputValue] = React.useState(\"\");\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500);\n\n React.useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current!,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected]\n );\n\n const handleUnselect = React.useCallback(\n (option: Option) => {\n const newOptions = selected.filter((s) => s.value !== option.value);\n setSelected(newOptions);\n onChange?.(newOptions);\n },\n [onChange, selected]\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current;\n if (input) {\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n if (input.value === \"\" && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1];\n if (!lastSelectOption?.fixed && lastSelectOption) {\n handleUnselect(lastSelectOption);\n }\n }\n }\n if (e.key === \"Escape\") {\n input.blur();\n setOpen(false);\n }\n }\n },\n [handleUnselect, selected]\n );\n\n useEffect(() => {\n if (value) {\n setSelected(value);\n }\n }, [value]);\n\n useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return;\n }\n const newOption = transToGroupOption(arrayOptions || [], groupBy);\n if (JSON.stringify(newOption) !== JSON.stringify(options)) {\n setOptions(newOption);\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options]);\n\n useEffect(() => {\n /** sync search */\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n };\n\n const exec = async () => {\n if (!onSearchSync || !open) {\n return;\n }\n\n if (triggerSearchOnFocus) {\n doSearchSync();\n }\n\n if (debouncedSearchTerm) {\n doSearchSync();\n }\n };\n\n void exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n useEffect(() => {\n /** async search */\n const doSearch = async () => {\n setIsLoading(true);\n const res = await onSearch?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n setIsLoading(false);\n };\n\n const exec = async () => {\n if (!onSearch || !open) {\n return;\n }\n\n if (triggerSearchOnFocus) {\n await doSearch();\n }\n\n if (debouncedSearchTerm) {\n await doSearch();\n }\n };\n\n void exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n const EmptyItem = () => {\n if (emptyIndicator) {\n return emptyIndicator;\n }\n return null;\n };\n\n const selectables = React.useMemo<GroupOption>(\n () => removePickedOption(options, selected),\n [options, selected]\n );\n\n const commandFilter = React.useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter;\n }\n\n if (creatable) {\n return (value: string, search: string) => {\n return value.toLowerCase().includes(search.toLowerCase()) ? 1 : -1;\n };\n }\n return undefined;\n }, [creatable, commandProps?.filter]);\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over) {\n return;\n }\n\n if (active.id !== over.id) {\n const oldIndex = selected.findIndex((item) => item.value === active.id);\n const newIndex = selected.findIndex((item) => item.value === over.id);\n\n const newSelected = arrayMove(selected, oldIndex, newIndex);\n setSelected(newSelected);\n onChange?.(newSelected);\n }\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <div\n className={cn(\n \"min-h-10 rounded-md border border-input text-base ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 md:text-sm\",\n {\n \"px-1 py-1\": selected.length !== 0,\n \"cursor-text\": !disabled && selected.length !== 0,\n },\n className\n )}\n onClick={() => {\n if (disabled) {\n return;\n }\n inputRef?.current?.focus();\n }}\n >\n <div className=\"relative flex flex-wrap items-center gap-1\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={selected.map((s) => s.value)}\n strategy={horizontalListSortingStrategy}\n >\n {selected.map((option) => (\n <SortableBadge\n key={option.value}\n option={option}\n disabled={disabled}\n onUnselect={handleUnselect}\n badgeClassName={badgeClassName}\n />\n ))}\n </SortableContext>\n </DndContext>\n\n <Button\n variant=\"ghost\"\n onClick={() => {\n setSelected(selected.filter((s) => s.fixed));\n onChange?.(selected.filter((s) => s.fixed));\n }}\n className={cn(\n \"absolute right-0 h-6 w-6 p-0\",\n (hideClearAllButton ||\n disabled ||\n selected.length < 1 ||\n selected.filter((s) => s.fixed).length ===\n selected.length) &&\n \"hidden\"\n )}\n >\n <X />\n </Button>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\" align=\"start\">\n <Command\n {...commandProps}\n shouldFilter={\n commandProps?.shouldFilter !== undefined\n ? commandProps.shouldFilter\n : !onSearch\n }\n filter={commandFilter()}\n >\n <CommandInput placeholder=\"Search city...\" />\n <CommandList>\n {isLoading ? (\n loadingIndicator\n ) : (\n <>\n {EmptyItem()}\n\n {!selectFirstItem && (\n <CommandItem value=\"-\" className=\"hidden\" />\n )}\n {Object.entries(selectables).map(([key, dropdowns]) => (\n <CommandGroup\n key={key}\n heading={key}\n className=\"h-full overflow-auto\"\n >\n {dropdowns.map((option) => (\n <CommandItem\n key={option.value}\n value={option.label}\n disabled={option.disable}\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length);\n return;\n }\n setInputValue(\"\");\n const newOptions = [...selected, option];\n setSelected(newOptions);\n onChange?.(newOptions);\n }}\n className={cn(\n \"cursor-pointer\",\n option.disable &&\n \"cursor-default text-muted-foreground\"\n )}\n >\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nMultipleSelector.displayName = \"MultipleSelector\";\nexport default MultipleSelector;\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\n\nexport function useColumnNames() {\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const availableFields = getColumnNames();\n\n return availableFields;\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { PivotTableSettings } from \"./definition\";\nimport { useColumnNames } from \"./useColumnNames\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\n\nconst AGGREGATION_OPTIONS = [\n { label: \"Sum\", value: \"sum\" },\n { label: \"Count\", value: \"count\" },\n { label: \"Average\", value: \"avg\" },\n { label: \"Min\", value: \"min\" },\n { label: \"Max\", value: \"max\" },\n { label: \"Median\", value: \"median\" },\n { label: \"Mode\", value: \"mode\" },\n { label: \"StdDev\", value: \"stddev\" },\n { label: \"Variance\", value: \"variance\" },\n { label: \"Count Unique\", value: \"countUnique\" },\n { label: \"Single Value\", value: \"singleValue\" },\n] as const;\n\nexport function PivotTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<PivotTableSettings>) {\n const availableFields = useColumnNames();\n\n const fieldOptions = availableFields.map((f) => ({\n label: f,\n value: f,\n }));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Row Fields</Label>\n <div className=\"max-w-[400px]\">\n <MultiSelect\n options={fieldOptions}\n value={settings.rowFields.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n rowFields: values.map((v) => v.value),\n })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"max-w-[400px]\">\n <FieldSelector\n label=\"Column Field\"\n value={settings.columnField}\n onChange={(value) =>\n onSettingsChange({ ...settings, columnField: value })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Value Fields</Label>\n <div className=\"max-w-[400px] space-y-2\">\n {settings.valueFields.map((valueField, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <ComboBox\n options={fieldOptions}\n value={fieldOptions.find((f) => f.value === valueField.field)}\n onChange={(option) => {\n const newValueFields = [...settings.valueFields];\n newValueFields[index] = {\n ...valueField,\n field: option?.value || valueField.field,\n };\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n optionToString={(option) => option.label}\n />\n </div>\n <div className=\"flex-1\">\n <ComboBox\n options={AGGREGATION_OPTIONS}\n value={AGGREGATION_OPTIONS.find(\n (o) => o.value === valueField.aggregation\n )}\n onChange={(option) => {\n if (!option) {\n return;\n }\n const newValueFields = [...settings.valueFields];\n newValueFields[index] = {\n ...valueField,\n aggregation: option.value,\n };\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n optionToString={(option) => option.label}\n />\n </div>\n <button\n className=\"p-2 hover:bg-gray-100 rounded\"\n onClick={() => {\n const newValueFields = settings.valueFields.filter(\n (_, i) => i !== index\n );\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n >\n ×\n </button>\n </div>\n ))}\n <button\n className=\"text-sm text-blue-600 hover:text-blue-800\"\n onClick={() => {\n onSettingsChange({\n ...settings,\n valueFields: [\n ...settings.valueFields,\n {\n field: availableFields[0],\n aggregation: \"count\",\n },\n ],\n });\n }}\n >\n + Add Value Field\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { ValueFilter } from \"@/types/FilterTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Table } from \"lucide-react\";\n\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { PivotTable } from \"./PivotTable\";\nimport { PivotTableSettingsPanel } from \"./PivotTableSettingsPanel\";\n\nexport interface PivotTableSettings extends BaseChartSettings {\n type: \"pivot\";\n rowFields: string[];\n columnField: string;\n valueFields: Array<{\n field: string;\n aggregation:\n | \"sum\"\n | \"count\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"median\"\n | \"mode\"\n | \"stddev\"\n | \"variance\"\n | \"countUnique\"\n | \"singleValue\";\n formula?: string;\n label?: string;\n }>;\n showTotals: {\n row: boolean;\n column: boolean;\n grand: boolean;\n };\n dateBinning?: {\n field: string;\n type: \"day\" | \"month\" | \"year\";\n };\n}\n\nexport const pivotTableDefinition: ChartDefinition<PivotTableSettings> = {\n type: \"pivot\",\n name: \"Pivot Table\",\n description: \"Interactive pivot table for data analysis\",\n icon: Table,\n\n component: PivotTable,\n settingsPanel: PivotTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"pivot\",\n title: \"Pivot Table\",\n layout,\n margin: {},\n rowFields: [],\n columnField: \"\",\n valueFields: [{ field: \"\", aggregation: \"count\" }],\n showTotals: {\n row: true,\n column: true,\n grand: true,\n },\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return (\n settings.rowFields.length > 0 ||\n settings.columnField !== \"\" ||\n settings.valueFields.length > 0\n );\n },\n\n getFilterFunction: (\n settings: PivotTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Get all value filters for row and column fields\n const rowFilters = settings.filters.filter(\n (f): f is ValueFilter =>\n f.type === \"value\" && settings.rowFields.includes(f.field)\n );\n const columnFilters = settings.filters.filter(\n (f): f is ValueFilter =>\n f.type === \"value\" && f.field === settings.columnField\n );\n\n const noMatchingFilters =\n rowFilters.length === 0 && columnFilters.length === 0;\n\n return (d: IdType) => {\n if (noMatchingFilters) {\n return true;\n }\n\n // Check if the data point matches all active row filters\n const matchesRowFilters = rowFilters.some((filter) => {\n const dataHash = fieldGetter(filter.field);\n return applyFilter(dataHash[d], filter);\n });\n\n // Check if the data point matches all active column filters\n const matchesColumnFilters = columnFilters.some((filter) => {\n const dataHash = fieldGetter(filter.field);\n return applyFilter(dataHash[d], filter);\n });\n\n // if there are only row filters, return true if any row filter matches\n if (columnFilters.length === 0) {\n return matchesRowFilters;\n }\n\n // if there are only column filters, return true if any column filter matches\n if (rowFilters.length === 0) {\n return matchesColumnFilters;\n }\n\n // if there are both row and column filters, return true if any row or column filter matches\n return matchesRowFilters && matchesColumnFilters;\n };\n },\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div className=\"relative w-full overflow-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-muted-foreground h-10 px-2 text-left align-middle font-medium [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-0.5 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","export interface FilterBase {\n type: string;\n field: string;\n}\n\nexport interface ValueFilter extends FilterBase {\n type: \"value\";\n values: Array<datum>;\n}\n\nexport interface RangeFilter extends FilterBase {\n type: \"range\";\n min?: number;\n max?: number;\n}\n\nexport interface TextFilter extends FilterBase {\n type: \"text\";\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\";\n value: string;\n}\n\nexport type Filter = ValueFilter | RangeFilter | TextFilter;\n\nexport interface ChartFilters {\n filters: Filter[];\n}\n\nexport type datum = string | number | boolean | undefined;\n\n// Helper type guards\nexport const isValueFilter = (filter: Filter): filter is ValueFilter => {\n return filter.type === \"value\";\n};\n\nexport const isRangeFilter = (filter: Filter): filter is RangeFilter => {\n return filter.type === \"range\";\n};\n\nexport const isTextFilter = (filter: Filter): filter is TextFilter => {\n return filter.type === \"text\";\n};\n","import { TableBody, TableCell, TableRow } from \"@/components/ui/table\";\nimport { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\n\nimport { isTextFilter } from \"@/types/FilterTypes\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableBodyProps {\n settings: DataTableSettings;\n}\n\n// Helper function to check if a value is numeric\nfunction isNumeric(value: any): boolean {\n if (typeof value === \"number\") {\n return true;\n }\n if (typeof value !== \"string\") {\n return false;\n }\n return !isNaN(Number(value)) && !isNaN(parseFloat(value));\n}\n\n// Helper function to compare values with natural sort\nfunction compareValues(a: any, b: any): number {\n // Handle null/undefined values\n if (a === null || a === undefined) {\n return 1;\n }\n if (b === null || b === undefined) {\n return -1;\n }\n if (a === b) {\n return 0;\n }\n\n // Convert to strings for comparison if not numeric\n const aStr = String(a);\n const bStr = String(b);\n\n // If both values are numeric, compare as numbers\n if (isNumeric(a) && isNumeric(b)) {\n return Number(a) - Number(b);\n }\n\n // For strings, use localeCompare for natural sort\n return aStr.localeCompare(bStr);\n}\n\n// Helper function to check if a row matches the global search\nfunction matchesGlobalSearch(\n row: Record<string, any>,\n searchTerm: string\n): boolean {\n if (!searchTerm) {\n return true;\n }\n const searchLower = searchTerm.toLowerCase();\n\n return Object.values(row).some((value) => {\n if (value === null || value === undefined) {\n return false;\n }\n const strValue = String(value).toLowerCase();\n return strValue.includes(searchLower);\n });\n}\n\nexport function DataTableBody({ settings }: DataTableBodyProps) {\n const {\n pageSize,\n currentPage,\n sortBy,\n sortDirection,\n filters,\n globalSearch,\n } = settings;\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: IdType; [key: string]: any } => row !== undefined\n ) || [];\n\n // Apply global search\n const searchFilteredData = globalSearch\n ? filteredData.filter((row) => matchesGlobalSearch(row, globalSearch))\n : filteredData;\n\n // Apply column filters\n const filteredByColumns = searchFilteredData.filter((row) => {\n // Get all text filters\n const textFilters = filters.filter(isTextFilter);\n\n // If no text filters, return true\n if (textFilters.length === 0) {\n return true;\n }\n\n // Check if row matches all text filters\n return textFilters.every((filter) => {\n const cellValue = row[filter.field];\n if (cellValue === null || cellValue === undefined) {\n return false;\n }\n\n const value = String(cellValue).toLowerCase();\n const filterValue = filter.value.toLowerCase();\n\n switch (filter.operator) {\n case \"contains\":\n return value.includes(filterValue);\n case \"equals\":\n return value === filterValue;\n case \"startsWith\":\n return value.startsWith(filterValue);\n case \"endsWith\":\n return value.endsWith(filterValue);\n default:\n return true;\n }\n });\n });\n\n // Sort data if sortBy is set\n const sortedData = sortBy\n ? [...filteredByColumns].sort((a, b) => {\n const aValue = a[sortBy];\n const bValue = b[sortBy];\n const comparison = compareValues(aValue, bValue);\n return sortDirection === \"asc\" ? comparison : -comparison;\n })\n : filteredByColumns;\n\n // Calculate pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n // Get paginated data\n const paginatedData = sortedData.slice(startIndex, endIndex);\n\n return (\n <TableBody>\n {paginatedData.map((row) => (\n <TableRow key={String(row.__ID)}>\n {settings.columns.map((column) => (\n <TableCell key={column.id} style={{ width: column.width }}>\n {row[column.id]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground aria-invalid:border-destructive ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import { Input } from \"@/components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Button } from \"@/components/ui/button\";\nimport { X } from \"lucide-react\";\nimport { useState } from \"react\";\n\ninterface ColumnFilterProps {\n columnId: string;\n columnLabel: string;\n value: string;\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\";\n onChange: (\n columnId: string,\n value: string,\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\"\n ) => void;\n onClear: () => void;\n}\n\nexport function ColumnFilter({\n columnId,\n columnLabel,\n value,\n operator,\n onChange,\n onClear,\n}: ColumnFilterProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={operator}\n onValueChange={(value: typeof operator) =>\n onChange(columnId, value, value)\n }\n >\n <SelectTrigger className=\"h-8 w-[100px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"contains\">Contains</SelectItem>\n <SelectItem value=\"equals\">Equals</SelectItem>\n <SelectItem value=\"startsWith\">Starts with</SelectItem>\n <SelectItem value=\"endsWith\">Ends with</SelectItem>\n </SelectContent>\n </Select>\n <Input\n placeholder={`Filter ${columnLabel}...`}\n value={value}\n onChange={(e) => onChange(columnId, e.target.value, operator)}\n className=\"h-8 w-[200px]\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={onClear}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { TableHead, TableHeader, TableRow } from \"@/components/ui/table\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Filter, TextFilter } from \"@/types/FilterTypes\";\nimport { ChevronDown, ChevronUp, Filter as FilterIcon } from \"lucide-react\";\nimport React, { useState } from \"react\";\nimport { ColumnFilter } from \"./components/ColumnFilter\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableHeaderProps {\n settings: DataTableSettings;\n}\n\nexport function DataTableHeader({ settings }: DataTableHeaderProps) {\n const { columns, sortBy, sortDirection, filters } = settings;\n const updateChart = useDataLayer((state) => state.updateChart);\n const [activeFilter, setActiveFilter] = useState<string | null>(null);\n const [resizingColumn, setResizingColumn] = useState<string | null>(null);\n const [tempWidths, setTempWidths] = useState<Record<string, number>>({});\n\n const handleSort = (columnId: string) => {\n if (sortBy === columnId) {\n // Toggle sort direction\n updateChart(settings.id, {\n sortDirection: sortDirection === \"asc\" ? \"desc\" : \"asc\",\n });\n } else {\n // Set new sort column\n updateChart(settings.id, {\n sortBy: columnId,\n sortDirection: \"asc\",\n });\n }\n };\n\n const handleFilterChange = (\n columnId: string,\n value: string,\n operator: TextFilter[\"operator\"]\n ) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column) {\n return;\n }\n\n // Create new filters array with updated text filter\n const newFilters = filters.filter(\n (f: Filter) => f.type !== \"text\" || f.field !== column.field\n );\n\n if (value) {\n const textFilter: TextFilter = {\n type: \"text\",\n field: column.field,\n operator,\n value,\n };\n newFilters.push(textFilter);\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n const handleFilterClear = (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column) {\n return;\n }\n\n // Remove text filter for this column\n const newFilters = filters.filter(\n (f: Filter) => f.type !== \"text\" || f.field !== column.field\n );\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n const handleResizeStart = (e: React.MouseEvent, columnId: string) => {\n e.preventDefault();\n setResizingColumn(columnId);\n\n const startX = e.pageX;\n const column = columns.find((col) => col.id === columnId);\n const startWidth = column?.width || 0;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingColumn) {\n return;\n }\n\n const diff = e.pageX - startX;\n const newWidth = Math.max(50, startWidth + diff); // Minimum width of 50px\n setTempWidths((prev) => ({ ...prev, [columnId]: newWidth }));\n };\n\n const handleMouseUp = () => {\n if (!resizingColumn) {\n return;\n }\n\n const newWidth = tempWidths[columnId];\n if (newWidth) {\n const newColumns = columns.map((col) =>\n col.id === columnId ? { ...col, width: newWidth } : col\n );\n updateChart(settings.id, { columns: newColumns });\n }\n\n setResizingColumn(null);\n setTempWidths({});\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n };\n\n return (\n <TableHeader>\n <TableRow>\n {columns.map((column) => {\n const textFilter = filters.find(\n (f: Filter): f is TextFilter =>\n f.type === \"text\" && f.field === column.field\n );\n\n return (\n <TableHead\n key={column.id}\n className=\"relative select-none\"\n style={{\n width:\n resizingColumn === column.id\n ? tempWidths[column.id] || column.width\n : column.width,\n }}\n >\n <div\n className=\"flex items-center gap-2 cursor-pointer\"\n onClick={() => handleSort(column.id)}\n >\n {column.field}\n {sortBy === column.id &&\n (sortDirection === \"asc\" ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown className=\"h-4 w-4\" />\n ))}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"flex items-center gap-2\"\n onClick={() =>\n setActiveFilter(\n activeFilter === column.id ? null : column.id\n )\n }\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n {activeFilter === column.id && (\n <ColumnFilter\n columnId={column.id}\n columnLabel={column.id}\n value={textFilter?.value || \"\"}\n operator={textFilter?.operator || \"contains\"}\n onChange={handleFilterChange}\n onClear={() => handleFilterClear(column.id)}\n />\n )}\n </div>\n <div\n className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-primary\"\n onMouseDown={(e) => handleResizeStart(e, column.id)}\n />\n </TableHead>\n );\n })}\n </TableRow>\n </TableHeader>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTablePaginationProps {\n settings: DataTableSettings;\n}\n\nconst PAGE_SIZE_OPTIONS = [\n { label: \"10 rows\", value: 10 },\n { label: \"25 rows\", value: 25 },\n { label: \"50 rows\", value: 50 },\n { label: \"100 rows\", value: 100 },\n];\n\nexport function DataTablePagination({ settings }: DataTablePaginationProps) {\n const { pageSize, currentPage } = settings;\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n const updateChart = useDataLayer((state) => state.updateChart);\n\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: number; [key: string]: any } => row !== undefined\n ) || [];\n\n const totalPages = Math.ceil(filteredData.length / pageSize);\n\n const handlePageSizeChange = (value: string) => {\n const newPageSize = parseInt(value, 10);\n const newCurrentPage = Math.min(\n Math.ceil((currentPage * pageSize) / newPageSize),\n Math.ceil(filteredData.length / newPageSize)\n );\n updateChart(settings.id, {\n pageSize: newPageSize,\n currentPage: newCurrentPage,\n });\n };\n\n const handlePageChange = (newPage: number) => {\n if (newPage >= 1 && newPage <= totalPages) {\n updateChart(settings.id, { currentPage: newPage });\n }\n };\n\n return (\n <div className=\"flex items-center justify-between px-2 py-4\">\n <div className=\"flex items-center space-x-2\">\n <p className=\"text-sm text-gray-700\">{filteredData.length} rows</p>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Select\n value={pageSize.toString()}\n onValueChange={handlePageSizeChange}\n >\n <SelectTrigger className=\"h-8 w-[100px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PAGE_SIZE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <p className=\"text-sm text-gray-700\">\n Page {currentPage} of {totalPages}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Download, Search } from \"lucide-react\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableToolbarProps {\n settings: DataTableSettings;\n}\n\nexport function DataTableToolbar({ settings }: DataTableToolbarProps) {\n const updateChart = useDataLayer((state) => state.updateChart);\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n\n const handleSearch = (value: string) => {\n updateChart(settings.id, {\n ...settings,\n globalSearch: value,\n currentPage: 1, // Reset to first page when searching\n });\n };\n\n const handleExport = () => {\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: number; [key: string]: any } =>\n row !== undefined\n ) || [];\n\n // Apply global search if present\n const searchFilteredData = settings.globalSearch\n ? filteredData.filter((row) => {\n const searchLower = settings.globalSearch.toLowerCase();\n return Object.values(row).some((value) => {\n if (value === null || value === undefined) {\n return false;\n }\n const strValue = String(value).toLowerCase();\n return strValue.includes(searchLower);\n });\n })\n : filteredData;\n\n // Create CSV content\n const headers = settings.columns.map((col) => col.field).join(\",\");\n const rows = searchFilteredData.map((row) =>\n settings.columns\n .map((col) => {\n const value = row[col.id];\n // Escape commas and quotes in the value\n if (\n typeof value === \"string\" &&\n (value.includes(\",\") || value.includes('\"'))\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n })\n .join(\",\")\n );\n\n const csvContent = [headers, ...rows].join(\"\\n\");\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.setAttribute(\"href\", url);\n link.setAttribute(\n \"download\",\n `table-export-${new Date().toISOString()}.csv`\n );\n link.style.visibility = \"hidden\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n return (\n <div className=\"flex items-center justify-between p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n className=\"pl-8\"\n value={settings.globalSearch}\n onChange={(e) => handleSearch(e.target.value)}\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-2\"\n onClick={handleExport}\n >\n <Download className=\"h-4 w-4\" />\n Export\n </Button>\n </div>\n </div>\n );\n}\n","import { BaseChartProps } from \"@/types/ChartTypes\";\nimport { DataTableBody } from \"./DataTableBody\";\nimport { DataTableHeader } from \"./DataTableHeader\";\nimport { DataTablePagination } from \"./DataTablePagination\";\nimport { DataTableToolbar } from \"./DataTableToolbar\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableProps extends BaseChartProps {\n settings: DataTableSettings;\n}\n\nexport function DataTable({ settings, width, height }: DataTableProps) {\n return (\n <div className=\"flex flex-col h-full w-full\">\n <DataTableToolbar settings={settings} />\n <div\n className=\"flex-1 overflow-auto relative\"\n style={{ maxHeight: `${height - 100}px` }} // Subtract toolbar and pagination height\n >\n <table className=\"w-full border-collapse\">\n <DataTableHeader settings={settings} />\n <DataTableBody settings={settings} />\n </table>\n </div>\n <DataTablePagination settings={settings} />\n </div>\n );\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { useColumnNames } from \"../PivotTable/useColumnNames\";\nimport { DataTableSettings } from \"./definition\";\n\nconst PAGE_SIZE_OPTIONS = [\n { label: \"10 rows\", value: 10 },\n { label: \"25 rows\", value: 25 },\n { label: \"50 rows\", value: 50 },\n { label: \"100 rows\", value: 100 },\n] as const;\n\nexport function DataTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<DataTableSettings>) {\n const availableFields = useColumnNames();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Columns</Label>\n <MultiSelect\n options={availableFields.map((f) => ({\n label: f,\n value: f,\n }))}\n value={settings.columns.map((col) => ({\n label: col.field,\n value: col.field,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n columns: values.map((v) => ({\n id: v.value,\n field: v.value,\n })),\n })\n }\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Page Size</Label>\n <ComboBox\n options={PAGE_SIZE_OPTIONS}\n value={PAGE_SIZE_OPTIONS.find((o) => o.value === settings.pageSize)}\n onChange={(option) =>\n onSettingsChange({\n ...settings,\n pageSize: option?.value || 25,\n })\n }\n optionToString={(option) => option.label}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Global Search</Label>\n <Input\n placeholder=\"Search all columns...\"\n value={settings.globalSearch}\n onChange={(e) =>\n onSettingsChange({\n ...settings,\n globalSearch: e.target.value,\n })\n }\n />\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Table } from \"lucide-react\";\n\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DataTable } from \"./DataTable\";\nimport { DataTableSettingsPanel } from \"./DataTableSettingsPanel\";\n\nexport interface DataTableSettings extends BaseChartSettings {\n type: \"data-table\";\n columns: Array<{\n id: string;\n field: string;\n width?: number;\n }>;\n pageSize: number;\n currentPage: number;\n sortBy?: string;\n sortDirection: \"asc\" | \"desc\";\n filters: Filter[];\n globalSearch: string;\n tableHeight: number;\n}\n\nexport const dataTableDefinition: ChartDefinition<DataTableSettings> = {\n type: \"data-table\",\n name: \"Data Table\",\n description: \"Interactive data table with sorting and filtering\",\n icon: Table,\n\n component: DataTable,\n settingsPanel: DataTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"data-table\",\n title: \"Data Table\",\n layout,\n margin: {},\n columns: [],\n pageSize: 25,\n currentPage: 1,\n sortDirection: \"asc\",\n filters: [],\n globalSearch: \"\",\n tableHeight: 400,\n }),\n\n validateSettings: (settings) => {\n return settings.columns.length > 0;\n },\n\n getFilterFunction: (\n settings: DataTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // If no filters are active, return true\n if (settings.filters.length === 0) {\n return (d: IdType) => true;\n }\n\n // Create filter functions for each active filter\n const filterFunctions = settings.filters.map((filter) => {\n const column = settings.columns.find((col) => col.field === filter.field);\n if (!column) {\n return () => true;\n }\n\n const dataHash = fieldGetter(column.field);\n\n return (d: IdType) => {\n const value = dataHash[d];\n if (value === undefined) {\n return false;\n }\n\n if (applyFilter(value, filter)) {\n return true;\n }\n\n return false;\n };\n });\n\n // Combine all filter functions with AND logic\n return (d: IdType) => filterFunctions.every((fn) => fn(d));\n },\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n\nexport { Progress };\n","import { datum } from \"@/types/ChartTypes\";\n\nexport type DataType = \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n\nexport function detectColumnType(columnData: {\n [key: number]: datum;\n}): DataType {\n // Convert object to array for easier processing\n const values = Object.values(columnData);\n\n // Skip null/undefined values for type detection\n const nonNullValues = values.filter((v) => v != null);\n if (nonNullValues.length === 0) {\n return \"categorical\";\n }\n\n // Check if all values are boolean\n const booleanValues = new Set([\"true\", \"false\", true, false]);\n if (nonNullValues.every((v) => booleanValues.has(v as string | boolean))) {\n return \"boolean\";\n }\n\n // Check if all values are numbers or can be converted to numbers\n if (nonNullValues.every((v) => !isNaN(Number(v)))) {\n return \"numeric\";\n }\n\n // Check if all values are valid dates\n if (nonNullValues.every((v) => !isNaN(Date.parse(String(v))))) {\n return \"datetime\";\n }\n\n // Default to categorical if no other type matches\n return \"categorical\";\n}\n","import { datum } from \"@/types/ChartTypes\";\n\nexport interface SamplingOptions {\n sampleSize?: number;\n method: \"random\" | \"systematic\";\n seed?: number;\n}\n\nexport function sampleData(\n data: { [key: number]: datum },\n options: SamplingOptions = { method: \"random\", sampleSize: 1000 }\n): { [key: number]: datum } {\n const values = Object.entries(data);\n const totalSize = values.length;\n const sampleSize = Math.min(options.sampleSize || 1000, totalSize);\n\n if (options.method === \"systematic\") {\n const step = Math.floor(totalSize / sampleSize);\n return Object.fromEntries(\n values.filter((_, index) => index % step === 0).slice(0, sampleSize)\n );\n }\n\n // Random sampling\n const shuffled = [...values];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n\n return Object.fromEntries(shuffled.slice(0, sampleSize));\n}\n\nexport function estimateStatisticalSignificance(\n sampleSize: number,\n populationSize: number\n): {\n marginOfError: number;\n confidenceInterval: [number, number];\n} {\n // Using standard error formula for finite populations\n const z = 1.96; // z-score for 95% confidence level\n const p = 0.5; // assuming maximum variance\n const marginOfError =\n z *\n Math.sqrt((p * (1 - p)) / sampleSize) *\n Math.sqrt((populationSize - sampleSize) / (populationSize - 1));\n\n return {\n marginOfError,\n confidenceInterval: [0.5 - marginOfError, 0.5 + marginOfError],\n };\n}\n","import { datum } from \"@/types/ChartTypes\";\nimport { DataType } from \"./dataTypeDetection\";\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ninterface ColumnStatistics {\n dataType: DataType;\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\nexport function calculateColumnStatistics(\n columnData: { [key: number]: datum },\n dataType: DataType\n): ColumnStatistics {\n const values = Object.values(columnData);\n const totalCount = values.length;\n const nullCount = values.filter((v) => v == null).length;\n const uniqueValues = new Set(values);\n const uniqueCount = uniqueValues.size;\n\n if (dataType === \"numeric\") {\n const numericValues = values\n .filter((v) => v != null)\n .map((v) => Number(v))\n .filter((v) => !isNaN(v));\n\n if (numericValues.length === 0) {\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n };\n }\n\n const sorted = [...numericValues].sort((a, b) => a - b);\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n const sum = numericValues.reduce((a, b) => a + b, 0);\n const mean = sum / numericValues.length;\n const median =\n sorted.length % 2 === 0\n ? (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2\n : sorted[Math.floor(sorted.length / 2)];\n const squaredDiffs = numericValues.map((v) => Math.pow(v - mean, 2));\n const variance =\n squaredDiffs.reduce((a, b) => a + b, 0) / numericValues.length;\n const stdDev = Math.sqrt(variance);\n\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n statistics: {\n min,\n max,\n mean,\n median,\n stdDev,\n },\n };\n } else {\n // For non-numeric types, calculate category statistics\n const distribution: Record<string, number> = {};\n values.forEach((v) => {\n const key = String(v);\n distribution[key] = (distribution[key] || 0) + 1;\n });\n\n const topValues = Object.entries(distribution)\n .map(([value, count]) => ({ value, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n categories: {\n topValues,\n distribution,\n },\n };\n }\n}\n","import { Calendar, Hash, HelpCircle, ToggleLeft, Type } from \"lucide-react\";\nimport { DataType } from \"../utils/dataTypeDetection\";\n\ninterface DataTypeIconProps {\n type: DataType | \"unknown\";\n}\n\nexport function DataTypeIcon({ type }: DataTypeIconProps) {\n const iconMap: Record<\n DataType | \"unknown\",\n { icon: typeof Hash; label: string }\n > = {\n numeric: { icon: Hash, label: \"Numeric\" },\n datetime: { icon: Calendar, label: \"Date/Time\" },\n categorical: { icon: Type, label: \"Categorical\" },\n boolean: { icon: ToggleLeft, label: \"Boolean\" },\n unknown: { icon: HelpCircle, label: \"Unknown\" },\n };\n\n const { icon: Icon, label } = iconMap[type];\n\n return <Icon className=\"h-4 w-4\" />;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-w-sm rounded-md px-3 py-1.5 text-xs\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { Badge } from \"@/components/ui/badge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { ArrowDown, ArrowUp, Hash } from \"lucide-react\";\nimport { LucideIcon } from \"lucide-react\";\n\ninterface StatBadgeProps {\n type: \"min\" | \"max\" | \"common\";\n value: string | number;\n count?: number;\n icon?: LucideIcon;\n}\n\nconst defaultIcons: Record<StatBadgeProps[\"type\"], LucideIcon> = {\n min: ArrowDown,\n max: ArrowUp,\n common: Hash,\n};\n\nexport function StatBadge({\n type,\n value,\n count,\n icon: IconProp,\n}: StatBadgeProps) {\n const Icon = IconProp || defaultIcons[type];\n const tooltipContent = count !== undefined ? `Count: ${count}` : value;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Icon className=\"h-3 w-3\" />\n <span className=\"truncate max-w-[100px]\">{value}</span>\n </Badge>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartType } from \"@/types/ChartTypes\";\n\nexport function useCreateCharts() {\n const addChart = useDataLayer((s) => s.addChart);\n\n const createChart = (type: ChartType, field: string) => {\n const layout = {\n x: 5,\n y: 0,\n w: 6,\n h: 4,\n };\n\n const definition = getChartDefinition(type);\n if (!definition) {\n throw new Error(`Chart type ${type} not registered`);\n }\n\n const settings = definition.createDefaultSettings(layout, field);\n addChart(settings);\n };\n\n return { createChart };\n}\n","import { Button } from \"@/components/ui/button\";\nimport { BarChart, LineChart, ScatterChart, Table2 } from \"lucide-react\";\nimport { useCreateCharts } from \"@/hooks/useCreateCharts\";\n\ninterface ChartActionsProps {\n columnName: string;\n dataType: \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n}\n\nexport function ChartActions({ columnName, dataType }: ChartActionsProps) {\n const { createChart } = useCreateCharts();\n\n return (\n <div className=\"flex gap-1\">\n {dataType === \"categorical\" && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"row\", columnName)}\n >\n <BarChart className=\"h-4 w-4 rotate-90\" />\n </Button>\n )}\n\n {dataType === \"numeric\" && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"bar\", columnName)}\n >\n <BarChart className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"scatter\", columnName)}\n >\n <ScatterChart className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n\n {(dataType === \"categorical\" || dataType === \"datetime\") && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"pivot\", columnName)}\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { ArrowUpDown, AlertCircle } from \"lucide-react\";\nimport { DataTypeIcon } from \"./DataTypeIcon\";\nimport { StatBadge } from \"./StatBadge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { ChartActions } from \"./ChartActions\";\nimport { DataType } from \"../utils/dataTypeDetection\";\n\ninterface ColumnSummary {\n name: string;\n dataType: DataType | \"unknown\";\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ninterface CompactSummaryTableProps {\n data: ColumnSummary[];\n onSort: (column: keyof ColumnSummary) => void;\n totalRows: number;\n}\n\nexport function CompactSummaryTable({\n data,\n onSort,\n totalRows,\n}: CompactSummaryTableProps) {\n return (\n <div className=\"rounded-md border\">\n <div className=\"flex items-center justify-between border-b px-4 py-2\">\n <span className=\"text-sm text-muted-foreground\">\n Rows available: {totalRows.toLocaleString()}\n </span>\n </div>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-24\"></TableHead>\n <TableHead>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n onClick={() => onSort(\"name\")}\n className=\"h-8 text-left font-medium\"\n >\n Column\n <ArrowUpDown className=\"ml-2 h-4 w-4\" />\n </Button>\n </div>\n </TableHead>\n <TableHead className=\"w-16\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <span>Count</span>\n </TooltipTrigger>\n <TooltipContent>\n <p>Unique values / Total values</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </TableHead>\n <TableHead>Stats</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((summary) => (\n <TableRow key={summary.name}>\n <TableCell>\n <div className=\"flex gap-1\">\n <ChartActions\n columnName={summary.name}\n dataType={\n summary.dataType === \"unknown\"\n ? \"categorical\"\n : summary.dataType\n }\n />\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <DataTypeIcon type={summary.dataType} />\n <span className=\"font-semibold\">{summary.name}</span>\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex items-center gap-1\">\n <span>{summary.uniqueCount}</span>\n {summary.nullCount > 0 && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <AlertCircle className=\"h-4 w-4 text-yellow-500\" />\n </TooltipTrigger>\n <TooltipContent>\n <p>{summary.nullCount} null values</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex gap-2\">\n {summary.statistics && (\n <>\n <StatBadge type=\"min\" value={summary.statistics.min} />\n <StatBadge type=\"max\" value={summary.statistics.max} />\n </>\n )}\n {summary.categories && summary.categories.topValues[0] && (\n <StatBadge\n type=\"common\"\n value={summary.categories.topValues[0].value}\n count={summary.categories.topValues[0].count}\n />\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Download, Loader2 } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { detectColumnType } from \"../../SummaryTable/utils/dataTypeDetection\";\nimport {\n estimateStatisticalSignificance,\n sampleData,\n} from \"../../SummaryTable/utils/samplingStrategy\";\nimport { calculateColumnStatistics } from \"../../SummaryTable/utils/statisticsCalculator\";\n\nimport { Slider } from \"@/components/ui/slider\";\nimport { toast } from \"sonner\";\nimport { DataType } from \"../../SummaryTable/utils/dataTypeDetection\";\nimport { CompactSummaryTable } from \"../../SummaryTable/components/CompactSummaryTable\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\n\ninterface ColumnSummary {\n name: string;\n dataType: DataType | \"unknown\";\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ntype SortConfig = {\n column: keyof ColumnSummary | null;\n direction: \"asc\" | \"desc\";\n};\n\n// Add this function before the SummaryTable component\nconst exportToCSV = (summaries: ColumnSummary[]) => {\n // Create CSV header\n const headers = [\n \"Column\",\n \"Type\",\n \"Total\",\n \"Unique\",\n \"Null\",\n \"Min\",\n \"Max\",\n \"Mean\",\n \"Median\",\n \"StdDev\",\n \"Top Values\",\n ];\n\n // Convert summaries to CSV rows\n const rows = summaries.map((summary) => {\n const stats = summary.statistics || ({} as NumericStatistics);\n const categories = summary.categories || ({} as CategoryStatistics);\n\n return [\n summary.name,\n summary.dataType,\n summary.totalCount,\n summary.uniqueCount,\n summary.nullCount,\n stats.min !== undefined ? stats.min.toFixed(2) : \"\",\n stats.max !== undefined ? stats.max.toFixed(2) : \"\",\n stats.mean !== undefined ? stats.mean.toFixed(2) : \"\",\n stats.median !== undefined ? stats.median.toFixed(2) : \"\",\n stats.stdDev !== undefined ? stats.stdDev.toFixed(2) : \"\",\n categories.topValues\n ? categories.topValues.map((v) => `${v.value}(${v.count})`).join(\"; \")\n : \"\",\n ];\n });\n\n // Combine headers and rows\n const csvContent = [\n headers.join(\",\"),\n ...rows.map((row) => row.map((cell) => `\"${cell}\"`).join(\",\")),\n ].join(\"\\n\");\n\n // Create and trigger download\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", \"summary_table.csv\");\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n toast.success(\"Summary table exported to CSV\");\n};\n\nexport function SummaryTable({ height }: BaseChartProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const [sortConfig, setSortConfig] = useState<SortConfig>({\n column: null,\n direction: \"asc\",\n });\n const [useSampling, setUseSampling] = useState(true);\n const [sampleSize, setSampleSize] = useState(1000);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingProgress, setProcessingProgress] = useState(0);\n\n // Progressive loading state\n const [processedColumns, setProcessedColumns] = useState<Set<string>>(\n new Set()\n );\n const [processingQueue, setProcessingQueue] = useState<string[]>([]);\n const [columnSummaryData, setColumnSummaryData] = useState<\n Record<string, ColumnSummary>\n >({});\n\n // Get total row count\n const totalRowCount = useCallback(() => {\n const firstColumn = getColumnNames()[0];\n return firstColumn ? Object.keys(getColumnData(firstColumn)).length : 0;\n }, [getColumnNames, getColumnData]);\n\n // Determine if sampling should be available\n const samplingAvailable = totalRowCount() > sampleSize;\n\n // Ensure sampling is disabled when not available\n useEffect(() => {\n if (!samplingAvailable && useSampling) {\n setUseSampling(false);\n }\n }, [samplingAvailable, useSampling]);\n\n const columnSummaries = useCallback(() => {\n const columnNames = getColumnNames();\n\n // Initialize processing queue if empty\n if (processingQueue.length === 0 && processedColumns.size === 0) {\n setProcessingQueue(columnNames);\n }\n\n return columnNames.map((columnName) => {\n // Return cached data if already processed\n if (columnSummaryData[columnName]) {\n return columnSummaryData[columnName];\n }\n\n // Return placeholder data for unprocessed columns\n return {\n name: columnName,\n dataType: \"unknown\" as const,\n totalCount: 0,\n uniqueCount: 0,\n nullCount: 0,\n };\n });\n }, [getColumnNames, processingQueue, processedColumns, columnSummaryData]);\n\n // Process columns progressively\n const processNextColumn = useCallback(async () => {\n if (processingQueue.length === 0 || isProcessing) {\n return;\n }\n\n setIsProcessing(true);\n const columnName = processingQueue[0];\n\n try {\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const columnData = getColumnData(columnName);\n const shouldUseSampling = useSampling && samplingAvailable;\n const sampledData = shouldUseSampling\n ? sampleData(columnData, { method: \"random\", sampleSize })\n : columnData;\n\n const dataType = detectColumnType(sampledData);\n const statistics = calculateColumnStatistics(sampledData, dataType);\n\n setColumnSummaryData((prev) => ({\n ...prev,\n [columnName]: {\n name: columnName,\n ...statistics,\n },\n }));\n\n setProcessedColumns((prev) => new Set([...prev, columnName]));\n setProcessingQueue((prev) => prev.slice(1));\n\n const progress =\n ((processedColumns.size + 1) /\n (processedColumns.size + processingQueue.length)) *\n 100;\n setProcessingProgress(progress);\n\n if (processingQueue.length === 1) {\n toast.success(\"Processing Complete\");\n }\n } catch (error) {\n toast.error(`Error processing column ${columnName}`);\n } finally {\n setIsProcessing(false);\n }\n }, [\n processingQueue,\n isProcessing,\n processedColumns,\n getColumnData,\n useSampling,\n sampleSize,\n samplingAvailable,\n ]);\n\n // Process columns when queue changes\n useEffect(() => {\n if (processingQueue.length > 0) {\n processNextColumn();\n }\n }, [processingQueue, processNextColumn]);\n\n const handleSampleSizeChange = useCallback(\n (value: number[]) => {\n setSampleSize(value[0]);\n // Reset processing state to reanalyze with new sample size\n setProcessedColumns(new Set());\n setProcessingQueue(getColumnNames());\n setColumnSummaryData({});\n setProcessingProgress(0);\n },\n [getColumnNames]\n );\n\n const significance = useMemo(() => {\n if (!useSampling) {\n return null;\n }\n return estimateStatisticalSignificance(sampleSize, totalRowCount());\n }, [useSampling, sampleSize, totalRowCount]);\n\n const sortedSummaries = useMemo(() => {\n const summaries = columnSummaries();\n if (!sortConfig.column) {\n return summaries;\n }\n\n return [...summaries].sort((a, b) => {\n const aValue = a[sortConfig.column as keyof ColumnSummary];\n const bValue = b[sortConfig.column as keyof ColumnSummary];\n\n if (aValue === bValue) {\n return 0;\n }\n if (aValue == null) {\n return 1;\n }\n if (bValue == null) {\n return -1;\n }\n\n // Handle different types of values\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n return sortConfig.direction === \"asc\"\n ? aValue - bValue\n : bValue - aValue;\n }\n\n // Convert to strings for comparison\n const aStr = String(aValue);\n const bStr = String(bValue);\n return sortConfig.direction === \"asc\"\n ? aStr.localeCompare(bStr)\n : bStr.localeCompare(aStr);\n });\n }, [columnSummaries, sortConfig]);\n\n const handleSort = (column: keyof ColumnSummary) => {\n setSortConfig((current) => ({\n column,\n direction:\n current.column === column && current.direction === \"asc\"\n ? \"desc\"\n : \"asc\",\n }));\n };\n\n return (\n <div className=\"space-y-4 overflow-auto\" style={{ height }}>\n <div className=\"space-y-4\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-4\">\n <div>\n {samplingAvailable && (\n <Badge variant={useSampling ? \"default\" : \"outline\"}>\n {useSampling ? \"Sampling Enabled\" : \"Full Dataset\"}\n </Badge>\n )}\n {!samplingAvailable && (\n <Badge variant=\"secondary\">\n Using Full Dataset ({totalRowCount()} rows)\n </Badge>\n )}\n\n {samplingAvailable && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setUseSampling(!useSampling);\n setProcessedColumns(new Set());\n setProcessingQueue(getColumnNames());\n setProcessingProgress(0);\n }}\n >\n Toggle Sampling\n </Button>\n )}\n </div>\n\n {useSampling && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n Sample Size: {sampleSize}\n </span>\n {significance && (\n <span className=\"text-sm text-muted-foreground\">\n Margin of Error:{\" \"}\n {(significance.marginOfError * 100).toFixed(2)}%\n </span>\n )}\n </div>\n <Slider\n value={[sampleSize]}\n min={100}\n max={10000}\n step={100}\n onValueChange={handleSampleSizeChange}\n />\n </div>\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => exportToCSV(sortedSummaries)}\n disabled={isProcessing || processingQueue.length > 0}\n >\n <Download className=\"mr-2 h-4 w-4\" />\n Export to CSV\n </Button>\n </div>\n\n {(isProcessing || processingQueue.length > 0) && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm text-muted-foreground\">\n Processing columns... {processedColumns.size} of{\" \"}\n {processedColumns.size + processingQueue.length}\n </span>\n </div>\n <Progress value={processingProgress} />\n </div>\n )}\n </div>\n\n <CompactSummaryTable\n data={sortedSummaries}\n onSort={handleSort}\n totalRows={totalRowCount()}\n />\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { SummaryTableSettings } from \"./definition\";\n\nexport function SummaryTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<SummaryTableSettings>) {\n // Summary table has no additional settings beyond the base settings\n return null;\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Info } from \"lucide-react\";\n\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { SummaryTable } from \"./SummaryTable\";\nimport { SummaryTableSettingsPanel } from \"./SummaryTableSettingsPanel\";\n\nexport interface SummaryTableSettings extends BaseChartSettings {\n type: \"summary\";\n // Summary table is a simple display of statistics\n // It inherits all base settings and doesn't need additional settings\n}\n\nexport const summaryTableDefinition: ChartDefinition<SummaryTableSettings> = {\n type: \"summary\",\n name: \"Summary Table\",\n description: \"Display summary statistics for your data\",\n icon: Info,\n\n component: SummaryTable,\n settingsPanel: SummaryTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"summary\",\n title: \"Summary Table\",\n layout,\n margin: {},\n }),\n\n validateSettings: (settings) => {\n // Summary table is always valid as it shows basic statistics\n return true;\n },\n\n getFilterFunction: (\n settings: SummaryTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Summary table doesn't support filtering\n return (d: IdType) => true;\n },\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 aria-invalid:outline-destructive/60 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/40 aria-invalid:ring-destructive/20 aria-invalid:border-destructive/60 dark:aria-invalid:border-destructive dark:aria-invalid:ring-destructive/50 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-[3px] aria-invalid:focus-visible:outline-none md:text-sm dark:aria-invalid:focus-visible:ring-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import { BaseChartProps } from \"@/types/ChartTypes\";\nimport { MarkdownSettings } from \"./definition\";\n\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useState } from \"react\";\nimport { Textarea } from \"@/components/ui/textarea.js\";\n\nexport const Markdown = ({\n settings,\n width,\n height,\n}: BaseChartProps<MarkdownSettings>) => {\n const updateChart = useDataLayer((s) => s.updateChart);\n const [localContent, setLocalContent] = useState<string>(settings.content);\n const isDirty = localContent !== settings.content;\n\n const handleChange = (value: string) => {\n setLocalContent(value);\n };\n\n const handleSave = () => {\n updateChart(settings.id, {\n ...settings,\n content: localContent,\n });\n };\n\n return (\n <div style={{ width, height }} className=\"flex flex-col\">\n <div className=\"flex-1 overflow-auto\">\n <Textarea value={localContent} onChange={handleChange as any} />\n </div>\n </div>\n );\n};\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { FileText } from \"lucide-react\";\nimport { Markdown } from \"./Markdown\";\n\nexport interface MarkdownSettings extends BaseChartSettings {\n type: \"markdown\";\n content: string;\n}\n\nexport const markdownDefinition: ChartDefinition<MarkdownSettings> = {\n type: \"markdown\",\n name: \"Markdown\",\n description: \"A markdown editor for rich text content\",\n icon: FileText,\n\n component: Markdown,\n settingsPanel: () => null,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"markdown\",\n content: \"\",\n layout,\n }),\n\n validateSettings: (settings) => {\n return settings.type === \"markdown\";\n },\n\n getFilterFunction: () => () => true, // No filtering for markdown\n};\n","import { BoxPlotSettings } from \"./definition\";\n\nexport interface BoxPlotStats {\n q1: number;\n median: number;\n q3: number;\n iqr: number;\n whiskerLow: number;\n whiskerHigh: number;\n outliers: number[];\n totalCount: number;\n}\n\nfunction getQuartile(sortedData: number[], q: number): number {\n const pos = (sortedData.length - 1) * q;\n const base = Math.floor(pos);\n const rest = pos - base;\n if (sortedData[base + 1] !== undefined) {\n return sortedData[base] + rest * (sortedData[base + 1] - sortedData[base]);\n } else {\n return sortedData[base];\n }\n}\n\nexport function calculateBoxPlotStats(\n data: number[],\n whiskerType: BoxPlotSettings[\"whiskerType\"]\n): BoxPlotStats {\n if (data.length === 0) {\n return {\n q1: 0,\n median: 0,\n q3: 0,\n iqr: 0,\n whiskerLow: 0,\n whiskerHigh: 0,\n outliers: [],\n totalCount: 0,\n };\n }\n\n const sortedData = [...data].sort((a, b) => a - b);\n const q1 = getQuartile(sortedData, 0.25);\n const median = getQuartile(sortedData, 0.5);\n const q3 = getQuartile(sortedData, 0.75);\n const iqr = q3 - q1;\n\n let whiskerLow: number;\n let whiskerHigh: number;\n let outliers: number[];\n\n switch (whiskerType) {\n case \"tukey\": {\n const lowerFence = q1 - 1.5 * iqr;\n const upperFence = q3 + 1.5 * iqr;\n\n whiskerLow = Math.max(lowerFence, sortedData[0]);\n whiskerHigh = Math.min(upperFence, sortedData[sortedData.length - 1]);\n\n if (whiskerLow > whiskerHigh) {\n whiskerLow = sortedData[0];\n whiskerHigh = sortedData[sortedData.length - 1];\n }\n\n outliers = sortedData.filter((x) => x < whiskerLow || x > whiskerHigh);\n break;\n }\n case \"minmax\": {\n whiskerLow = sortedData[0];\n whiskerHigh = sortedData[sortedData.length - 1];\n outliers = [];\n break;\n }\n case \"stdDev\": {\n const mean =\n sortedData.reduce((sum, x) => sum + x, 0) / sortedData.length;\n const stdDev = Math.sqrt(\n sortedData.reduce((sum, x) => sum + Math.pow(x - mean, 2), 0) /\n sortedData.length\n );\n\n whiskerLow = mean - 2 * stdDev;\n whiskerHigh = mean + 2 * stdDev;\n outliers = sortedData.filter((x) => x < whiskerLow || x > whiskerHigh);\n break;\n }\n }\n\n return {\n q1,\n median,\n q3,\n iqr,\n whiskerLow,\n whiskerHigh,\n outliers,\n totalCount: data.length,\n };\n}\n\nexport function calculateKernelDensity(\n data: number[],\n bandwidth: number,\n numPoints: number = 100\n): [number, number][] {\n const sortedData = [...data].sort((a, b) => a - b);\n const min = sortedData[0];\n const max = sortedData[sortedData.length - 1];\n const range = max - min;\n\n const points = Array.from({ length: numPoints }, (_, i) => {\n const t = i / (numPoints - 1);\n return min + t * range;\n });\n\n const density = points.map((x) => {\n const sum = sortedData.reduce((acc, xi) => {\n const diff = x - xi;\n return acc + Math.exp(-(diff * diff) / (2 * bandwidth * bandwidth));\n }, 0);\n const densityValue =\n sum / (sortedData.length * bandwidth * Math.sqrt(2 * Math.PI));\n\n return [x, densityValue] as [number, number];\n });\n\n const maxDensity = Math.max(...density.map(([_, y]) => y));\n\n return density.map(([x, y]) => [x, y / maxDensity] as [number, number]);\n}\n\nexport function calculateBeeSwarmPositions(\n data: number[],\n width: number,\n maxPoints: number = 1000\n): [number, number][] {\n if (data.length > maxPoints) {\n const sampledData = [...data]\n .sort(() => Math.random() - 0.5)\n .slice(0, maxPoints);\n return calculateBeeSwarmPositionsForData(sampledData, width);\n }\n return calculateBeeSwarmPositionsForData(data, width);\n}\n\nfunction calculateBeeSwarmPositionsForData(\n data: number[],\n width: number\n): [number, number][] {\n const positions: [number, number][] = [];\n const radius = 2;\n const spacing = radius * 2;\n\n const sortedData = [...data].sort((a, b) => a - b);\n\n for (const value of sortedData) {\n let x = 0;\n const y = value;\n let attempts = 0;\n const maxAttempts = 100;\n\n while (attempts < maxAttempts) {\n const overlaps = positions.some(([px, py]) => {\n const dx = x - px;\n const dy = y - py;\n return Math.sqrt(dx * dx + dy * dy) < spacing;\n });\n\n if (!overlaps) {\n break;\n }\n\n x = (x + spacing) % width;\n attempts++;\n }\n\n positions.push([x, y]);\n }\n\n return positions;\n}\n","import {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { Filter, datum } from \"@/types/FilterTypes\";\nimport { ScaleLinear, scaleBand, scaleLinear } from \"d3-scale\";\nimport natsort from \"natsort\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport {\n calculateBeeSwarmPositions,\n calculateBoxPlotStats,\n calculateKernelDensity,\n} from \"./boxPlotCalculations\";\nimport { BoxPlotSettings } from \"./definition\";\n\nconst Y_SCALE_PADDING = 0.1; // 10% padding for whiskers\nconst BOX_PADDING = 0.2; // Padding between boxes in a group\n\nexport function BoxPlot({\n settings,\n width,\n height,\n facetIds,\n}: BaseChartProps<BoxPlotSettings>) {\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Get all data for axis limits calculation\n const allData = useGetColumnDataForIds(settings.field);\n\n // Get filtered data for rendering\n const liveData = useGetLiveData(settings, settings.field, facetIds);\n\n // Get color field data if specified\n const colorFieldData = useGetLiveData(\n settings,\n settings.colorField,\n facetIds\n );\n const hasColorField = !!settings.colorField;\n\n // Chart dimensions\n const margin = { top: 20, right: 20, bottom: 30, left: 60 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Group data by color field if specified\n const groupedData = useMemo(() => {\n if (!hasColorField) {\n const validData = liveData.map(Number).filter((x) => !isNaN(x));\n\n const result = [\n {\n group: \"All Data\",\n data: validData,\n },\n ];\n return result;\n }\n\n const groups = new Map<string | number, number[]>();\n\n liveData.forEach((value, index) => {\n const colorValue = colorFieldData[index];\n const numValue = Number(value);\n\n if (colorValue === undefined || colorValue === null) {\n return;\n }\n\n if (isNaN(numValue)) {\n return;\n }\n\n if (typeof colorValue === \"string\" || typeof colorValue === \"number\") {\n if (!groups.has(colorValue)) {\n groups.set(colorValue, []);\n }\n groups.get(colorValue)?.push(numValue);\n }\n });\n\n const result = Array.from(groups.entries()).map(([group, data]) => ({\n group,\n data,\n }));\n\n // If we have no valid groups but we do have data, fall back to single group\n if (result.length === 0 && liveData.length > 0) {\n const validData = liveData.map(Number).filter((x) => !isNaN(x));\n\n return [\n {\n group: \"All Data\",\n data: validData,\n },\n ];\n }\n\n return result;\n }, [liveData, colorFieldData, hasColorField]);\n\n // Calculate statistics for all groups\n const groupStats = useMemo(() => {\n const stats = groupedData.map(({ group, data }) => ({\n group,\n stats: calculateBoxPlotStats(data, settings.whiskerType),\n }));\n return stats;\n }, [groupedData, settings.whiskerType]);\n\n // Calculate KDE for each group if violin overlay is enabled\n const groupKDEs = useMemo(() => {\n if (!settings.violinOverlay) {\n return null;\n }\n\n return groupedData.map(({ group, data }) => {\n // Calculate bandwidth using Silverman's rule of thumb\n const stdDev = Math.sqrt(\n data.reduce(\n (sum, x) =>\n sum +\n Math.pow(x - data.reduce((a, b) => a + b, 0) / data.length, 2),\n 0\n ) / data.length\n );\n const autoBandwidth = 1.06 * stdDev * Math.pow(data.length, -0.2);\n\n const bandwidth = settings.autoBandwidth\n ? autoBandwidth\n : settings.violinBandwidth;\n\n return {\n group,\n kde: calculateKernelDensity(data, bandwidth),\n };\n });\n }, [\n settings.violinOverlay,\n settings.autoBandwidth,\n settings.violinBandwidth,\n groupedData,\n ]);\n\n // Create scales\n const xScale = useMemo(() => {\n const groups = groupedData.map((g) => g.group?.toString() ?? \"All Data\");\n\n // Sort groups based on settings\n const sortedGroups = [...groups].sort((a, b) => {\n if (settings.sortBy === \"median\") {\n const aStats = groupStats.find((g) => g.group?.toString() === a)?.stats;\n const bStats = groupStats.find((g) => g.group?.toString() === b)?.stats;\n return (bStats?.median ?? 0) - (aStats?.median ?? 0);\n }\n return natsort()(a, b);\n });\n\n const scale = scaleBand()\n .domain(sortedGroups)\n .range([0, innerWidth])\n .padding(BOX_PADDING);\n\n return scale;\n }, [groupedData, innerWidth, settings.sortBy, groupStats]);\n\n // Create path generator for violin shapes\n const createPath = useCallback((points: [number, number][]) => {\n if (points.length === 0) {\n return \"\";\n }\n return points\n .map((point, i) => `${i === 0 ? \"M\" : \"L\"} ${point[0]} ${point[1]}`)\n .join(\" \");\n }, []);\n\n // Calculate bee swarm positions for each group if enabled\n const groupBeeSwarmPositions = useMemo(() => {\n if (!settings.beeSwarmOverlay) {\n return null;\n }\n\n return groupedData.map(({ group, data }) => {\n return {\n group,\n positions: calculateBeeSwarmPositions(data, xScale.bandwidth(), 1000),\n };\n });\n }, [groupedData, settings.beeSwarmOverlay, xScale]);\n\n // Get global axis limits if in a facet\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create y scale with synchronized limits if in a facet\n const yScale = useMemo(() => {\n const allStats = groupStats.map((g) => g.stats);\n const min = Math.min(...allStats.map((s) => s.whiskerLow));\n const max = Math.max(...allStats.map((s) => s.whiskerHigh));\n const range = max - min;\n const padding = range * Y_SCALE_PADDING;\n\n const globalMin =\n globalYLimits?.type === \"numerical\" ? globalYLimits.min : min - padding;\n const globalMax =\n globalYLimits?.type === \"numerical\" ? globalYLimits.max : max + padding;\n\n const scale = scaleLinear()\n .domain([globalMin, globalMax])\n .range([innerHeight, 0]);\n\n return scale;\n }, [groupStats, innerHeight, globalYLimits]) as ScaleLinear<number, number>;\n\n // Register axis limits with the facet context\n useEffect(() => {\n if (facetIds && allData.length > 0) {\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: yScale.domain()[0],\n max: yScale.domain()[1],\n });\n\n if (settings.colorField) {\n registerAxisLimits(settings.id, \"x\", {\n type: \"categorical\",\n categories: new Set(\n groupedData.map((g) => g.group?.toString() ?? \"\")\n ),\n });\n }\n }\n }, [\n settings.id,\n settings.colorField,\n facetIds,\n allData,\n groupStats,\n registerAxisLimits,\n yScale,\n groupedData,\n ]);\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n // Remove range filter for the field\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.field\n );\n updateChart(settings.id, { filters: newFilters });\n return;\n }\n\n const [, [, y1]] = extent;\n const yStart = yScale.invert(y1);\n const yEnd = yScale.invert(extent[0][1]);\n\n // Create new filters array with updated range filter\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.field\n );\n\n newFilters.push({\n type: \"range\",\n field: settings.field,\n min: Math.min(yStart, yEnd),\n max: Math.max(yStart, yEnd),\n });\n\n updateChart(settings.id, { filters: newFilters });\n },\n [settings.id, settings.field, settings.filters, updateChart, yScale]\n );\n\n const activeFilter = useMemo(() => {\n return settings.filters.find(\n (f: Filter) => f.field === settings.colorField\n );\n }, [settings.filters, settings.colorField]);\n\n const handleBoxClick = useCallback(\n (group: string | number) => {\n if (!settings.colorField) {\n return;\n }\n\n let newValues: datum[] = [];\n if (activeFilter && activeFilter.type === \"value\") {\n // If group is already in filter, remove it\n if (activeFilter.values.includes(group)) {\n newValues = activeFilter.values.filter((v) => v !== group);\n } else {\n // Add group to existing filter\n newValues = [...activeFilter.values, group];\n }\n } else {\n // Create new filter with just this group\n newValues = [group];\n }\n\n // Create a new filter for the color field\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.colorField\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.colorField,\n values: newValues,\n });\n }\n\n updateChart(settings.id, { filters: newFilters });\n },\n [\n settings.colorField,\n settings.filters,\n settings.id,\n activeFilter,\n updateChart,\n ]\n );\n\n // Helper function to check if a group matches the current filter\n const isGroupFiltered = useCallback(\n (group: string | number) => {\n if (!settings.colorField) {\n return true;\n }\n\n if (\n !activeFilter ||\n activeFilter.type !== \"value\" ||\n !activeFilter.values\n ) {\n return true;\n }\n\n return applyFilter(group, activeFilter);\n },\n [settings.colorField, activeFilter]\n );\n\n return (\n <div style={{ width, height }}>\n <TooltipProvider>\n <BaseChart\n width={width}\n height={height}\n margin={margin}\n xScale={xScale}\n yScale={yScale}\n brushingMode=\"2d\"\n onBrushChange={handleBrushChange}\n settings={settings}\n >\n {/* Axis labels */}\n {settings.xAxisLabel && (\n <text\n x={innerWidth / 2}\n y={innerHeight + margin.bottom - 5}\n textAnchor=\"middle\"\n className=\"text-sm fill-muted-foreground\"\n >\n {settings.xAxisLabel}\n </text>\n )}\n {settings.yAxisLabel && (\n <text\n x={-innerHeight / 2}\n y={-margin.left + 15}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n className=\"text-sm fill-muted-foreground\"\n >\n {settings.yAxisLabel}\n </text>\n )}\n\n {/* Main content */}\n {groupStats.map(({ group, stats }) => {\n const isFiltered = isGroupFiltered(group);\n const boxColor = isFiltered\n ? getColorForValue(\n settings.colorScaleId,\n group ?? settings.styles.boxFill\n )\n : \"rgb(156 163 175)\";\n const xPos = xScale(group?.toString() ?? \"\") ?? 0;\n const boxWidth = xScale.bandwidth();\n\n // Get KDE for this group if violin overlay is enabled\n const kde = groupKDEs?.find((g) => g.group === group)?.kde;\n\n // Get bee swarm positions for this group if enabled\n const beeSwarmPositions = groupBeeSwarmPositions?.find(\n (g) => g.group === group\n )?.positions;\n\n // Create tooltip content for the box\n const boxTooltipContent = (\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{group?.toString() ?? \"All Data\"}</p>\n <p>Total Points: {stats.totalCount}</p>\n <p>Outliers: {stats.outliers.length}</p>\n <p>Q1: {stats.q1.toFixed(2)}</p>\n <p>Median: {stats.median.toFixed(2)}</p>\n <p>Q3: {stats.q3.toFixed(2)}</p>\n <p>IQR: {stats.iqr.toFixed(2)}</p>\n </div>\n );\n\n // Create tooltip content for whiskers\n const whiskerTooltipContent = (\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{group?.toString() ?? \"All Data\"}</p>\n <p>Lower Whisker: {stats.whiskerLow.toFixed(2)}</p>\n <p>Upper Whisker: {stats.whiskerHigh.toFixed(2)}</p>\n </div>\n );\n\n return (\n <g\n key={group?.toString() ?? \"default\"}\n transform={`translate(${xPos}, 0)`}\n >\n {/* Whiskers */}\n <Tooltip>\n <TooltipTrigger asChild>\n <line\n x1={boxWidth / 2}\n x2={boxWidth / 2}\n y1={yScale(stats.whiskerHigh)}\n y2={yScale(stats.whiskerLow)}\n stroke={boxColor}\n strokeWidth={settings.styles.whiskerStrokeWidth}\n />\n </TooltipTrigger>\n <TooltipContent>{whiskerTooltipContent}</TooltipContent>\n </Tooltip>\n\n {/* Box */}\n <Tooltip>\n <TooltipTrigger asChild>\n <rect\n x={0}\n y={yScale(stats.q3)}\n width={boxWidth}\n height={yScale(stats.q1) - yScale(stats.q3)}\n fill={boxColor}\n stroke={settings.styles.boxStroke}\n strokeWidth={settings.styles.boxStrokeWidth}\n onClick={() => handleBoxClick(group)}\n style={{\n cursor: settings.colorField ? \"pointer\" : \"default\",\n }}\n />\n </TooltipTrigger>\n <TooltipContent>{boxTooltipContent}</TooltipContent>\n </Tooltip>\n\n {/* Median line */}\n <line\n x1={0}\n x2={boxWidth}\n y1={yScale(stats.median)}\n y2={yScale(stats.median)}\n stroke={settings.styles.medianStroke}\n strokeWidth={settings.styles.medianStrokeWidth}\n />\n\n {/* Outliers */}\n {settings.showOutliers &&\n stats.outliers.map((value: number, i: number) => (\n <Tooltip key={i}>\n <TooltipTrigger asChild>\n <circle\n cx={boxWidth / 2}\n cy={yScale(value)}\n r={settings.styles.outlierSize}\n fill={boxColor}\n stroke={settings.styles.outlierStroke}\n />\n </TooltipTrigger>\n <TooltipContent>\n <p>Outlier: {value.toFixed(2)}</p>\n </TooltipContent>\n </Tooltip>\n ))}\n\n {/* Violin plot overlay */}\n {settings.violinOverlay && kde && (\n <g>\n <path\n d={createPath(\n settings.beeSwarmOverlay\n ? // If bee swarm is enabled, only show left half of violin\n [\n [boxWidth / 2, yScale(kde[0][0])] as [\n number,\n number,\n ],\n ...kde.map(\n ([x, y]) =>\n [\n boxWidth / 2 - y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n [\n boxWidth / 2,\n yScale(kde[kde.length - 1][0]),\n ] as [number, number],\n ]\n : // Otherwise show full violin\n [\n [boxWidth / 2, yScale(kde[0][0])] as [\n number,\n number,\n ],\n ...kde.map(\n ([x, y]) =>\n [\n boxWidth / 2 + y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n ...kde\n .reverse()\n .map(\n ([x, y]) =>\n [\n boxWidth / 2 - y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n ]\n )}\n fill={boxColor}\n fillOpacity={0.2}\n stroke={boxColor}\n strokeWidth={1}\n pointerEvents=\"none\"\n />\n </g>\n )}\n\n {/* Bee swarm overlay */}\n {settings.beeSwarmOverlay && beeSwarmPositions && (\n <g>\n {beeSwarmPositions.map(([x, y], i) => (\n <circle\n key={i}\n cx={\n settings.violinOverlay\n ? boxWidth / 2 + Math.abs(x)\n : boxWidth / 2 + x\n }\n cy={yScale(y)}\n r={2}\n fill={boxColor}\n fillOpacity={0.5}\n stroke=\"none\"\n pointerEvents=\"none\"\n />\n ))}\n </g>\n )}\n </g>\n );\n })}\n </BaseChart>\n </TooltipProvider>\n </div>\n );\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { BoxPlotSettings } from \"./definition\";\n\nexport function BoxPlotSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<BoxPlotSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"field\">Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"colorField\">Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n colorScaleId: value ? getOrCreateScaleForField(value) : undefined,\n })\n }\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"whiskerType\">Whisker Type</Label>\n <ComboBox\n value={settings.whiskerType}\n options={[\"tukey\", \"minmax\", \"stdDev\"]}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n whiskerType: value as BoxPlotSettings[\"whiskerType\"],\n })\n }\n placeholder=\"Select whisker type\"\n optionToString={(option) => option}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"showOutliers\">Show Outliers</Label>\n <Switch\n id=\"showOutliers\"\n checked={settings.showOutliers}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, showOutliers: checked })\n }\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"sortBy\">Sort By</Label>\n <ComboBox\n value={settings.sortBy}\n options={[\"median\", \"label\"]}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n sortBy: value as BoxPlotSettings[\"sortBy\"],\n })\n }\n placeholder=\"Select sorting method\"\n optionToString={(option) => option}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"violinOverlay\">Violin Overlay</Label>\n <Switch\n id=\"violinOverlay\"\n checked={settings.violinOverlay}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, violinOverlay: checked })\n }\n />\n </div>\n\n {settings.violinOverlay && (\n <>\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"autoBandwidth\">Auto Bandwidth</Label>\n <Switch\n id=\"autoBandwidth\"\n checked={settings.autoBandwidth}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, autoBandwidth: checked })\n }\n />\n </div>\n {!settings.autoBandwidth && (\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"violinBandwidth\">Bandwidth</Label>\n <input\n type=\"number\"\n id=\"violinBandwidth\"\n min=\"0.1\"\n max=\"1\"\n step=\"0.1\"\n value={settings.violinBandwidth}\n onChange={(e) =>\n onSettingsChange({\n ...settings,\n violinBandwidth: parseFloat(e.target.value),\n })\n }\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n )}\n </>\n )}\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"beeSwarmOverlay\">Bee Swarm</Label>\n <Switch\n id=\"beeSwarmOverlay\"\n checked={settings.beeSwarmOverlay}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, beeSwarmOverlay: checked })\n }\n />\n </div>\n </div>\n );\n}\n","export function BoxPlotIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"200\"\n height=\"200\"\n viewBox=\"0 0 32 32\"\n className={className}\n >\n <path\n fill=\"currentColor\"\n d=\"M22 6V4H12v2h4v2h-4v12h4v2h-4v2h10v-2h-4v-2h4V8h-4V6Zm-8 12v-3h6v3Zm6-5h-6v-3h6Z\"\n />\n <path fill=\"currentColor\" d=\"M30 30H4a2 2 0 0 1-2-2V2h2v26h26Z\" />\n </svg>\n );\n}\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { Box } from \"lucide-react\";\nimport { BoxPlot } from \"./BoxPlot\";\nimport { BoxPlotSettingsPanel } from \"./BoxPlotSettingsPanel\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { BoxPlotIcon } from \"./BoxPlotIcon\";\n\nexport interface BoxPlotStyleSettings {\n boxFill: string;\n boxStroke: string;\n boxStrokeWidth: number;\n medianStroke: string;\n medianStrokeWidth: number;\n whiskerStroke: string;\n whiskerStrokeWidth: number;\n outlierSize: number;\n outlierStroke: string;\n outlierFill: string;\n}\n\nexport interface BoxPlotSettings extends BaseChartSettings {\n type: \"boxplot\";\n whiskerType: \"tukey\" | \"minmax\" | \"stdDev\";\n showOutliers: boolean;\n violinOverlay: boolean;\n beeSwarmOverlay: boolean;\n styles: BoxPlotStyleSettings;\n filters: Filter[];\n sortBy: \"median\" | \"label\";\n violinBandwidth: number;\n autoBandwidth: boolean;\n}\n\nexport const boxPlotDefinition: ChartDefinition<BoxPlotSettings> = {\n type: \"boxplot\",\n name: \"Box Plot\",\n description: \"Display distribution of values with quartiles and outliers\",\n icon: BoxPlotIcon,\n\n component: BoxPlot,\n settingsPanel: BoxPlotSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n field: field ?? \"\",\n type: \"boxplot\",\n title: \"Box Plot\",\n layout,\n whiskerType: \"tukey\",\n showOutliers: true,\n violinOverlay: false,\n beeSwarmOverlay: false,\n sortBy: \"label\",\n violinBandwidth: 0.3,\n autoBandwidth: true,\n styles: {\n boxFill: \"hsl(217.2 91.2% 59.8%)\",\n boxStroke: \"black\",\n boxStrokeWidth: 1,\n medianStroke: \"white\",\n medianStrokeWidth: 2,\n whiskerStroke: \"black\",\n whiskerStrokeWidth: 1,\n outlierSize: 3,\n outlierStroke: \"black\",\n outlierFill: \"none\",\n },\n filters: [],\n xAxis: DEFAULT_CHART_SETTINGS.xAxis,\n yAxis: DEFAULT_CHART_SETTINGS.yAxis,\n margin: DEFAULT_CHART_SETTINGS.margin,\n facet: DEFAULT_CHART_SETTINGS.facet,\n colorScaleId: undefined,\n colorField: undefined,\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n }),\n\n validateSettings: (settings) => {\n return !!settings.field;\n },\n\n getFilterFunction: (settings, fieldGetter) => {\n if (!settings.colorField) {\n return () => true;\n }\n\n const dataHash = fieldGetter(settings.colorField);\n\n const filter = settings.filters.find(\n (f): f is Filter => f.field === settings.colorField\n );\n\n return (d) => {\n const value = dataHash[d];\n\n if (filter) {\n if (!applyFilter(value, filter)) {\n return false;\n }\n }\n\n return true;\n };\n },\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground rounded-xl border shadow-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\"flex flex-col gap-1.5 p-6\", className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"p-6 pt-0\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","// Utility function to determine text color based on background color\nexport function getContrastTextColor(backgroundColor: string): string {\n // Convert hex to RGB\n const hex = backgroundColor.replace(\"#\", \"\");\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n\n // Calculate relative luminance\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n return luminance > 0.5 ? \"#000000\" : \"#ffffff\";\n}\n","import { ColorScaleType } from \"@/types/ColorScaleTypes\";\n\nimport { getContrastTextColor } from \"./getContrastTextColor\";\n\ninterface ColorScaleProps {\n scale: ColorScaleType;\n wrap: boolean;\n numericalBreakpoints?: number;\n getColorForValue: (scaleId: string, value: number) => string;\n}\nexport function ColorScale({\n scale,\n wrap,\n numericalBreakpoints = 5,\n getColorForValue,\n}: ColorScaleProps) {\n if (!scale?.palette) {\n console.error(\"Missing palette for scale:\", scale);\n return <div className=\"h-8 rounded-md bg-muted\">Invalid color scale</div>;\n }\n\n if (scale.type === \"numerical\") {\n // Create discrete colors based on breakpoints\n const steps = numericalBreakpoints;\n const min = scale.min;\n const max = scale.max;\n const range = max - min;\n const stepSize = range / (steps - 1);\n\n const breakpoints = Array.from({ length: steps }, (_, i) => {\n const value = min + i * stepSize;\n return {\n value,\n color: getColorForValue(scale.id, value),\n };\n });\n\n return (\n <div className=\"rounded-md\">\n <div className={`flex h-full ${wrap ? \"flex-wrap\" : \"\"}`}>\n {breakpoints.map(({ value, color }, i) => (\n <div\n key={i}\n className=\"h-8 flex items-center justify-center\"\n style={{\n backgroundColor: color,\n color: getContrastTextColor(color),\n flexBasis: wrap ? \"20%\" : `${100 / steps}%`,\n }}\n >\n <span className=\"text-xs truncate px-1\">\n {value.toLocaleString(undefined, {\n maximumFractionDigits: 1,\n })}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-md\">\n <div className={`flex h-full ${wrap ? \"flex-wrap\" : \"\"}`}>\n {Array.from(scale.mapping.entries()).map(([value, color], i) => (\n <div\n key={i}\n className=\"h-8 flex items-center justify-center\"\n style={{\n backgroundColor: color,\n color: getContrastTextColor(color),\n flexBasis: wrap ? \"20%\" : \"auto\",\n flexGrow: wrap ? 0 : 1,\n }}\n >\n <span className=\"text-xs truncate px-1\">{value}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { Card } from \"@/components/ui/card\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ColorLegendSettings } from \"./definition\";\nimport { ColorScale } from \"./ColorScale\";\n\nexport function ColorLegendChart({\n settings,\n width,\n height,\n}: BaseChartProps<ColorLegendSettings>) {\n const { colorScales, getOrCreateScaleForField, getColorForValue } =\n useColorScales();\n\n if (settings.fields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-muted-foreground\">\n Select a field to see a legend\n </div>\n );\n }\n\n return (\n <div\n className=\"flex flex-col p-4 gap-4 overflow-y-auto\"\n style={{ width, height }}\n >\n <ScrollArea className=\"flex-1\">\n <div className=\"grid gap-4 grid-cols-1\">\n {settings.fields.map((field) => {\n // Get or create a color scale for this field\n const scaleId = getOrCreateScaleForField(field);\n const scale = colorScales.find((s) => s.id === scaleId);\n\n if (!scale) {\n console.error(\"No scale found for field:\", field);\n return null;\n }\n\n return (\n <Card key={field} className=\"p-4\">\n <div className=\"font-medium mb-2\">{field}</div>\n <ColorScale\n scale={scale}\n wrap={settings.wrap}\n numericalBreakpoints={settings.numericalBreakpoints}\n getColorForValue={getColorForValue}\n />\n </Card>\n );\n })}\n </div>\n </ScrollArea>\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ColorLegendSettings } from \"./definition\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { useColumnNames } from \"@/components/charts/PivotTable/useColumnNames\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\n\nexport function ColorLegendSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ColorLegendSettings>) {\n const availableFields = useColumnNames();\n\n const fieldOptions = availableFields.map((f) => ({\n label: f,\n value: f,\n }));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Fields to Show</Label>\n <div className=\"max-w-[400px]\">\n <MultiSelect\n options={fieldOptions}\n value={settings.fields.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n fields: values.map((v) => v.value),\n })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Numerical Scale Breakpoints</Label>\n <NumericInputEnter\n value={settings.numericalBreakpoints}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n numericalBreakpoints: value,\n })\n }\n min={2}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"wrap\"\n checked={settings.wrap}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, wrap: checked })\n }\n />\n <Label htmlFor=\"wrap\">Wrap Colors</Label>\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { Palette } from \"lucide-react\";\nimport { ColorLegendChart } from \"./ColorLegendChart\";\nimport { ColorLegendSettingsPanel } from \"./ColorLegendSettingsPanel\";\n\nexport interface ColorLegendSettings extends BaseChartSettings {\n type: \"color-legend\";\n fields: string[];\n numericalBreakpoints: number;\n wrap: boolean;\n}\n\nexport const colorLegendDefinition: ChartDefinition<ColorLegendSettings> = {\n type: \"color-legend\",\n name: \"Color Legend\",\n description: \"Display and manage color scales used in visualizations\",\n icon: Palette,\n component: ColorLegendChart,\n settingsPanel: ColorLegendSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n id: crypto.randomUUID(),\n type: \"color-legend\",\n title: \"Color Legend\",\n field: \"\",\n layout,\n colorScaleId: undefined,\n colorField: undefined,\n facet: {\n enabled: false,\n type: \"grid\",\n rowVariable: \"\",\n columnVariable: \"\",\n },\n xAxis: {},\n yAxis: {},\n margin: {},\n filters: [],\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 0,\n yGridLines: 0,\n fields: [],\n numericalBreakpoints: 5,\n wrap: false,\n }),\n\n validateSettings: () => true,\n getFilterFunction: () => () => true,\n};\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(line);\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","export interface DataPoint {\n x: number;\n y: number;\n}\n\nexport interface ReducedDataPoint extends DataPoint {\n type: \"min\" | \"max\" | \"start\";\n}\n\n/**\n * Reduces a dataset to a fixed number of buckets using min-max-start algorithm.\n * For each bucket, it keeps the start point, minimum point, and maximum point.\n * If the input data length is less than buckets * 3, returns original data.\n *\n * @param data Array of data points with x and y values\n * @param numBuckets Number of buckets to divide the data into (typically chart width)\n * @returns Array of reduced data points with type information\n */\nexport function reduceDataPoints(\n data: DataPoint[],\n numBuckets: number\n): ReducedDataPoint[] {\n // Handle edge cases\n if (!data || data.length === 0) {\n return [];\n }\n\n // Ensure numBuckets is valid and reasonable\n const validBuckets = Math.max(1, Math.min(1000, Math.floor(numBuckets)));\n\n // If data is small enough, just convert to ReducedDataPoint format\n if (data.length <= validBuckets * 3) {\n return data.map((point) => ({ ...point, type: \"start\" as const }));\n }\n\n const xExtent = {\n min: Math.min(...data.map((d) => d.x)),\n max: Math.max(...data.map((d) => d.x)),\n };\n\n // If all x values are the same, return just one point\n if (xExtent.min === xExtent.max) {\n return [{ ...data[0], type: \"start\" as const }];\n }\n\n const buckets: ReducedDataPoint[][] = Array(validBuckets)\n .fill(null)\n .map(() => []);\n\n // Distribute points into buckets\n data.forEach((point) => {\n const bucketIndex = Math.min(\n Math.floor(\n ((point.x - xExtent.min) / (xExtent.max - xExtent.min)) * validBuckets\n ),\n validBuckets - 1\n );\n buckets[bucketIndex].push({ ...point, type: \"start\" });\n });\n\n // Process each bucket to find min, max, and start points\n const result: ReducedDataPoint[] = [];\n buckets.forEach((bucket) => {\n if (bucket.length === 0) {\n return;\n }\n\n // Always include the first point as start\n result.push({ ...bucket[0], type: \"start\" });\n\n if (bucket.length > 1) {\n const minPoint = bucket.reduce((min, p) => (p.y < min.y ? p : min));\n const maxPoint = bucket.reduce((max, p) => (p.y > max.y ? p : max));\n\n // Only add min/max if they're different from the start point\n if (minPoint !== bucket[0]) {\n result.push({ ...minPoint, type: \"min\" });\n }\n if (maxPoint !== bucket[0] && maxPoint !== minPoint) {\n result.push({ ...maxPoint, type: \"max\" });\n }\n }\n });\n\n return result.sort((a, b) => a.x - b.x);\n}\n","import {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { type BaseChartProps } from \"@/types/ChartTypes\";\nimport { extent } from \"d3-array\";\nimport { scaleLinear } from \"d3-scale\";\nimport { curveLinear, curveMonotoneX, curveStepAfter, line } from \"d3-shape\";\nimport { type FC, useEffect, useMemo } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport {\n useGetColumnDataForIds,\n useGetColumnDataForMultipleIds,\n} from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { type LineChartSettings } from \"./definition\";\nimport { ArrowRight } from \"lucide-react\";\nimport { reduceDataPoints, type DataPoint } from \"@/lib/chartUtils\";\n\nconst curveTypes = {\n linear: curveLinear,\n monotoneX: curveMonotoneX,\n step: curveStepAfter,\n} as const;\n\ntype CurveType = keyof typeof curveTypes;\n\n// Define color palettes\nconst COLOR_PALETTES = {\n default: [\n \"#2563eb\", // blue-600\n \"#dc2626\", // red-600\n \"#9333ea\", // purple-600\n \"#ea580c\", // orange-600\n \"#0891b2\", // cyan-600\n \"#4f46e5\", // indigo-600\n \"#be123c\", // rose-600\n \"#ca8a04\", // yellow-600\n \"#16a34a\", // green-600\n \"#059669\", // emerald-600\n ],\n} as const;\n\nconst getRandomHslColor = () => {\n const hue = Math.floor(Math.random() * 360);\n return `hsl(${hue}, 50%, 50%)`;\n};\n\nconst defaultSeriesSettings = {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n} as const;\n\nexport const LineChart: FC<BaseChartProps<LineChartSettings>> = ({\n settings,\n width,\n height,\n facetIds,\n}) => {\n const updateChart = useDataLayer((state) => state.updateChart);\n\n // Get all data for axis limits calculation\n const allXData = useGetColumnDataForIds(settings.xField);\n\n // Get filtered data for rendering\n const liveXData = useGetLiveData(settings, settings.xField, facetIds);\n\n // Get all series data using the new hook\n const liveSeriesData = useGetColumnDataForMultipleIds(\n settings.seriesField,\n facetIds\n );\n\n const margin = { top: 20, right: 60, bottom: 30, left: 60 };\n\n // Adjust margins based on legend position\n if (settings.showLegend) {\n switch (settings.legendPosition) {\n case \"top\":\n margin.top += 40;\n break;\n case \"bottom\":\n margin.bottom += 40;\n break;\n case \"right\":\n margin.right += 120;\n break;\n case \"left\":\n margin.left += 120;\n break;\n }\n }\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Convert data to numbers for d3\n const processedLiveSeriesData = useMemo(() => {\n return settings.seriesField.map((field) => {\n const data =\n liveSeriesData[field]?.map((d, i) => ({\n x: Number(liveXData[i] ?? 0),\n y: d != null ? Number(d) : 0,\n })) ?? [];\n\n // Reduce the data points based on chart width\n const reducedData = reduceDataPoints(data, innerWidth);\n\n return {\n name: field,\n data: reducedData,\n };\n });\n }, [settings.seriesField, liveSeriesData, liveXData, innerWidth]);\n\n // Ensure consistent color assignment for series with better distribution\n const seriesColors = useMemo(() => {\n const colors: Record<string, string> = {};\n const palette = COLOR_PALETTES.default;\n\n // First pass - keep existing colors and track which palette colors are used\n const usedPaletteColors = new Set<string>();\n settings.seriesField.forEach((field) => {\n const existingColor = settings.seriesSettings[field]?.lineColor;\n if (existingColor && existingColor !== \"#000000\") {\n colors[field] = existingColor;\n if ((palette as readonly string[]).includes(existingColor)) {\n usedPaletteColors.add(existingColor);\n }\n }\n });\n\n // Get unused palette colors\n const unusedPaletteColors = (palette as readonly string[]).filter(\n (color) => !usedPaletteColors.has(color)\n );\n\n // Second pass - assign colors to series that need them\n // splice off the first color from the unused palette colors\n settings.seriesField.forEach((field) => {\n const nextColor = unusedPaletteColors.shift();\n if (colors[field]) {\n return;\n }\n\n // Use an unused palette color\n colors[field] = nextColor ?? getRandomHslColor();\n });\n\n return colors;\n }, [settings.seriesField, settings.seriesSettings]);\n\n // Store assigned colors back into settings using updateChart\n useEffect(() => {\n requestAnimationFrame(() => {\n const newSeriesSettings = { ...settings.seriesSettings };\n let hasChanges = false;\n\n settings.seriesField.forEach((field) => {\n if (!newSeriesSettings[field]) {\n newSeriesSettings[field] = { ...defaultSeriesSettings };\n hasChanges = true;\n }\n\n // Only update if color is undefined or \"default\"\n if (\n !newSeriesSettings[field]?.lineColor ||\n newSeriesSettings[field]?.lineColor === \"default\"\n ) {\n newSeriesSettings[field]!.lineColor = seriesColors[field];\n hasChanges = true;\n }\n });\n\n if (hasChanges) {\n updateChart(settings.id, {\n seriesSettings: newSeriesSettings,\n });\n }\n });\n }, [\n seriesColors,\n settings.id,\n settings.seriesField,\n settings.seriesSettings,\n updateChart,\n ]);\n\n if (processedLiveSeriesData.length === 0) {\n return null;\n }\n\n // Process data and create scales\n const xExtent = extent(allXData.map((d) => (d != null ? Number(d) : 0))) as [\n number,\n number,\n ];\n\n // Calculate y extent across all series\n const leftAxisSeries = processedLiveSeriesData.filter(\n (series) => !settings.seriesSettings[series.name]?.useRightAxis\n );\n const rightAxisSeries = processedLiveSeriesData.filter(\n (series) => settings.seriesSettings[series.name]?.useRightAxis\n );\n\n const leftYExtent = extent(\n leftAxisSeries.flatMap((series) => series.data.map((d) => d.y))\n ) as [number, number];\n\n const rightYExtent = extent(\n rightAxisSeries.flatMap((series) => series.data.map((d) => d.y))\n ) as [number, number];\n\n const xScale = scaleLinear().domain(xExtent).range([0, innerWidth]).nice();\n const leftYScale = scaleLinear()\n .domain(leftYExtent)\n .range([innerHeight, 0])\n .nice();\n const rightYScale = scaleLinear()\n .domain(rightYExtent)\n .range([innerHeight, 0])\n .nice();\n\n // Create line generator with dynamic y-accessor\n const createLineGenerator = (yField: string) =>\n line<(typeof processedLiveSeriesData)[0][\"data\"][0]>()\n .x((d) => xScale(d.x))\n .y((d) =>\n settings.seriesSettings[yField]?.useRightAxis\n ? rightYScale(d.y)\n : leftYScale(d.y)\n )\n .curve(curveTypes[settings.styles.curveType as CurveType]);\n\n // Legend component\n const Legend = () => {\n if (!settings.showLegend) {\n return null;\n }\n\n const legendItems = processedLiveSeriesData.map((series) => {\n const seriesSettings = settings.seriesSettings[series.name] ?? {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n };\n\n return {\n name: series.name,\n color: seriesColors[series.name],\n lineStyle: seriesSettings.lineStyle,\n useRightAxis: seriesSettings.useRightAxis,\n };\n });\n\n const handleAxisToggle = (seriesName: string) => {\n const currentSettings = settings.seriesSettings[seriesName] ?? {\n ...defaultSeriesSettings,\n };\n updateChart(settings.id, {\n seriesSettings: {\n ...settings.seriesSettings,\n [seriesName]: {\n ...currentSettings,\n useRightAxis: !currentSettings.useRightAxis,\n },\n },\n });\n };\n\n const isVertical =\n settings.legendPosition === \"left\" || settings.legendPosition === \"right\";\n\n return (\n <div\n className={cn(\n \"absolute flex gap-4 text-sm items-center\",\n isVertical ? \"flex-col\" : \"flex-row\",\n settings.legendPosition === \"top\" && \"top-0 left-[60px] right-[60px]\",\n settings.legendPosition === \"bottom\" &&\n \"bottom-0 left-[60px] right-[60px]\",\n settings.legendPosition === \"left\" &&\n \"left-0 top-[20px] bottom-[30px] w-[100px]\",\n settings.legendPosition === \"right\" &&\n \"right-0 top-[20px] bottom-[30px] w-[100px]\"\n )}\n >\n {legendItems.map((item) => (\n <div key={item.name} className=\"flex items-center gap-2\">\n <div\n className=\"flex items-center gap-2 px-2 py-1 rounded cursor-pointer hover:bg-accent/50\"\n style={{\n border: `1px solid ${item.color}`,\n }}\n onClick={() => handleAxisToggle(item.name)}\n >\n <svg width=\"20\" height=\"2\" className=\"flex-shrink-0\">\n <line\n x1=\"0\"\n y1=\"1\"\n x2=\"20\"\n y2=\"1\"\n stroke={item.color}\n strokeWidth=\"2\"\n strokeDasharray={\n item.lineStyle === \"dashed\"\n ? \"4,4\"\n : item.lineStyle === \"dotted\"\n ? \"2,2\"\n : undefined\n }\n />\n </svg>\n <span className=\"text-sm text-muted-foreground truncate\">\n {item.name}\n </span>\n {item.useRightAxis && (\n <ArrowRight\n className=\"h-3 w-3 text-muted-foreground\"\n style={{ color: item.color }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"relative\" style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n margin={margin}\n xScale={xScale}\n yScale={leftYScale}\n settings={settings}\n >\n <TooltipProvider>\n <g>\n {/* Grid */}\n {settings.showXGrid && (\n <g>\n {leftYScale.ticks(5).map((tick: number) => (\n <line\n key={tick}\n x1={0}\n x2={innerWidth}\n y1={leftYScale(tick)}\n y2={leftYScale(tick)}\n stroke=\"currentColor\"\n strokeOpacity={0.1}\n />\n ))}\n </g>\n )}\n {settings.showYGrid && (\n <g>\n {xScale.ticks(5).map((tick: number) => (\n <line\n key={tick}\n x1={xScale(tick)}\n x2={xScale(tick)}\n y1={0}\n y2={innerHeight}\n stroke=\"currentColor\"\n strokeOpacity={0.1}\n />\n ))}\n </g>\n )}\n\n {/* Right Y-Axis */}\n {rightAxisSeries.length > 0 && (\n <g transform={`translate(${innerWidth}, 0)`}>\n {rightYScale.ticks(5).map((tick: number) => (\n <g\n key={tick}\n transform={`translate(0, ${rightYScale(tick)})`}\n >\n <line x1={0} x2={6} y1={0} y2={0} stroke=\"currentColor\" />\n <text\n x={9}\n y={0}\n dy=\".32em\"\n fontSize={10}\n textAnchor=\"start\"\n fill=\"currentColor\"\n >\n {tick}\n </text>\n </g>\n ))}\n </g>\n )}\n\n {/* Lines */}\n {processedLiveSeriesData.map((series) => {\n const lineGenerator = createLineGenerator(series.name);\n const seriesSettings = settings.seriesSettings[series.name] ?? {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n };\n\n const seriesColor = seriesColors[series.name];\n\n return (\n <g key={series.name}>\n <path\n d={lineGenerator(series.data) || undefined}\n fill=\"none\"\n stroke={seriesColor}\n strokeWidth={seriesSettings.lineWidth}\n strokeOpacity={seriesSettings.lineOpacity}\n strokeDasharray={\n seriesSettings.lineStyle === \"dashed\"\n ? \"5,5\"\n : seriesSettings.lineStyle === \"dotted\"\n ? \"2,2\"\n : undefined\n }\n />\n {seriesSettings.showPoints &&\n series.data.map((d, j) => (\n <Tooltip key={j}>\n <TooltipTrigger asChild>\n <circle\n cx={xScale(d.x)}\n cy={\n seriesSettings.useRightAxis\n ? rightYScale(d.y)\n : leftYScale(d.y)\n }\n r={seriesSettings.pointSize}\n fill={seriesColor}\n fillOpacity={seriesSettings.pointOpacity}\n />\n </TooltipTrigger>\n <TooltipContent>\n <div className=\"space-y-1\">\n <div className=\"font-medium\">{series.name}</div>\n <div>\n {settings.xField}: {d.x}\n </div>\n <div>\n {series.name}: {d.y}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n ))}\n </g>\n );\n })}\n </g>\n </TooltipProvider>\n </BaseChart>\n <Legend />\n </div>\n );\n};\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { Card } from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { type FC } from \"react\";\nimport { type SeriesSettings } from \"./definition\";\n\ninterface LineSeriesSettingsProps {\n seriesName: string;\n settings: SeriesSettings;\n onSettingsChange: (settings: SeriesSettings) => void;\n}\n\nexport const LineSeriesSettings: FC<LineSeriesSettingsProps> = ({\n seriesName,\n settings,\n onSettingsChange,\n}) => {\n const updateSettings = (updates: Partial<SeriesSettings>) => {\n onSettingsChange({ ...settings, ...updates });\n };\n\n const lineStyleOptions = [\n { label: \"Solid\", value: \"solid\" as const },\n { label: \"Dashed\", value: \"dashed\" as const },\n { label: \"Dotted\", value: \"dotted\" as const },\n ];\n\n return (\n <Card className=\"p-2\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 justify-between\">\n <div className=\"font-medium\">{seriesName}</div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-4 ml-4\">\n <div className=\"flex items-center gap-1\">\n <Label className=\"text-xs\">Points</Label>\n <Switch\n className=\"scale-75\"\n checked={settings.showPoints}\n onCheckedChange={(checked) =>\n updateSettings({ showPoints: checked })\n }\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <Label className=\"text-xs\">Right Y</Label>\n <Switch\n className=\"scale-75\"\n checked={settings.useRightAxis}\n onCheckedChange={(checked) =>\n updateSettings({ useRightAxis: checked })\n }\n />\n </div>\n </div>\n <div className=\"col-span-1\">\n <ComboBox\n value={lineStyleOptions.find(\n (opt) => opt.value === settings.lineStyle\n )}\n options={lineStyleOptions}\n onChange={(option) =>\n updateSettings({ lineStyle: option?.value ?? \"solid\" })\n }\n optionToString={(option) => option.label}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-6 gap-2\">\n <div className=\"col-span-1\">\n <input\n type=\"color\"\n value={settings.lineColor ?? \"#000000\"}\n onChange={(e) => updateSettings({ lineColor: e.target.value })}\n className=\"h-8 w-full rounded-md border\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.lineWidth}\n onChange={(value) => updateSettings({ lineWidth: value })}\n min={1}\n max={10}\n stepSmall={1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.lineOpacity}\n onChange={(value) => updateSettings({ lineOpacity: value })}\n min={0}\n max={1}\n stepSmall={0.1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.pointSize}\n onChange={(value) => updateSettings({ pointSize: value })}\n min={1}\n max={20}\n stepSmall={1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.pointOpacity}\n onChange={(value) => updateSettings({ pointOpacity: value })}\n min={0}\n max={1}\n stepSmall={0.1}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n </Card>\n );\n};\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background data-[state=active]:text-foreground ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 inline-flex items-center justify-center gap-2 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 aria-invalid:focus-visible:ring-0 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 flex-1 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { type ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { type FC } from \"react\";\nimport {\n type LineChartSettings,\n type SeriesSettings,\n DEFAULT_SERIES_SETTINGS,\n} from \"./definition\";\nimport { LineSeriesSettings } from \"./LineSeriesSettings\";\nimport { ComboBox } from \"@/components/ComboBox\";\nimport MultiSelect, { type Option } from \"@/components/ui/multi-select\";\nimport { useColumnNames } from \"@/components/charts/PivotTable/useColumnNames\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport const LineChartSettingsPanel: FC<\n ChartSettingsPanelProps<LineChartSettings>\n> = ({ settings, onSettingsChange }) => {\n const updateSettings = (updates: Partial<LineChartSettings>) => {\n onSettingsChange({ ...settings, ...updates });\n };\n\n const updateStyles = (updates: Partial<LineChartSettings[\"styles\"]>) => {\n updateSettings({\n styles: { ...settings.styles, ...updates },\n });\n };\n\n const updateSeriesSettings = (\n seriesName: string,\n seriesSettings: SeriesSettings\n ) => {\n updateSettings({\n seriesSettings: {\n ...settings.seriesSettings,\n [seriesName]: seriesSettings,\n },\n });\n };\n\n const availableFields = useColumnNames();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => updateSettings({ xField: value })}\n />\n\n <Label>Series Fields</Label>\n <MultiSelect\n options={availableFields.map((f) => ({\n label: f,\n value: f,\n }))}\n value={settings.seriesField.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) => {\n const newSeriesFields = values.map((v) => v.value);\n const newSeriesSettings = { ...settings.seriesSettings };\n\n // Add default settings for new series\n newSeriesFields.forEach((field) => {\n if (!newSeriesSettings[field]) {\n newSeriesSettings[field] = { ...DEFAULT_SERIES_SETTINGS };\n }\n });\n\n // Remove settings for removed series\n Object.keys(newSeriesSettings).forEach((field) => {\n if (!newSeriesFields.includes(field)) {\n delete newSeriesSettings[field];\n }\n });\n\n updateSettings({\n seriesField: newSeriesFields,\n seriesSettings: newSeriesSettings,\n });\n }}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Line Style</Label>\n <ComboBox\n value={{\n label:\n settings.styles.curveType === \"linear\"\n ? \"Linear\"\n : settings.styles.curveType === \"monotoneX\"\n ? \"Smooth\"\n : \"Step\",\n value: settings.styles.curveType,\n }}\n options={[\n { label: \"Linear\", value: \"linear\" as const },\n { label: \"Smooth\", value: \"monotoneX\" as const },\n { label: \"Step\", value: \"step\" as const },\n ]}\n onChange={(option) =>\n updateStyles({ curveType: option?.value ?? \"linear\" })\n }\n optionToString={(option) => option.label}\n />\n\n <Label>Show Legend</Label>\n <div className=\"flex items-center\">\n <Switch\n checked={settings.showLegend}\n onCheckedChange={(checked) =>\n updateSettings({ showLegend: checked })\n }\n />\n </div>\n\n {settings.showLegend && (\n <>\n <Label>Legend Position</Label>\n <ComboBox\n value={{\n label:\n settings.legendPosition.charAt(0).toUpperCase() +\n settings.legendPosition.slice(1),\n value: settings.legendPosition,\n }}\n options={[\n { label: \"Top\", value: \"top\" as const },\n { label: \"Right\", value: \"right\" as const },\n { label: \"Bottom\", value: \"bottom\" as const },\n { label: \"Left\", value: \"left\" as const },\n ]}\n onChange={(option) =>\n updateSettings({\n legendPosition: option?.value ?? \"top\",\n })\n }\n optionToString={(option) => option.label}\n />\n </>\n )}\n </div>\n\n <Tabs defaultValue=\"general\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"series\">Series</TabsTrigger>\n <TabsTrigger value=\"axis\">Axis</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"series\">\n <div className=\"space-y-4\">\n {settings.seriesField.map((field) => (\n <LineSeriesSettings\n key={field}\n seriesName={field}\n settings={\n settings.seriesSettings[field] ?? DEFAULT_SERIES_SETTINGS\n }\n onSettingsChange={(newSettings) =>\n updateSeriesSettings(field, newSettings)\n }\n />\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"axis\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label className=\"font-medium\">Grid Lines</Label>\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={settings.showXGrid}\n onCheckedChange={(checked) =>\n updateSettings({ showXGrid: checked })\n }\n />\n <Label>Show X Grid</Label>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={settings.showYGrid}\n onCheckedChange={(checked) =>\n updateSettings({ showYGrid: checked })\n }\n />\n <Label>Show Y Grid</Label>\n </div>\n </div>\n </div>\n </TabsContent>\n </Tabs>\n </div>\n );\n};\n","import {\n type BaseChartSettings,\n type ChartDefinition,\n type ChartLayout,\n} from \"@/types/ChartTypes\";\nimport { LineChart as LineChartIcon } from \"lucide-react\";\nimport { LineChart } from \"./LineChart\";\nimport { LineChartSettingsPanel } from \"./LineChartSettingsPanel\";\n\nexport interface SeriesSettings {\n showPoints: boolean;\n pointSize: number;\n pointOpacity: number;\n lineWidth: number;\n lineOpacity: number;\n lineColor?: string;\n lineStyle: \"solid\" | \"dashed\" | \"dotted\";\n useRightAxis: boolean;\n}\n\nexport interface LineChartSettings extends BaseChartSettings {\n type: \"line\";\n\n // Data fields\n xField: string;\n seriesField: string[];\n\n // Series settings\n seriesSettings: Record<string, SeriesSettings>;\n\n // Global line styling\n styles: {\n curveType: \"linear\" | \"monotoneX\" | \"step\";\n };\n\n // Grid options\n showXGrid: boolean;\n showYGrid: boolean;\n\n // Legend options\n showLegend: boolean;\n legendPosition: \"top\" | \"right\" | \"bottom\" | \"left\";\n}\n\nexport const DEFAULT_SERIES_SETTINGS: SeriesSettings = {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n};\n\nexport const lineChartDefinition: ChartDefinition<LineChartSettings> = {\n type: \"line\",\n name: \"Line Chart\",\n description: \"Display data as connected points over time or sequence\",\n icon: LineChartIcon,\n component: LineChart,\n settingsPanel: LineChartSettingsPanel,\n createDefaultSettings: (layout: ChartLayout): LineChartSettings => ({\n id: \"\",\n type: \"line\",\n title: \"\",\n field: \"\",\n layout,\n colorScaleId: undefined,\n colorField: undefined,\n facet: {\n enabled: false,\n type: \"grid\",\n rowVariable: \"\",\n columnVariable: \"\",\n },\n xAxis: {},\n yAxis: {},\n margin: {},\n filters: [],\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n xField: \"\",\n seriesField: [],\n seriesSettings: {},\n styles: {\n curveType: \"linear\",\n },\n showXGrid: true,\n showYGrid: true,\n showLegend: true,\n legendPosition: \"top\",\n }),\n validateSettings: (settings: LineChartSettings): boolean => {\n return settings.xField !== \"\" && settings.seriesField.length > 0;\n },\n getFilterFunction: (settings: LineChartSettings) => {\n return (d: number) => true;\n },\n};\n","import { BaseChartProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { datum, Filter, ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand, scaleLinear } from \"d3-scale\";\nimport { useEffect, useMemo } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetLiveData } from \"../useGetLiveData\";\n\ntype RowChartProps = BaseChartProps<RowChartSettings>;\n\nexport function RowChart({ settings, width, height, facetIds }: RowChartProps) {\n const data = useGetLiveData(settings, settings.field, facetIds);\n\n const { getColorForValue } = useColorScales();\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n\n const updateChart = useDataLayer((s) => s.updateChart);\n\n const valueFilter = settings.filters.find(\n (f: Filter): f is ValueFilter =>\n f.type === \"value\" && f.field === settings.field\n );\n const filterValues = valueFilter?.values ?? [];\n\n const handleBarClick = (label: datum) => {\n if (label === \"Others\") {\n // Don't allow filtering on \"Others\" category\n return;\n }\n\n const newValues = filterValues.includes(label)\n ? filterValues.filter((f) => f !== label)\n : [...filterValues, label];\n\n // Create new filters array with updated value filter\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n // Chart dimensions\n const margin = { top: 20, right: 40, bottom: 30, left: 100 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Calculate counts and handle overflow\n const { displayCounts } = useMemo(() => {\n const countMap = new Map<datum, number>();\n data.forEach((value) => {\n const key = value === undefined ? \"undefined\" : value;\n countMap.set(key, (countMap.get(key) || 0) + 1);\n });\n\n // Convert to array and sort by count descending\n const sortedCounts = Array.from(countMap.entries())\n .map(([label, count]) => ({ label, count }))\n .sort((a, b) => b.count - a.count);\n\n // Calculate how many rows we can fit based on min and max row height constraints\n const availableHeight = height - margin.top - margin.bottom;\n const rowHeight = Math.max(\n settings.minRowHeight,\n Math.min(settings.maxRowHeight, availableHeight / sortedCounts.length)\n );\n const maxRows = Math.floor(availableHeight / rowHeight);\n\n // If we have more items than we can display, create an \"Others\" category\n if (sortedCounts.length > maxRows) {\n const visibleCounts = sortedCounts.slice(0, maxRows - 1);\n const otherSum = sortedCounts\n .slice(maxRows - 1)\n .reduce((sum, item) => sum + item.count, 0);\n\n return {\n displayCounts: [...visibleCounts, { label: \"Others\", count: otherSum }],\n };\n }\n\n return {\n displayCounts: sortedCounts,\n };\n }, [\n data,\n height,\n margin.top,\n margin.bottom,\n settings.minRowHeight,\n settings.maxRowHeight,\n ]);\n\n // Register axis limits with the facet context if in a facet\n useEffect(() => {\n if (facetIds && displayCounts.length > 0) {\n // Register x-axis limits (numerical for row chart)\n const maxValue = Math.max(...displayCounts.map((d) => d.count));\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: 0,\n max: maxValue,\n });\n }\n }, [settings.id, facetIds, displayCounts, registerAxisLimits]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales with synchronized limits if in a facet\n const xScale = useMemo(() => {\n const maxValue = Math.max(...displayCounts.map((d) => d.count));\n\n if (globalXLimits && globalXLimits.type === \"numerical\") {\n return scaleLinear()\n .domain([0, globalXLimits.max])\n .range([0, innerWidth])\n .nice();\n }\n\n return scaleLinear().domain([0, maxValue]).range([0, innerWidth]).nice();\n }, [displayCounts, innerWidth, globalXLimits]);\n\n const yScale = useMemo(() => {\n if (globalYLimits && globalYLimits.type === \"categorical\") {\n const allCategories = Array.from(globalYLimits.categories);\n return scaleBand()\n .domain(allCategories)\n .range([0, innerHeight])\n .padding(0.1);\n }\n\n return scaleBand()\n .domain(displayCounts.map((d) => String(d.label)))\n .range([0, innerHeight])\n .padding(0.1);\n }, [displayCounts, innerHeight, globalYLimits]);\n\n if (displayCounts.length === 0) {\n return <div style={{ width, height }}>No data to display</div>;\n }\n\n return (\n <div style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n margin={margin}\n xScale={xScale}\n yScale={yScale}\n settings={settings}\n >\n <g className=\"select-none\">\n {/* Bars */}\n {displayCounts.map(({ label, count }) => {\n let isFiltered = true;\n if (valueFilter) {\n isFiltered = applyFilter(label, valueFilter);\n }\n\n const color =\n valueFilter && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n String(label),\n \"hsl(217.2 91.2% 59.8%)\"\n );\n\n const barWidth = xScale(count);\n const barHeight = yScale.bandwidth();\n\n if (barWidth < 1 || barHeight < 1) {\n return null;\n }\n\n return (\n <rect\n key={String(label)}\n x={0}\n y={yScale(String(label))}\n width={barWidth}\n height={barHeight}\n className={`${\n label === \"Others\"\n ? \"fill-muted/80 hover:fill-muted\"\n : \"cursor-pointer\"\n }`}\n style={{ fill: color }}\n onClick={() => handleBarClick(label)}\n />\n );\n })}\n\n {/* Count labels */}\n {displayCounts.map(({ label, count }) => (\n <text\n key={String(label)}\n x={xScale(count) + 5}\n y={yScale(String(label))! + yScale.bandwidth() / 2}\n dominantBaseline=\"middle\"\n className=\"text-sm fill-foreground\"\n >\n {count}\n </text>\n ))}\n </g>\n </BaseChart>\n </div>\n );\n}\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { ChartSettingsPanelProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nexport function RowChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<RowChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Data Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field ?? \"\"}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label htmlFor=\"minRowHeight\">Min Row Height</Label>\n <NumericInputEnter\n value={settings.minRowHeight || 30}\n onChange={(value) =>\n onSettingsChange({ ...settings, minRowHeight: value })\n }\n min={20}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Enter minimum row height\"\n />\n\n <Label htmlFor=\"maxRowHeight\">Max Row Height</Label>\n <NumericInputEnter\n value={settings.maxRowHeight || 50}\n onChange={(value) =>\n onSettingsChange({ ...settings, maxRowHeight: value })\n }\n min={30}\n max={200}\n stepSmall={1}\n stepMedium={10}\n stepLarge={20}\n placeholder=\"Enter maximum row height\"\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"colorField\"\n checked={settings.field === settings.colorField}\n onCheckedChange={(checked) => {\n onSettingsChange({\n ...settings,\n colorField: checked ? settings.field : undefined,\n colorScaleId:\n checked && settings.field\n ? getOrCreateScaleForField(settings.field)\n : undefined,\n });\n }}\n />\n <Label htmlFor=\"colorField\">Use as color field</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { BarChart } from \"lucide-react\";\n\nimport { RowChart } from \"@/components/charts/RowChart/RowChart\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport {\n ChartDefinition,\n ChartLayout,\n RowChartSettings,\n datum,\n} from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DEFAULT_ROW_SETTINGS } from \"@/utils/defaultSettings\";\nimport { RowChartSettingsPanel } from \"./RowChartSettingsPanel\";\n\nexport const rowChartDefinition: ChartDefinition<RowChartSettings> = {\n type: \"row\",\n name: \"Row Chart\",\n description: \"A horizontal bar chart showing values by category\",\n icon: BarChart,\n\n component: RowChart,\n settingsPanel: RowChartSettingsPanel,\n\n createDefaultSettings: (layout: ChartLayout, field?: string) => ({\n ...DEFAULT_ROW_SETTINGS,\n id: crypto.randomUUID(),\n layout,\n field: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return Boolean(settings.field);\n },\n\n getFilterFunction: (\n settings: RowChartSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const dataHash = fieldGetter(settings.field);\n const valueFilter = settings.filters.find(\n (f): f is Filter => f.type === \"value\" && f.field === settings.field\n );\n\n return (d: IdType) => {\n if (!valueFilter) {\n return true;\n }\n\n const value = dataHash[d];\n return applyFilter(value, valueFilter);\n };\n },\n};\n","import { barChartDefinition } from \"@/components/charts/BarChart/definition\";\nimport { scatterPlotDefinition } from \"@/components/charts/ScatterPlot/definition\";\nimport { threeDScatterDefinition } from \"@/components/charts/ThreeDScatter/definition\";\nimport { pivotTableDefinition } from \"@/components/charts/PivotTable/definition\";\nimport { dataTableDefinition } from \"@/components/charts/DataTable/definition\";\nimport { summaryTableDefinition } from \"@/components/charts/SummaryTable/definition\";\nimport { markdownDefinition } from \"@/components/charts/Markdown/definition\";\nimport { boxPlotDefinition } from \"@/components/charts/BoxPlot/definition\";\nimport { colorLegendDefinition } from \"@/components/charts/ColorLegend/definition\";\nimport { lineChartDefinition } from \"@/components/charts/LineChart/definition\";\nimport {\n BaseChartSettings,\n ChartDefinition,\n ChartSettings,\n} from \"@/types/ChartTypes\";\nimport { rowChartDefinition } from \"../components/charts/RowChart/definition\";\n\ntype ChartType = string;\n\nexport interface ChartRegistry {\n register<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n ): void;\n get(type: ChartType): ChartDefinition<ChartSettings> | undefined;\n getAll(): ChartDefinition<ChartSettings>[];\n has(type: ChartType): boolean;\n}\n\nexport class ChartRegistryImpl implements ChartRegistry {\n private definitions = new Map<ChartType, ChartDefinition<ChartSettings>>();\n\n register<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n ): void {\n if (this.definitions.has(definition.type)) {\n console.error(`Chart type ${definition.type} is already registered`);\n return;\n }\n this.definitions.set(\n definition.type,\n definition as unknown as ChartDefinition<ChartSettings>\n );\n }\n\n get(type: ChartType): ChartDefinition<ChartSettings> | undefined {\n return this.definitions.get(type);\n }\n\n getAll(): ChartDefinition<ChartSettings>[] {\n return Array.from(this.definitions.values());\n }\n\n has(type: ChartType): boolean {\n return this.definitions.has(type);\n }\n}\n\n// Singleton instance\nexport const chartRegistry = new ChartRegistryImpl();\n\n// Helper functions\nexport function registerChart<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n): void {\n chartRegistry.register(definition);\n}\n\nexport function getChartDefinition(\n type: ChartType\n): ChartDefinition<ChartSettings> {\n const def = chartRegistry.get(type);\n if (!def) {\n throw new Error(`Chart type ${type} not registered`);\n }\n return def;\n}\n\nexport function useChartDefinition(type: ChartType) {\n const definition = chartRegistry.get(type);\n\n if (!definition) {\n throw new Error(`Chart type ${type} not registered`);\n }\n\n return definition;\n}\n\nexport function registerAllCharts() {\n chartRegistry.register(rowChartDefinition);\n chartRegistry.register(barChartDefinition);\n chartRegistry.register(scatterPlotDefinition);\n chartRegistry.register(threeDScatterDefinition);\n chartRegistry.register(pivotTableDefinition);\n chartRegistry.register(dataTableDefinition);\n chartRegistry.register(summaryTableDefinition);\n chartRegistry.register(markdownDefinition);\n chartRegistry.register(boxPlotDefinition);\n chartRegistry.register(colorLegendDefinition);\n chartRegistry.register(lineChartDefinition);\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport crossfilter from \"crossfilter2\";\nimport isEqual from \"react-fast-compare\";\n\ntype FieldValue = string | number | boolean | undefined;\n\ntype ChartDimension<TData, TId extends IdType> = {\n dimension: crossfilter.Dimension<TData, TId>;\n chart: ChartSettings;\n};\n\nexport class CrossfilterWrapper<T> {\n ref: crossfilter.Crossfilter<T>;\n charts: Map<string, ChartDimension<T, IdType>> = new Map();\n idFunction: (item: T) => IdType;\n\n // assume this gets set after creation\n fieldGetter: (name: string) => Record<IdType, FieldValue> = () => ({});\n\n constructor(data: T[], idFunction: (item: T) => IdType) {\n this.ref = crossfilter(data);\n this.idFunction = idFunction;\n }\n\n setFieldGetter(fieldGetter: (name: string) => Record<IdType, FieldValue>) {\n this.fieldGetter = fieldGetter;\n }\n\n updateChart(chart: ChartSettings) {\n // check if the filters have changed\n const oldChart = this.charts.get(chart.id);\n\n // Compare filters directly\n if (!isEqual(oldChart?.chart.filters, chart.filters)) {\n this.updateChartFilters(chart);\n }\n\n // need to update internal defs so diff works again\n\n if (!oldChart) {\n // will hit this case if we did an update and should have done remove/add\n this.charts.set(chart.id, {\n dimension: this.ref.dimension(this.idFunction),\n chart,\n });\n } else {\n this.charts.set(chart.id, {\n ...oldChart,\n chart,\n });\n }\n }\n\n updateChartFilters(chart: ChartSettings) {\n // get the filters from the chart\n const filterFunc = this.getFilterFunction(chart);\n\n const foundChart = this.charts.get(chart.id);\n\n // apply the filters to the dimension\n const dimension = foundChart?.dimension;\n if (!dimension) {\n console.error(\"updateChartFilters: dimension not found\", {\n chart,\n charts: this.charts,\n });\n return;\n }\n\n dimension.filterFunction(filterFunc);\n\n // this gives an object with key + value\n // the value will be 1 if the item should be rendered\n // will still need to check the value = 1 items in the actual chart with the filter func again\n // ideally wire up the hook to the raw crossfilter obj so charts can get IDs to render per dim\n }\n\n addChart(chart: ChartSettings) {\n // need to create a dimension for the chart\n const dimension = this.ref.dimension(this.idFunction);\n\n const chartDimension: ChartDimension<T, IdType> = {\n dimension,\n chart,\n };\n\n this.charts.set(chart.id, chartDimension);\n\n this.updateChartFilters(chart);\n }\n\n removeChart(chart: ChartSettings) {\n const savedChart = this.charts.get(chart.id);\n if (!savedChart) {\n throw new Error(`Chart ${chart.id} not found`);\n }\n\n savedChart.dimension.filterAll();\n savedChart.dimension.dispose();\n this.charts.delete(chart.id);\n }\n\n removeAllCharts() {\n // Clear and dispose all dimensions\n for (const chart of this.charts.values()) {\n chart.dimension.filterAll();\n chart.dimension.dispose();\n }\n // Clear the charts map\n this.charts.clear();\n }\n\n getFilterFunction(chart: ChartSettings): (d: IdType) => boolean {\n const definition = getChartDefinition(chart.type);\n return definition.getFilterFunction(chart, this.fieldGetter);\n }\n\n getAllData() {\n // obj with key as id and value as datum\n\n // id -> count\n const data: LiveItemMap = {};\n\n const commonNonce = new Date().getTime();\n\n for (const chart of this.charts.values()) {\n data[chart.chart.id] = {\n items: chart.dimension.group<IdType, number>().all(),\n nonce: commonNonce,\n };\n }\n\n return data;\n }\n}\n\nexport type LiveItem = {\n items: readonly crossfilter.Grouping<IdType, number>[];\n nonce: number;\n};\n\nexport type LiveItemMap = Record<string, LiveItem>;\n","import { datum } from \"@/types/ChartTypes\";\nimport { timeFormat } from \"d3-time-format\";\nimport {\n type AdvancedExpression,\n type BasicExpression,\n type CalculationContext,\n type CalculationResult,\n type Expression,\n type FunctionExpression,\n type GroupExpression,\n type LiteralExpression,\n type RankExpression,\n type TernaryExpression,\n type UnaryExpression,\n} from \"../types\";\n\ntype CalcFunction = (...args: any[]) => any;\n\nexport class Calculator {\n constructor(private context: CalculationContext) {}\n\n evaluate(expression: Expression): CalculationResult {\n try {\n let result: any;\n let funcResult: CalculationResult;\n\n switch (expression.type) {\n case \"basic\":\n result = this.evaluateBasic(expression as BasicExpression);\n break;\n case \"function\":\n funcResult = this.evaluateFunction(expression as FunctionExpression);\n if (!funcResult.success) {\n console.error(\n `[Calculator.evaluate] Function evaluation failed: ${funcResult.error}`\n );\n return funcResult;\n }\n result = funcResult.value;\n break;\n case \"group\":\n result = this.evaluateGroup(expression as GroupExpression);\n break;\n case \"rank\":\n result = this.evaluateRank(expression as RankExpression);\n break;\n case \"advanced\":\n result = this.evaluateAdvanced(expression as AdvancedExpression);\n break;\n case \"ternary\":\n result = this.evaluateTernary(expression as TernaryExpression);\n break;\n case \"unary\":\n result = this.evaluateUnary(expression as UnaryExpression);\n break;\n case \"literal\":\n result = this.evaluateLiteral(expression as LiteralExpression);\n break;\n default:\n throw new Error(\n `Unknown expression type: ${(expression as any).type}`\n );\n }\n\n // Ensure we return a proper CalculationResult\n return {\n success: true,\n value: result,\n };\n } catch (error: unknown) {\n console.error(\n `[Calculator.evaluate] Error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n return {\n success: false,\n value: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private evaluateBasic(expression: BasicExpression): datum {\n if (!expression.left || !expression.right) {\n throw new Error(`Invalid basic expression: missing operands`);\n }\n\n const leftResult = this.evaluate(expression.left);\n if (!leftResult.success) {\n throw new Error(`Failed to evaluate left operand: ${leftResult.error}`);\n }\n\n const rightResult = this.evaluate(expression.right);\n if (!rightResult.success) {\n throw new Error(`Failed to evaluate right operand: ${rightResult.error}`);\n }\n\n const left = leftResult.value;\n const right = rightResult.value;\n\n // Convert operands to numbers if they're strings that look like numbers\n const leftNum = typeof left === \"string\" ? Number(left) : left;\n const rightNum = typeof right === \"string\" ? Number(right) : right;\n\n if (isNaN(leftNum) || isNaN(rightNum)) {\n throw new Error(\n `Invalid operands for operator ${expression.operator}: ${left}, ${right}`\n );\n }\n\n switch (expression.operator) {\n case \"+\":\n return leftNum + rightNum;\n case \"-\":\n return leftNum - rightNum;\n case \"*\":\n return leftNum * rightNum;\n case \"/\":\n if (rightNum === 0) {\n throw new Error(\"Division by zero\");\n }\n return leftNum / rightNum;\n case \"^\":\n return Math.pow(leftNum, rightNum);\n default:\n throw new Error(`Unknown operator: ${expression.operator}`);\n }\n }\n\n private evaluateFunction(expression: FunctionExpression): CalculationResult {\n // Get the function implementation first\n const func = this.getFunction(expression.functionName);\n if (!func) {\n console.error(\n `[Calculator.evaluateFunction] Unknown function: ${expression.functionName}`\n );\n return {\n success: false,\n value: null,\n error: `Unknown function: ${expression.functionName}`,\n };\n }\n\n try {\n // Evaluate all arguments\n\n const evaluatedArgs = expression.arguments.map((arg: Expression) => {\n if (arg.type === \"literal\") {\n const literalArg = arg as LiteralExpression;\n\n // If it has a numeric value, use it directly\n if (literalArg.value !== undefined) {\n if (typeof literalArg.value === \"number\") {\n return literalArg.value;\n }\n\n // If it's a string literal, use it directly\n if (typeof literalArg.value === \"string\") {\n // Check if it's a variable reference\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalArg.value)) {\n const value = this.context.variables.get(literalArg.value);\n if (value !== undefined) {\n return value;\n }\n }\n return literalArg.value;\n }\n\n return literalArg.value;\n }\n\n // If name is defined and it's a number, use it directly\n if (typeof literalArg.name === \"string\") {\n // If it looks like a number, convert it\n if (!isNaN(Number(literalArg.name))) {\n return Number(literalArg.name);\n }\n\n // If it looks like a variable, try to resolve it\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalArg.name)) {\n const value = this.context.variables.get(literalArg.name);\n if (value !== undefined) {\n return value;\n }\n }\n\n return literalArg.name;\n }\n\n return literalArg.value !== undefined\n ? literalArg.value\n : literalArg.name;\n }\n\n const result = this.evaluate(arg);\n if (!result.success) {\n throw new Error(`Failed to evaluate argument: ${result.error}`);\n }\n return result.value;\n });\n\n // For date functions, ensure the first argument is a Date object\n if (\n expression.functionName.toLowerCase() === \"formatdate\" ||\n expression.functionName.toLowerCase() === \"extractdatecomponent\"\n ) {\n if (!(evaluatedArgs[0] instanceof Date)) {\n try {\n // If it's a variable name, try to get the actual date from variables\n if (\n typeof evaluatedArgs[0] === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(evaluatedArgs[0])\n ) {\n const dateValue = this.context.variables.get(evaluatedArgs[0]);\n if (dateValue instanceof Date) {\n evaluatedArgs[0] = dateValue;\n } else if (dateValue !== undefined) {\n evaluatedArgs[0] = new Date(dateValue);\n }\n } else {\n evaluatedArgs[0] = new Date(evaluatedArgs[0]);\n }\n\n if (isNaN(evaluatedArgs[0].getTime())) {\n console.error(\n `[Calculator.evaluateFunction] Invalid date:`,\n evaluatedArgs[0]\n );\n return {\n success: false,\n value: null,\n error: `Invalid date: ${evaluatedArgs[0]}`,\n };\n }\n } catch (error) {\n console.error(\n `[Calculator.evaluateFunction] Date conversion error:`,\n error\n );\n return {\n success: false,\n value: null,\n error: `Failed to convert argument to Date: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n }\n\n // Execute the function with evaluated arguments\n const result = func(...evaluatedArgs);\n return {\n success: true,\n value: result,\n };\n } catch (error) {\n console.error(`[Calculator.evaluateFunction] Error:`, error);\n return {\n success: false,\n value: null,\n error: `Error executing function ${expression.functionName}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n\n private evaluateGroup(expression: GroupExpression): Record<string, datum> {\n const groupBy = expression.groupBy;\n const aggregation = expression.aggregation;\n\n // Group the data\n const groups = new Map<string, any[]>();\n for (const row of this.context.data) {\n const key = groupBy.map((field: string) => row[field]).join(\":\");\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n }\n\n // Apply aggregation to each group\n const results = new Map<string, any>();\n for (const [key, groupData] of groups) {\n results.set(key, this.aggregate(groupData, aggregation));\n }\n\n return Object.fromEntries(results);\n }\n\n private evaluateRank(expression: RankExpression): Record<number, number> {\n const rankBy = expression.rankBy;\n const isNormalized = expression.isNormalized;\n const isCumulative = expression.isCumulative;\n\n // Sort the data\n const sortedData = [...this.context.data].sort((a, b) => {\n for (const field of rankBy) {\n if (a[field] < b[field]) {\n return -1;\n }\n if (a[field] > b[field]) {\n return 1;\n }\n }\n return 0;\n });\n\n // Assign ranks\n const ranks = new Map<number, number>();\n sortedData.forEach((row, index) => {\n const rank = index + 1;\n ranks.set(row.id, isNormalized ? rank / sortedData.length : rank);\n });\n\n if (isCumulative) {\n let sum = 0;\n const sortedRanks = Array.from(ranks.entries()).sort(([id1], [id2]) => {\n const row1 = sortedData.find((row) => row.id === id1);\n const row2 = sortedData.find((row) => row.id === id2);\n if (!row1 || !row2) {\n return 0;\n }\n for (const field of rankBy) {\n if (row1[field] < row2[field]) {\n return -1;\n }\n if (row1[field] > row2[field]) {\n return 1;\n }\n }\n return 0;\n });\n\n for (const [id, value] of sortedRanks) {\n sum += value;\n ranks.set(id, sum);\n }\n }\n\n return Object.fromEntries(ranks);\n }\n\n private evaluateAdvanced(expression: AdvancedExpression): Promise<any> {\n // This would be implemented based on the specific advanced analytics needed\n throw new Error(\"Advanced analytics not implemented yet\");\n }\n\n private getFunction(name: string): CalcFunction | undefined {\n console.log(`[Calculator.getFunction] Looking up function: ${name}`);\n const functions: Record<string, CalcFunction> = {\n sum: (...values: number[]) => {\n return values.reduce((a, b) => Number(a) + Number(b), 0);\n },\n avg: (...values: number[]) => {\n return (\n values.reduce((a, b) => Number(a) + Number(b), 0) / values.length\n );\n },\n min: (...values: number[]) => {\n return Math.min(...values.map((v) => Number(v)));\n },\n max: (...values: number[]) => {\n return Math.max(...values.map((v) => Number(v)));\n },\n count: (...values: any[]) => {\n return values.length;\n },\n formatdate: (date: Date, format: string) => {\n return this.formatDate(date, format);\n },\n extractdatecomponent: (\n date: Date,\n component: \"year\" | \"month\" | \"day\" | \"quarter\" | \"week\"\n ) => {\n return this.extractDateComponent(date, component);\n },\n };\n\n // First try exact match\n if (name in functions) {\n return functions[name];\n }\n\n // Try case-insensitive match\n const lowerName = name.toLowerCase();\n const functionKey = Object.keys(functions).find(\n (key) => key.toLowerCase() === lowerName\n );\n return functionKey ? functions[functionKey] : undefined;\n }\n\n private aggregate(data: any[], type: string): any {\n const values = data.map((row) => row.value);\n\n switch (type) {\n case \"sum\":\n return values.reduce((a, b) => a + b, 0);\n case \"average\":\n return values.reduce((a, b) => a + b, 0) / values.length;\n case \"min\":\n return Math.min(...values);\n case \"max\":\n return Math.max(...values);\n case \"count\":\n return values.length;\n case \"countUnique\":\n return new Set(values).size;\n default:\n throw new Error(`Unknown aggregation type: ${type}`);\n }\n }\n\n private evaluateExpression(expr: Expression): number {\n if (expr.type === \"literal\") {\n const literalExpr = expr as LiteralExpression;\n if (literalExpr.value !== undefined) {\n // If it's a string and looks like an identifier, try to resolve it from variables\n if (\n typeof literalExpr.value === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalExpr.value)\n ) {\n const value = this.context.variables.get(literalExpr.value);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${literalExpr.value}`);\n }\n return Number(value);\n }\n return Number(literalExpr.value);\n }\n // Handle identifiers in the name field\n if (\n typeof literalExpr.name === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalExpr.name)\n ) {\n const value = this.context.variables.get(literalExpr.name);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${literalExpr.name}`);\n }\n return Number(value);\n }\n return Number(literalExpr.name);\n }\n\n if (expr.type === \"basic\") {\n const basicExpr = expr as BasicExpression;\n if (!basicExpr.left || !basicExpr.right) {\n throw new Error(`Invalid basic expression: missing operands`);\n }\n\n const left = this.evaluateExpression(basicExpr.left);\n const right = this.evaluateExpression(basicExpr.right);\n\n switch (basicExpr.operator) {\n case \"+\":\n return left + right;\n case \"-\":\n return left - right;\n case \"*\":\n return left * right;\n case \"/\":\n if (right === 0) {\n throw new Error(\"Division by zero\");\n }\n return left / right;\n case \"^\":\n return Math.pow(left, right);\n default:\n throw new Error(`Unknown operator: ${basicExpr.operator}`);\n }\n }\n\n if (expr.type === \"unary\") {\n const unaryExpr = expr as UnaryExpression;\n if (!unaryExpr.operand) {\n throw new Error(`Invalid unary expression: missing operand`);\n }\n\n const operand = this.evaluateExpression(unaryExpr.operand);\n\n switch (unaryExpr.operator) {\n case \"-\":\n return -operand;\n case \"+\":\n return operand;\n default:\n throw new Error(`Unknown unary operator: ${unaryExpr.operator}`);\n }\n }\n\n if (expr.type === \"ternary\") {\n const ternaryExpr = expr as TernaryExpression;\n if (\n !ternaryExpr.condition ||\n !ternaryExpr.trueBranch ||\n !ternaryExpr.falseBranch\n ) {\n throw new Error(`Invalid ternary expression: missing branches`);\n }\n\n const condition = this.evaluateExpression(ternaryExpr.condition);\n return condition\n ? this.evaluateExpression(ternaryExpr.trueBranch)\n : this.evaluateExpression(ternaryExpr.falseBranch);\n }\n\n throw new Error(`Unsupported expression type: ${expr.type}`);\n }\n\n private evaluateUnary(expression: UnaryExpression): datum {\n if (!expression.operand) {\n throw new Error(`Invalid unary expression: missing operand`);\n }\n return this.evaluateExpression(expression);\n }\n\n private evaluateTernary(expression: TernaryExpression): datum {\n if (\n !expression.condition ||\n !expression.trueBranch ||\n !expression.falseBranch\n ) {\n throw new Error(`Invalid ternary expression: missing branches`);\n }\n return this.evaluateExpression(expression);\n }\n\n // Date Processing Functions\n private formatDate(date: Date, format: string): string {\n console.log(\n `[Calculator.formatDate] Formatting date with format: ${format}`,\n date\n );\n try {\n const formatter = timeFormat(format);\n const result = formatter(date);\n console.log(`[Calculator.formatDate] Result:`, result);\n return result;\n } catch (error) {\n console.error(`[Calculator.formatDate] Error:`, error);\n throw new Error(\n `Error formatting date: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private getISOWeek(date: Date): number {\n try {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n d.setDate(d.getDate() + 3 - ((d.getDay() + 6) % 7));\n const week1 = new Date(d.getFullYear(), 0, 4);\n return (\n 1 +\n Math.round(\n ((d.getTime() - week1.getTime()) / 86400000 -\n 3 +\n ((week1.getDay() + 6) % 7)) /\n 7\n )\n );\n } catch (error) {\n throw new Error(\n `Error calculating ISO week: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private extractDateComponent(\n date: Date,\n component: \"year\" | \"month\" | \"day\" | \"quarter\" | \"week\"\n ): number {\n try {\n let result: number;\n switch (component) {\n case \"year\":\n result = date.getFullYear();\n break;\n case \"month\":\n result = date.getMonth() + 1; // Adding 1 since getMonth() returns 0-11\n break;\n case \"day\":\n result = date.getDate();\n break;\n case \"quarter\":\n result = Math.floor(date.getMonth() / 3) + 1;\n break;\n case \"week\":\n result = this.getISOWeek(date);\n break;\n default:\n throw new Error(`Unknown date component: ${component}`);\n }\n return result;\n } catch (error) {\n console.error(`[Calculator.extractDateComponent] Error:`, error);\n throw new Error(\n `Error extracting date component: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n // String Operation Functions\n private concatenateStrings(strings: string[]): string {\n throw new Error(\"String concatenation not implemented\");\n }\n\n private extractSubstring(str: string, start: number, end?: number): string {\n throw new Error(\"Substring extraction not implemented\");\n }\n\n private patternMatch(\n str: string,\n pattern: string,\n replacement?: string\n ): string | string[] {\n throw new Error(\"Pattern matching not implemented\");\n }\n\n // Statistical Functions\n private calculatePercentile(values: number[], percentile: number): number {\n throw new Error(\"Percentile calculation not implemented\");\n }\n\n private calculateStandardDeviation(values: number[]): number {\n throw new Error(\"Standard deviation calculation not implemented\");\n }\n\n private calculateVariance(values: number[]): number {\n throw new Error(\"Variance calculation not implemented\");\n }\n\n private calculateMedian(values: number[]): number {\n throw new Error(\"Median calculation not implemented\");\n }\n\n private calculateZScore(value: number, mean: number, stdDev: number): number {\n throw new Error(\"Z-score calculation not implemented\");\n }\n\n // Advanced Analytics Functions\n private performSOM(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"Self-organizing maps not implemented\");\n }\n\n private performPCA(data: number[][], components: number): number[][] {\n throw new Error(\"PCA not implemented\");\n }\n\n private performUMAP(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"UMAP transformation not implemented\");\n }\n\n private performTSNE(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"t-SNE transformation not implemented\");\n }\n\n // Regression Analysis Functions\n private performLinearRegression(\n x: number[],\n y: number[]\n ): Record<string, any> {\n throw new Error(\"Linear regression not implemented\");\n }\n\n private performPolynomialRegression(\n x: number[],\n y: number[],\n degree: number\n ): Record<string, any> {\n throw new Error(\"Polynomial regression not implemented\");\n }\n\n private calculateResiduals(\n observed: number[],\n predicted: number[]\n ): number[] {\n throw new Error(\"Residuals calculation not implemented\");\n }\n\n private performANOVA(groups: number[][]): Record<string, any> {\n throw new Error(\"ANOVA not implemented\");\n }\n\n // Data Transformation Functions\n private normalizeData(values: number[]): number[] {\n throw new Error(\"Data normalization not implemented\");\n }\n\n private standardizeData(values: number[]): number[] {\n throw new Error(\"Data standardization not implemented\");\n }\n\n private logTransform(values: number[], base?: number): number[] {\n throw new Error(\"Logarithmic transformation not implemented\");\n }\n\n private binData(\n values: number[],\n binCount: number\n ): Record<string, number[]> {\n throw new Error(\"Data binning not implemented\");\n }\n\n private createDummyVariables(categories: string[]): Record<string, number[]> {\n throw new Error(\"Dummy variable creation not implemented\");\n }\n\n private evaluateLiteral(expression: LiteralExpression): any {\n // If value is defined, use it first\n if (expression.value !== undefined) {\n // If it's a string that looks like an identifier, try to resolve it from variables\n if (\n typeof expression.value === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(expression.value)\n ) {\n const value = this.context.variables.get(expression.value);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${expression.value}`);\n }\n return value;\n }\n // If it's a string that looks like a number, convert it\n if (\n typeof expression.value === \"string\" &&\n !isNaN(Number(expression.value))\n ) {\n return Number(expression.value);\n }\n return expression.value;\n }\n\n // If name is defined and looks like an identifier, try to resolve it from variables\n if (\n typeof expression.name === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(expression.name)\n ) {\n const value = this.context.variables.get(expression.name);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${expression.name}`);\n }\n return value;\n }\n\n // If name is a string that looks like a number, convert it\n if (\n typeof expression.name === \"string\" &&\n !isNaN(Number(expression.name))\n ) {\n return Number(expression.name);\n }\n\n return expression.name;\n }\n}\n","import { DatumObject, HasId } from \"@/providers/DataLayerProvider\";\nimport { Calculator } from \"./engine/Calculator\";\nimport { CalculationContext, Expression } from \"./types\";\nimport { datum } from \"@/types/ChartTypes\";\n\nexport interface CalculationDefinition {\n expression: Expression;\n resultColumnName: string;\n}\n\nexport interface CalculationStateType {\n calculations: CalculationDefinition[];\n calculationResults: Map<string, Map<number, any>>;\n dependencyGraph: Map<string, Set<string>>;\n}\n\nexport const createCalculationState = (): CalculationStateType => {\n return {\n calculations: [],\n calculationResults: new Map(),\n dependencyGraph: new Map(),\n };\n};\n\nexport class CalculationManager<T extends DatumObject> {\n private calculator: Calculator | null = null;\n private state: CalculationStateType;\n\n constructor(private data: (T & HasId)[]) {\n this.state = createCalculationState();\n }\n\n /**\n * Add a new calculation definition\n */\n addCalculation(calculation: CalculationDefinition): Set<string> {\n // Check if a calculation with this result column name already exists\n const existingIndex = this.state.calculations.findIndex(\n (calc) => calc.resultColumnName === calculation.resultColumnName\n );\n\n if (existingIndex !== -1) {\n throw new Error(\n `A calculation with result column name '${calculation.resultColumnName}' already exists`\n );\n }\n\n this.state.calculations.push(calculation);\n this.updateDependencyGraph(calculation);\n\n // Execute the calculation and collect all affected columns\n const affectedColumns = new Set<string>([calculation.resultColumnName]);\n\n // Find all dependent calculations that were executed\n const dependents = this.findDependents(calculation.resultColumnName);\n for (const dependent of dependents) {\n affectedColumns.add(dependent);\n }\n\n return affectedColumns;\n }\n\n /**\n * Remove a calculation by result column name\n */\n removeCalculation(resultColumnName: string): void {\n this.state.calculations = this.state.calculations.filter(\n (calc) => calc.resultColumnName !== resultColumnName\n );\n this.state.calculationResults.delete(resultColumnName);\n this.state.dependencyGraph.delete(resultColumnName);\n\n // Remove this calculation from other calculations' dependencies\n for (const [, dependencies] of this.state.dependencyGraph.entries()) {\n dependencies.delete(resultColumnName);\n }\n }\n\n /**\n * Get all calculation definitions\n */\n getCalculations(): CalculationDefinition[] {\n return [...this.state.calculations];\n }\n\n getPreceedingCalculations(\n calculation: CalculationDefinition\n ): CalculationDefinition[] {\n const precedents = new Set<string>();\n\n // find all calculations that come before this one in the dependency graph\n // do it recursively until we have all precedents\n const visited = new Set<string>();\n const visit = (resultColumnName: string) => {\n if (visited.has(resultColumnName)) {\n return;\n }\n visited.add(resultColumnName);\n\n for (const [calcName, deps] of this.state.dependencyGraph.entries()) {\n if (deps.has(resultColumnName)) {\n precedents.add(calcName);\n visit(calcName);\n }\n }\n };\n\n visit(calculation.resultColumnName);\n\n if (precedents.size === 0) {\n return [];\n }\n\n const precedentsArray = Array.from(precedents);\n return precedentsArray\n .map(\n (name) =>\n this.state.calculations.find(\n (calc) => calc.resultColumnName === name\n ) || undefined\n )\n .filter(Boolean) as CalculationDefinition[];\n }\n\n /**\n * Execute a specific calculation\n */\n executeCalculation(calculation: CalculationDefinition): Map<number, datum> {\n if (!this.calculator) {\n this.initializeCalculator();\n }\n\n const precedents = this.getPreceedingCalculations(calculation);\n for (const precedent of precedents) {\n this.executeCalculation(precedent);\n }\n\n const resultMap = new Map<number, datum>();\n\n // Execute the calculation for each row\n for (const row of this.data) {\n const context: CalculationContext = {\n data: this.data,\n variables: this.createVariablesForRow(row),\n };\n\n this.calculator = new Calculator(context);\n const result = this.calculator.evaluate(calculation.expression);\n\n if (result.success) {\n resultMap.set(row.__ID, result.value);\n } else {\n console.error(\n `Calculation error for ${calculation.resultColumnName}:`,\n result.error\n );\n resultMap.set(row.__ID, undefined);\n }\n }\n\n // Store the results\n this.state.calculationResults.set(calculation.resultColumnName, resultMap);\n\n return resultMap;\n }\n\n /**\n * Find all calculations that depend on a given calculation\n */\n private findDependents(resultColumnName: string): Set<string> {\n const dependents = new Set<string>();\n\n // Find calculations that directly depend on this calculation's result column\n for (const [\n calcName,\n dependencies,\n ] of this.state.dependencyGraph.entries()) {\n // Check if this calculation depends on the target calculation\n if (dependencies.has(resultColumnName)) {\n dependents.add(calcName);\n\n // Recursively find dependents of this dependent\n const nestedDependents = this.findDependents(calcName);\n for (const nestedName of nestedDependents) {\n dependents.add(nestedName);\n }\n }\n }\n\n return dependents;\n }\n\n /**\n * Update the dependency graph for a calculation\n */\n private updateDependencyGraph(calculation: CalculationDefinition): void {\n // Extract variable dependencies from the expression\n const dependencies = new Set<string>(calculation.expression.dependencies);\n\n // Update the dependency graph\n this.state.dependencyGraph.set(calculation.resultColumnName, dependencies);\n }\n\n /**\n * Initialize the calculator with current data\n */\n private initializeCalculator(): void {\n const context: CalculationContext = {\n data: this.data,\n variables: new Map(),\n };\n\n this.calculator = new Calculator(context);\n }\n\n /**\n * Create variables map for a specific row\n */\n private createVariablesForRow(row: T & HasId): Map<string, any> {\n const variables = new Map<string, any>();\n\n // Add all row fields as variables\n for (const [key, value] of Object.entries(row)) {\n if (key !== \"__ID\") {\n variables.set(key, value);\n }\n }\n\n // Add results from already calculated fields\n for (const calculation of this.state.calculations) {\n const results = this.state.calculationResults.get(\n calculation.resultColumnName\n );\n if (results && results.has(row.__ID)) {\n variables.set(calculation.resultColumnName, results.get(row.__ID));\n }\n }\n\n return variables;\n }\n}\n","import { SavedProject } from \"@/providers/DataLayerProvider\";\n\nconst PROJECTS_KEY = \"data-viz-projects\";\n\nexport function saveProjects(projects: SavedProject[]): void {\n localStorage.setItem(PROJECTS_KEY, JSON.stringify(projects));\n}\n\nexport function loadProjects(): SavedProject[] {\n const projectsJson = localStorage.getItem(PROJECTS_KEY);\n if (!projectsJson) {\n return [];\n }\n return JSON.parse(projectsJson);\n}\n\nexport function saveProject(project: SavedProject): void {\n const projects = loadProjects();\n const existingIndex = projects.findIndex(\n (p) => p.sourceDataPath === project.sourceDataPath\n );\n\n if (existingIndex >= 0) {\n projects[existingIndex] = project;\n } else {\n projects.push(project);\n }\n\n saveProjects(projects);\n}\n\nexport function deleteProject(sourceDataPath: string): void {\n const projects = loadProjects();\n const filteredProjects = projects.filter(\n (p) => p.sourceDataPath !== sourceDataPath\n );\n saveProjects(filteredProjects);\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport {\n CrossfilterWrapper,\n LiveItem,\n LiveItemMap,\n} from \"@/hooks/CrossfilterWrapper\";\nimport {\n CalculationDefinition,\n CalculationManager,\n} from \"@/lib/calculations/CalculationState\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { ColorScaleType } from \"@/types/ColorScaleTypes\";\nimport {\n GridSettings,\n SavedDataStructure,\n SerializedColorScale,\n ViewMetadata,\n} from \"@/types/SavedDataTypes\";\nimport { saveProject } from \"@/utils/localStorage\";\nimport { createContext, useContext, useRef } from \"react\";\nimport { createStore, useStore } from \"zustand\";\n\ntype DatumObject = { [key: string]: datum };\nexport type { DatumObject };\n\n// Props and State interfaces\ninterface DataLayerProps<T extends DatumObject> {\n data?: T[];\n charts?: ChartSettings[];\n savedData?: SavedDataStructure;\n}\n\n// Add ID to the data type\nexport type IdType = number;\nexport type HasId = { __ID: IdType };\n\ninterface DataLayerState<T extends DatumObject> extends DataLayerProps<T> {\n data: (T & HasId)[];\n emptyColumn: Record<IdType, datum>;\n fileName: string | undefined;\n setData: (data: T[], fileName?: string) => void;\n\n liveItems: LiveItemMap;\n\n // Chart state\n charts: ChartSettings[];\n addChart: (chart: Omit<ChartSettings, \"id\">) => void;\n removeChart: (chart: ChartSettings) => void;\n removeAllCharts: () => void;\n updateChart: (id: string, settings: Partial<ChartSettings>) => void;\n\n // Color scale state\n colorScales: ColorScaleType[];\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => ColorScaleType;\n removeColorScale: (id: string) => void;\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => void;\n\n // Filter state (placeholder)\n clearAllFilters: () => void;\n clearFilter: (chart: ChartSettings) => void;\n\n crossfilterWrapper: CrossfilterWrapper<T & HasId>;\n nonce: number;\n getLiveItems: (chart: ChartSettings) => LiveItem | undefined;\n\n // data and key functions\n getColumnData: (field: string | undefined) => Record<IdType, datum>;\n getColumnNames: () => string[];\n columnCache: Record<string, Record<IdType, datum>>;\n\n // Project and View Management\n currentProject: SavedProject | null;\n setCurrentProject: (project: SavedProject) => void;\n saveCurrentView: (name: string) => void;\n loadView: (view: SavedView) => void;\n\n // Calculation state\n calculationManager: CalculationManager<T>;\n calculations: CalculationDefinition[];\n addCalculation: (\n calculation: Omit<CalculationDefinition, \"id\">\n ) => Promise<CalculationDefinition>;\n removeCalculation: (resultColumnName: string) => void;\n updateCalculation: (\n resultColumnName: string,\n newCalculation: CalculationDefinition\n ) => void;\n\n calcColumnCache: Record<string, Record<IdType, datum> | undefined>;\n\n // Grid settings\n gridSettings: GridSettings;\n updateGridSettings: (settings: Partial<GridSettings>) => void;\n\n // Save/Restore functionality\n saveToStructure: () => SavedDataStructure;\n restoreFromStructure: (savedData: SavedDataStructure) => void;\n}\n\n// Store type\ntype DataLayerStore<T extends DatumObject> = ReturnType<\n typeof createDataLayerStore<T>\n>;\n\nfunction getDataAndCrossfilterWrapper<T extends DatumObject>(\n data: T[],\n fieldGetter?: (name: string) => Record<IdType, datum>,\n charts?: ChartSettings[]\n): Partial<DataLayerState<T>> {\n const dataWithIds = data.map((row, index) => ({\n ...row,\n __ID: index,\n }));\n const newCrossFilter = new CrossfilterWrapper<T & HasId>(\n dataWithIds,\n (d) => d.__ID\n );\n\n if (fieldGetter) {\n newCrossFilter.setFieldGetter(fieldGetter);\n }\n\n if (charts) {\n charts.forEach((chart) => {\n newCrossFilter.addChart(chart);\n });\n }\n\n return {\n data: dataWithIds,\n emptyColumn: data.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper: newCrossFilter,\n charts: charts ?? [],\n colorScales: [],\n calculationManager: new CalculationManager<T>(dataWithIds),\n calculations: [],\n };\n}\n\n// Store creator\nconst getInitialStoreState = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n): Required<\n Pick<\n DataLayerState<T>,\n | \"data\"\n | \"emptyColumn\"\n | \"crossfilterWrapper\"\n | \"calculationManager\"\n | \"calculations\"\n | \"charts\"\n | \"colorScales\"\n | \"gridSettings\"\n | \"columnCache\"\n | \"calcColumnCache\"\n | \"nonce\"\n | \"currentProject\"\n | \"fileName\"\n >\n> => {\n const {\n data: initData,\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n } = getDataAndCrossfilterWrapper(initProps?.data ?? []);\n\n if (!crossfilterWrapper || !initData || !ogCalculationManager) {\n throw new Error(\n \"Data, crossfilterWrapper, or calculationManager not found\"\n );\n }\n\n // Initialize with saved data if provided\n if (initProps?.savedData) {\n const savedData = initProps.savedData;\n\n // Restore calculations\n const newCalculations: CalculationDefinition[] = [];\n savedData.calculations.forEach((calc) => {\n ogCalculationManager.addCalculation(calc);\n newCalculations.push(calc);\n });\n\n // Restore color scales with proper Map objects\n const restoredColorScales: ColorScaleType[] = savedData.colorScales.map(\n (scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: new Map(scale.mapping),\n };\n }\n return scale;\n }\n );\n\n return {\n data: initData,\n emptyColumn: initData.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: newCalculations,\n charts: savedData.charts,\n colorScales: restoredColorScales,\n gridSettings: savedData.gridSettings,\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n fileName: undefined,\n };\n }\n\n // Return default state if no saved data\n return {\n data: initData,\n emptyColumn: initData.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: [],\n charts: initProps?.charts ?? [],\n colorScales: [],\n gridSettings: {\n columnCount: 12,\n rowHeight: 100,\n containerPadding: 10,\n showBackgroundMarkers: true,\n },\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n fileName: undefined,\n };\n};\n\nconst createDataLayerStore = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n) => {\n const initialState = getInitialStoreState(initProps);\n const { crossfilterWrapper } = initialState;\n\n if (!crossfilterWrapper) {\n throw new Error(\"crossfilterWrapper not found in initial state\");\n }\n\n const store = createStore<DataLayerState<T>>()((set, get) => ({\n ...initialState,\n liveItems: {},\n setData: (rawData, fileName) => {\n // Get fresh crossfilter and data with IDs\n const {\n data: newData,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n } = getDataAndCrossfilterWrapper(rawData, get().getColumnData);\n\n // Create default summary chart\n const definition = getChartDefinition(\"summary\");\n\n const summaryChart = definition.createDefaultSettings({\n x: 0,\n y: 0,\n w: 4,\n h: 6,\n });\n\n // Reset everything to initial state\n set({\n data: newData,\n fileName,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n calculations: [],\n charts: [summaryChart],\n colorScales: [],\n liveItems: {},\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n });\n },\n\n addChart: (chartSettings) => {\n const { crossfilterWrapper } = get();\n const newChart = {\n ...chartSettings,\n id: crypto.randomUUID(),\n } as ChartSettings;\n\n crossfilterWrapper.addChart(newChart);\n set((state) => ({\n charts: [...state.charts, newChart],\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n removeChart: (chart) => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeChart(chart);\n set((state) => ({\n charts: state.charts.filter((ogChart) => ogChart.id !== chart.id),\n }));\n },\n\n removeAllCharts: () => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeAllCharts();\n set({ charts: [] });\n },\n\n updateChart: (id, settings) => {\n const { crossfilterWrapper } = get();\n\n const chart = get().charts.find((chart) => chart.id === id);\n\n if (!chart) {\n console.error(\"updateChart: chart not found\", { id });\n return;\n }\n\n let updatedChart: ChartSettings;\n\n if (id !== settings.id && settings.id) {\n // goal here is to catch obvious problem where id has changed\n\n // remove the old chart, add the new one\n crossfilterWrapper.removeChart(chart);\n crossfilterWrapper.addChart(settings as ChartSettings);\n\n updatedChart = settings as ChartSettings;\n } else {\n updatedChart = {\n ...chart,\n ...settings,\n } as ChartSettings;\n\n crossfilterWrapper.updateChart(updatedChart);\n }\n set((state) => ({\n charts: state.charts.map((chart) =>\n chart.id === id ? updatedChart : chart\n ),\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => {\n const newScale = {\n ...scale,\n id: crypto.randomUUID(),\n } as ColorScaleType;\n\n set((state) => ({\n colorScales: [...state.colorScales, newScale],\n }));\n\n return newScale;\n },\n\n removeColorScale: (id: string) => {\n set((state) => ({\n colorScales: state.colorScales.filter((scale) => scale.id !== id),\n }));\n },\n\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => {\n set((state) => ({\n colorScales: state.colorScales.map((scale) =>\n scale.id === id ? ({ ...scale, ...updates } as ColorScaleType) : scale\n ),\n }));\n },\n\n clearAllFilters: () => {\n const { charts, crossfilterWrapper } = get();\n\n const newCharts = charts.map((chart) => ({\n ...chart,\n filters: [],\n })) as ChartSettings[];\n\n for (const chart of newCharts) {\n crossfilterWrapper.updateChart(chart);\n }\n\n // Update all live items in a single update\n set({\n charts: newCharts,\n liveItems: crossfilterWrapper.getAllData(),\n });\n },\n\n clearFilter: (chart) => {\n const { updateChart } = get();\n updateChart(chart.id, { filters: [] });\n },\n\n getLiveItems: (chart) => {\n const { liveItems } = get();\n\n const liveItemsForChart = liveItems[chart.id] ?? undefined;\n\n return liveItemsForChart;\n },\n\n getColumnNames() {\n const { data, calculations } = get();\n const baseColumns = Object.keys(data[0] || {});\n\n const calcFields = calculations.map((calc) => calc.resultColumnName);\n\n return [...baseColumns, ...calcFields];\n },\n\n getColumnData(field: string | undefined) {\n const {\n columnCache,\n data,\n calcColumnCache,\n calculations,\n emptyColumn,\n calculationManager,\n } = get();\n\n if (!field) {\n return emptyColumn;\n }\n\n if (columnCache[field]) {\n return columnCache[field] as Record<string, datum>;\n }\n\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === field\n );\n\n if (calculation) {\n if (calcColumnCache[field]) {\n return calcColumnCache[field] as Record<string, datum>;\n }\n\n // Otherwise, calculate the column data\n // TODO: Implement calculation in the manager for whole column\n // needs to account for dependencies\n const resultMap = calculationManager.executeCalculation(calculation);\n\n // convert to Record<IdType, datum>\n const columnData: { [key: IdType]: datum } = {};\n resultMap.forEach((value, key) => {\n columnData[key] = value;\n });\n\n // update the column cache\n // doing the RAF since this is called in the render loop\n requestAnimationFrame(() => {\n set((state) => {\n const newCalcColumnCache = { ...state.calcColumnCache };\n newCalcColumnCache[field] = columnData;\n return { calcColumnCache: newCalcColumnCache };\n });\n });\n\n return columnData;\n }\n\n // check if field is in the data -- if not, return all undefined\n // do not add to column cache\n if (!data.some((row) => field in row)) {\n return emptyColumn;\n }\n\n // Otherwise, it's a regular column\n const columnData: { [key: IdType]: datum } = {};\n data.forEach((row) => {\n columnData[row.__ID] = row[field];\n });\n\n // doing the RAF since this is called in the render loop\n requestAnimationFrame(() => {\n set((state) => {\n const newColumnCache = { ...state.columnCache };\n newColumnCache[field] = columnData;\n return { columnCache: newColumnCache };\n });\n });\n\n return columnData;\n },\n\n setCurrentProject: (project: SavedProject) => {\n set({ currentProject: project });\n // Only save to storage if the project is marked as saved\n if (project.isSaved) {\n saveProject(project);\n }\n },\n\n saveCurrentView: (name: string) => {\n const { charts, currentProject, calculations } = get();\n\n if (!currentProject) {\n console.error(\"No project selected\");\n return;\n }\n\n const newView: SavedView = {\n version: 1,\n name,\n charts: [...charts],\n calculations: [...calculations],\n };\n\n const updatedProject: SavedProject = {\n ...currentProject,\n views: [...currentProject.views, newView],\n };\n\n set({ currentProject: updatedProject });\n // Only save to storage if the project is marked as saved\n if (updatedProject.isSaved) {\n saveProject(updatedProject);\n }\n },\n\n loadView: (view: SavedView) => {\n const { crossfilterWrapper, calculationManager } = get();\n\n // Clear existing charts\n crossfilterWrapper.charts.forEach((_, chartId) => {\n crossfilterWrapper.removeChart({ id: chartId } as ChartSettings);\n });\n\n // Load new charts\n set({ charts: view.charts });\n\n // Initialize crossfilter for new charts\n view.charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // Load calculations if they exist\n if (view.calculations) {\n // Clear existing calculations\n calculationManager?.getCalculations().forEach((calc) => {\n calculationManager.removeCalculation(calc.resultColumnName);\n });\n\n // Add new calculations\n const newCalculations: CalculationDefinition[] = [];\n view.calculations.forEach(async (calc) => {\n if (calculationManager) {\n try {\n await calculationManager.addCalculation(calc);\n newCalculations.push(calc);\n } catch (error) {\n console.error(\"Error adding calculation:\", error);\n }\n }\n });\n\n set({ calculations: newCalculations });\n }\n\n set({ liveItems: crossfilterWrapper.getAllData() });\n },\n\n // Calculation management\n addCalculation: async (calculation) => {\n const { calculationManager } = get();\n\n if (!calculationManager) {\n throw new Error(\"Calculation manager not initialized\");\n }\n\n const affectedColumns = calculationManager.addCalculation(calculation);\n\n set((state) => {\n const newCalculations = [...state.calculations, calculation];\n const newCalcColumnCache = { ...state.calcColumnCache };\n for (const columnName of affectedColumns) {\n newCalcColumnCache[columnName] = undefined;\n }\n return {\n calculations: newCalculations,\n calcColumnCache: newCalcColumnCache,\n nonce: state.nonce + 1,\n };\n });\n\n return calculation;\n },\n\n removeCalculation: (resultColumnName) => {\n const { calculationManager } = get();\n if (!calculationManager) {\n throw new Error(\"Calculation manager not initialized\");\n }\n\n calculationManager.removeCalculation(resultColumnName);\n\n set((state) => ({\n calculations: state.calculations.filter(\n (calc) => calc.resultColumnName !== resultColumnName\n ),\n }));\n\n // Remove from column cache\n set((state) => {\n const newColumnCache = { ...state.columnCache };\n if (resultColumnName in newColumnCache) {\n delete newColumnCache[resultColumnName];\n }\n return { columnCache: newColumnCache };\n });\n },\n\n updateCalculation: (resultColumnName, newCalculation) => {\n const { addCalculation, removeCalculation } = get();\n\n removeCalculation(resultColumnName);\n addCalculation(newCalculation);\n },\n\n updateGridSettings: (settings) => {\n set((state) => ({\n gridSettings: {\n ...state.gridSettings,\n ...settings,\n },\n }));\n },\n\n // Save/Restore functionality\n saveToStructure: () => {\n const state = get();\n const metadata: ViewMetadata = {\n name: state.currentProject?.name ?? \"Untitled\",\n version: 1,\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n };\n\n // Convert Map objects in colorScales to arrays for serialization\n const serializedColorScales: SerializedColorScale[] =\n state.colorScales.map((scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: Array.from(scale.mapping.entries()),\n };\n }\n return scale;\n });\n\n return {\n charts: state.charts,\n calculations: state.calculations,\n gridSettings: state.gridSettings,\n metadata,\n colorScales: serializedColorScales,\n };\n },\n\n restoreFromStructure: (savedData: SavedDataStructure) => {\n const { crossfilterWrapper, calculationManager } = get();\n\n // Clear existing charts\n crossfilterWrapper.removeAllCharts();\n\n savedData.charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // Restore calculations\n const newCalculations: CalculationDefinition[] = [];\n savedData.calculations.forEach(async (calc) => {\n if (calculationManager) {\n try {\n await calculationManager.addCalculation(calc);\n newCalculations.push(calc);\n } catch (error) {\n console.error(\"Error restoring calculation:\", error);\n }\n }\n });\n\n // Restore color scales with proper Map objects\n const restoredColorScales: ColorScaleType[] = savedData.colorScales.map(\n (scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: new Map(scale.mapping),\n };\n }\n return scale;\n }\n );\n\n set((state) => ({\n gridSettings: savedData.gridSettings,\n charts: savedData.charts,\n calculations: newCalculations,\n colorScales: restoredColorScales,\n liveItems: crossfilterWrapper.getAllData(),\n nonce: state.nonce + 1,\n }));\n },\n }));\n\n // this stuff is done down here because we need the store methods to exist\n // before plumbing them into the crossfilter wrapper\n // not ideal... but it works.\n\n // this madness passes the column getter back into the crossfilter wrapper\n // this ensures that crossfilter has access to calculated fields\n crossfilterWrapper.setFieldGetter(store.getState().getColumnData);\n\n // add the initial charts to crossfilter\n store.getState().charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // set the live items\n store.setState({ liveItems: crossfilterWrapper.getAllData() });\n\n return store;\n};\n\n// Create context\nexport const DataLayerContext = createContext<DataLayerStore<any> | null>(null);\n\n// Provider wrapper\ntype DataLayerProviderProps<T extends DatumObject> = React.PropsWithChildren<\n DataLayerProps<T>\n>;\n\nexport function DataLayerProvider<T extends DatumObject>({\n children,\n ...props\n}: DataLayerProviderProps<T>) {\n const storeRef = useRef<DataLayerStore<T> | null>(null);\n if (!storeRef.current) {\n storeRef.current = createDataLayerStore<T>(props);\n // Initialize with saved data if provided\n }\n return (\n <DataLayerContext.Provider value={storeRef.current}>\n {children}\n </DataLayerContext.Provider>\n );\n}\n\n// Custom hook that mimics the hook returned by `create`\nexport function useDataLayer<T extends DatumObject, U>(\n selector: (state: DataLayerState<T>) => U\n): U {\n const store = useContext(DataLayerContext);\n if (!store) {\n throw new Error(\"Missing DataLayerContext.Provider in the tree\");\n }\n return useStore(store, selector);\n}\n\ntype SavedView = {\n version: 1;\n charts: ChartSettings[];\n name: string;\n calculations?: CalculationDefinition[];\n};\n\ntype SavedProject = {\n version: 1;\n name: string;\n sourceDataPath: string;\n views: SavedView[];\n isSaved: boolean;\n};\n\nexport type { SavedProject, SavedView };\n","import { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport {\n CategoricalColorScale,\n ColorScaleType,\n NumericalColorScale,\n} from \"@/types/ColorScaleTypes\";\nimport {\n interpolateCool,\n interpolateInferno,\n interpolateMagma,\n interpolatePlasma,\n interpolateViridis,\n interpolateWarm,\n schemeCategory10,\n schemeSet3,\n} from \"d3-scale-chromatic\";\nimport { Hash, Palette, Shapes } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { HexColorPicker } from \"react-colorful\";\n\nconst NUMERICAL_PALETTES = [\n { name: \"Viridis\", interpolator: interpolateViridis },\n { name: \"Inferno\", interpolator: interpolateInferno },\n { name: \"Magma\", interpolator: interpolateMagma },\n { name: \"Plasma\", interpolator: interpolatePlasma },\n { name: \"Warm\", interpolator: interpolateWarm },\n { name: \"Cool\", interpolator: interpolateCool },\n];\n\nconst CATEGORICAL_PALETTES = [\n { name: \"Category10\", colors: [...schemeCategory10] },\n { name: \"Set3\", colors: [...schemeSet3] },\n];\n\ninterface ColorScaleEditorState {\n scales: ColorScaleType[];\n isDirty: boolean;\n}\n\nfunction NumericalScalePreview({ palette }: { palette: string }) {\n const interpolator = NUMERICAL_PALETTES.find(\n (p) => p.name === palette\n )?.interpolator;\n if (!interpolator) {\n return null;\n }\n\n return (\n <div className=\"w-full h-8 rounded-md overflow-hidden\">\n <div\n className=\"w-full h-full\"\n style={{\n background: `linear-gradient(to right, ${Array.from(\n { length: 10 },\n (_, i) => interpolator(i / 9)\n ).join(\", \")})`,\n }}\n />\n </div>\n );\n}\n\nfunction CategoricalScalePreview({ colors }: { colors: string[] }) {\n return (\n <div className=\"flex w-full h-8 rounded-md overflow-hidden\">\n {colors.map((color, i) => (\n <div\n key={i}\n className=\"flex-1 h-full\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n );\n}\n\nfunction NumericalScaleEditor({\n scale,\n onUpdate,\n}: {\n scale: NumericalColorScale;\n onUpdate: (scale: NumericalColorScale) => void;\n}) {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n value={scale.name}\n onChange={(e) => onUpdate({ ...scale, name: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label>Min</Label>\n <Input\n type=\"number\"\n value={scale.min}\n onChange={(e) =>\n onUpdate({\n ...scale,\n min: parseFloat(e.target.value),\n })\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Max</Label>\n <Input\n type=\"number\"\n value={scale.max}\n onChange={(e) =>\n onUpdate({\n ...scale,\n max: parseFloat(e.target.value),\n })\n }\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Palette</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {NUMERICAL_PALETTES.map((p) => (\n <Button\n key={p.name}\n variant={scale.palette === p.name ? \"default\" : \"outline\"}\n className=\"w-full h-auto p-2\"\n onClick={() => onUpdate({ ...scale, palette: p.name })}\n >\n <div className=\"w-full space-y-2\">\n <span>{p.name}</span>\n <NumericalScalePreview palette={p.name} />\n </div>\n </Button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction CategoricalScaleEditor({\n scale,\n onUpdate,\n}: {\n scale: CategoricalColorScale;\n onUpdate: (scale: CategoricalColorScale) => void;\n}) {\n const [editingColor, setEditingColor] = useState<{\n value: string;\n color: string;\n } | null>(null);\n\n const updateColor = useCallback(\n (value: string, newColor: string) => {\n const newMapping = new Map(scale.mapping);\n newMapping.set(value, newColor);\n const newPalette = Array.from(newMapping.values());\n onUpdate({ ...scale, mapping: newMapping, palette: newPalette });\n },\n [scale, onUpdate]\n );\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n value={scale.name}\n onChange={(e) => onUpdate({ ...scale, name: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Preset Palettes</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {CATEGORICAL_PALETTES.map((p) => (\n <Button\n key={p.name}\n variant=\"outline\"\n className=\"w-full h-auto p-2\"\n onClick={() => {\n const newMapping = new Map();\n Array.from(scale.mapping.keys()).forEach((value, i) => {\n newMapping.set(value, p.colors[i % p.colors.length]);\n });\n onUpdate({\n ...scale,\n mapping: newMapping,\n palette: Array.from(newMapping.values()),\n });\n }}\n >\n <div className=\"w-full space-y-2\">\n <span>{p.name}</span>\n <CategoricalScalePreview colors={p.colors} />\n </div>\n </Button>\n ))}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Category Colors</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {Array.from(scale.mapping.entries()).map(([value, color]) => (\n <Button\n key={value}\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => setEditingColor({ value, color })}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <div\n className=\"w-4 h-4 rounded\"\n style={{ backgroundColor: color }}\n />\n <span className=\"truncate\">{value}</span>\n </div>\n </Button>\n ))}\n </div>\n </div>\n\n {editingColor && (\n <Dialog open={true} onOpenChange={() => setEditingColor(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit Color for {editingColor.value}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <HexColorPicker\n color={editingColor.color}\n onChange={(newColor) =>\n updateColor(editingColor.value, newColor)\n }\n />\n <Input\n value={editingColor.color}\n onChange={(e) =>\n updateColor(editingColor.value, e.target.value)\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )}\n </div>\n );\n}\n\nfunction ScaleListItem({\n scale,\n isSelected,\n onClick,\n}: {\n scale: ColorScaleType;\n isSelected: boolean;\n onClick: () => void;\n}) {\n return (\n <Button\n variant={isSelected ? \"default\" : \"ghost\"}\n className=\"w-full justify-start\"\n onClick={onClick}\n >\n <div className=\"flex items-center gap-2 w-full\">\n {scale.type === \"numerical\" ? (\n <Hash className=\"w-4 h-4\" />\n ) : (\n <Shapes className=\"w-4 h-4\" />\n )}\n <span className=\"truncate\">{scale.name}</span>\n </div>\n </Button>\n );\n}\n\nexport function ColorScaleManager() {\n const { colorScales, updateColorScale } = useColorScales();\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [selectedScaleId, setSelectedScaleId] = useState<string | null>(\n colorScales[0]?.id ?? null\n );\n const [state, setState] = useState<ColorScaleEditorState>({\n scales: colorScales,\n isDirty: false,\n });\n\n useEffect(() => {\n setState({ scales: colorScales, isDirty: false });\n }, [colorScales]);\n\n const filteredScales = useMemo(() => {\n return state.scales.filter((scale) =>\n scale.name.toLowerCase().includes(searchQuery.toLowerCase())\n );\n }, [state.scales, searchQuery]);\n\n const selectedScale = useMemo(\n () => state.scales.find((s) => s.id === selectedScaleId),\n [state.scales, selectedScaleId]\n );\n\n const handleSave = () => {\n state.scales.forEach((scale) => {\n const { id, ...scaleWithoutId } = scale;\n updateColorScale(id, scaleWithoutId);\n });\n setState((prev) => ({ ...prev, isDirty: false }));\n };\n\n const handleScaleUpdate = (updatedScale: ColorScaleType) => {\n setState((prev) => ({\n scales: prev.scales.map((s) =>\n s.id === updatedScale.id ? updatedScale : s\n ),\n isDirty: true,\n }));\n };\n\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Palette className=\"w-4 h-4 mr-2\" />\n Color Scales\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-[80vw] max-h-[80vh] min-h-[50vh]\">\n <DialogHeader>\n <DialogTitle>Color Scale Manager</DialogTitle>\n <DialogDescription>\n Manage color scales for your visualizations\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex gap-6\">\n {/* Left Sidebar */}\n <div className=\"w-64 border-r pr-4 space-y-4\">\n <Input\n placeholder=\"Search scales...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n <div className=\"space-y-1 overflow-y-auto\">\n {filteredScales.map((scale) => (\n <ScaleListItem\n key={scale.id}\n scale={scale}\n isSelected={scale.id === selectedScaleId}\n onClick={() => setSelectedScaleId(scale.id)}\n />\n ))}\n </div>\n </div>\n\n {/* Right Content */}\n <div className=\"overflow-y-auto w-[400px]\">\n {selectedScale && (\n <div className=\"space-y-4\">\n {selectedScale.type === \"numerical\" ? (\n <NumericalScaleEditor\n scale={selectedScale}\n onUpdate={handleScaleUpdate}\n />\n ) : (\n <CategoricalScaleEditor\n scale={selectedScale}\n onUpdate={handleScaleUpdate}\n />\n )}\n {selectedScale.type === \"numerical\" ? (\n <NumericalScalePreview palette={selectedScale.palette} />\n ) : (\n <CategoricalScalePreview colors={selectedScale.palette} />\n )}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setState({ scales: colorScales, isDirty: false })}\n >\n Reset\n </Button>\n <Button onClick={handleSave} disabled={!state.isDirty}>\n Save Changes\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Plus } from \"lucide-react\";\nimport { useCreateCharts } from \"@/hooks/useCreateCharts\";\nimport { chartRegistry } from \"@/charts/registry\";\n\nexport function ChartCreationButtons() {\n const { createChart } = useCreateCharts();\n const chartDefinitions = chartRegistry\n .getAll()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"flex items-center gap-2\">\n <Plus className=\"h-4 w-4\" />\n Add Blank Chart...\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {chartDefinitions.map((chartDef) => {\n const Icon = chartDef.icon;\n return (\n <DropdownMenuItem\n key={chartDef.type}\n onClick={() => createChart(chartDef.type, \"\")}\n className=\"flex items-center gap-2\"\n >\n <Icon className=\"h-4 w-4\" />\n {chartDef.name}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import { SavedDataStructure } from \"@/types/SavedDataTypes\";\n\nexport async function saveToClipboard(data: SavedDataStructure): Promise<void> {\n try {\n const jsonString = JSON.stringify(data);\n await navigator.clipboard.writeText(jsonString);\n } catch (error) {\n console.error(\"Error saving to clipboard:\", error);\n throw new Error(\"Failed to save data to clipboard\");\n }\n}\n\nexport async function loadFromClipboard(): Promise<SavedDataStructure | null> {\n try {\n const text = await navigator.clipboard.readText();\n const data = JSON.parse(text);\n if (validateSavedData(data)) {\n return migrateDataVersion(data);\n }\n return null;\n } catch (error) {\n console.error(\"Error loading from clipboard:\", error);\n return null;\n }\n}\n\nexport function validateSavedData(data: unknown): data is SavedDataStructure {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const { charts, calculations, gridSettings, metadata, colorScales } =\n data as SavedDataStructure;\n\n // Validate required properties exist\n if (!charts || !calculations || !gridSettings || !metadata || !colorScales) {\n return false;\n }\n\n // Validate metadata\n if (\n typeof metadata.name !== \"string\" ||\n typeof metadata.version !== \"number\" ||\n typeof metadata.createdAt !== \"string\" ||\n typeof metadata.modifiedAt !== \"string\"\n ) {\n return false;\n }\n\n // Validate gridSettings\n if (\n typeof gridSettings.columnCount !== \"number\" ||\n typeof gridSettings.rowHeight !== \"number\" ||\n typeof gridSettings.containerPadding !== \"number\" ||\n typeof gridSettings.showBackgroundMarkers !== \"boolean\"\n ) {\n return false;\n }\n\n // Basic array checks\n if (\n !Array.isArray(charts) ||\n !Array.isArray(calculations) ||\n !Array.isArray(colorScales)\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function migrateDataVersion(\n data: SavedDataStructure\n): SavedDataStructure {\n // Currently we only have version 1, so no migration needed\n // This function will be expanded when we add new versions\n return data;\n}\n\nexport async function saveRawDataToClipboard(data: unknown): Promise<void> {\n try {\n const jsonString = JSON.stringify(data);\n await navigator.clipboard.writeText(jsonString);\n } catch (error) {\n console.error(\"Error saving raw data to clipboard:\", error);\n throw new Error(\"Failed to save raw data to clipboard\");\n }\n}\n","import { GridSettings } from \"@/types/SavedDataTypes\";\nimport { cn } from \"@/lib/utils\";\n\ninterface GridBackgroundProps {\n settings: GridSettings;\n width: number;\n height: number;\n className?: string;\n}\n\nexport function GridBackground({\n settings,\n width,\n height,\n className,\n}: GridBackgroundProps) {\n if (!settings.showBackgroundMarkers) {\n return null;\n }\n\n const columnWidth =\n (width - settings.containerPadding * 2) / settings.columnCount;\n\n return (\n <div\n className={cn(\n \"absolute inset-0 pointer-events-none border border-dashed border-gray-200\",\n className\n )}\n style={{\n width,\n height,\n }}\n >\n <div\n className=\"absolute inset-0\"\n style={{\n margin: settings.containerPadding,\n }}\n >\n {/* Vertical grid lines */}\n {Array.from({ length: settings.columnCount - 1 }).map((_, i) => (\n <div\n key={i}\n className=\"absolute top-0 bottom-0 border-l border-dashed border-gray-200\"\n style={{\n left: (i + 1) * columnWidth,\n }}\n />\n ))}\n\n {/* Horizontal grid lines */}\n {Array.from({\n length: Math.floor(height / settings.rowHeight) - 1,\n }).map((_, i) => (\n <div\n key={i}\n className=\"absolute left-0 right-0 border-t border-dashed border-gray-200\"\n style={{\n top: (i + 1) * settings.rowHeight,\n }}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport GridLayout from \"react-grid-layout\";\nimport \"react-grid-layout/css/styles.css\";\nimport \"react-resizable/css/styles.css\";\nimport type { Layout } from \"react-grid-layout\";\nimport type { ChartSettings } from \"@/types/ChartTypes\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { GridBackground } from \"./GridBackground\";\n\ninterface ChartGridLayoutProps {\n children: ReactNode;\n charts: ChartSettings[];\n onLayoutChange: (layout: Layout[]) => void;\n containerWidth: number;\n}\n\nexport function ChartGridLayout({\n children,\n charts,\n onLayoutChange,\n containerWidth,\n}: ChartGridLayoutProps) {\n const gridSettings = useDataLayer((s) => s.gridSettings);\n\n // Calculate the total height based on the layout\n const totalHeight = Math.max(\n ...charts.map(\n (chart) => (chart.layout.y + chart.layout.h) * gridSettings.rowHeight\n ),\n 400 // minimum height\n );\n\n const layout: Layout[] = charts.map((chart) => ({\n ...chart.layout,\n i: chart.id,\n }));\n\n return (\n <div className=\"relative w-full\">\n <GridBackground\n settings={gridSettings}\n width={containerWidth}\n height={totalHeight}\n />\n <GridLayout\n className=\"layout\"\n layout={layout}\n cols={gridSettings.columnCount}\n rowHeight={gridSettings.rowHeight}\n width={containerWidth}\n containerPadding={[\n gridSettings.containerPadding,\n gridSettings.containerPadding,\n ]}\n onLayoutChange={onLayoutChange}\n draggableHandle=\".drag-handle\"\n >\n {children}\n </GridLayout>\n </div>\n );\n}\n","import { useChartDefinition } from \"@/charts/registry\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\n\ninterface ChartRendererProps {\n settings: ChartSettings;\n width: number;\n height: number;\n facetIds?: IdType[];\n}\n\nexport function ChartRenderer({\n settings,\n width,\n height,\n facetIds,\n}: ChartRendererProps) {\n const definition = useChartDefinition(settings.type);\n const ChartComponent = definition.component;\n\n return (\n <ChartComponent\n settings={settings}\n width={width}\n height={height}\n facetIds={facetIds}\n />\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { ChartRenderer } from \"../ChartRenderer\";\nimport { FacetData } from \"./FacetContainer\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\n\ninterface FacetGridLayoutProps {\n width: number;\n height: number;\n rowVariable: string;\n columnVariable: string;\n facetData: FacetData[];\n settings: ChartSettings;\n}\n\nexport function FacetGridLayout({\n width,\n height,\n rowVariable,\n columnVariable,\n facetData,\n settings,\n}: FacetGridLayoutProps) {\n // Extract unique row and column values\n const { rows, columns, grid } = useMemo(() => {\n const rows = Array.from(new Set(facetData.map((d) => d.rowValue))).sort();\n const columns = Array.from(\n new Set(\n facetData\n .filter((d) => d.columnValue !== null)\n .map((d) => d.columnValue as string)\n )\n ).sort();\n\n // Create a grid of facets\n const grid: Record<string, Record<string, IdType[]>> = {};\n\n rows.forEach((row) => {\n grid[row] = {};\n columns.forEach((col) => {\n grid[row][col] = [];\n });\n });\n\n facetData.forEach((facet) => {\n if (facet.rowValue && facet.columnValue) {\n grid[facet.rowValue][facet.columnValue] = facet.ids;\n }\n });\n\n return { rows, columns, grid };\n }, [facetData]);\n\n // Calculate cell dimensions based on the number of rows and columns\n const cellWidth = width / (columns.length + 1); // +1 for the row headers\n const cellHeight = height / (rows.length + 1); // +1 for the column headers\n\n return (\n <div className=\"w-full h-full overflow-auto\">\n <table className=\"w-full h-full border-collapse\">\n <thead>\n <tr>\n {/* Top-left empty cell */}\n <th className=\"border p-2 bg-muted/50 font-semibold\">\n {rowVariable} / {columnVariable}\n </th>\n\n {/* Column headers */}\n {columns.map((col) => (\n <th key={col} className=\"border p-2 bg-muted/50 font-semibold\">\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row}>\n {/* Row header */}\n <th className=\"border p-2 bg-muted/50 font-semibold text-left\">\n {row}\n </th>\n\n {/* Facet cells */}\n {columns.map((col) => (\n <td key={`${row}-${col}`} className=\"border p-0\">\n <div\n style={{\n width: cellWidth,\n height: cellHeight,\n }}\n >\n {grid[row]?.[col]?.length > 0 ? (\n <ChartRenderer\n settings={settings}\n width={cellWidth}\n height={cellHeight}\n facetIds={grid[row][col]}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-muted-foreground\">\n No data\n </div>\n )}\n </div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { ChartRenderer } from \"../ChartRenderer\";\nimport { FacetData } from \"./FacetContainer\";\n\ninterface FacetWrapLayoutProps {\n width: number;\n height: number;\n columns: number;\n facetData: FacetData[];\n settings: ChartSettings;\n}\n\nexport function FacetWrapLayout({\n width,\n height,\n columns,\n facetData,\n settings,\n}: FacetWrapLayoutProps) {\n // Calculate dimensions based on the number of facet values\n const facetWidth = width / (columns || 1);\n const rows = Math.ceil(facetData.length / (columns || 1));\n const facetHeight = height / (rows || 1);\n\n return (\n <div\n className=\"w-full h-full grid gap-2\"\n style={{\n gridTemplateColumns: `repeat(${columns || 1}, 1fr)`,\n gridAutoRows: `${facetHeight}px`,\n }}\n >\n {facetData.map((facet) => (\n <div key={facet.id} className=\"border p-2\">\n <div className=\"font-medium mb-1\">{facet.rowValue}</div>\n <div style={{ height: facetHeight - 30 }}>\n <ChartRenderer\n settings={settings}\n width={facetWidth - 16} // Adjust for padding\n height={facetHeight - 30} // Adjust for header and padding\n facetIds={facet.ids}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { FacetGridLayout } from \"./FacetGridLayout\";\nimport { FacetWrapLayout } from \"./FacetWrapLayout\";\nimport { useGetAllIds } from \"../useGetLiveData\";\n\ninterface FacetContainerProps {\n settings: ChartSettings;\n width: number;\n height: number;\n}\n\nexport interface FacetData {\n id: string;\n rowValue: string;\n columnValue: string | null;\n ids: IdType[];\n}\n\nexport function FacetContainer({\n settings,\n width,\n height,\n}: FacetContainerProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const allIds = useGetAllIds();\n\n const facetData = useMemo(() => {\n if (!settings.facet?.enabled) {\n return [] as FacetData[];\n }\n\n const facet = settings.facet;\n const rowVariable = facet.rowVariable;\n\n if (!rowVariable) {\n return [] as FacetData[];\n }\n\n const rowData = getColumnData(rowVariable);\n const columnData =\n facet.type === \"grid\" ? getColumnData(facet.columnVariable) : null;\n\n // Group data by facet variables\n const facets: Record<string, IdType[]> = {};\n\n allIds.forEach((id) => {\n const rowValue = rowData[id] ?? \"undefined\";\n const colValue = columnData\n ? (columnData[id as IdType] ?? \"undefined\")\n : null;\n\n const rowLabel = getFacetLabel(rowValue);\n const colLabel = colValue !== null ? getFacetLabel(colValue) : null;\n\n const facetKey = colLabel ? `${rowLabel}__${colLabel}` : rowLabel;\n\n if (!facets[facetKey]) {\n facets[facetKey] = [];\n }\n\n facets[facetKey].push(id);\n });\n\n return Object.entries(facets).map(([key, ids]) => {\n let rowValue: string;\n let columnValue: string | null = null;\n\n if (facet.type === \"grid\" && key.includes(\"__\")) {\n const parts = key.split(\"__\");\n rowValue = parts[0];\n columnValue = parts[1];\n } else {\n rowValue = key;\n }\n\n return {\n id: key,\n rowValue,\n columnValue,\n ids,\n };\n }) as FacetData[];\n }, [settings.facet, getColumnData, allIds]);\n\n if (!settings.facet?.enabled) {\n return null;\n }\n\n return (\n <div className=\"w-full h-full\">\n {settings.facet.type === \"grid\" ? (\n <FacetGridLayout\n width={width}\n height={height}\n rowVariable={settings.facet.rowVariable}\n columnVariable={settings.facet.columnVariable}\n facetData={facetData}\n settings={settings}\n />\n ) : (\n <FacetWrapLayout\n width={width}\n height={height}\n columns={settings.facet.columnCount}\n facetData={facetData}\n settings={settings}\n />\n )}\n </div>\n );\n}\n\nfunction getFacetLabel(value: datum) {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return String(value);\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return \"unknown\";\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { Label } from \"../ui/label\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { Switch } from \"../ui/switch\";\n\ninterface AdvancedSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function AdvancedSettingsTab({\n settings,\n onSettingChange,\n}: AdvancedSettingsTabProps) {\n return (\n <div className=\"space-y-6\">\n {/* General Chart Settings */}\n <div className=\"space-y-4\">\n <h3 className=\"font-medium text-sm\">General Settings</h3>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"margin\">Chart Margin</Label>\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"col-start-2\">\n <NumericInputEnter\n value={settings.margin?.top || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n top: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Top\"\n />\n </div>\n <div className=\"col-start-1 row-start-2\">\n <NumericInputEnter\n value={settings.margin?.left || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n left: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Left\"\n />\n </div>\n <div className=\"col-start-3 row-start-2\">\n <NumericInputEnter\n value={settings.margin?.right || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n right: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Right\"\n />\n </div>\n <div className=\"col-start-2 row-start-3\">\n <NumericInputEnter\n value={settings.margin?.bottom || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n bottom: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Bottom\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { RotateCcw } from \"lucide-react\";\nimport { ComboBox } from \"../ComboBox\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { Button } from \"../ui/button\";\nimport { Label } from \"../ui/label\";\n\ninterface AxisSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\ninterface ScaleType {\n value: string;\n label: string;\n}\n\nconst SCALE_TYPES: ScaleType[] = [\n { value: \"linear\", label: \"Linear\" },\n { value: \"log\", label: \"Logarithmic\" },\n { value: \"time\", label: \"Time\" },\n { value: \"band\", label: \"Band\" },\n];\n\nconst DEFAULT_AXIS_SETTINGS = {\n scaleType: \"linear\",\n grid: false,\n min: 0,\n max: 100,\n};\n\nexport function AxisSettingsTab({\n settings,\n onSettingChange,\n}: AxisSettingsTabProps) {\n const handleAxisChange = (axis: \"x\" | \"y\", key: string, value: any) => {\n onSettingChange(`${axis}Axis`, {\n ...settings[`${axis}Axis`],\n [key]: value,\n });\n };\n\n const handleAxisReset = () => {\n onSettingChange(\"xAxis\", DEFAULT_AXIS_SETTINGS);\n onSettingChange(\"yAxis\", DEFAULT_AXIS_SETTINGS);\n onSettingChange(\"xGridLines\", 5);\n onSettingChange(\"yGridLines\", 5);\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr_1fr] gap-x-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAxisReset}\n className=\"h-8 px-2\"\n >\n <RotateCcw className=\"h-4 w-4 mr-1\" />\n Reset\n </Button>\n <h4 className=\"font-medium text-sm text-center\">X Axis</h4>\n <h4 className=\"font-medium text-sm text-center\">Y Axis</h4>\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr_1fr] gap-x-4 gap-y-6 items-center\">\n <Label>Scale Type</Label>\n <ComboBox\n value={SCALE_TYPES.find(\n (option) => option.value === (settings.xAxis?.scaleType || \"linear\")\n )}\n options={SCALE_TYPES}\n onChange={(option) =>\n handleAxisChange(\"x\", \"scaleType\", option?.value)\n }\n optionToString={(option) => option.label}\n placeholder=\"X Scale\"\n />\n <ComboBox\n value={SCALE_TYPES.find(\n (option) => option.value === (settings.yAxis?.scaleType || \"linear\")\n )}\n options={SCALE_TYPES}\n onChange={(option) =>\n handleAxisChange(\"y\", \"scaleType\", option?.value)\n }\n optionToString={(option) => option.label}\n placeholder=\"Y Scale\"\n />\n\n <Label>Grid Lines</Label>\n <NumericInputEnter\n value={settings.xGridLines ?? 5}\n onChange={(value) => onSettingChange(\"xGridLines\", value)}\n min={0}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n placeholder=\"X Grid Lines\"\n />\n <NumericInputEnter\n value={settings.yGridLines ?? 5}\n onChange={(value) => onSettingChange(\"yGridLines\", value)}\n min={0}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n placeholder=\"Y Grid Lines\"\n />\n\n <Label>Domain Min</Label>\n <NumericInputEnter\n value={settings.xAxis?.min || 0}\n onChange={(value) => handleAxisChange(\"x\", \"min\", value)}\n placeholder=\"X Min\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n <NumericInputEnter\n value={settings.yAxis?.min || 0}\n onChange={(value) => handleAxisChange(\"y\", \"min\", value)}\n placeholder=\"Y Min\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n\n <Label>Domain Max</Label>\n <NumericInputEnter\n value={settings.xAxis?.max || 100}\n onChange={(value) => handleAxisChange(\"x\", \"max\", value)}\n placeholder=\"X Max\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n <NumericInputEnter\n value={settings.yAxis?.max || 100}\n onChange={(value) => handleAxisChange(\"y\", \"max\", value)}\n placeholder=\"Y Max\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n </div>\n </div>\n );\n}\n","import {\n ChartSettings,\n FacetSettings,\n GridFacetSettings,\n WrapFacetSettings,\n} from \"@/types/ChartTypes\";\nimport { Label } from \"../ui/label\";\nimport { Switch } from \"../ui/switch\";\nimport { FieldSelector } from \"../FieldSelector\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { ComboBox } from \"../ComboBox\";\n\ninterface FacetSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nconst FACET_TYPES = [\n { value: \"wrap\", label: \"Wrap\" },\n { value: \"grid\", label: \"Grid\" },\n];\n\nexport function FacetSettingsTab({\n settings,\n onSettingChange,\n}: FacetSettingsTabProps) {\n const handleFacetChange = (key: string, value: any) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n [key]: value,\n });\n };\n\n const handleFacetTypeChange = (type: FacetSettings[\"type\"]) => {\n if (type === \"wrap\") {\n onSettingChange(\"facet\", {\n ...settings.facet,\n type,\n columnCount: 2,\n } as WrapFacetSettings);\n } else if (type === \"grid\") {\n onSettingChange(\"facet\", {\n ...settings.facet,\n type,\n columnVariable: \"\",\n } as GridFacetSettings);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"enableFacet\">Enable Faceting</Label>\n <div className=\"flex items-center\">\n <Switch\n id=\"enableFacet\"\n checked={!!settings.facet?.enabled}\n onCheckedChange={(checked) => {\n if (checked) {\n onSettingChange(\"facet\", {\n enabled: true,\n type: \"wrap\",\n rowVariable: \"\",\n columnCount: 2,\n });\n } else {\n handleFacetChange(\"enabled\", false);\n }\n }}\n />\n </div>\n\n {settings.facet?.enabled && (\n <>\n <Label htmlFor=\"facetType\">Facet Type</Label>\n <ComboBox\n value={FACET_TYPES.find(\n (option) => option.value === settings.facet?.type\n )}\n options={FACET_TYPES}\n onChange={(option) =>\n handleFacetTypeChange(option?.value as FacetSettings[\"type\"])\n }\n optionToString={(option) => option.label}\n placeholder=\"Select facet type\"\n />\n\n <Label>Row Variable</Label>\n <FieldSelector\n label=\"\"\n value={settings.facet.rowVariable || \"\"}\n onChange={(value) => handleFacetChange(\"rowVariable\", value)}\n />\n\n {settings.facet.type === \"grid\" ? (\n <>\n <Label>Column Variable</Label>\n <FieldSelector\n label=\"\"\n value={\n (settings.facet as GridFacetSettings).columnVariable || \"\"\n }\n onChange={(value) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n columnVariable: value,\n enabled: true,\n type: \"grid\",\n } as GridFacetSettings);\n }}\n />\n </>\n ) : (\n <>\n <Label htmlFor=\"columns\">Number of Columns</Label>\n <NumericInputEnter\n value={(settings.facet as WrapFacetSettings).columnCount || 2}\n onChange={(value) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n columnCount: value,\n enabled: true,\n type: \"wrap\",\n } as WrapFacetSettings);\n }}\n min={1}\n max={10}\n stepSmall={1}\n stepMedium={1}\n stepLarge={2}\n placeholder=\"Enter number of columns\"\n />\n </>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\n\ninterface LabelsSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function LabelsSettingsTab({\n settings,\n onSettingChange,\n}: LabelsSettingsTabProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Title Text</Label>\n <Input\n value={settings.title || \"\"}\n onChange={(e) => onSettingChange(\"title\", e.target.value)}\n placeholder=\"Enter chart title\"\n />\n\n <Label>X Axis Label</Label>\n <Input\n value={settings.xAxisLabel || \"\"}\n onChange={(e) => onSettingChange(\"xAxisLabel\", e.target.value)}\n placeholder=\"Enter X axis label\"\n />\n\n <Label>Y Axis Label</Label>\n <Input\n value={settings.yAxisLabel || \"\"}\n onChange={(e) => onSettingChange(\"yAxisLabel\", e.target.value)}\n placeholder=\"Enter Y axis label\"\n />\n </div>\n </div>\n );\n}\n","import { chartRegistry, useChartDefinition } from \"@/charts/registry\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { ComboBox } from \"../ComboBox\";\nimport { Label } from \"../ui/label\";\n\ninterface MainSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function MainSettingsTab({\n settings,\n onSettingChange,\n}: MainSettingsTabProps) {\n const chartDefinition = useChartDefinition(settings.type);\n const chartTypes = chartRegistry.getAll();\n\n // this magic flies in the right settings for the chart type\n const SettingsPanel = chartDefinition.settingsPanel;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"chartType\">Chart Type</Label>\n <ComboBox\n value={chartDefinition}\n options={chartTypes}\n onChange={(option) => {\n if (option) {\n const newSettings = option.createDefaultSettings(\n settings.layout,\n settings.field\n );\n Object.entries(newSettings).forEach(([key, value]) => {\n onSettingChange(key, value);\n });\n }\n }}\n optionToNode={(option) => {\n const Icon = option.icon;\n return (\n <div className=\"flex items-center gap-2\">\n <Icon className=\"h-4 w-4\" />\n <span>{option.name}</span>\n </div>\n );\n }}\n optionToString={(option) => option.name}\n placeholder=\"Select chart type\"\n />\n </div>\n\n <SettingsPanel\n settings={settings}\n onSettingsChange={(newSettings) => {\n Object.entries(newSettings).forEach(([key, value]) => {\n onSettingChange(key, value);\n });\n }}\n />\n </div>\n );\n}\n","import { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\ninterface TabContainerProps {\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n children: {\n [key: string]: React.ReactNode;\n };\n tabs: {\n value: string;\n label: string;\n }[];\n}\n\nexport function TabContainer({\n activeTab,\n onTabChange,\n children,\n tabs,\n}: TabContainerProps) {\n return (\n <Tabs\n defaultValue={activeTab || tabs[0].value}\n onValueChange={onTabChange}\n className=\"w-full\"\n >\n <TabsList className=\"w-full\">\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value} className=\"flex-1\">\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsContent key={tab.value} value={tab.value}>\n {children[tab.value]}\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { mergeWithDefaultSettings } from \"@/utils/defaultSettings\";\nimport { useEffect, useState } from \"react\";\nimport { AdvancedSettingsTab } from \"./settings/AdvancedSettingsTab\";\nimport { AxisSettingsTab } from \"./settings/AxisSettingsTab\";\nimport { FacetSettingsTab } from \"./settings/FacetSettingsTab\";\nimport { LabelsSettingsTab } from \"./settings/LabelsSettingsTab\";\nimport { MainSettingsTab } from \"./settings/MainSettingsTab\";\nimport { TabContainer } from \"./settings/TabContainer\";\nimport { Button } from \"./ui/button\";\n\ninterface ChartSettingsContentProps {\n settings: ChartSettings;\n}\n\nexport function ChartSettingsContent({ settings }: ChartSettingsContentProps) {\n // Local state for settings\n const [localSettings, setLocalSettings] = useState<ChartSettings>(\n mergeWithDefaultSettings(settings)\n );\n\n const updateChart = useDataLayer((s) => s.updateChart);\n\n // Update local settings when prop changes\n useEffect(() => {\n setLocalSettings(mergeWithDefaultSettings(settings));\n }, [settings]);\n\n const handleSettingChange = (key: string, value: any) => {\n setLocalSettings((prev) => {\n const newSettings = {\n ...prev,\n [key]: value,\n };\n return mergeWithDefaultSettings(newSettings);\n });\n };\n\n const handleUpdate = () => {\n updateChart(settings.id, localSettings);\n };\n\n const tabs = [\n { value: \"main\", label: \"Main\" },\n { value: \"facet\", label: \"Facet\" },\n { value: \"axis\", label: \"Axis\" },\n { value: \"labels\", label: \"Labels\" },\n { value: \"advanced\", label: \"Advanced\" },\n ];\n\n return (\n <div className=\"space-y-4 max-h-[90vh] overflow-y-auto\">\n <TabContainer tabs={tabs}>\n {{\n main: (\n <MainSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n facet: (\n <FacetSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n axis: (\n <AxisSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n labels: (\n <LabelsSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n advanced: (\n <AdvancedSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n }}\n </TabContainer>\n\n <Button className=\"w-full\" onClick={handleUpdate}>\n Update Chart\n </Button>\n </div>\n );\n}\n","import { create } from \"zustand\";\n\ntype AlertStore = {\n isOpen: boolean;\n title: string;\n description: string;\n resolve: ((value: boolean) => void) | null;\n id: number;\n showAlert: (title: string, description: string) => Promise<boolean>;\n closeAlert: (result: boolean) => void;\n};\n\nexport const useAlertStore = create<AlertStore>((set, get) => ({\n isOpen: false,\n title: \"\",\n description: \"\",\n resolve: null,\n id: 0,\n\n showAlert: async (title: string, description: string) => {\n return new Promise<boolean>((resolve) => {\n const { id } = get();\n set({\n isOpen: true,\n title,\n description,\n resolve,\n id: id + 1,\n });\n });\n },\n\n closeAlert: (result: boolean) => {\n const { resolve } = get();\n if (resolve) {\n resolve(result);\n }\n set({\n isOpen: false,\n title: \"\",\n description: \"\",\n resolve: null,\n });\n },\n}));\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { FacetAxisProvider } from \"@/providers/FacetAxisProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { Copy, FilterX, GripVertical, Settings2, X } from \"lucide-react\";\nimport { ChartRenderer } from \"./charts/ChartRenderer\";\nimport { FacetContainer } from \"./charts/FacetRelated/FacetContainer\";\nimport { ChartSettingsContent } from \"./ChartSettingsContent\";\nimport { Button } from \"./ui/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/popover\";\nimport { useAlertStore } from \"@/stores/alertStore\";\n\ninterface PlotChartPanelProps {\n settings: ChartSettings;\n onDelete: () => void;\n onDuplicate: () => void;\n width: number;\n height: number;\n}\n\nexport function PlotChartPanel({\n settings,\n onDelete,\n onDuplicate,\n width,\n height,\n}: PlotChartPanelProps) {\n const clearFilter = useDataLayer((state) => state.clearFilter);\n const showAlert = useAlertStore((state) => state.showAlert);\n\n const handleDelete = async () => {\n const confirmed = await showAlert(\n \"Delete Chart\",\n \"Are you sure you want to delete this chart? This action cannot be undone.\"\n );\n if (confirmed) {\n onDelete();\n }\n };\n\n return (\n <div\n className=\"bg-card border rounded-lg\"\n style={{ width: width, height: height }}\n >\n <div\n className=\"flex items-center justify-between select-none\"\n style={{ height: 24 }}\n >\n <div className=\"drag-handle cursor-move flex items-center gap-2\">\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n <h3 className=\"font-medium\">{settings.title}</h3>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onDuplicate}>\n <Copy className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => clearFilter(settings)}\n >\n <FilterX className=\"h-4 w-4\" />\n </Button>\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"min-w-120\" side=\"left\" align=\"start\">\n <ChartSettingsContent settings={settings} />\n </PopoverContent>\n </Popover>\n <Button variant=\"ghost\" size=\"icon\" onClick={handleDelete}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <div>\n <FacetAxisProvider>\n {settings.facet?.enabled ? (\n <FacetContainer\n settings={settings}\n width={width - 32}\n height={height - 56}\n />\n ) : (\n <ChartRenderer\n settings={settings}\n width={width - 32}\n height={height - 56}\n facetIds={undefined}\n />\n )}\n </FacetAxisProvider>\n </div>\n </div>\n );\n}\n","import { type Expression } from \"../types\";\nimport * as ohm from \"ohm-js\";\n\n// Define the grammar inline\nconst grammarSource = `Calculation {\n Expression = IfExpr | TernaryExpr | LogicalExpr\n\n LogicalExpr = LogicalExpr LogicalOp ComparisonExpr -- binary\n | ComparisonExpr -- term\n\n ComparisonExpr = ComparisonExpr ComparisonOp AddExpr -- binary\n | AddExpr -- term\n\n AddExpr = AddExpr (\"+\" | \"-\") MulExpr -- binary\n | MulExpr -- term\n\n MulExpr = MulExpr (\"*\" | \"/\") PowerExpr -- binary\n | PowerExpr -- term\n\n PowerExpr = Term \"^\" PowerExpr -- binary\n | Term -- term\n\n TernaryExpr = LogicalExpr \"?\" Expression \":\" Expression\n Term = UnaryExpr | FunctionCall | ParenTerm | number | string | boolean | null | identifier\n UnaryExpr = UnaryOperator Term\n FunctionCall = identifier \"(\" ListOf<Expression, \",\"> \")\"\n ParenTerm = \"(\" Expression \")\"\n IfExpr = \"if\" Expression \"then\" Expression \"else\" Expression\n\n ComparisonOp = \"==\" | \"!=\" | \"<=\" | \">=\" | \"<\" | \">\"\n LogicalOp = \"&&\" | \"||\"\n UnaryOperator = \"-\" | \"+\" | \"!\"\n\n identifier = ~keyword letter (letter | digit | \"_\")*\n number = digit+ (\".\" digit+)?\n string = \"\\\\\"\" stringChar* \"\\\\\"\"\n stringChar = ~(\"\\\\\"\" | \"\\\\\\\\\") any -- nonEscape\n | \"\\\\\\\\\" any -- escape\n boolean = \"true\" | \"false\"\n null = \"null\"\n\n // Built-in keywords\n keyword = \"if\" | \"then\" | \"else\" | \"true\" | \"false\" | \"null\"\n\n // Whitespace handling\n space += comment\n comment = \"//\" (~\"\\\\n\" any)* \"\\\\n\" // Single line comments\n}`;\n\n// Create the grammar\nconst grammar = ohm.grammar(grammarSource);\n\nexport interface ParsedExpression {\n type: string;\n value?: any;\n children?: ParsedExpression[];\n operator?: string;\n left?: ParsedExpression;\n right?: ParsedExpression;\n name?: string;\n arguments?: ParsedExpression[];\n operand?: ParsedExpression;\n condition?: ParsedExpression;\n trueBranch?: ParsedExpression;\n falseBranch?: ParsedExpression;\n dependencies?: string[];\n expression?: string;\n}\n\ntype Node = ohm.Node;\n\n// Create semantics\nconst semantics = grammar.createSemantics();\n\nsemantics.addOperation<ParsedExpression>(\"eval\", {\n Expression(e: Node): ParsedExpression {\n return e.eval();\n },\n LogicalExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n LogicalExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n ComparisonExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n ComparisonExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n AddExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n AddExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n MulExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n MulExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n PowerExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n PowerExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n LogicalExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n ComparisonExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n AddExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n MulExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n PowerExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n TernaryExpr(\n condition: Node,\n _q: Node,\n trueBranch: Node,\n _c: Node,\n falseBranch: Node\n ): ParsedExpression {\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"?:\",\n name: `${condition.sourceString} ? ${trueBranch.sourceString} : ${falseBranch.sourceString}`,\n };\n },\n IfExpr(\n _if: Node,\n condition: Node,\n _then: Node,\n trueBranch: Node,\n _else: Node,\n falseBranch: Node\n ): ParsedExpression {\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"if\",\n name: `if ${condition.sourceString} then ${trueBranch.sourceString} else ${falseBranch.sourceString}`,\n };\n },\n UnaryExpr(op: Node, expr: Node): ParsedExpression {\n return {\n type: \"unary\",\n operator: op.sourceString,\n expression: op.sourceString,\n operand: expr.eval(),\n };\n },\n FunctionCall(\n name: Node,\n _open: Node,\n args: Node,\n _close: Node\n ): ParsedExpression {\n return {\n type: \"function\",\n name: name.sourceString,\n arguments: args.asIteration().children.map((arg: Node) => arg.eval()),\n };\n },\n ParenTerm(_open: Node, expr: Node, _close: Node): ParsedExpression {\n return expr.eval();\n },\n number(digits: Node, _dot: Node, decimals: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: parseFloat(this.sourceString),\n expression: this.sourceString,\n };\n },\n string(_open: Node, chars: Node, _close: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: chars.sourceString.replace(/\\\\(.)/g, \"$1\"),\n expression: chars.sourceString,\n };\n },\n boolean(_: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: this.sourceString === \"true\",\n expression: this.sourceString,\n };\n },\n null(_: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: null,\n expression: \"null\",\n };\n },\n identifier(first: Node, rest: Node): ParsedExpression {\n return {\n type: \"identifier\",\n name: this.sourceString,\n expression: this.sourceString,\n };\n },\n});\n\nexport function parseExpression(input: string): Expression {\n const matchResult = grammar.match(input);\n\n if (matchResult.failed()) {\n throw new Error(`Parse error: ${matchResult.message}`);\n }\n\n const parsed = semantics(matchResult).eval();\n\n // Convert the parsed expression to our Expression type\n return convertToExpression(parsed, input);\n}\n\nfunction convertToExpression(\n parsed: ParsedExpression,\n rawInput: string\n): Expression {\n const id = crypto.randomUUID();\n\n switch (parsed.type) {\n case \"basic\":\n if (!parsed.left || !parsed.right) {\n throw new Error(\"Basic expression must have left and right operands\");\n }\n return {\n id,\n type: \"basic\",\n name: `${parsed.left?.name || \"\"} ${parsed.operator} ${\n parsed.right?.name || \"\"\n }`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n left: convertToExpression(parsed.left, \"\"),\n right: convertToExpression(parsed.right, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"unary\":\n if (!parsed.operand) {\n throw new Error(\"Unary expression must have an operand\");\n }\n return {\n id,\n type: \"unary\",\n name: `${parsed.operator}${parsed.operand?.name || \"\"}`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n operand: convertToExpression(parsed.operand, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"ternary\":\n if (!parsed.condition || !parsed.trueBranch || !parsed.falseBranch) {\n throw new Error(\n \"Ternary expression must have condition and both branches\"\n );\n }\n return {\n id,\n type: \"ternary\",\n name:\n parsed.name ||\n `${parsed.condition?.name || \"\"} ? ${\n parsed.trueBranch?.name || \"\"\n } : ${parsed.falseBranch?.name || \"\"}`,\n expression: parsed.expression || \"?:\",\n dependencies: getDependencies(parsed),\n condition: convertToExpression(parsed.condition, \"\"),\n trueBranch: convertToExpression(parsed.trueBranch, \"\"),\n falseBranch: convertToExpression(parsed.falseBranch, \"\"),\n rawInput,\n };\n case \"function\":\n return {\n id,\n type: \"function\",\n name: parsed.name || \"\",\n expression: \"\",\n functionName: parsed.name || \"\",\n arguments:\n parsed.arguments?.map((arg) => convertToExpression(arg, \"\")) || [],\n dependencies: getDependencies(parsed),\n rawInput,\n };\n case \"identifier\":\n // Create a literal expression for identifiers instead of basic\n return {\n id,\n type: \"literal\",\n name: parsed.name || \"\",\n expression: parsed.name || \"\",\n dependencies: [parsed.name || \"\"],\n value: parsed.name || \"\",\n rawInput,\n };\n case \"literal\":\n return {\n id,\n type: \"literal\",\n name: String(parsed.value),\n expression: String(parsed.value),\n dependencies: [],\n value: parsed.value,\n rawInput,\n };\n default:\n throw new Error(`Unsupported expression type: ${parsed.type}`);\n }\n}\n\nfunction getDependencies(parsed: ParsedExpression): string[] {\n const deps = new Set<string>();\n\n function collect(expr: ParsedExpression) {\n if (expr.type === \"identifier\") {\n deps.add(expr.name || \"\");\n }\n if (expr.arguments) {\n expr.arguments.forEach(collect);\n }\n if (expr.left) {\n collect(expr.left);\n }\n if (expr.right) {\n collect(expr.right);\n }\n if (expr.operand) {\n collect(expr.operand);\n }\n if (expr.condition) {\n collect(expr.condition);\n collect(expr.trueBranch!);\n collect(expr.falseBranch!);\n }\n }\n\n collect(parsed);\n return Array.from(deps);\n}\n\nexport default semantics;\n","import { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { Dispatch, SetStateAction, useState } from \"react\";\n\nexport interface CalculationFormProps {\n resultColumnName: string;\n setResultColumnName: Dispatch<SetStateAction<string>>;\n expression: string;\n setExpression: Dispatch<SetStateAction<string>>;\n availableFields: string[];\n\n onSubmit: () => void;\n onCancel: () => void;\n submitButtonText: string;\n}\n\nexport function CalculationForm({\n resultColumnName,\n setResultColumnName,\n expression,\n setExpression,\n availableFields,\n onSubmit,\n onCancel,\n submitButtonText,\n}: CalculationFormProps) {\n const [error, setError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<{\n text: string;\n type: \"success\" | \"error\" | null;\n }>({\n text: \"\",\n type: null,\n });\n\n const handleValidate = () => {\n try {\n parseExpression(expression);\n setError(null);\n setStatusMessage({ text: \"Expression is valid!\", type: \"success\" });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setStatusMessage({ text: \"Invalid expression\", type: \"error\" });\n }\n };\n\n const handleInsertField = (field: string) => {\n setExpression((prev) => prev + field);\n };\n\n return (\n <form\n onSubmit={(ev) => {\n ev.preventDefault();\n onSubmit();\n }}\n >\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid grid-cols-[200px_1fr] gap-4\">\n <div className=\"space-y-2 \">\n <Label htmlFor=\"result-column\" className=\"block mb-2\">\n Result Column Name\n </Label>\n <Input\n id=\"result-column\"\n value={resultColumnName}\n onChange={(e) => setResultColumnName(e.target.value)}\n placeholder=\"calculated_field\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"expression\">Expression</Label>\n <div className=\"flex gap-2\">\n <Input\n id=\"expression\"\n value={expression}\n onChange={(e) => setExpression(e.target.value)}\n placeholder=\"Enter your expression...\"\n className=\"flex-1\"\n />\n <Button onClick={handleValidate} variant=\"secondary\">\n Validate\n </Button>\n </div>\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\n {statusMessage.text && (\n <p\n className={`text-sm ${\n statusMessage.type === \"success\"\n ? \"text-green-500\"\n : statusMessage.type === \"error\"\n ? \"text-red-500\"\n : \"\"\n }`}\n >\n {statusMessage.text}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <Card className=\"p-4\">\n <h3 className=\"font-semibold mb-2\">Available Fields</h3>\n <div className=\"flex flex-wrap gap-2\">\n {availableFields.map((field) => (\n <Button\n key={field}\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleInsertField(field)}\n >\n {field}\n </Button>\n ))}\n </div>\n </Card>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\">{submitButtonText}</Button>\n </div>\n </div>\n </form>\n );\n}\n","import { useGetColumnData } from \"@/components/charts/useGetColumnData\";\nimport { Card } from \"@/components/ui/card\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { CalculationDefinition } from \"@/lib/calculations/CalculationState\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\n\ninterface CalculationPreviewProps {\n calculation: CalculationDefinition;\n\n previewRows?: number;\n}\n\nexport function CalculationPreview({\n calculation,\n previewRows = 10,\n}: CalculationPreviewProps) {\n const rawData = useGetColumnData(calculation.resultColumnName);\n\n // Prepare the preview data\n const previewData = useMemo(() => {\n return Object.entries(rawData).map(([id, result]) => ({\n __ID: id,\n [calculation.resultColumnName]: result,\n }));\n }, [rawData, calculation.resultColumnName]);\n\n const totalRows = useDataLayer((state) => state.data.length);\n\n return (\n <div className=\"space-y-4\">\n <p>Expression: {calculation.expression.rawInput}</p>\n\n <div>\n <h4 className=\"text-sm font-medium mb-2\">Preview Data</h4>\n <div className=\"border rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>ID</TableHead>\n <TableHead>Result</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {previewData.slice(0, previewRows).map((row) => (\n <TableRow key={row.__ID}>\n <TableCell>{row.__ID}</TableCell>\n <TableCell>{row[calculation.resultColumnName]}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {totalRows > previewRows && (\n <p className=\"text-sm text-muted-foreground mt-2\">\n Showing {previewRows} of {totalRows} rows\n </p>\n )}\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Edit, Eye, PlusCircle, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { CalculationForm } from \"./CalculationForm\";\nimport { CalculationPreview } from \"./CalculationPreview\";\n\nexport type CalcBuilder = {\n name: string;\n resultColumnName: string;\n expressionString: string;\n};\n\nexport function CalculationManager() {\n const calculations = useDataLayer((state) => state.calculations);\n const addCalculation = useDataLayer((state) => state.addCalculation);\n const removeCalculation = useDataLayer((state) => state.removeCalculation);\n const updateCalculation = useDataLayer((state) => state.updateCalculation);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const data = useDataLayer((state) => state.data);\n\n const [isFormDialogOpen, setIsFormDialogOpen] = useState(false);\n const [isPreviewDialogOpen, setIsPreviewDialogOpen] = useState(false);\n const [currentCalculation, setCurrentCalculation] = useState<string | null>(\n null\n );\n const [dialogMode, setDialogMode] = useState<\"add\" | \"edit\">(\"add\");\n\n const [newCalcColumn, setNewCalcColumn] = useState(\"\");\n const [newExpression, setNewExpression] = useState(\"\");\n\n const availableFields = getColumnNames();\n\n const handleAddCalculation = async () => {\n if (!newCalcColumn.trim()) {\n toast.error(\"Please enter a result column name\");\n return;\n }\n\n if (!newExpression.trim()) {\n toast.error(\"Please enter an expression\");\n return;\n }\n\n try {\n await addCalculation({\n resultColumnName: newCalcColumn,\n expression: parseExpression(newExpression),\n });\n\n toast.success(\"Calculation added successfully\");\n setIsFormDialogOpen(false);\n resetNewCalculationForm();\n } catch (error) {\n toast.error(\n `Failed to add calculation: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n };\n\n const handleRemoveCalculation = (resultColumnName: string) => {\n removeCalculation(resultColumnName);\n toast.success(\"Calculation removed\");\n };\n\n const handleEditCalculation = (resultColumnName: string) => {\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === resultColumnName\n );\n if (calculation) {\n setCurrentCalculation(resultColumnName);\n setNewCalcColumn(calculation.resultColumnName);\n setNewExpression(calculation.expression.rawInput);\n setDialogMode(\"edit\");\n setIsFormDialogOpen(true);\n }\n };\n\n const handlePreviewCalculation = (resultColumnName: string) => {\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === resultColumnName\n );\n if (calculation) {\n setCurrentCalculation(resultColumnName);\n setIsPreviewDialogOpen(true);\n }\n };\n\n const handleUpdateCalculation = async () => {\n if (!currentCalculation) {\n return;\n }\n\n if (!newCalcColumn.trim()) {\n toast.error(\"Please enter a result column name\");\n return;\n }\n\n if (!newExpression.trim()) {\n toast.error(\"Please enter an expression\");\n return;\n }\n\n try {\n updateCalculation(currentCalculation, {\n resultColumnName: newCalcColumn,\n expression: parseExpression(newExpression),\n });\n\n toast.success(\"Calculation updated successfully\");\n setIsFormDialogOpen(false);\n } catch (error) {\n toast.error(\n `Failed to update calculation: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n };\n\n const resetNewCalculationForm = () => {\n setNewCalcColumn(\"\");\n setNewExpression(\"\");\n };\n\n const openAddDialog = () => {\n resetNewCalculationForm();\n setDialogMode(\"add\");\n setCurrentCalculation(null);\n setIsFormDialogOpen(true);\n };\n\n const handleFormSubmit = () => {\n if (dialogMode === \"add\") {\n handleAddCalculation();\n } else {\n handleUpdateCalculation();\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center\">\n <h2 className=\"text-xl font-semibold\">Calculations</h2>\n <Button\n variant=\"outline\"\n className=\"flex items-center gap-2\"\n onClick={openAddDialog}\n >\n <PlusCircle className=\"h-4 w-4\" />\n Add Calculation\n </Button>\n </div>\n\n {calculations.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n No calculations defined. Add one to get started.\n </div>\n ) : (\n <div className=\"border rounded-md\">\n <Table className=\"border-collapse\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[120px] border border-border\">\n Actions\n </TableHead>\n\n <TableHead className=\"w-[200px] text-center border border-border\">\n Result Column\n </TableHead>\n <TableHead className=\"w-full border border-border\">\n Expression\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {calculations.map((calc) => (\n <TableRow key={calc.resultColumnName}>\n <TableCell className=\"w-[120px] border border-border\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handlePreviewCalculation(calc.resultColumnName)\n }\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handleEditCalculation(calc.resultColumnName)\n }\n >\n <Edit className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handleRemoveCalculation(calc.resultColumnName)\n }\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </TableCell>\n\n <TableCell className=\"w-[200px] text-center border border-border\">\n {calc.resultColumnName}\n </TableCell>\n <TableCell className=\"font-mono text-sm w-full border border-border\">\n {calc.expression.rawInput}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n\n {/* Combined Add/Edit Dialog */}\n <Dialog open={isFormDialogOpen} onOpenChange={setIsFormDialogOpen}>\n <DialogContent className=\"max-w-3xl max-h-[80vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {dialogMode === \"add\"\n ? \"Add New Calculation\"\n : \"Edit Calculation\"}\n </DialogTitle>\n <DialogDescription>\n {dialogMode === \"add\"\n ? \"Create a new calculation to transform your data\"\n : \"Update your calculation\"}\n </DialogDescription>\n </DialogHeader>\n <CalculationForm\n resultColumnName={newCalcColumn}\n setResultColumnName={setNewCalcColumn}\n expression={newExpression}\n setExpression={setNewExpression}\n availableFields={availableFields}\n onSubmit={handleFormSubmit}\n onCancel={() => setIsFormDialogOpen(false)}\n submitButtonText={\n dialogMode === \"add\" ? \"Add Calculation\" : \"Update Calculation\"\n }\n />\n </DialogContent>\n </Dialog>\n\n {/* Preview Dialog */}\n <Dialog open={isPreviewDialogOpen} onOpenChange={setIsPreviewDialogOpen}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>Calculation Preview</DialogTitle>\n <DialogDescription>Preview calculation results</DialogDescription>\n </DialogHeader>\n {currentCalculation && (\n <div className=\"py-4\">\n {calculations.find(\n (calc) => calc.resultColumnName === currentCalculation\n )?.expression && (\n <CalculationPreview\n calculation={\n calculations.find(\n (calc) => calc.resultColumnName === currentCalculation\n )!\n }\n previewRows={10}\n />\n )}\n </div>\n )}\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n onClick={() => setIsPreviewDialogOpen(false)}\n >\n Close\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Label } from \"../ui/label\";\nimport { Input } from \"../ui/input\";\nimport { Switch } from \"../ui/switch\";\n\nexport function GridSettingsPanel() {\n const gridSettings = useDataLayer((s) => s.gridSettings);\n const updateGridSettings = useDataLayer((s) => s.updateGridSettings);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Column Count</Label>\n <Input\n type=\"number\"\n value={gridSettings.columnCount}\n onChange={(e) =>\n updateGridSettings({\n columnCount: parseInt(e.target.value),\n })\n }\n min={1}\n max={24}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Row Height (px)</Label>\n <Input\n type=\"number\"\n value={gridSettings.rowHeight}\n onChange={(e) =>\n updateGridSettings({\n rowHeight: parseInt(e.target.value),\n })\n }\n min={20}\n max={200}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Container Padding (px)</Label>\n <Input\n type=\"number\"\n value={gridSettings.containerPadding}\n onChange={(e) =>\n updateGridSettings({\n containerPadding: parseInt(e.target.value),\n })\n }\n min={0}\n max={50}\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"show-markers\"\n checked={gridSettings.showBackgroundMarkers}\n onCheckedChange={(checked) =>\n updateGridSettings({ showBackgroundMarkers: checked })\n }\n />\n <Label htmlFor=\"show-markers\">Show Grid Markers</Label>\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { ColorScaleManager } from \"./ColorScaleManager\";\nimport { ChartCreationButtons } from \"./plot/ChartCreationButtons\";\n\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport type { ChartLayout } from \"@/types/ChartTypes\";\nimport { saveRawDataToClipboard, saveToClipboard } from \"@/utils/saveDataUtils\";\nimport {\n Calculator,\n Copy,\n FilterX,\n Grid,\n MoreHorizontal,\n X,\n} from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Layout } from \"react-grid-layout\";\nimport { toast } from \"sonner\";\nimport { ChartGridLayout } from \"./ChartGridLayout\";\nimport { PlotChartPanel } from \"./PlotChartPanel\";\nimport { CalculationManager } from \"./calculations/CalculationManager\";\nimport { GridSettingsPanel } from \"./settings/GridSettingsPanel\";\nimport { useAlertStore } from \"@/stores/alertStore\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\n\n// Add this conversion function\nconst gridToPixels = (\n layout: ChartLayout,\n containerWidth: number,\n gridSettings: {\n columnCount: number;\n containerPadding: number;\n rowHeight: number;\n }\n) => {\n const columnWidth =\n (containerWidth - gridSettings.containerPadding * 2) /\n gridSettings.columnCount;\n\n // Ensure width doesn't exceed available space\n const maxColumns = Math.min(layout.w, gridSettings.columnCount);\n const width = maxColumns * columnWidth;\n\n return {\n width,\n height: layout.h * gridSettings.rowHeight,\n };\n};\n\nexport function PlotManager() {\n const charts = useDataLayer((state) => state.charts);\n const updateChart = useDataLayer((state) => state.updateChart);\n const addChart = useDataLayer((state) => state.addChart);\n const removeChart = useDataLayer((state) => state.removeChart);\n const removeAllCharts = useDataLayer((state) => state.removeAllCharts);\n const clearAllFilters = useDataLayer((state) => state.clearAllFilters);\n const gridSettings = useDataLayer((state) => state.gridSettings);\n const saveToStructure = useDataLayer((state) => state.saveToStructure);\n const data = useDataLayer((state) => state.data);\n const showAlert = useAlertStore((state) => state.showAlert);\n\n const [activeTab, setActiveTab] = useState(\"charts\");\n\n // Add ref and state for container dimensions\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Add useEffect to measure container\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const handleLayoutChange = (newLayout: Layout[]) => {\n charts.forEach((chart) => {\n const updatedLayout = newLayout.find((l) => l.i === chart.id);\n if (updatedLayout) {\n updateChart(chart.id, {\n layout: {\n x: updatedLayout.x,\n y: updatedLayout.y,\n w: updatedLayout.w,\n h: updatedLayout.h,\n },\n });\n }\n });\n };\n\n const copyChartsToClipboard = async () => {\n if (charts.length === 0) {\n toast(\"No charts to copy\");\n return;\n }\n\n try {\n const savedData = saveToStructure();\n await saveToClipboard(savedData);\n\n toast(\"Configuration saved to clipboard\");\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n toast.error(\"Failed to copy configuration to clipboard\");\n }\n };\n\n const copyDataToClipboard = async () => {\n if (!data || data.length === 0) {\n toast(\"No data to copy\");\n return;\n }\n\n try {\n await saveRawDataToClipboard(data);\n\n toast(\"Data saved to clipboard\");\n } catch (error) {\n console.error(\"Failed to copy data to clipboard:\", error);\n toast.error(\"Failed to copy data to clipboard\");\n }\n };\n\n const handleRemoveAllCharts = async () => {\n const confirmed = await showAlert(\n \"Remove All Charts\",\n \"Are you sure you want to remove all charts? This action cannot be undone.\"\n );\n\n if (confirmed) {\n removeAllCharts();\n toast(\"All charts have been removed\");\n }\n };\n\n return (\n <div className=\"w-full pb-40\" ref={containerRef}>\n <div className=\"flex justify-between items-center mb-4\">\n <div className=\"flex items-center gap-2\">\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"w-full\"\n >\n <TabsList>\n <TabsTrigger value=\"charts\" className=\"flex items-center gap-2\">\n Charts\n </TabsTrigger>\n <TabsTrigger\n value=\"calculations\"\n className=\"flex items-center gap-2\"\n >\n <Calculator className=\"h-4 w-4\" />\n Calculations\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <ChartCreationButtons />\n </div>\n <div className=\"flex items-center gap-2\">\n {charts.length > 0 && activeTab === \"charts\" && (\n <>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={clearAllFilters}\n title=\"Clear All Filters\"\n >\n <FilterX className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onClick={copyChartsToClipboard}\n className=\"flex items-center gap-2\"\n >\n <Copy className=\"h-4 w-4\" />\n Copy Charts\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={copyDataToClipboard}\n className=\"flex items-center gap-2\"\n >\n <Copy className=\"h-4 w-4\" />\n Copy Data\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={handleRemoveAllCharts}\n className=\"flex items-center gap-2 text-destructive\"\n >\n <X className=\"h-4 w-4\" />\n Remove All Charts\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n <ColorScaleManager />\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Grid className=\"h-4 w-4 mr-2\" />\n Grid Settings\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Grid Settings</DialogTitle>\n <DialogDescription>\n Configure the grid layout settings for all charts\n </DialogDescription>\n </DialogHeader>\n <GridSettingsPanel />\n </DialogContent>\n </Dialog>\n </div>\n </div>\n\n <Tabs value={activeTab} className=\"w-full\">\n <TabsContent value=\"charts\" className=\"mt-0\">\n <ChartGridLayout\n charts={charts}\n onLayoutChange={handleLayoutChange}\n containerWidth={containerWidth}\n >\n {charts.map((chart) => {\n if (!chart.layout) {\n return null;\n }\n const size = gridToPixels(\n chart.layout,\n containerWidth,\n gridSettings\n );\n return (\n <div key={chart.id}>\n <PlotChartPanel\n settings={chart}\n onDelete={() => removeChart(chart)}\n onDuplicate={() => {\n const { id, ...chartWithoutId } = chart;\n addChart(chartWithoutId);\n }}\n width={size.width}\n height={size.height}\n />\n </div>\n );\n })}\n </ChartGridLayout>\n </TabsContent>\n <TabsContent value=\"calculations\" className=\"mt-0\">\n <Card>\n <CardContent className=\"pt-6\">\n <CalculationManager />\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Toaster as Sonner, ToasterProps } from \"sonner\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme();\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport { cn } from \"@/lib/utils\";\nimport { buttonVariants } from \"@/components/ui/button\";\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n );\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n {...props}\n />\n );\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { useAlertStore } from \"@/stores/alertStore\";\n\nexport function GlobalAlertDialog() {\n const { isOpen, title, description, closeAlert, id } = useAlertStore();\n\n return (\n <AlertDialog\n key={id}\n open={isOpen}\n onOpenChange={(open) => !open && closeAlert(false)}\n >\n <AlertDialogContent\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n const action = document.getElementById(`alert-dialog-action-${id}`);\n if (action) {\n action.focus();\n }\n }}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction\n onClick={() => closeAlert(true)}\n autoFocus\n id={`alert-dialog-action-${id}`}\n >\n Continue\n </AlertDialogAction>\n <AlertDialogCancel\n onClick={() => closeAlert(false)}\n autoFocus={false}\n >\n Cancel\n </AlertDialogCancel>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import type { DatumObject } from \"@/providers/DataLayerProvider\";\nimport { DataLayerProvider } from \"@/providers/DataLayerProvider\";\nimport { SavedDataStructure } from \"@/types/SavedDataTypes\";\nimport { PlotManager } from \"./PlotManager\";\nimport { registerAllCharts } from \"@/charts/registry\";\nimport { Toaster } from \"./ui/sonner\";\nimport { GlobalAlertDialog } from \"./GlobalAlertDialog\";\n\nimport \"../index.css\";\n\nregisterAllCharts();\n\nexport function ExplorEda({\n data,\n savedData,\n}: {\n data: DatumObject[];\n savedData: SavedDataStructure | undefined;\n}) {\n return (\n <DataLayerProvider data={data} savedData={savedData}>\n <div className=\"bg-background text-foreground\">\n <PlotManager />\n <GlobalAlertDialog />\n <Toaster />\n </div>\n </DataLayerProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/applyFilter.ts","../src/utils/defaultSettings.ts","../src/hooks/useColorScales.ts","../src/hooks/getAxisFilter.ts","../src/providers/FacetAxisProvider.tsx","../src/components/charts/Axis/Axis.tsx","../src/hooks/useBrush.tsx","../src/lib/utils.ts","../src/hooks/useFilterExtent.ts","../src/components/charts/BaseChart.tsx","../src/components/charts/useGetColumnData.tsx","../src/components/charts/useGetLiveData.tsx","../src/components/charts/BarChart/BarChart.tsx","../src/components/ui/button.tsx","../src/components/ui/dialog.tsx","../src/components/ui/command.tsx","../src/components/ui/popover.tsx","../src/components/ComboBox.tsx","../src/components/ui/label.tsx","../src/components/FieldSelector.tsx","../src/components/ui/slider.tsx","../src/components/ui/switch.tsx","../src/components/charts/BarChart/BarChartSettingsPanel.tsx","../src/components/charts/BarChart/definition.ts","../src/components/charts/ScatterPlot/ScatterPlotSettingsPanel.tsx","../src/components/charts/ScatterPlot/ScatterPlot.tsx","../src/components/charts/ScatterPlot/definition.ts","../src/components/charts/ThreeDScatter/ThreeDScatterAxes.tsx","../src/components/charts/ThreeDScatter/ThreeDScatterPoints.tsx","../src/components/charts/ThreeDScatter/useThreeDScatterData.ts","../src/components/charts/ThreeDScatter/ThreeDScatterChart.tsx","../src/components/ui/input.tsx","../src/components/NumericInputEnter.tsx","../src/components/charts/ThreeDScatter/ThreeDScatterSettingsPanel.tsx","../src/components/charts/ThreeDScatter/definition.ts","../src/components/charts/PivotTable/utils/calculations.ts","../src/components/charts/PivotTable/PivotTable.tsx","../src/components/ui/badge.tsx","../src/components/ui/multi-select.tsx","../src/components/charts/PivotTable/useColumnNames.tsx","../src/components/charts/PivotTable/PivotTableSettingsPanel.tsx","../src/components/charts/PivotTable/definition.ts","../src/components/ui/table.tsx","../src/types/FilterTypes.ts","../src/components/charts/DataTable/DataTableBody.tsx","../src/components/ui/select.tsx","../src/components/charts/DataTable/components/ColumnFilter.tsx","../src/components/charts/DataTable/DataTableHeader.tsx","../src/components/charts/DataTable/DataTablePagination.tsx","../src/components/charts/DataTable/DataTableToolbar.tsx","../src/components/charts/DataTable/DataTable.tsx","../src/components/charts/DataTable/DataTableSettingsPanel.tsx","../src/components/charts/DataTable/definition.ts","../src/components/ui/progress.tsx","../src/components/SummaryTable/utils/dataTypeDetection.ts","../src/components/SummaryTable/utils/samplingStrategy.ts","../src/components/SummaryTable/utils/statisticsCalculator.ts","../src/components/SummaryTable/components/DataTypeIcon.tsx","../src/components/ui/tooltip.tsx","../src/components/SummaryTable/components/StatBadge.tsx","../src/hooks/useCreateCharts.ts","../src/components/SummaryTable/components/ChartActions.tsx","../src/components/SummaryTable/components/CompactSummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTableSettingsPanel.tsx","../src/components/charts/SummaryTable/definition.ts","../src/components/ui/toggle.tsx","../src/components/ui/toggle-group.tsx","../src/components/charts/Markdown/MenuBar.tsx","../src/components/charts/Markdown/Markdown.tsx","../src/components/charts/Markdown/definition.ts","../src/components/charts/BoxPlot/boxPlotCalculations.ts","../src/components/charts/BoxPlot/BoxPlot.tsx","../src/components/charts/BoxPlot/BoxPlotSettingsPanel.tsx","../src/components/charts/BoxPlot/BoxPlotIcon.tsx","../src/components/charts/BoxPlot/definition.ts","../src/components/ui/card.tsx","../src/components/ui/scroll-area.tsx","../src/components/charts/ColorLegend/getContrastTextColor.tsx","../src/components/charts/ColorLegend/ColorScale.tsx","../src/components/charts/ColorLegend/ColorLegendChart.tsx","../src/components/charts/ColorLegend/ColorLegendSettingsPanel.tsx","../src/components/charts/ColorLegend/definition.ts","../src/lib/chartUtils.ts","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/constant.js","../../../node_modules/.pnpm/d3-path@3.1.0/node_modules/d3-path/src/path.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/path.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/array.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/point.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/line.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js","../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/step.js","../src/components/charts/LineChart/LineChart.tsx","../src/components/charts/LineChart/LineSeriesSettings.tsx","../src/components/ui/tabs.tsx","../src/components/charts/LineChart/LineChartSettingsPanel.tsx","../src/components/charts/LineChart/definition.ts","../src/components/charts/RowChart/RowChart.tsx","../src/components/charts/RowChart/RowChartSettingsPanel.tsx","../src/components/charts/RowChart/definition.ts","../src/charts/registry.ts","../src/hooks/CrossfilterWrapper.ts","../src/lib/calculations/engine/Calculator.ts","../src/lib/calculations/CalculationState.ts","../src/utils/localStorage.ts","../src/providers/DataLayerProvider.tsx","../src/components/ColorScaleManager.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/plot/ChartCreationButtons.tsx","../src/utils/saveDataUtils.ts","../src/components/GridBackground.tsx","../src/components/ChartGridLayout.tsx","../src/components/charts/ChartRenderer.tsx","../src/components/charts/FacetRelated/FacetGridLayout.tsx","../src/components/charts/FacetRelated/FacetWrapLayout.tsx","../src/components/charts/FacetRelated/FacetContainer.tsx","../src/components/settings/AdvancedSettingsTab.tsx","../src/components/settings/AxisSettingsTab.tsx","../src/components/settings/FacetSettingsTab.tsx","../src/components/settings/LabelsSettingsTab.tsx","../src/components/settings/MainSettingsTab.tsx","../src/components/settings/TabContainer.tsx","../src/components/ChartSettingsContent.tsx","../src/stores/alertStore.ts","../src/components/PlotChartPanel.tsx","../src/lib/calculations/parser/semantics.ts","../src/components/calculations/CalculationForm.tsx","../src/components/calculations/CalculationPreview.tsx","../src/components/calculations/CalculationManager.tsx","../src/components/settings/GridSettingsPanel.tsx","../src/components/PlotManager.tsx","../src/components/ui/sonner.tsx","../src/components/ui/alert-dialog.tsx","../src/components/GlobalAlertDialog.tsx","../src/components/ExplorEda.tsx"],"names":["jsx","x","y","useRef","extent","useCallback","useMemo","jsxs","isNumeric","min","max","isEqual","useEffect","newFilters","CommandPrimitive","useState","CommandList","React","scaleLinear","Fragment","THREE","point","THREE3","THREE4","FilterIcon","cva","Slot","CommandEmpty","forwardRef","X","value","Table","e","PAGE_SIZE_OPTIONS","Icon","Hash","BarChart","ScatterChart","Table2","toast","Download","React4","ChevronUp","ChevronDown","Type","Color","Y_SCALE_PADDING","result","scaleBand","Palette","path","LineChart","LineChartIcon","createStore","crossfilterWrapper","chart","columnData","createContext","useContext","useStore","interpolateViridis","interpolateInferno","interpolateMagma","interpolatePlasma","interpolateWarm","interpolateCool","schemeCategory10","schemeSet3","rows","columns","grid","DEFAULT_AXIS_SETTINGS","grammar","CalculationManager","Eye","Calculator","FilterX","Copy","Sonner"],"mappings":"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","file":"ExplorEda.js","sourcesContent":["import { datum, Filter } from \"@/types/FilterTypes\";\n\nexport function applyFilter(value: datum, filter: Filter): boolean {\n switch (filter.type) {\n case \"value\":\n return filter.values.includes(value as string | number);\n case \"range\":\n if (typeof value === \"number\") {\n return (\n (filter.min === undefined || value >= filter.min) &&\n (filter.max === undefined || value <= filter.max)\n );\n }\n break;\n case \"text\":\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n const search = filter.value.toLowerCase();\n\n switch (filter.operator) {\n case \"contains\":\n return lower.includes(search);\n case \"equals\":\n return lower === search;\n case \"startsWith\":\n return lower.startsWith(search);\n case \"endsWith\":\n return lower.endsWith(search);\n }\n }\n }\n\n return false;\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { ThreeDScatterSettings } from \"@/components/charts/ThreeDScatter/types\";\nimport {\n AxisSettings,\n BaseChartSettings,\n ChartSettings,\n MarginSettings,\n RowChartSettings,\n WrapFacetSettings,\n} from \"@/types/ChartTypes\";\nimport { Vector3 } from \"three\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DataTableSettings } from \"@/components/charts/DataTable/definition\";\nimport { PivotTableSettings } from \"@/components/charts/PivotTable/definition\";\nimport { ScatterPlotSettings } from \"@/components/charts/ScatterPlot/definition\";\nimport { SummaryTableSettings } from \"@/components/charts/SummaryTable/definition\";\n\nexport const DEFAULT_AXIS_SETTINGS: AxisSettings = {\n scaleType: \"linear\",\n grid: false,\n min: 0,\n max: 100,\n};\n\nexport const DEFAULT_MARGIN_SETTINGS: MarginSettings = {\n top: 20,\n right: 20,\n bottom: 20,\n left: 20,\n};\n\nexport const DEFAULT_FACET_SETTINGS: WrapFacetSettings = {\n enabled: false,\n type: \"wrap\",\n rowVariable: \"\",\n columnCount: 2,\n};\n\nexport const DEFAULT_CHART_SETTINGS: Omit<BaseChartSettings, \"id\"> = {\n title: \"\",\n type: \"row\",\n field: \"\",\n layout: { x: 0, y: 0, w: 12, h: 7 },\n xAxis: DEFAULT_AXIS_SETTINGS,\n yAxis: DEFAULT_AXIS_SETTINGS,\n margin: DEFAULT_MARGIN_SETTINGS,\n facet: DEFAULT_FACET_SETTINGS,\n colorScaleId: undefined,\n colorField: undefined,\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n filters: [] as Filter[],\n};\n\nexport const DEFAULT_PIVOT_SETTINGS: Omit<PivotTableSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"pivot\",\n rowFields: [],\n columnField: \"\",\n valueFields: [],\n showTotals: { row: false, column: false, grand: false },\n};\n\nexport const DEFAULT_ROW_SETTINGS: Omit<RowChartSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"row\",\n minRowHeight: 30,\n maxRowHeight: 50,\n filters: [],\n};\n\nexport const DEFAULT_SCATTER_SETTINGS: Omit<ScatterPlotSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"scatter\",\n xField: \"\",\n yField: \"\",\n filters: [],\n};\n\nexport const DEFAULT_3D_SCATTER_SETTINGS: Omit<ThreeDScatterSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"3d-scatter\",\n xField: \"\",\n yField: \"\",\n zField: \"\",\n colorField: undefined,\n sizeField: undefined,\n cameraPosition: new Vector3(10, 10, 10),\n cameraTarget: new Vector3(0, 0, 0),\n pointSize: 0.1,\n pointOpacity: 0.8,\n showGrid: true,\n showAxes: true,\n xAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n yAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n zAxis: { ...DEFAULT_AXIS_SETTINGS, zoomLevel: 1 },\n};\n\nexport const DEFAULT_SUMMARY_SETTINGS: Omit<SummaryTableSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"summary\",\n title: \"Data Summary\",\n layout: { x: 0, y: 0, w: 12, h: 8 },\n};\n\nexport const DEFAULT_DATA_TABLE_SETTINGS: Omit<DataTableSettings, \"id\"> = {\n ...DEFAULT_CHART_SETTINGS,\n type: \"data-table\",\n columns: [],\n pageSize: 10,\n currentPage: 1,\n sortDirection: \"asc\",\n filters: [] as Filter[],\n globalSearch: \"\",\n tableHeight: 600,\n};\n\nexport function mergeWithDefaultSettings<T extends ChartSettings>(\n settings: T\n): T {\n const def = getChartDefinition(settings.type);\n const defaults = def.createDefaultSettings(settings.layout, settings.field);\n return {\n ...defaults,\n ...settings,\n xAxis: { ...DEFAULT_AXIS_SETTINGS, ...settings.xAxis },\n yAxis: { ...DEFAULT_AXIS_SETTINGS, ...settings.yAxis },\n margin: { ...DEFAULT_MARGIN_SETTINGS, ...settings.margin },\n facet: { ...DEFAULT_FACET_SETTINGS, ...settings.facet },\n } as T;\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport {\n CategoricalColorScale,\n ColorScaleType,\n NumericalColorScale,\n UseColorScalesReturn,\n} from \"@/types/ColorScaleTypes\";\nimport {\n interpolateCool,\n interpolateInferno,\n interpolateMagma,\n interpolatePlasma,\n interpolateViridis,\n interpolateWarm,\n schemeCategory10,\n schemeSet3,\n} from \"d3-scale-chromatic\";\nimport { scaleOrdinal, scaleSequential } from \"d3-scale\";\n\nimport { useCallback, useMemo } from \"react\";\n\nconst DEFAULT_NUMERICAL_PALETTES = [\n { name: \"Viridis\", interpolator: interpolateViridis },\n { name: \"Inferno\", interpolator: interpolateInferno },\n { name: \"Magma\", interpolator: interpolateMagma },\n { name: \"Plasma\", interpolator: interpolatePlasma },\n { name: \"Warm\", interpolator: interpolateWarm },\n { name: \"Cool\", interpolator: interpolateCool },\n];\n\nconst DEFAULT_CATEGORICAL_PALETTES = [\n { name: \"Category10\", colors: schemeCategory10 },\n { name: \"Set3\", colors: schemeSet3 },\n];\n\nexport function useColorScales(): UseColorScalesReturn {\n const colorScales = useDataLayer((state) => state.colorScales);\n const addColorScale = useDataLayer((state) => state.addColorScale);\n const removeColorScale = useDataLayer((state) => state.removeColorScale);\n const updateColorScale = useDataLayer((state) => state.updateColorScale);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n\n // Memoized d3 scale objects\n const d3Scales = useMemo(() => {\n const scales = new Map();\n\n colorScales.forEach((scale) => {\n if (scale.type === \"numerical\") {\n const numericalScale = scale as NumericalColorScale;\n const interpolator =\n DEFAULT_NUMERICAL_PALETTES.find(\n (p) => p.name === numericalScale.palette\n )?.interpolator || interpolateViridis;\n\n scales.set(\n scale.id,\n scaleSequential(interpolator).domain([\n numericalScale.min,\n numericalScale.max,\n ])\n );\n } else {\n const categoricalScale = scale as CategoricalColorScale;\n scales.set(\n scale.id,\n scaleOrdinal<string>()\n .domain(Array.from(categoricalScale.mapping.keys()))\n .range(categoricalScale.palette)\n );\n }\n });\n\n return scales;\n }, [colorScales]);\n\n const getColorForValue = useCallback(\n (\n scaleId: string | undefined,\n value: string | number,\n defaultColor: string = \"#000000\"\n ): string => {\n if (!scaleId) {\n return defaultColor;\n }\n\n const scale = colorScales.find((s) => s.id === scaleId);\n if (!scale) {\n // console.warn(`Color scale ${scaleId} not found`);\n return \"#000000\";\n }\n\n const d3Scale = d3Scales.get(scaleId);\n if (!d3Scale) {\n console.warn(`D3 scale for ${scaleId} not found`);\n return \"#000000\";\n }\n\n try {\n return d3Scale(value);\n } catch (error) {\n console.error(\"Error getting color for value\", {\n scaleId,\n value,\n error,\n });\n return \"#000000\";\n }\n },\n [colorScales, d3Scales]\n );\n\n const getScaleById = (id: string): ColorScaleType | undefined => {\n return colorScales.find((s) => s.id === id);\n };\n\n const createDefaultNumericalScale = (\n name: string,\n min: number,\n max: number\n ): ColorScaleType => {\n const scale: Omit<NumericalColorScale, \"id\"> = {\n name,\n type: \"numerical\",\n palette: \"Viridis\",\n min,\n max,\n };\n return addColorScale(scale);\n };\n\n const createDefaultCategoricalScale = (\n name: string,\n values: string[]\n ): ColorScaleType => {\n const defaultPalette = DEFAULT_CATEGORICAL_PALETTES[0].colors;\n const mapping = new Map<string, string>();\n values.forEach((value, i) => {\n mapping.set(value, defaultPalette[i % defaultPalette.length]);\n });\n\n const scale: Omit<CategoricalColorScale, \"id\"> = {\n name,\n type: \"categorical\",\n palette: Array.from(mapping.values()),\n mapping,\n };\n return addColorScale(scale);\n };\n\n const getD3Scale = (scaleId: string) => {\n return d3Scales.get(scaleId);\n };\n\n const getOrCreateScaleForField = (field: string, name?: string): string => {\n // First check if a scale already exists for this field\n const existingScale = colorScales.find((s) => s.name === (name ?? field));\n if (existingScale) {\n return existingScale.id;\n }\n\n // Get all values for the field\n const values = Object.values(getColumnData(field));\n\n // Filter out null and undefined\n const cleanValues = values.filter((v): v is string | number => v != null);\n\n // Check if values are numerical\n const isNumerical = cleanValues.every((v) => !isNaN(Number(v)));\n\n let newScale: ColorScaleType;\n if (isNumerical) {\n const numericValues = cleanValues.map(Number);\n const min = Math.min(...numericValues);\n const max = Math.max(...numericValues);\n newScale = createDefaultNumericalScale(name ?? field, min, max);\n } else {\n const uniqueValues = Array.from(new Set(cleanValues.map(String)));\n newScale = createDefaultCategoricalScale(name ?? field, uniqueValues);\n }\n\n return newScale.id;\n };\n\n return {\n addColorScale,\n removeColorScale,\n updateColorScale,\n getColorForValue,\n getScaleById,\n colorScales,\n createDefaultNumericalScale,\n createDefaultCategoricalScale,\n getD3Scale,\n getOrCreateScaleForField,\n };\n}\n","import { Filter, RangeFilter } from \"@/types/FilterTypes\";\n\nexport function getRangeFilterForField(\n filters: Filter[],\n field: string\n): RangeFilter | undefined {\n return filters.find(\n (f): f is RangeFilter => f.type === \"range\" && f.field === field\n );\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\";\nimport isEqual from \"react-fast-compare\";\nimport { createStore, useStore } from \"zustand\";\n\n// Numerical axis limits\ninterface NumericalAxisLimits {\n type: \"numerical\";\n min: number;\n max: number;\n}\n\n// Categorical axis limits\ninterface CategoricalAxisLimits {\n type: \"categorical\";\n categories: Set<string>;\n}\n\n// Union type for axis limits\ntype AxisLimits = NumericalAxisLimits | CategoricalAxisLimits;\n\ninterface FacetAxisState {\n axisLimits: {\n x: Record<string, AxisLimits>;\n y: Record<string, AxisLimits>;\n };\n registerAxisLimits: (\n chartId: string,\n axis: \"x\" | \"y\",\n limits: AxisLimits\n ) => void;\n getGlobalAxisLimits: (axis: \"x\" | \"y\") => AxisLimits | null;\n}\n\n// Create the Zustand store\nconst createFacetAxisStore = () => {\n return createStore<FacetAxisState>()((set, get) => ({\n axisLimits: { x: {}, y: {} },\n\n registerAxisLimits: (\n chartId: string,\n axis: \"x\" | \"y\",\n limits: AxisLimits\n ) => {\n const before = get().axisLimits[axis][chartId];\n const after = limits;\n\n if (before && after && isEqual(before, after)) {\n return;\n }\n\n // call new function to determine new limits\n const newLimits = determineNewLimits(before, after);\n\n requestAnimationFrame(() => {\n set((state) => ({\n axisLimits: {\n ...state.axisLimits,\n [axis]: {\n ...state.axisLimits[axis],\n [chartId]: newLimits,\n },\n },\n }));\n });\n },\n\n getGlobalAxisLimits: (axis: \"x\" | \"y\"): AxisLimits | null => {\n const limits = Object.values(get().axisLimits[axis]);\n if (limits.length === 0) {\n return null;\n }\n\n // Check if all limits are of the same type\n const firstLimitType = limits[0].type;\n const allSameType = limits.every(\n (limit) => limit.type === firstLimitType\n );\n\n if (!allSameType) {\n console.warn(\"Mixed axis types detected in facets. Using first type.\");\n }\n\n if (firstLimitType === \"numerical\") {\n // For numerical limits, find min and max across all charts\n const numericalLimits = limits.filter(\n (limit): limit is NumericalAxisLimits => limit.type === \"numerical\"\n );\n\n return {\n type: \"numerical\",\n min: Math.min(...numericalLimits.map((l) => l.min)),\n max: Math.max(...numericalLimits.map((l) => l.max)),\n };\n } else {\n // For categorical limits, create a union of all categories\n const categoricalLimits = limits.filter(\n (limit): limit is CategoricalAxisLimits =>\n limit.type === \"categorical\"\n );\n\n const allCategories = new Set<string>();\n categoricalLimits.forEach((limit) => {\n limit.categories.forEach((category) => {\n allCategories.add(category);\n });\n });\n\n return {\n type: \"categorical\",\n categories: allCategories,\n };\n }\n },\n }));\n};\n\n// Store type\ntype FacetAxisStore = ReturnType<typeof createFacetAxisStore>;\n\n// Create a context for the store\nconst FacetAxisContext = createContext<FacetAxisStore | null>(null);\n\n// Provider component\nexport function FacetAxisProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<FacetAxisStore | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = createFacetAxisStore();\n }\n\n return (\n <FacetAxisContext.Provider value={storeRef.current}>\n {children}\n </FacetAxisContext.Provider>\n );\n}\n\n// Hook to use the facet axis store\nexport function useFacetAxis<T>(selector: (state: FacetAxisState) => T): T {\n const store = useContext(FacetAxisContext);\n if (!store) {\n throw new Error(\"useFacetAxis must be used within a FacetAxisProvider\");\n }\n\n return useStore(store, selector);\n}\nfunction determineNewLimits(before: AxisLimits | undefined, after: AxisLimits) {\n // determine new limits by taking extremes\n // min of mins\n // max of maxes\n\n // if categorical, take union of categories\n if (!before) {\n return after;\n }\n\n if (before.type === \"numerical\" && after.type === \"numerical\") {\n return {\n type: \"numerical\",\n min: Math.min(before.min, after.min),\n max: Math.max(before.max, after.max),\n };\n }\n\n if (before.type === \"categorical\" && after.type === \"categorical\") {\n return {\n type: \"categorical\",\n categories: new Set([...before.categories, ...after.categories]),\n };\n }\n\n if (before.type === \"numerical\" && after.type === \"categorical\") {\n return {\n type: \"categorical\",\n categories: new Set([...after.categories]),\n };\n }\n\n if (before.type === \"categorical\" && after.type === \"numerical\") {\n return {\n type: \"categorical\",\n categories: new Set([...before.categories]),\n };\n }\n\n throw new Error(\"Invalid axis limits\");\n}\n","import { ScaleBand, ScaleLinear } from \"d3-scale\";\n\ntype Scale = ScaleLinear<number, number> | ScaleBand<string>;\n\ninterface AxisProps {\n scale: Scale;\n transform: string;\n className?: string;\n tickCount?: number;\n showGridLines?: boolean;\n axisLabel?: string;\n}\n\nexport function XAxis({\n scale,\n transform,\n tickCount = 5,\n showGridLines = false,\n axisLabel,\n}: AxisProps) {\n // Helper function to get ticks\n const getTicks = () => {\n if (\"ticks\" in scale) {\n // For linear scales\n return scale.ticks(tickCount);\n } else {\n // For band scales\n return scale.domain();\n }\n };\n\n const ticks = getTicks();\n const range = scale.range();\n const axisLength = range[1] - range[0];\n\n return (\n <g transform={transform} className=\"text-sm fill-foreground\">\n {/* Main axis line */}\n <line\n x1={range[0]}\n x2={range[1]}\n y1={0}\n y2={0}\n className=\"stroke-border\"\n />\n\n {/* Ticks and labels */}\n {ticks.map((tick, i) => {\n const x =\n \"bandwidth\" in scale\n ? scale(tick as string)! + scale.bandwidth() / 2\n : scale(tick as number);\n\n return (\n <g key={i} transform={`translate(${x}, 0)`}>\n {/* Tick line */}\n <line x1={0} x2={0} y1={0} y2={6} className=\"stroke-border\" />\n {/* Grid line */}\n {showGridLines && (\n <line\n x1={0}\n x2={0}\n y1={0}\n y2={-axisLength}\n className=\"stroke-border/20 stroke-dasharray-2\"\n />\n )}\n {/* Label */}\n <text\n x={0}\n y={20}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-xs\"\n >\n {tick}\n </text>\n </g>\n );\n })}\n\n {/* Axis label */}\n {axisLabel && (\n <text\n x={range[0] + axisLength / 2}\n y={30}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-sm font-medium\"\n >\n {axisLabel}\n </text>\n )}\n </g>\n );\n}\n\nexport function YAxis({\n scale,\n transform,\n tickCount = 5,\n showGridLines = false,\n axisLabel,\n}: AxisProps) {\n // Helper function to get ticks\n const getTicks = () => {\n if (\"ticks\" in scale) {\n // For linear scales\n return scale.ticks(tickCount);\n } else {\n // For band scales\n return scale.domain();\n }\n };\n\n const ticks = getTicks();\n const range = scale.range();\n const axisLength = range[0] - range[1];\n\n return (\n <g transform={transform} className=\"text-sm fill-foreground\">\n {/* Main axis line */}\n <line\n x1={0}\n x2={0}\n y1={range[1]}\n y2={range[0]}\n className=\"stroke-border\"\n />\n\n {/* Ticks and labels */}\n {ticks.map((tick, i) => {\n const y =\n \"bandwidth\" in scale\n ? scale(tick as string)! + scale.bandwidth() / 2\n : scale(tick as number);\n\n return (\n <g key={i} transform={`translate(0, ${y})`}>\n {/* Tick line */}\n <line x1={0} x2={-6} y1={0} y2={0} className=\"stroke-border\" />\n {/* Grid line */}\n {showGridLines && (\n <line\n x1={0}\n x2={axisLength}\n y1={0}\n y2={0}\n className=\"stroke-border/20 stroke-dasharray-2\"\n />\n )}\n {/* Label */}\n <text\n x={-12}\n y={0}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-xs\"\n >\n {tick}\n </text>\n </g>\n );\n })}\n\n {/* Axis label */}\n {axisLabel && (\n <text\n x={-(range[1] + (range[0] - range[1]) / 2)}\n y={0}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n className=\"fill-muted-foreground text-sm font-medium\"\n >\n {axisLabel}\n </text>\n )}\n </g>\n );\n}\n","import {\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { usePrevious } from \"react-use\";\ninterface Point {\n x: number;\n y: number;\n}\n\ntype BrushState =\n | { state: \"idle\" }\n | {\n state: \"dragging\";\n start: Point;\n current: Point;\n }\n | {\n state: \"moving\";\n start: Point;\n brushStart: Point;\n brushEnd: Point;\n }\n | {\n state: \"resizing\";\n edge:\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\";\n start: Point;\n brushStart: Point;\n brushEnd: Point;\n }\n | {\n state: \"brushed\";\n brushStart: Point;\n brushEnd: Point;\n };\n\ninterface BrushOptions {\n svgRef: RefObject<SVGSVGElement | null>;\n marginLeft: number;\n marginTop: number;\n innerWidth: number;\n innerHeight: number;\n mode: \"horizontal\" | \"2d\" | \"none\";\n onBrushChange?: (extent: [[number, number], [number, number]] | null) => void;\n defaultExtent?: [[number, number], [number, number]] | null;\n}\n\ninterface BrushRenderProps {\n x: number;\n y: number;\n width: number;\n height: number;\n state: BrushState[\"state\"];\n}\n\nconst BRUSH_EDGE_THRESHOLD_PX = 5;\n\nexport function useBrush({\n svgRef,\n marginLeft,\n marginTop,\n innerWidth,\n innerHeight,\n mode,\n onBrushChange,\n defaultExtent,\n}: BrushOptions) {\n const [brushState, setBrushState] = useState<BrushState>(() => {\n if (defaultExtent) {\n return {\n state: \"brushed\",\n brushStart: { x: defaultExtent[0][0], y: defaultExtent[0][1] },\n brushEnd: { x: defaultExtent[1][0], y: defaultExtent[1][1] },\n };\n }\n return { state: \"idle\" };\n });\n\n // Track the last external update to prevent infinite loops\n const lastExternalUpdateRef = useRef<string | null>(null);\n\n // Update brush state when defaultExtent changes\n useEffect(() => {\n if (!defaultExtent) {\n if (brushState.state !== \"idle\") {\n setBrushState({ state: \"idle\" });\n }\n return;\n }\n\n // Round coordinates to prevent floating point issues\n const roundedExtent: [[number, number], [number, number]] = [\n [\n Math.round(defaultExtent[0][0] * 10000) / 10000,\n Math.round(defaultExtent[0][1] * 10000) / 10000,\n ],\n [\n Math.round(defaultExtent[1][0] * 10000) / 10000,\n Math.round(defaultExtent[1][1] * 10000) / 10000,\n ],\n ];\n\n const newExtentKey = JSON.stringify(roundedExtent);\n if (newExtentKey === lastExternalUpdateRef.current) {\n return; // Skip if this update was triggered by our own brush change\n }\n\n setBrushState({\n state: \"brushed\",\n brushStart: { x: roundedExtent[0][0], y: roundedExtent[0][1] },\n brushEnd: { x: roundedExtent[1][0], y: roundedExtent[1][1] },\n });\n }, [defaultExtent]);\n\n // Call onBrushChange when brush state changes\n\n useEffect(() => {\n if (!onBrushChange) {\n return;\n }\n\n if (brushState.state === \"brushed\") {\n // Round coordinates to prevent floating point issues\n const extent: [[number, number], [number, number]] = [\n [\n Math.round(brushState.brushStart.x * 10000) / 10000,\n Math.round(brushState.brushStart.y * 10000) / 10000,\n ],\n [\n Math.round(brushState.brushEnd.x * 10000) / 10000,\n Math.round(brushState.brushEnd.y * 10000) / 10000,\n ],\n ];\n const extentKey = JSON.stringify(extent);\n\n if (extentKey === lastExternalUpdateRef.current) {\n // prevent infinite loop\n return;\n }\n\n lastExternalUpdateRef.current = extentKey;\n onBrushChange(extent);\n } else if (brushState.state === \"idle\") {\n if (lastExternalUpdateRef.current == null) {\n // prevent infinite loop on non-change\n return;\n }\n lastExternalUpdateRef.current = null;\n onBrushChange(null);\n }\n }, [brushState, onBrushChange, brushState?.state]);\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (mode === \"none\") {\n return;\n }\n e.stopPropagation();\n\n if (!svgRef.current) {\n return;\n }\n\n const rect = svgRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left - marginLeft;\n const y = e.clientY - rect.top - marginTop;\n\n // Check if we're clicking near the brush edges or in the middle\n if (brushState.state === \"idle\") {\n setBrushState({\n state: \"dragging\",\n start: { x, y },\n current: { x, y },\n });\n return;\n }\n\n if (brushState.state === \"brushed\") {\n const brushStart = brushState.brushStart;\n const brushEnd = brushState.brushEnd;\n\n // First check corners (only in 2D mode)\n if (mode === \"2d\") {\n const nearTopLeft =\n Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearTopRight =\n Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearBottomLeft =\n Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX;\n const nearBottomRight =\n Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX &&\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX;\n\n if (nearTopLeft) {\n setBrushState({\n state: \"resizing\",\n edge: \"topLeft\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearTopRight) {\n setBrushState({\n state: \"resizing\",\n edge: \"topRight\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearBottomLeft) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottomLeft\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n } else if (nearBottomRight) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottomRight\",\n start: { x, y },\n brushStart,\n brushEnd,\n });\n return;\n }\n }\n\n // Then check edges as before\n if (Math.abs(x - brushStart.x) <= BRUSH_EDGE_THRESHOLD_PX) {\n setBrushState({\n state: \"resizing\",\n edge: \"left\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (Math.abs(x - brushEnd.x) <= BRUSH_EDGE_THRESHOLD_PX) {\n setBrushState({\n state: \"resizing\",\n edge: \"right\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n Math.abs(y - brushStart.y) <= BRUSH_EDGE_THRESHOLD_PX &&\n mode === \"2d\"\n ) {\n setBrushState({\n state: \"resizing\",\n edge: \"top\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n Math.abs(y - brushEnd.y) <= BRUSH_EDGE_THRESHOLD_PX &&\n mode === \"2d\"\n ) {\n setBrushState({\n state: \"resizing\",\n edge: \"bottom\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else if (\n x >= brushStart.x &&\n x <= brushEnd.x &&\n (mode === \"horizontal\" || (y >= brushStart.y && y <= brushEnd.y))\n ) {\n setBrushState({\n state: \"moving\",\n start: { x, y },\n brushStart: brushStart,\n brushEnd: brushEnd,\n });\n } else {\n setBrushState({ state: \"idle\" });\n }\n }\n },\n [brushState, marginLeft, marginTop, mode, svgRef]\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (mode === \"none\") {\n return;\n }\n if (brushState.state === \"idle\" || brushState.state === \"brushed\") {\n return;\n }\n\n if (!svgRef.current) {\n return;\n }\n\n const rect = svgRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left - marginLeft;\n const y = e.clientY - rect.top - marginTop;\n const clampedX = Math.max(0, Math.min(x, innerWidth));\n const clampedY = Math.max(0, Math.min(y, innerHeight));\n\n switch (brushState.state) {\n case \"dragging\":\n setBrushState({\n ...brushState,\n current: {\n x: clampedX,\n y: mode === \"2d\" ? clampedY : innerHeight,\n },\n });\n break;\n case \"moving\": {\n const brushWidth = brushState.brushEnd.x - brushState.brushStart.x;\n const brushHeight = brushState.brushEnd.y - brushState.brushStart.y;\n const deltaX = clampedX - brushState.start.x;\n const deltaY = mode === \"2d\" ? clampedY - brushState.start.y : 0;\n\n const newStartX = Math.max(\n 0,\n Math.min(brushState.brushStart.x + deltaX, innerWidth - brushWidth)\n );\n const newStartY = Math.max(\n 0,\n Math.min(\n brushState.brushStart.y + deltaY,\n innerHeight - brushHeight\n )\n );\n\n setBrushState({\n state: \"moving\",\n start: { x: clampedX, y: clampedY },\n brushStart: {\n x: newStartX,\n y: mode === \"2d\" ? newStartY : 0,\n },\n brushEnd: {\n x: newStartX + brushWidth,\n y: mode === \"2d\" ? newStartY + brushHeight : innerHeight,\n },\n });\n break;\n }\n case \"resizing\":\n if (brushState.edge === \"left\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: clampedX,\n y: brushState.brushStart.y,\n },\n });\n } else if (brushState.edge === \"right\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: clampedX, y: brushState.brushEnd.y },\n });\n } else if (brushState.edge === \"top\" && mode === \"2d\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: brushState.brushStart.x,\n y: clampedY,\n },\n });\n } else if (brushState.edge === \"bottom\" && mode === \"2d\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: brushState.brushEnd.x, y: clampedY },\n });\n } else if (mode === \"2d\") {\n // Handle corner resizing\n if (brushState.edge === \"topLeft\") {\n setBrushState({\n ...brushState,\n brushStart: { x: clampedX, y: clampedY },\n });\n } else if (brushState.edge === \"topRight\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: brushState.brushStart.x,\n y: clampedY,\n },\n brushEnd: {\n x: clampedX,\n y: brushState.brushEnd.y,\n },\n });\n } else if (brushState.edge === \"bottomLeft\") {\n setBrushState({\n ...brushState,\n brushStart: {\n x: clampedX,\n y: brushState.brushStart.y,\n },\n brushEnd: {\n x: brushState.brushEnd.x,\n y: clampedY,\n },\n });\n } else if (brushState.edge === \"bottomRight\") {\n setBrushState({\n ...brushState,\n brushEnd: { x: clampedX, y: clampedY },\n });\n }\n }\n break;\n }\n },\n [brushState, innerWidth, innerHeight, marginLeft, marginTop, mode, svgRef]\n );\n\n const handleMouseUp = useCallback(() => {\n if (mode === \"none\") {\n return;\n }\n if (brushState.state === \"dragging\") {\n const width = Math.abs(brushState.current.x - brushState.start.x);\n const height = Math.abs(brushState.current.y - brushState.start.y);\n\n if (width < 5 || (mode === \"2d\" && height < 5)) {\n setBrushState({\n state: \"idle\",\n });\n } else {\n const brushStartX = Math.min(brushState.start.x, brushState.current.x);\n const brushEndX = Math.max(brushState.start.x, brushState.current.x);\n const brushStartY =\n mode === \"2d\"\n ? Math.min(brushState.start.y, brushState.current.y)\n : 0;\n const brushEndY =\n mode === \"2d\"\n ? Math.max(brushState.start.y, brushState.current.y)\n : innerHeight;\n\n setBrushState({\n state: \"brushed\",\n brushStart: { x: brushStartX, y: brushStartY },\n brushEnd: { x: brushEndX, y: brushEndY },\n });\n }\n } else if (\n brushState.state === \"moving\" ||\n brushState.state === \"resizing\"\n ) {\n const start = brushState.brushStart;\n const end = brushState.brushEnd;\n\n setBrushState({\n state: \"brushed\",\n brushStart: {\n x: Math.min(start.x, end.x),\n y: Math.min(start.y, end.y),\n },\n brushEnd: {\n x: Math.max(start.x, end.x),\n y: Math.max(start.y, end.y),\n },\n });\n }\n }, [brushState, mode, innerHeight]);\n\n const getBrushRenderProps = useCallback((): BrushRenderProps | null => {\n if (brushState.state === \"idle\") {\n return null;\n }\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (brushState.state === \"dragging\") {\n x = Math.min(brushState.start.x, brushState.current.x);\n y =\n mode === \"2d\" ? Math.min(brushState.start.y, brushState.current.y) : 0;\n width = Math.abs(brushState.current.x - brushState.start.x);\n height =\n mode === \"2d\"\n ? Math.abs(brushState.current.y - brushState.start.y)\n : innerHeight;\n } else if (brushState.state === \"moving\") {\n x = brushState.brushStart.x;\n y = brushState.brushStart.y;\n width = Math.abs(brushState.brushEnd.x - brushState.brushStart.x);\n height = Math.abs(brushState.brushEnd.y - brushState.brushStart.y);\n } else if (brushState.state === \"resizing\") {\n x = Math.min(brushState.brushStart.x, brushState.brushEnd.x);\n y = Math.min(brushState.brushStart.y, brushState.brushEnd.y);\n width = Math.abs(brushState.brushEnd.x - brushState.brushStart.x);\n height = Math.abs(brushState.brushEnd.y - brushState.brushStart.y);\n } else if (brushState.state === \"brushed\") {\n x = brushState.brushStart.x;\n y = brushState.brushStart.y;\n width = brushState.brushEnd.x - brushState.brushStart.x;\n height = brushState.brushEnd.y - brushState.brushStart.y;\n } else {\n return null;\n }\n\n return {\n x,\n y,\n width,\n height,\n state: brushState.state,\n };\n }, [brushState, mode, innerHeight]);\n\n const getCursor = useCallback(() => {\n if (mode === \"none\") {\n return \"default\";\n }\n if (brushState.state === \"idle\") {\n return \"default\";\n }\n if (brushState.state === \"moving\") {\n return \"move\";\n }\n if (brushState.state === \"resizing\") {\n if (mode === \"2d\") {\n switch (brushState.edge) {\n case \"left\":\n case \"right\":\n return \"ew-resize\";\n case \"top\":\n case \"bottom\":\n return \"ns-resize\";\n case \"topLeft\":\n case \"bottomRight\":\n return \"nwse-resize\";\n case \"topRight\":\n case \"bottomLeft\":\n return \"nesw-resize\";\n }\n }\n return \"ew-resize\";\n }\n return undefined;\n }, [mode, brushState]);\n\n const brushProps = getBrushRenderProps();\n\n const renderBrush = useMemo(() => {\n if (mode === \"none\" || brushState.state === \"idle\") {\n return null;\n }\n if (!brushProps) {\n return null;\n }\n\n const { x, y, width, height, state } = brushProps;\n\n if (width < 1 || height < 1) {\n return null;\n }\n\n return (\n <>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill=\"rgba(255, 0, 0, 0.2)\"\n stroke=\"rgba(255, 0, 0, 0.8)\"\n strokeWidth={1}\n style={{ cursor: \"move\" }}\n />\n\n {state === \"brushed\" && (\n <>\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={height}\n fill=\"transparent\"\n style={{ cursor: \"ew-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={height}\n fill=\"transparent\"\n style={{ cursor: \"ew-resize\" }}\n />\n {mode === \"2d\" && (\n <>\n <rect\n x={x}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={width}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"ns-resize\" }}\n />\n <rect\n x={x}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={width}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"ns-resize\" }}\n />\n {/* Corner handles */}\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nwse-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nesw-resize\" }}\n />\n <rect\n x={x - BRUSH_EDGE_THRESHOLD_PX}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nesw-resize\" }}\n />\n <rect\n x={x + width - BRUSH_EDGE_THRESHOLD_PX}\n y={y + height - BRUSH_EDGE_THRESHOLD_PX}\n width={BRUSH_EDGE_THRESHOLD_PX * 2}\n height={BRUSH_EDGE_THRESHOLD_PX * 2}\n fill=\"transparent\"\n style={{ cursor: \"nwse-resize\" }}\n />\n </>\n )}\n </>\n )}\n </>\n );\n }, [brushProps, brushState.state, mode]);\n\n return {\n brushState,\n handleMouseDown,\n handleMouseMove,\n handleMouseUp,\n getCursor,\n renderBrush,\n };\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { ScaleLinear } from \"d3-scale\";\nimport { useCallback, useMemo } from \"react\";\nimport { getRangeFilterForField } from \"./getAxisFilter\";\nimport { RangeFilter } from \"@/types/FilterTypes\";\n\ninterface UseFilterExtentProps {\n settings: ChartSettings;\n xScale: ScaleLinear<number, number>;\n yScale: ScaleLinear<number, number>;\n innerHeight: number;\n}\n\nexport function useFilterExtent({\n settings,\n xScale,\n yScale,\n innerHeight,\n}: UseFilterExtentProps) {\n const convertFilterRangeToExtent = useCallback(\n (filter: RangeFilter, scale: ScaleLinear<number, number>) => {\n if (!filter || filter.min === undefined || filter.max === undefined) {\n return null;\n }\n\n // Round to 4 decimal places to avoid floating point issues\n const min = Math.round(scale(filter.min) * 10000) / 10000;\n const max = Math.round(scale(filter.max) * 10000) / 10000;\n\n return [min, max] as [number, number];\n },\n []\n );\n\n const extent = useMemo(() => {\n switch (settings.type) {\n case \"scatter\": {\n const xFilter = getRangeFilterForField(\n settings.filters,\n settings.xField\n );\n const yFilter = getRangeFilterForField(\n settings.filters,\n settings.yField\n );\n\n if (!xFilter || !yFilter) {\n return null;\n }\n\n const xExtent = convertFilterRangeToExtent(xFilter, xScale);\n const yExtent = convertFilterRangeToExtent(yFilter, yScale);\n\n if (!xExtent || !yExtent) {\n return null;\n }\n\n return [\n [xExtent[0], yExtent[1]],\n [xExtent[1], yExtent[0]],\n ] as [[number, number], [number, number]];\n }\n\n case \"bar\": {\n if (\"bandwidth\" in xScale) {\n return null;\n }\n\n const rangeFilter = getRangeFilterForField(\n settings.filters,\n settings.field\n );\n if (!rangeFilter) {\n return null;\n }\n\n const xExtent = convertFilterRangeToExtent(rangeFilter, xScale);\n\n if (!xExtent) {\n return null;\n }\n\n return [\n [xExtent[0], 0],\n [xExtent[1], innerHeight],\n ] as [[number, number], [number, number]];\n }\n\n case \"row\":\n return null;\n }\n }, [settings, xScale, yScale, innerHeight, convertFilterRangeToExtent]);\n\n return extent;\n}\n","import { ReactNode, useRef } from \"react\";\nimport { ScaleBand, ScaleLinear } from \"d3-scale\";\nimport { XAxis, YAxis } from \"./Axis/Axis\";\nimport { useBrush } from \"@/hooks/useBrush\";\nimport { cn } from \"@/lib/utils\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { useFilterExtent } from \"@/hooks/useFilterExtent\";\n\ntype BrushMode = \"horizontal\" | \"2d\" | \"none\";\n\ninterface BaseChartProps {\n width: number;\n height: number;\n xScale: ScaleLinear<number, number> | ScaleBand<string>;\n yScale: ScaleLinear<number, number> | ScaleBand<string>;\n brushingMode?: BrushMode;\n onBrushChange?: (extent: [[number, number], [number, number]] | null) => void;\n children: ReactNode;\n className?: string;\n settings: ChartSettings;\n}\n\nexport function BaseChart({\n width,\n height,\n xScale,\n yScale,\n brushingMode = \"none\",\n onBrushChange,\n children,\n className,\n settings,\n}: BaseChartProps) {\n const margin = settings.margin;\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n const svgRef = useRef<SVGSVGElement>(null);\n\n const extent = useFilterExtent({\n settings,\n xScale,\n yScale,\n innerHeight,\n });\n\n const brush = useBrush({\n svgRef,\n marginLeft: margin.left,\n marginTop: margin.top,\n innerWidth,\n innerHeight,\n mode: brushingMode as \"horizontal\" | \"2d\" | \"none\",\n onBrushChange,\n defaultExtent: extent,\n });\n\n if (width < 1 || height < 1) {\n return null;\n }\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn(\"select-none\", className)}\n style={{ cursor: brush.getCursor() }}\n onMouseDownCapture={brush.handleMouseDown}\n onMouseMoveCapture={brush.handleMouseMove}\n onMouseUpCapture={brush.handleMouseUp}\n onMouseLeave={brush.handleMouseUp}\n >\n <g transform={`translate(${margin.left},${margin.top})`}>\n {/* Main content */}\n {children}\n\n {/* Brush overlay */}\n {brush.renderBrush}\n\n {/* Axes */}\n <XAxis\n scale={xScale}\n transform={`translate(0,${innerHeight})`}\n axisLabel={settings.xAxisLabel}\n />\n <YAxis\n scale={yScale}\n transform=\"translate(0,0)\"\n axisLabel={settings.yAxisLabel}\n />\n </g>\n </svg>\n );\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\n\nexport function useGetColumnData(field: string | undefined) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n return getColumnData(field);\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, field, getColumnData]);\n}\n\nexport function useGetColumnDataForIds(\n field: string | undefined,\n ids?: IdType[]\n) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n const data = getColumnData(field);\n\n if (!ids) {\n return Object.values(data);\n }\n\n return ids.map((id) => data[id]);\n\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, field, getColumnData, ids]);\n}\n\nexport function useGetColumnDataForMultipleIds(\n fields: string[] | undefined,\n ids?: IdType[]\n) {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n const nonce = useDataLayer((s) => s.nonce);\n\n return useMemo(() => {\n if (!fields) {\n return {};\n }\n\n const result: Record<string, any[]> = {};\n\n for (const field of fields) {\n const data = getColumnData(field);\n\n if (!ids) {\n result[field] = Object.values(data);\n } else {\n result[field] = ids.map((id) => data[id]);\n }\n }\n\n return result;\n // include the nonce since it tracks updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, fields, getColumnData, ids]);\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { useGetColumnDataForIds } from \"./useGetColumnData\";\n\nexport function useGetLiveData(\n settings: ChartSettings,\n field: string | undefined,\n facetIds?: IdType[]\n) {\n const getLiveItems = useDataLayer((s) => s.getLiveItems);\n\n // WARNING: this must live outside the hook below\n // need to see new items on every render\n const liveItems = getLiveItems(settings);\n\n const liveIdsPerFacet = useMemo(() => {\n if (!liveItems) {\n return [];\n }\n\n const facetIdSet = new Set(facetIds);\n\n const liveIds = liveItems.items\n .filter((c) => c.value > 0)\n .filter((c) =>\n facetIds && facetIds.length > 0 ? facetIdSet.has(c.key) : true\n )\n .map((d) => d.key);\n\n return liveIds;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [facetIds, liveItems?.nonce]);\n\n const data = useGetColumnDataForIds(field, liveIdsPerFacet);\n\n if (!field) {\n return [];\n }\n\n return data;\n}\n\nexport function useGetLiveIds(settings: ChartSettings) {\n const getLiveItems = useDataLayer((s) => s.getLiveItems);\n const nonce = useDataLayer((s) => s.nonce);\n\n const liveItems = getLiveItems(settings);\n\n // useMemo against the nonce\n return useMemo(() => {\n if (!liveItems) {\n return [];\n }\n\n return liveItems.items.filter((c) => c.value > 0).map((d) => d.key);\n\n // need the nonce to trigger a re-render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nonce, liveItems?.items]);\n}\n\nexport function useGetAllIds() {\n const getColumnData = useDataLayer((s) => s.getColumnData);\n\n const allIds = useMemo(() => {\n const data = getColumnData(\"__ID\") as Record<IdType, datum>;\n return Object.values(data) as IdType[];\n }, [getColumnData]);\n\n return allIds;\n}\n","import { useColorScales } from \"@/hooks/useColorScales\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand, ScaleBand, scaleLinear, ScaleLinear } from \"d3-scale\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport isEqual from \"react-fast-compare\";\nimport { useCustomCompareMemo } from \"use-custom-compare\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { BarChartSettings } from \"./definition\";\n\nconst X_SCALE_PADDING = 0.05; // 5% padding on each side\nconst Y_SCALE_PADDING = 0.1; // 10% padding for top of bars\n\ntype NumericBin = {\n label: string;\n start: number;\n end: number;\n value: number;\n isNumeric: true;\n};\n\ntype CategoryBin = {\n label: string;\n value: number;\n isNumeric: false;\n};\n\ntype BarChartProps = BaseChartProps<BarChartSettings>;\n\nexport function BarChart({ settings, width, height, facetIds }: BarChartProps) {\n // Get all data for axis limits calculation (not filtered by current selections)\n const allColData = useGetColumnDataForIds(settings.field);\n // Get filtered data for rendering\n const liveColData = useGetLiveData(settings, settings.field, facetIds);\n\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Chart dimensions\n const margin = settings.margin;\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n const isNumeric = useMemo(\n () => allColData.every((d) => !isNaN(Number(d))),\n [allColData]\n );\n\n // Calculate chart data from live (filtered) data for rendering\n const chartData = useMemo(() => {\n if (isNumeric) {\n const numericData = liveColData.map(Number);\n const allNumericData = allColData.map(Number);\n\n // Create bins using full data range\n const binCount = settings.binCount || 10;\n const min = Math.min(...allNumericData);\n const max = Math.max(...allNumericData);\n const binWidth = (max - min) / binCount;\n\n const bins = Array.from({ length: binCount }, (_, i) => {\n const start = min + i * binWidth;\n const end = start + binWidth;\n const value = numericData.filter((d) => d >= start && d < end).length;\n return { start, end, value, isNumeric: true } as NumericBin;\n });\n\n return bins;\n } else {\n // Handle categorical data using all possible categories\n const uniqueCats = new Set(allColData.map(String));\n const countMap = new Map<string, number>();\n\n // Initialize all categories with 0\n uniqueCats.forEach((cat) => countMap.set(cat, 0));\n\n // Count occurrences from live data\n liveColData.forEach((value) => {\n const key = String(value);\n countMap.set(key, (countMap.get(key) || 0) + 1);\n });\n\n return Array.from(countMap.entries()).map(\n ([label, value]) =>\n ({\n label,\n value,\n isNumeric: false,\n }) as CategoryBin\n );\n }\n }, [liveColData, allColData, isNumeric, settings.binCount]);\n\n // Calculate min/max from ALL data for axis limits\n const { min, max, uniqueValues } = useMemo(() => {\n if (isNumeric) {\n const numericData = allColData.map(Number);\n const binCount = settings.binCount || 10;\n const dataMin = Math.min(...numericData);\n const dataMax = Math.max(...numericData);\n const binWidth = (dataMax - dataMin) / binCount;\n\n return {\n min: dataMin,\n max: dataMax + binWidth, // Add one bin width to include the last bin's end\n uniqueValues: undefined,\n };\n }\n\n return {\n min: undefined,\n max: undefined,\n uniqueValues: Array.from(new Set(allColData.map(String))),\n };\n }, [allColData, isNumeric, settings.binCount]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales with synchronized limits if in a facet\n const xScale = useCustomCompareMemo(\n () => {\n if (min !== undefined && max !== undefined) {\n // Numerical x-axis\n const globalMin =\n globalXLimits?.type === \"numerical\" ? globalXLimits.min : min;\n const globalMax =\n globalXLimits?.type === \"numerical\" ? globalXLimits.max : max;\n\n // Only pad if using local limits\n const range = max - min;\n const padding = range * X_SCALE_PADDING;\n const minToUse = globalXLimits ? globalMin : min - padding;\n const maxToUse = globalXLimits ? globalMax : max + padding;\n\n return scaleLinear()\n .domain([minToUse, maxToUse])\n .range([0, innerWidth]);\n } else {\n const globalCategories =\n globalXLimits?.type === \"categorical\"\n ? globalXLimits.categories\n : uniqueValues;\n\n const allCategories = Array.from(globalCategories);\n\n return scaleBand()\n .domain(allCategories)\n .range([0, innerWidth])\n .padding(0.3);\n }\n },\n [innerWidth, max, min, uniqueValues, globalXLimits],\n isEqual\n ) as ScaleLinear<number, number> | ScaleBand<string>;\n\n const yScale = useMemo(() => {\n const maxValue = Math.max(...chartData.map((d) => d.value));\n const paddedMax = maxValue * (1 + Y_SCALE_PADDING);\n\n // take larger of global or padded max\n const globalMax =\n globalYLimits?.type === \"numerical\" ? globalYLimits.max : paddedMax;\n\n const limitToUse = Math.max(globalMax, paddedMax);\n\n return scaleLinear().domain([0, limitToUse]).range([innerHeight, 0]);\n }, [chartData, innerHeight, globalYLimits]);\n\n // Register axis limits with the facet context if in a facet\n useEffect(() => {\n if (facetIds && chartData.length > 0) {\n // determine x limits based on data type\n if (isNumeric) {\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: Number(xScale.domain()[0]),\n max: Number(xScale.domain()[1]),\n });\n } else {\n registerAxisLimits(settings.id, \"x\", {\n type: \"categorical\",\n categories: new Set(chartData.map((d) => d.label)),\n });\n }\n // Register y-axis limits (numerical for bar chart)\n const maxValue = yScale.domain()[1];\n\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: 0,\n max: maxValue,\n });\n }\n }, [\n settings.id,\n facetIds,\n chartData,\n registerAxisLimits,\n isNumeric,\n min,\n max,\n yScale,\n xScale,\n ]);\n\n const isBandScale = \"bandwidth\" in xScale;\n\n const valueFilter = settings.filters.find(\n (f): f is ValueFilter => f.type === \"value\" && f.field === settings.field\n );\n const rangeFilter = getRangeFilterForField(settings.filters, settings.field);\n const hasActiveFilters = valueFilter || rangeFilter;\n\n const handleBarClick = useCallback(\n (label: string) => {\n if (!isBandScale) {\n return;\n }\n\n const filterValues = valueFilter?.values ?? [];\n const newValues = filterValues.includes(label)\n ? filterValues.filter((f) => f !== label)\n : [...filterValues, label];\n\n // Create new filters array with updated value filter\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n isBandScale,\n settings.id,\n settings.field,\n updateChart,\n valueFilter,\n settings.filters,\n ]\n );\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n // Remove both value and range filters for the field\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.field\n );\n updateChart(settings.id, {\n filters: newFilters,\n });\n return;\n }\n\n if (isBandScale) {\n return;\n }\n\n const xStart = extent?.[0]?.[0];\n const xEnd = extent?.[1]?.[0];\n\n const linearScale = xScale as ScaleLinear<number, number>;\n const start = linearScale.invert(xStart);\n const end = linearScale.invert(xEnd);\n\n // Create new filters array with updated range filter\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.field\n );\n\n newFilters.push({\n type: \"range\",\n field: settings.field,\n min: start,\n max: end,\n });\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n isBandScale,\n settings.id,\n settings.field,\n updateChart,\n xScale,\n settings.filters,\n ]\n );\n\n return (\n <div style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n brushingMode={isBandScale ? \"none\" : \"horizontal\"}\n onBrushChange={handleBrushChange}\n settings={settings}\n >\n <g>\n {chartData.map((d, i) => {\n const isNumeric = d.isNumeric;\n let x: number;\n let barWidth: number;\n\n if (isNumeric) {\n const numericBin = d as NumericBin;\n const linearScale = xScale as ScaleLinear<number, number>;\n x = linearScale(numericBin.start);\n barWidth =\n linearScale(numericBin.end) - linearScale(numericBin.start);\n } else {\n const categoryBin = d as CategoryBin;\n const bandScale = xScale as ScaleBand<string>;\n x = bandScale(categoryBin.label) || 0;\n barWidth = bandScale.bandwidth();\n }\n\n const value = isNumeric\n ? (d as NumericBin).start\n : (d as CategoryBin).label;\n let isFiltered = true;\n\n // Apply value and range filters using applyFilter\n if (valueFilter) {\n isFiltered = applyFilter(value, valueFilter);\n }\n\n if (rangeFilter && isNumeric) {\n isFiltered = applyFilter(value, rangeFilter);\n }\n\n const color =\n hasActiveFilters && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n value,\n \"hsl(217.2 91.2% 59.8%)\"\n );\n\n const barHeight = innerHeight - yScale(d.value);\n\n if (barWidth < 1 || barHeight < 1) {\n return null;\n }\n\n return (\n <rect\n key={i}\n x={x}\n y={yScale(d.value)}\n width={barWidth}\n height={barHeight}\n className={isBandScale ? \"cursor-pointer\" : \"\"}\n style={{ fill: color }}\n onClick={() =>\n isBandScale && handleBarClick((d as CategoryBin).label)\n }\n >\n <title>\n {isNumeric\n ? `Range: ${(d as NumericBin).start.toFixed(2)} - ${(\n d as NumericBin\n ).end.toFixed(2)}, Count: ${d.value}`\n : `${(d as CategoryBin).label}, Count: ${d.value}`}\n </title>\n </rect>\n );\n })}\n </g>\n </BaseChart>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-lg leading-none font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-hidden\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","\"use client\";\n\nimport { Check, ChevronsUpDown } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n} from \"@/components/ui/command\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { cn } from \"@/lib/utils\";\nimport { useState } from \"react\";\nimport { CommandList } from \"cmdk\";\n\ninterface ComboBoxProps<T> {\n value: T | undefined;\n options: T[];\n onChange: (value: T | undefined) => void;\n optionToString?: (option: T) => string;\n optionToNode?: (option: T) => React.ReactNode;\n placeholder?: string;\n className?: string;\n}\n\nexport function ComboBox<T>({\n value,\n options,\n onChange,\n optionToString = (option) => String(option),\n optionToNode,\n placeholder = \"Select option...\",\n className,\n}: ComboBoxProps<T>) {\n const [open, setOpen] = useState(false);\n\n const renderOption = (option: T) => {\n if (optionToNode) {\n return optionToNode(option);\n }\n return optionToString(option);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\"w-full justify-between\", className)}\n >\n {value ? renderOption(value) : placeholder}\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\">\n <Command>\n <CommandInput placeholder={placeholder} />\n <CommandGroup>\n <CommandList>\n <CommandEmpty>No options found.</CommandEmpty>\n {options.map((option, index) => {\n return (\n <CommandItem\n key={index}\n onSelect={() => {\n onChange(option === value ? undefined : option);\n setOpen(false);\n }}\n value={optionToString(option)}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {renderOption(option)}\n </CommandItem>\n );\n })}\n </CommandList>\n </CommandGroup>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import { Button } from \"@/components/ui/button\";\nimport { ComboBox } from \"./ComboBox\";\nimport { Label } from \"./ui/label\";\nimport { X } from \"lucide-react\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\n\ninterface FieldSelectorProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n allowClear?: boolean;\n}\n\nexport function FieldSelector({\n label,\n value,\n onChange,\n placeholder = \"Select field\",\n allowClear = false,\n}: FieldSelectorProps) {\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const availableFields = getColumnNames();\n\n const fieldOptions = availableFields.map((field) => ({\n value: field,\n label: field,\n }));\n\n const selectedOption = fieldOptions.find((option) => option.value === value);\n\n return (\n <div className=\"flex gap-2 items-center\">\n <div className=\"flex-1\">\n <Label htmlFor={label}>{label}</Label>\n <ComboBox\n value={selectedOption}\n options={fieldOptions}\n onChange={(option) => onChange(option?.value || value)}\n optionToString={(option) => option.label}\n placeholder={placeholder}\n />\n </div>\n {allowClear && value && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onChange(\"\")}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n );\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n \"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n \"bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n )}\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n \"bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n )}\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary bg-background ring-ring/20 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n );\n}\n\nexport { Slider };\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-hidden focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Slider } from \"@/components/ui/slider\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { BarChartSettings } from \"./definition\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\n\nexport function BarChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<BarChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label>Bin Count</Label>\n <Slider\n value={[settings.binCount ?? 10]}\n min={2}\n max={50}\n step={1}\n onValueChange={([value]) =>\n onSettingsChange({ ...settings, binCount: value })\n }\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"forceString\"\n checked={settings.forceString}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n forceString: checked,\n })\n }\n />\n <Label htmlFor=\"forceString\">Force String Values</Label>\n </div>\n </div>\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"colorField\"\n checked={settings.field === settings.colorField}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n colorField: checked ? settings.field : undefined,\n colorScaleId:\n checked && settings.field\n ? getOrCreateScaleForField(settings.field)\n : undefined,\n })\n }\n />\n <Label htmlFor=\"colorField\">Use as color field</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { ChartBarBig } from \"lucide-react\";\nimport { BarChart } from \"./BarChart\";\nimport { BarChartSettingsPanel } from \"./BarChartSettingsPanel\";\n\nexport interface BarChartSettings extends BaseChartSettings {\n type: \"bar\";\n binCount?: number;\n forceString?: boolean;\n filters: Filter[];\n}\n\nexport const barChartDefinition: ChartDefinition<BarChartSettings> = {\n type: \"bar\",\n name: \"Bar Chart\",\n description: \"Display data as vertical bars\",\n icon: ChartBarBig,\n\n component: BarChart,\n settingsPanel: BarChartSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n field: field ?? \"\",\n binCount: 10,\n type: \"bar\",\n title: \"Bar Chart\",\n layout,\n margin: { top: 20, right: 20, bottom: 30, left: 60 },\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return !!settings.field;\n },\n\n getFilterFunction: (\n settings: BarChartSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const dataHash = fieldGetter(settings.field);\n\n const filter = settings.filters.find(\n (f): f is Filter => f.field === settings.field\n );\n\n return (d: IdType) => {\n const value = dataHash[d];\n\n if (filter) {\n if (!applyFilter(value, filter)) {\n return false;\n }\n }\n\n return true;\n };\n },\n};\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ScatterPlotSettings } from \"./definition\";\nimport { Label } from \"@/components/ui/label\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\n\nexport function ScatterPlotSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ScatterPlotSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => onSettingsChange({ ...settings, xField: value })}\n />\n\n <Label>Y Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.yField}\n onChange={(value) => onSettingsChange({ ...settings, yField: value })}\n />\n\n <Label>Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n colorScaleId: value ? getOrCreateScaleForField(value) : undefined,\n })\n }\n />\n </div>\n </div>\n );\n}\n","import { applyFilter } from \"@/hooks/applyFilter\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ScaleLinear, scaleLinear } from \"d3-scale\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { ScatterPlotSettings } from \"./definition\";\n\n// Configurable constant for axis buffer (10%)\nconst AXIS_BUFFER_PERCENTAGE = 0.1;\n\ninterface ScatterPlotProps extends BaseChartProps {\n settings: ScatterPlotSettings;\n}\n\nexport function ScatterPlot({\n settings,\n width,\n height,\n facetIds,\n}: ScatterPlotProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Get all data for axis limits calculation (not filtered by current selections)\n const allXData = useGetColumnDataForIds(settings.xField, facetIds);\n const allYData = useGetColumnDataForIds(settings.yField, facetIds);\n\n // Get filtered data for rendering\n const xData = useGetLiveData(settings, settings.xField, facetIds);\n const yData = useGetLiveData(settings, settings.yField, facetIds);\n const colorData = useGetLiveData(settings, settings.colorField, facetIds);\n\n // Convert object to array and map to numbers\n const xValues = xData.map(Number);\n const yValues = yData.map(Number);\n\n // Calculate data bounds from ALL data (not just filtered data)\n const xMin = Math.min(...(allXData as number[]));\n const xMax = Math.max(...(allXData as number[]));\n const yMin = Math.min(...(allYData as number[]));\n const yMax = Math.max(...(allYData as number[]));\n\n // Calculate buffered bounds for scales\n const xRange = xMax - xMin;\n const yRange = yMax - yMin;\n const xBuffer = xRange * AXIS_BUFFER_PERCENTAGE;\n const yBuffer = yRange * AXIS_BUFFER_PERCENTAGE;\n\n const bufferedXMin = xMin - xBuffer;\n const bufferedXMax = xMax + xBuffer;\n const bufferedYMin = yMin - yBuffer;\n const bufferedYMax = yMax + yBuffer;\n\n // Register axis limits with the facet context if in a facet using requestAnimationFrame\n useEffect(() => {\n if (facetIds && allXData.length > 0) {\n // Register x-axis limits\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: xMin,\n max: xMax,\n });\n\n // Register y-axis limits\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: yMin,\n max: yMax,\n });\n }\n }, [\n settings.id,\n facetIds,\n allXData,\n allYData,\n xMin,\n xMax,\n yMin,\n yMax,\n registerAxisLimits,\n ]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales for BaseChart with synchronized limits if in a facet\n const xScale = useMemo(() => {\n if (globalXLimits && globalXLimits.type === \"numerical\" && facetIds) {\n // Apply buffer to global limits\n const globalRange = globalXLimits.max - globalXLimits.min;\n const globalBuffer = globalRange * AXIS_BUFFER_PERCENTAGE;\n\n return scaleLinear()\n .domain([\n globalXLimits.min - globalBuffer,\n globalXLimits.max + globalBuffer,\n ])\n .range([0, width - 80]);\n }\n\n return scaleLinear()\n .domain([bufferedXMin, bufferedXMax])\n .range([0, width - 80]);\n }, [\n bufferedXMin,\n bufferedXMax,\n width,\n globalXLimits,\n facetIds,\n ]) as ScaleLinear<number, number>;\n\n const yScale = useMemo(() => {\n if (globalYLimits && globalYLimits.type === \"numerical\" && facetIds) {\n // Apply buffer to global limits\n const globalRange = globalYLimits.max - globalYLimits.min;\n const globalBuffer = globalRange * AXIS_BUFFER_PERCENTAGE;\n\n return scaleLinear()\n .domain([\n globalYLimits.min - globalBuffer,\n globalYLimits.max + globalBuffer,\n ])\n .range([height - 50, 20]);\n }\n\n return scaleLinear()\n .domain([bufferedYMin, bufferedYMax])\n .range([height - 50, 20]);\n }, [\n bufferedYMin,\n bufferedYMax,\n height,\n globalYLimits,\n facetIds,\n ]) as ScaleLinear<number, number>;\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || xValues.length === 0) {\n return;\n }\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n\n // Use provided width and height instead of getBoundingClientRect\n const dpr = window.devicePixelRatio || 1;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Clear canvas using provided dimensions\n ctx.clearRect(0, 0, width, height);\n\n // Draw points using the same scales as BaseChart\n ctx.translate(settings.margin.left, settings.margin.top);\n\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n\n for (let i = 0; i < xValues.length; i++) {\n const x = xScale(xValues[i]);\n const y = yScale(yValues[i]);\n\n const isFiltered =\n (!xFilter || applyFilter(xValues[i], xFilter)) &&\n (!yFilter || applyFilter(yValues[i], yFilter));\n\n ctx.fillStyle =\n (xFilter || yFilter) && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n colorData[i] ?? \"hsl(217.2 91.2% 59.8%)\"\n );\n\n ctx.beginPath();\n ctx.arc(x, y, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }, [\n xValues,\n yValues,\n settings.xField,\n settings.yField,\n settings.filters,\n settings.colorScaleId,\n width,\n height,\n xScale,\n yScale,\n getColorForValue,\n colorData,\n ]);\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n updateChart(settings.id, {\n filters: settings.filters.filter(\n (f) => f.field !== settings.xField && f.field !== settings.yField\n ),\n });\n return;\n }\n\n const [[x0, y0], [x1, y1]] = extent;\n\n // Convert pixel coordinates back to data values\n const xStart = xScale.invert(x0);\n const xEnd = xScale.invert(x1);\n const yStart = yScale.invert(y0);\n const yEnd = yScale.invert(y1);\n\n // Create new filters array with updated x and y filters\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.xField && f.field !== settings.yField\n );\n\n // Add x filter\n newFilters.push({\n type: \"range\",\n field: settings.xField,\n min: Math.min(xStart, xEnd),\n max: Math.max(xStart, xEnd),\n });\n\n // Add y filter\n newFilters.push({\n type: \"range\",\n field: settings.yField,\n min: Math.min(yStart, yEnd),\n max: Math.max(yStart, yEnd),\n });\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n },\n [\n settings.id,\n settings.xField,\n settings.yField,\n settings.filters,\n updateChart,\n xScale,\n yScale,\n ]\n );\n\n return (\n <div style={{ width, height }} className=\"relative\">\n {xValues.length > 0 ? (\n <>\n <canvas\n ref={canvasRef}\n className=\"absolute inset-0 pointer-events-none\"\n style={{ width, height }}\n />\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n brushingMode=\"2d\"\n onBrushChange={handleBrushChange}\n className=\"absolute\"\n settings={settings}\n >\n <g /> {/* Empty group element as children */}\n </BaseChart>\n </>\n ) : (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n No data available\n </div>\n )}\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { ScatterChart } from \"lucide-react\";\n\nimport { ScatterPlotSettingsPanel } from \"./ScatterPlotSettingsPanel\";\nimport { ScatterPlot } from \"./ScatterPlot\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { Filter } from \"@/types/FilterTypes\";\n\nexport interface ScatterPlotSettings extends BaseChartSettings {\n type: \"scatter\";\n xField: string;\n yField: string;\n filters: Filter[];\n}\n\nexport const scatterPlotDefinition: ChartDefinition<ScatterPlotSettings> = {\n type: \"scatter\",\n name: \"Scatter Plot\",\n description: \"Display data as points in a 2D space\",\n icon: ScatterChart,\n\n component: ScatterPlot,\n settingsPanel: ScatterPlotSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"scatter\",\n title: \"Scatter Plot\",\n layout,\n margin: { top: 20, right: 20, bottom: 20, left: 20 },\n xField: \"__ID\",\n yField: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return !!settings.xField && !!settings.yField;\n },\n\n getFilterFunction: (\n settings: ScatterPlotSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const xDataHash = fieldGetter(settings.xField);\n const yDataHash = fieldGetter(settings.yField);\n\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n\n return (d: IdType) => {\n if (!xFilter && !yFilter) {\n return true;\n }\n\n const xValue = xDataHash[d];\n const yValue = yDataHash[d];\n\n // check both for exclusion -- if OK, then return true\n // we need both to be true to return true\n if (xFilter && !applyFilter(xValue, xFilter)) {\n return false;\n }\n\n if (yFilter && !applyFilter(yValue, yFilter)) {\n return false;\n }\n\n return true;\n };\n },\n};\n","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterSettings } from \"./types\";\n\ninterface ThreeDScatterAxesProps {\n scene: THREE.Scene;\n settings: ThreeDScatterSettings;\n}\n\nexport function ThreeDScatterAxes({ scene, settings }: ThreeDScatterAxesProps) {\n // Create axes helper\n const axesHelper = useMemo(() => {\n return new THREE.AxesHelper(10);\n }, []);\n\n // Create grid helper\n const gridHelpers = useMemo(() => {\n const size = 10;\n const divisions = 10;\n\n return {\n xy: new THREE.GridHelper(size, divisions),\n xz: new THREE.GridHelper(size, divisions),\n yz: new THREE.GridHelper(size, divisions),\n };\n }, []);\n\n // Setup grid positions and rotations\n useEffect(() => {\n if (settings.showGrid) {\n // XY plane (blue)\n gridHelpers.xy.rotation.x = Math.PI / 2;\n scene.add(gridHelpers.xy);\n\n // XZ plane (red)\n gridHelpers.xz.position.y = 0;\n scene.add(gridHelpers.xz);\n\n // YZ plane (green)\n gridHelpers.yz.rotation.z = Math.PI / 2;\n scene.add(gridHelpers.yz);\n }\n\n if (settings.showAxes) {\n scene.add(axesHelper);\n }\n\n return () => {\n scene.remove(gridHelpers.xy);\n scene.remove(gridHelpers.xz);\n scene.remove(gridHelpers.yz);\n scene.remove(axesHelper);\n\n gridHelpers.xy.dispose();\n gridHelpers.xz.dispose();\n gridHelpers.yz.dispose();\n axesHelper.dispose();\n };\n }, [scene, settings.showGrid, settings.showAxes, gridHelpers, axesHelper]);\n\n return null;\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterSettings } from \"./types\";\n\ninterface Point3D {\n x: number;\n y: number;\n z: number;\n color?: number | string;\n size?: number;\n}\n\ninterface ThreeDScatterPointsProps {\n scene: THREE.Scene;\n data: Point3D[];\n settings: ThreeDScatterSettings;\n}\n\nexport function ThreeDScatterPoints({\n scene,\n data,\n settings,\n}: ThreeDScatterPointsProps) {\n const pointsRef = useRef<THREE.Points | null>(null);\n\n // Create points geometry\n const pointsGeometry = useMemo(() => {\n const positions = new Float32Array(data.length * 3);\n const colors = new Float32Array(data.length * 3);\n\n data.forEach((point, i) => {\n positions[i * 3] = point.x || 0;\n positions[i * 3 + 1] = point.y || 0;\n positions[i * 3 + 2] = point.z || 0;\n\n // Handle color from point data\n if (point.color) {\n if (typeof point.color === \"string\") {\n // Convert hex string to RGB\n const color = new THREE.Color(point.color);\n colors[i * 3] = color.r;\n colors[i * 3 + 1] = color.g;\n colors[i * 3 + 2] = color.b;\n } else {\n // Handle numeric color\n const color = new THREE.Color(point.color);\n colors[i * 3] = color.r;\n colors[i * 3 + 1] = color.g;\n colors[i * 3 + 2] = color.b;\n }\n } else {\n // Default color (white)\n colors[i * 3] = 1;\n colors[i * 3 + 1] = 1;\n colors[i * 3 + 2] = 1;\n }\n });\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n return geometry;\n }, [data]);\n\n // Create points material\n const pointsMaterial = useMemo(() => {\n return new THREE.PointsMaterial({\n size: settings.pointSize,\n vertexColors: true,\n transparent: true,\n opacity: settings.pointOpacity,\n sizeAttenuation: true,\n });\n }, [settings.pointSize, settings.pointOpacity]);\n\n // Add points to scene\n useEffect(() => {\n const points = new THREE.Points(pointsGeometry, pointsMaterial);\n pointsRef.current = points;\n scene.add(points);\n\n return () => {\n if (pointsRef.current) {\n scene.remove(pointsRef.current);\n }\n pointsGeometry.dispose();\n pointsMaterial.dispose();\n };\n }, [scene, pointsGeometry, pointsMaterial]);\n\n return null;\n}\n","import { useColorScales } from \"@/hooks/useColorScales\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { ThreeDScatterSettings } from \"./types\";\n\nexport function useThreeDScatterData(\n settings: ThreeDScatterSettings,\n facetIds?: IdType[]\n) {\n const is3DScatter = settings.type === \"3d-scatter\";\n\n const xData = useGetLiveData(settings, settings.xField, facetIds);\n const yData = useGetLiveData(settings, settings.yField, facetIds);\n const zData = useGetLiveData(settings, settings.zField, facetIds);\n const colorData = useGetLiveData(settings, settings.colorField, facetIds);\n const sizeData = useGetLiveData(settings, settings.sizeField, facetIds);\n\n const { getColorForValue } = useColorScales();\n const colorScaleId = settings.colorScaleId;\n\n return useMemo(() => {\n if (!is3DScatter) {\n return [];\n }\n\n const result = [];\n for (let i = 0; i < xData.length; i++) {\n result.push({\n x: xData[i],\n y: yData[i],\n z: zData[i],\n color: getColorForValue(colorScaleId, colorData[i]),\n size: sizeData[i],\n });\n }\n return result;\n }, [\n is3DScatter,\n xData,\n yData,\n zData,\n getColorForValue,\n colorScaleId,\n colorData,\n sizeData,\n ]);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterChartProps } from \"./types\";\n\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { OrbitControls } from \"three/addons/controls/OrbitControls.js\";\nimport { ThreeDScatterAxes } from \"./ThreeDScatterAxes\";\nimport { ThreeDScatterPoints } from \"./ThreeDScatterPoints\";\nimport { useThreeDScatterData } from \"./useThreeDScatterData\";\n\ninterface CameraState {\n position: THREE.Vector3;\n target: THREE.Vector3;\n}\n\nexport function ThreeDScatterChart({\n settings,\n width,\n height,\n facetIds,\n}: ThreeDScatterChartProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const animationFrameRef = useRef<number>(null);\n const cameraStateRef = useRef<CameraState>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateChart = useDataLayer((state) => state.updateChart);\n const data = useThreeDScatterData(settings, facetIds);\n const [nonce, setNonce] = useState(0);\n\n // Initialize Three.js scene\n useEffect(() => {\n if (!containerRef.current || width <= 0 || height <= 0) {\n return;\n }\n\n // Create scene\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0x000000);\n sceneRef.current = scene;\n\n // Create camera\n const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);\n camera.position.copy(settings.cameraPosition);\n camera.lookAt(settings.cameraTarget);\n cameraRef.current = camera;\n\n // Create renderer\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n powerPreference: \"high-performance\",\n });\n renderer.setSize(width, height);\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n containerRef.current.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // Add orbit controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controlsRef.current = controls;\n controls.addEventListener(\"change\", () => {\n if (!controls.object || !controls.target) {\n return;\n }\n cameraStateRef.current = {\n position: controls.object.position.clone(),\n target: controls.target.clone(),\n };\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = setTimeout(() => {\n if (cameraStateRef.current) {\n updateChart(settings.id, {\n cameraPosition: cameraStateRef.current.position,\n cameraTarget: cameraStateRef.current.target,\n });\n }\n }, 1000);\n });\n\n // Add ambient light\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);\n scene.add(ambientLight);\n\n // Add directional light\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);\n directionalLight.position.set(10, 10, 10);\n scene.add(directionalLight);\n\n // Force initial render\n renderer.render(scene, camera);\n\n // Animation loop\n const animate = () => {\n animationFrameRef.current = requestAnimationFrame(animate);\n controls.update();\n renderer.render(scene, camera);\n };\n animate();\n\n setNonce((state) => state + 1);\n\n // Cleanup\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n if (controls) {\n controls.dispose();\n }\n if (renderer) {\n renderer.dispose();\n renderer.forceContextLoss();\n renderer.domElement.remove();\n }\n if (containerRef.current) {\n containerRef.current.innerHTML = \"\";\n }\n };\n }, [\n width,\n height,\n settings.cameraPosition,\n settings.cameraTarget,\n settings.id,\n updateChart,\n ]);\n\n // Handle window resize\n useEffect(() => {\n const handleResize = () => {\n if (\n !rendererRef.current ||\n !cameraRef.current ||\n !sceneRef.current ||\n width <= 0 ||\n height <= 0\n ) {\n return;\n }\n\n cameraRef.current.aspect = width / height;\n cameraRef.current.updateProjectionMatrix();\n rendererRef.current.setSize(width, height);\n // Force render on resize\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [width, height]);\n\n // Render points and axes immediately when scene is ready\n useEffect(() => {\n // Force a render after adding points and axes\n if (\n !sceneRef.current ||\n !rendererRef.current ||\n !cameraRef.current ||\n width <= 0 ||\n height <= 0\n ) {\n return;\n }\n\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }, [data, width, height]);\n\n return (\n <div ref={containerRef} style={{ width, height }}>\n {sceneRef.current && (\n <>\n <ThreeDScatterPoints\n scene={sceneRef.current}\n data={data}\n settings={settings}\n key={\"points-\" + nonce}\n />\n <ThreeDScatterAxes\n scene={sceneRef.current}\n settings={settings}\n key={\"axes-\" + nonce}\n />\n </>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground aria-invalid:outline-destructive/60 aria-invalid:ring-destructive/20 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/50 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 aria-invalid:outline-destructive/60 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/40 aria-invalid:ring-destructive/20 aria-invalid:border-destructive/60 dark:aria-invalid:border-destructive flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-[3px] aria-invalid:focus-visible:outline-none md:text-sm dark:aria-invalid:focus-visible:ring-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import { cn } from \"@/lib/utils\";\nimport { Input } from \"./ui/input\";\nimport { KeyboardEvent, useState } from \"react\";\n\nexport interface NumericInputEnterProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n stepSmall?: number;\n stepMedium?: number;\n stepLarge?: number;\n placeholder?: string;\n className?: string;\n}\n\nexport function NumericInputEnter({\n value,\n onChange,\n stepSmall = 1,\n stepMedium = 10,\n stepLarge = 100,\n min,\n max,\n placeholder,\n className,\n}: NumericInputEnterProps) {\n const [localValue, setLocalValue] = useState<string>(value.toString());\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n let delta = 0;\n\n // Handle arrow keys with modifiers\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const direction = e.key === \"ArrowUp\" ? 1 : -1;\n\n if (e.shiftKey && e.altKey) {\n delta = stepLarge * direction;\n } else if (e.shiftKey) {\n delta = stepMedium * direction;\n } else {\n delta = stepSmall * direction;\n }\n\n const newValue = Number(value) + delta;\n\n // Clamp value within min/max bounds\n const clampedValue = Math.min(\n max ?? Infinity,\n Math.max(min ?? -Infinity, newValue)\n );\n\n onChange(clampedValue);\n setLocalValue(clampedValue.toString());\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n\n const newValue = parseFloat(e.target.value);\n if (!isNaN(newValue)) {\n // Only update if within bounds\n if (\n (min === undefined || newValue >= min) &&\n (max === undefined || newValue <= max)\n ) {\n onChange(newValue);\n }\n }\n };\n\n const handleBlur = () => {\n // Reset to last valid value if input is empty or invalid\n if (!localValue || isNaN(parseFloat(localValue))) {\n setLocalValue(value.toString());\n }\n };\n\n return (\n <div className={cn(\"relative max-w-[160px]\", className)}>\n <Input\n type=\"number\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`w-full`}\n />\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ThreeDScatterSettings } from \"./types\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\n\nexport function ThreeDScatterSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ThreeDScatterSettings>) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => onSettingsChange({ ...settings, xField: value })}\n />\n\n <Label>Y Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.yField}\n onChange={(value) => onSettingsChange({ ...settings, yField: value })}\n />\n\n <Label>Z Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.zField}\n onChange={(value) => onSettingsChange({ ...settings, zField: value })}\n />\n\n <Label>Size Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.sizeField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n sizeField: value || undefined,\n })\n }\n />\n\n <Label>Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n })\n }\n />\n\n <Label>Point Size</Label>\n <NumericInputEnter\n value={settings.pointSize}\n onChange={(value) =>\n onSettingsChange({ ...settings, pointSize: value })\n }\n min={0.01}\n max={10}\n stepSmall={0.1}\n stepMedium={0.5}\n stepLarge={1}\n />\n\n <Label>Point Opacity</Label>\n <NumericInputEnter\n value={settings.pointOpacity}\n onChange={(value) =>\n onSettingsChange({ ...settings, pointOpacity: value })\n }\n min={0}\n max={1}\n stepSmall={0.1}\n stepMedium={0.2}\n stepLarge={0.3}\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"showGrid\"\n checked={settings.showGrid}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n showGrid: checked,\n })\n }\n />\n <Label htmlFor=\"showGrid\">Show Grid</Label>\n </div>\n </div>\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"showAxes\"\n checked={settings.showAxes}\n onCheckedChange={(checked) =>\n onSettingsChange({\n ...settings,\n showAxes: checked,\n })\n }\n />\n <Label htmlFor=\"showAxes\">Show Axes</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { ChartDefinition, Filter, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Box } from \"lucide-react\";\n\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport * as THREE from \"three\";\nimport { ThreeDScatterChart } from \"./ThreeDScatterChart\";\nimport { ThreeDScatterSettingsPanel } from \"./ThreeDScatterSettingsPanel\";\nimport { ThreeDScatterSettings } from \"./types\";\n\nexport const threeDScatterDefinition: ChartDefinition<ThreeDScatterSettings> = {\n type: \"3d-scatter\",\n name: \"3D Scatter Plot\",\n description: \"Display data as points in a 3D space\",\n icon: Box,\n\n component: ThreeDScatterChart,\n settingsPanel: ThreeDScatterSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"3d-scatter\",\n title: \"3D Scatter Plot\",\n layout,\n margin: {},\n xField: \"\",\n yField: \"\",\n zField: \"\",\n colorField: undefined,\n sizeField: undefined,\n pointSize: 5,\n pointOpacity: 0.8,\n showGrid: true,\n showAxes: true,\n cameraPosition: new THREE.Vector3(0, 0, 0),\n cameraTarget: new THREE.Vector3(0, 0, 0),\n xAxis: { ...DEFAULT_CHART_SETTINGS.xAxis, zoomLevel: 1 },\n yAxis: { ...DEFAULT_CHART_SETTINGS.yAxis, zoomLevel: 1 },\n zAxis: { ...DEFAULT_CHART_SETTINGS.yAxis, zoomLevel: 1 },\n }),\n\n validateSettings: (settings) => {\n return !!settings.xField && !!settings.yField && !!settings.zField;\n },\n\n getFilterFunction: (\n settings: ThreeDScatterSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Currently no filtering implemented for 3D scatter\n return (d: IdType) => true;\n },\n};\n","import { datum } from \"@/types/FilterTypes\";\nimport { PivotCell, PivotHeader, PivotRow, PivotTableData } from \"../types\";\nimport { PivotTableSettings } from \"../definition\";\n\ntype AggregationFunction = (values: any[]) => number | string;\n\nconst aggregationFunctions: Record<string, AggregationFunction> = {\n sum: (values) => values.reduce((a, b) => a + (Number(b) || 0), 0),\n count: (values) => values.length,\n avg: (values) => {\n const sum = values.reduce((a, b) => a + (Number(b) || 0), 0);\n return values.length ? sum / values.length : 0;\n },\n min: (values) => Math.min(...values.map((v) => Number(v) || 0)),\n max: (values) => Math.max(...values.map((v) => Number(v) || 0)),\n median: (values) => {\n const sorted = values.map((v) => Number(v) || 0).sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n },\n mode: (values) => {\n const counts = new Map<number | string, number>();\n values.forEach((v) => counts.set(v, (counts.get(v) || 0) + 1));\n let maxCount = 0;\n let mode: number | string = 0;\n counts.forEach((count, value) => {\n if (count > maxCount) {\n maxCount = count;\n mode = value;\n }\n });\n return mode;\n },\n stddev: (values) => {\n const avg = aggregationFunctions.avg(values) as number;\n const squareDiffs = values.map((v) => {\n const diff = (Number(v) || 0) - avg;\n return diff * diff;\n });\n return Math.sqrt(aggregationFunctions.avg(squareDiffs) as number);\n },\n variance: (values) => {\n const avg = aggregationFunctions.avg(values) as number;\n const squareDiffs = values.map((v) => {\n const diff = (Number(v) || 0) - avg;\n return diff * diff;\n });\n return aggregationFunctions.avg(squareDiffs) as number;\n },\n countUnique: (values) => new Set(values).size,\n singleValue: (values) => {\n const uniqueValues = new Set(values);\n if (uniqueValues.size !== 1) {\n throw new Error(\"Multiple values found when single value expected\");\n }\n return values[0];\n },\n};\n\nfunction flattenHeaders(headers: PivotHeader[]): PivotHeader[] {\n const result: PivotHeader[] = [];\n headers.forEach((header) => {\n if (!header.children?.length) {\n result.push(header);\n } else {\n result.push(...flattenHeaders(header.children));\n }\n });\n return result;\n}\n\nfunction generateHeaders(data: any[], field: string): PivotHeader[] {\n if (!field) {\n return [];\n }\n\n // Get unique values for the column field\n const uniqueValues = new Set(data.map((d) => d[field]));\n const values = Array.from(uniqueValues).sort();\n\n return values.map((value) => ({\n label: String(value),\n field,\n value,\n children: [],\n span: 1,\n depth: 0,\n }));\n}\n\nfunction generateCells(\n rowData: any[],\n columnHeaders: PivotHeader[],\n valueFields: PivotTableSettings[\"valueFields\"]\n): PivotCell[] {\n const cells: PivotCell[] = [];\n\n // If there are no columns defined, create a single cell for the total\n if (columnHeaders.length === 0) {\n for (const valueField of valueFields) {\n const values = rowData.map((d) => d[valueField.field]);\n const value = aggregationFunctions[valueField.aggregation](values);\n\n cells.push({\n key: {\n columnField: \"total\",\n columnValue: \"total\" as datum,\n valueField: valueField.field,\n },\n value,\n rawValue: value,\n sourceRows: rowData,\n });\n }\n return cells;\n }\n\n // Generate cells for each column header\n for (const header of columnHeaders) {\n const columnData = rowData.filter((d) => d[header.field] === header.value);\n\n for (const valueField of valueFields) {\n const values = columnData.map((d) => d[valueField.field]);\n const value = aggregationFunctions[valueField.aggregation](values);\n\n cells.push({\n key: {\n columnField: header.field,\n columnValue: header.value,\n valueField: valueField.field,\n },\n value,\n rawValue: value,\n sourceRows: columnData,\n });\n }\n }\n\n return cells;\n}\n\nfunction generateRows(\n data: any[],\n rowFields: string[],\n columnField: string,\n valueFields: PivotTableSettings[\"valueFields\"],\n showTotals: PivotTableSettings[\"showTotals\"]\n): PivotRow[] {\n const rows: PivotRow[] = [];\n const columnHeaders = generateHeaders(data, columnField);\n\n // Pre-compute row groups for better performance\n const rowGroups = new Map<string, any[]>();\n data.forEach((item) => {\n // Create a composite key for grouping, but store the individual values\n const keyString = rowFields.map((field) => item[field]).join(\":\");\n if (!rowGroups.has(keyString)) {\n rowGroups.set(keyString, []);\n }\n rowGroups.get(keyString)!.push(item);\n });\n\n // Generate rows\n rowGroups.forEach((groupData, keyString) => {\n // Create properly typed keys and headers\n const keys = rowFields.map((field, index) => {\n const value = groupData[0][field];\n return {\n field,\n value,\n };\n });\n\n const headers = keys.map((key, index) => ({\n label: String(key.value),\n field: key.field,\n value: key.value,\n span: 1,\n depth: index,\n }));\n\n const cells = generateCells(groupData, columnHeaders, valueFields);\n\n rows.push({\n keys,\n headers,\n cells,\n });\n });\n\n return rows;\n}\n\nexport function calculatePivotData(\n data: any[],\n settings: PivotTableSettings\n): PivotTableData {\n const headers = generateHeaders(data, settings.columnField);\n const rows = generateRows(\n data,\n settings.rowFields,\n settings.columnField,\n settings.valueFields,\n settings.showTotals\n );\n\n return {\n headers,\n rows,\n };\n}\n","import { calculatePivotData } from \"@/components/charts/PivotTable/utils/calculations\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { Filter, ValueFilter, datum } from \"@/types/FilterTypes\";\nimport { Filter as FilterIcon } from \"lucide-react\";\nimport { useCallback, useMemo } from \"react\";\nimport { toast } from \"sonner\";\nimport { useGetLiveIds } from \"../useGetLiveData\";\nimport { PivotCell, PivotHeader, PivotRow, CellKey, RowKey } from \"./types\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { PivotTableSettings } from \"./definition\";\n\ntype PivotTableProps = BaseChartProps & {\n settings: PivotTableSettings;\n};\n\nexport function PivotTable({\n settings,\n width,\n height,\n facetIds,\n}: PivotTableProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const updateChart = useDataLayer((state) => state.updateChart);\n\n const allLiveIds = useGetLiveIds(settings);\n\n // Get all required field data\n const pivotData = useMemo(() => {\n // Use facetIds if provided, otherwise use liveItems\n const liveIds = facetIds || allLiveIds;\n\n // Gather all required fields\n const allFields = new Set([\n ...settings.rowFields,\n settings.columnField,\n ...settings.valueFields.map((f) => f.field),\n ]);\n\n // Get column data for each field\n const fieldData: Record<string, Record<string | number, any>> = {};\n allFields.forEach((field) => {\n fieldData[field] = getColumnData(field);\n });\n\n // Create data array for pivot calculations\n const data = liveIds.map((id: string | number) => {\n const row: Record<string, any> = {};\n allFields.forEach((field) => {\n row[field] = fieldData[field][id];\n });\n return row;\n });\n\n return calculatePivotData(data, settings);\n }, [facetIds, allLiveIds, settings, getColumnData]);\n\n const handleFilterClick = useCallback(\n (field: string, value: datum) => {\n const currentFilters = settings.filters || [];\n const existingFilterIndex = currentFilters.findIndex(\n (f): f is ValueFilter =>\n f.type === \"value\" &&\n f.field === field &&\n f.values.includes(value as string | number)\n );\n\n let newFilters: Filter[];\n if (existingFilterIndex >= 0) {\n // Remove the filter if it exists\n newFilters = [\n ...currentFilters.slice(0, existingFilterIndex),\n ...currentFilters.slice(existingFilterIndex + 1),\n ];\n } else {\n // Add new filter\n const newFilter: ValueFilter = {\n type: \"value\",\n field,\n values: [value as string | number],\n };\n newFilters = [...currentFilters, newFilter];\n }\n\n updateChart(settings.id, {\n ...settings,\n filters: newFilters,\n });\n },\n [settings, updateChart]\n );\n\n const handleCellClick = useCallback(\n (cell: PivotCell, rowKeys: RowKey[], colKey: CellKey) => {\n if (!cell.sourceRows) {\n return;\n }\n\n // TODO: Implement drill-down modal with source rows\n toast(\n `Showing details for ${cell.value} (${cell.sourceRows.length} rows)`\n );\n },\n []\n );\n\n const isValueFiltered = useCallback(\n (field: string, value: datum) => {\n const currentFilters = settings.filters || [];\n const fieldFilters = currentFilters.filter((f) => f.field === field);\n\n // If no filters for this field, return false\n if (fieldFilters.length === 0) {\n return false;\n }\n\n // Check if the value matches any of the filters for this field\n return fieldFilters.some((filter) => applyFilter(value, filter));\n },\n [settings.filters]\n );\n\n const isCellFiltered = useCallback(\n (rowHeaders: PivotHeader[], cellKey: CellKey) => {\n const currentFilters = settings.filters || [];\n\n if (currentFilters.length === 0) {\n return false;\n }\n\n // Get all row field filters\n const rowFieldFilters = rowHeaders.map((header) => {\n const fieldFilters = currentFilters.filter(\n (f) => f.field === header.field\n );\n return {\n header,\n filters: fieldFilters,\n };\n });\n\n // Check if any row header matches its field's filters\n const hasRowFilters = rowFieldFilters.some((rf) => rf.filters.length > 0);\n const rowMatches =\n !hasRowFilters ||\n rowFieldFilters.some(\n ({ header, filters }) =>\n filters.length > 0 &&\n filters.some((filter) => applyFilter(header.value, filter))\n );\n\n // Get column filters\n const columnFilters = currentFilters.filter(\n (f) => f.field === cellKey.columnField\n );\n\n // Check if column matches its filters\n const hasColumnFilters = columnFilters.length > 0;\n const columnMatches =\n !hasColumnFilters ||\n columnFilters.some((filter) =>\n applyFilter(cellKey.columnValue, filter)\n );\n\n // Cell is highlighted if both row and column conditions are met\n return rowMatches && columnMatches;\n },\n [settings.filters]\n );\n\n const renderHeader = useCallback(\n (header: PivotHeader) => {\n const isFiltered = isValueFiltered(header.field, header.value);\n return (\n <th\n key={`${header.field}-${header.value}`}\n colSpan={settings.valueFields.length}\n className={cn(\n \"border p-2\",\n header.depth === 0 && \"font-semibold\",\n isFiltered ? \"bg-yellow-100\" : \"bg-muted/50\"\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => handleFilterClick(header.field, header.value)}\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n <span>{header.label}</span>\n </div>\n </th>\n );\n },\n [handleFilterClick, settings.valueFields.length, isValueFiltered]\n );\n\n // Calculate the number of header rows needed\n\n return (\n <div\n className={cn(\"w-full h-full border rounded-md flex flex-col p-4\")}\n style={{ height }}\n >\n <div className=\"overflow-auto flex-1\">\n <table className=\"w-full border-collapse relative\">\n <thead className=\"sticky top-0 bg-background z-40\">\n {/* First row: Row field headers and column field headers */}\n <tr>\n {/* Row field headers */}\n {settings.rowFields.map((field, i) => {\n const leftPosition = i * 150; // Match the body's width\n return (\n <th\n key={field}\n rowSpan={settings.columnField ? 2 : 1}\n className={cn(\n \"border p-2 bg-muted/50 font-semibold sticky\",\n // Add z-index that decreases as we go right to ensure proper layering\n `z-[${30 - i}]` // Higher z-index than body to stay on top\n )}\n style={{\n left: `${leftPosition}px`,\n minWidth: \"150px\",\n maxWidth: \"150px\",\n }}\n >\n {field}\n </th>\n );\n })}\n\n {/* Column headers or value fields if no columns */}\n {!settings.columnField\n ? settings.valueFields.map((valueField) => (\n <th\n key={valueField.field}\n className=\"border p-2 bg-muted/50 font-semibold\"\n >\n {valueField.label ||\n `${valueField.field} (${valueField.aggregation})`}\n </th>\n ))\n : pivotData.headers.map(renderHeader)}\n </tr>\n\n {/* Value field headers when column field exists */}\n {settings.columnField && (\n <tr>\n {pivotData.headers.map((header) =>\n settings.valueFields.map((valueField) => (\n <th\n key={`${header.field}-${header.value}-${valueField.field}`}\n className=\"border p-2 bg-muted/50\"\n >\n {valueField.label ||\n `${valueField.field} (${valueField.aggregation})`}\n </th>\n ))\n )}\n </tr>\n )}\n </thead>\n <tbody>\n {pivotData.rows.map((row: PivotRow) => (\n <tr key={row.keys.map((k) => `${k.field}-${k.value}`).join(\":\")}>\n {row.headers.map((header: PivotHeader, i) => {\n // Calculate cumulative width of previous headers\n const leftPosition = i * 150; // Using fixed width for consistency\n const isFiltered = isValueFiltered(\n header.field,\n header.value\n );\n return (\n <th\n key={`${header.field}-${header.value}`}\n className={cn(\n \"border p-2 text-left font-normal sticky\",\n isFiltered ? \"bg-yellow-100\" : \"bg-white\",\n // Add z-index that decreases as we go right to ensure proper layering\n `z-[${20 - i}]`\n )}\n style={{\n left: `${leftPosition}px`,\n minWidth: \"150px\", // Fixed width for consistency\n maxWidth: \"150px\",\n }}\n >\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() =>\n handleFilterClick(header.field, header.value)\n }\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n <span>{header.label}</span>\n </div>\n </th>\n );\n })}\n {row.cells.map((cell: PivotCell) => (\n <td\n key={`${cell.key.columnField}-${cell.key.columnValue}${cell.key.valueField ? `-${cell.key.valueField}` : \"\"}`}\n className={cn(\n \"border p-2 text-right\",\n cell.sourceRows && \"cursor-pointer hover:bg-muted/20\",\n isCellFiltered(row.headers, cell.key) && \"bg-yellow-50\"\n )}\n onClick={() =>\n cell.sourceRows &&\n handleCellClick(cell, row.keys, cell.key)\n }\n >\n {typeof cell.value === \"number\"\n ? cell.value.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n })\n : cell.value}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0 transition-[color,box-shadow]\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow-sm [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow-sm [a&]:hover:bg-destructive/90\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Command as CommandPrimitive, useCommandState } from \"cmdk\";\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { forwardRef, useEffect } from \"react\";\n\nimport { Badge } from \"./badge\";\nimport {\n Command,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"./command\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport interface Option {\n value: string;\n label: string;\n disable?: boolean;\n /** fixed option that can't be removed. */\n fixed?: boolean;\n /** Group the options by providing key. */\n [key: string]: string | boolean | undefined;\n}\ntype GroupOption = Record<string, Option[]>;\n\ninterface MultipleSelectorProps {\n value?: Option[];\n defaultOptions?: Option[];\n /** manually controlled options */\n options?: Option[];\n placeholder?: string;\n /** Loading component. */\n loadingIndicator?: React.ReactNode;\n /** Empty component. */\n emptyIndicator?: React.ReactNode;\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number;\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n **/\n triggerSearchOnFocus?: boolean;\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>;\n /**\n * sync search. This search will not showing loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: creatable, groupBy, delay.\n **/\n onSearchSync?: (value: string) => Option[];\n onChange?: (options: Option[]) => void;\n /** Limit the maximum number of selected options. */\n maxSelected?: number;\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void;\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean;\n disabled?: boolean;\n /** Group the options base on provided key. */\n groupBy?: string;\n className?: string;\n badgeClassName?: string;\n /**\n * First item selected is a default behavior by cmdk. That is why the default is true.\n * This is a workaround solution by add a dummy item.\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean;\n /** Allow user to create option when there is no option matched. */\n creatable?: boolean;\n /** Props of `Command` */\n commandProps?: React.ComponentPropsWithoutRef<typeof Command>;\n /** Props of `CommandInput` */\n inputProps?: Omit<\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>,\n \"value\" | \"placeholder\" | \"disabled\"\n >;\n /** hide the clear all button. */\n hideClearAllButton?: boolean;\n}\n\nexport interface MultipleSelectorRef {\n selectedValue: Option[];\n input: HTMLInputElement;\n focus: () => void;\n reset: () => void;\n}\n\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = React.useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {};\n }\n if (!groupBy) {\n return {\n \"\": options,\n };\n }\n\n const groupOption: GroupOption = {};\n options.forEach((option) => {\n const key = (option[groupBy] as string) || \"\";\n if (!groupOption[key]) {\n groupOption[key] = [];\n }\n groupOption[key].push(option);\n });\n return groupOption;\n}\n\nfunction removePickedOption(groupOption: GroupOption, picked: Option[]) {\n const cloneOption = JSON.parse(JSON.stringify(groupOption)) as GroupOption;\n\n for (const [key, value] of Object.entries(cloneOption)) {\n cloneOption[key] = value.filter(\n (val) => !picked.find((p) => p.value === val.value)\n );\n }\n return cloneOption;\n}\n\nfunction isOptionsExist(groupOption: GroupOption, targetOption: Option[]) {\n for (const [, value] of Object.entries(groupOption)) {\n if (\n value.some((option) => targetOption.find((p) => p.value === option.value))\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n **/\nconst CommandEmpty = forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof CommandPrimitive.Empty>\n>(({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0);\n\n if (!render) {\n return null;\n }\n\n return (\n <div\n ref={forwardedRef}\n className={cn(\"py-6 text-center text-sm\", className)}\n cmdk-empty=\"\"\n role=\"presentation\"\n {...props}\n />\n );\n});\n\nCommandEmpty.displayName = \"CommandEmpty\";\n\ninterface SortableBadgeProps {\n option: Option;\n disabled?: boolean;\n onUnselect: (option: Option) => void;\n badgeClassName?: string;\n}\n\nconst SortableBadge = ({\n option,\n disabled,\n onUnselect,\n badgeClassName,\n}: SortableBadgeProps) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: option.value });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 1 : 0,\n };\n\n return (\n <Badge\n ref={setNodeRef}\n style={style}\n className={cn(\n \"data-[disabled]:bg-muted-foreground data-[disabled]:text-muted data-[disabled]:hover:bg-muted-foreground\",\n \"data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground\",\n \"flex items-center gap-1\",\n isDragging && \"opacity-50\",\n badgeClassName\n )}\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n <button\n className={cn(\n \"flex cursor-grab items-center gap-1\",\n disabled && \"hidden\"\n )}\n {...attributes}\n {...listeners}\n >\n {option.label}\n </button>\n <button\n className={cn(\n \"ml-1 rounded-full outline-none ring-offset-background focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n (disabled || option.fixed) && \"hidden\"\n )}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n onUnselect(option);\n }\n }}\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={() => onUnselect(option)}\n >\n <X className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </Badge>\n );\n};\n\nconst MultipleSelector = React.forwardRef<\n MultipleSelectorRef,\n MultipleSelectorProps\n>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator,\n emptyIndicator,\n maxSelected = Number.MAX_SAFE_INTEGER,\n onMaxSelected,\n hidePlaceholderWhenSelected,\n disabled,\n groupBy,\n className,\n badgeClassName,\n selectFirstItem = true,\n creatable = false,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n hideClearAllButton = false,\n }: MultipleSelectorProps,\n ref: React.Ref<MultipleSelectorRef>\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [open, setOpen] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(false);\n\n const [selected, setSelected] = React.useState<Option[]>(value || []);\n const [options, setOptions] = React.useState<GroupOption>(\n transToGroupOption(arrayDefaultOptions, groupBy)\n );\n const [inputValue, setInputValue] = React.useState(\"\");\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500);\n\n React.useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current!,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected]\n );\n\n const handleUnselect = React.useCallback(\n (option: Option) => {\n const newOptions = selected.filter((s) => s.value !== option.value);\n setSelected(newOptions);\n onChange?.(newOptions);\n },\n [onChange, selected]\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current;\n if (input) {\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n if (input.value === \"\" && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1];\n if (!lastSelectOption?.fixed && lastSelectOption) {\n handleUnselect(lastSelectOption);\n }\n }\n }\n if (e.key === \"Escape\") {\n input.blur();\n setOpen(false);\n }\n }\n },\n [handleUnselect, selected]\n );\n\n useEffect(() => {\n if (value) {\n setSelected(value);\n }\n }, [value]);\n\n useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return;\n }\n const newOption = transToGroupOption(arrayOptions || [], groupBy);\n if (JSON.stringify(newOption) !== JSON.stringify(options)) {\n setOptions(newOption);\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options]);\n\n useEffect(() => {\n /** sync search */\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n };\n\n const exec = async () => {\n if (!onSearchSync || !open) {\n return;\n }\n\n if (triggerSearchOnFocus) {\n doSearchSync();\n }\n\n if (debouncedSearchTerm) {\n doSearchSync();\n }\n };\n\n void exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n useEffect(() => {\n /** async search */\n const doSearch = async () => {\n setIsLoading(true);\n const res = await onSearch?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n setIsLoading(false);\n };\n\n const exec = async () => {\n if (!onSearch || !open) {\n return;\n }\n\n if (triggerSearchOnFocus) {\n await doSearch();\n }\n\n if (debouncedSearchTerm) {\n await doSearch();\n }\n };\n\n void exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n const EmptyItem = () => {\n if (emptyIndicator) {\n return emptyIndicator;\n }\n return null;\n };\n\n const selectables = React.useMemo<GroupOption>(\n () => removePickedOption(options, selected),\n [options, selected]\n );\n\n const commandFilter = React.useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter;\n }\n\n if (creatable) {\n return (value: string, search: string) => {\n return value.toLowerCase().includes(search.toLowerCase()) ? 1 : -1;\n };\n }\n return undefined;\n }, [creatable, commandProps?.filter]);\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over) {\n return;\n }\n\n if (active.id !== over.id) {\n const oldIndex = selected.findIndex((item) => item.value === active.id);\n const newIndex = selected.findIndex((item) => item.value === over.id);\n\n const newSelected = arrayMove(selected, oldIndex, newIndex);\n setSelected(newSelected);\n onChange?.(newSelected);\n }\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <div\n className={cn(\n \"min-h-10 rounded-md border border-input text-base ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 md:text-sm\",\n {\n \"px-1 py-1\": selected.length !== 0,\n \"cursor-text\": !disabled && selected.length !== 0,\n },\n className\n )}\n onClick={() => {\n if (disabled) {\n return;\n }\n inputRef?.current?.focus();\n }}\n >\n <div className=\"relative flex flex-wrap items-center gap-1\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={selected.map((s) => s.value)}\n strategy={horizontalListSortingStrategy}\n >\n {selected.map((option) => (\n <SortableBadge\n key={option.value}\n option={option}\n disabled={disabled}\n onUnselect={handleUnselect}\n badgeClassName={badgeClassName}\n />\n ))}\n </SortableContext>\n </DndContext>\n\n <Button\n variant=\"ghost\"\n onClick={() => {\n setSelected(selected.filter((s) => s.fixed));\n onChange?.(selected.filter((s) => s.fixed));\n }}\n className={cn(\n \"absolute right-0 h-6 w-6 p-0\",\n (hideClearAllButton ||\n disabled ||\n selected.length < 1 ||\n selected.filter((s) => s.fixed).length ===\n selected.length) &&\n \"hidden\"\n )}\n >\n <X />\n </Button>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\" align=\"start\">\n <Command\n {...commandProps}\n shouldFilter={\n commandProps?.shouldFilter !== undefined\n ? commandProps.shouldFilter\n : !onSearch\n }\n filter={commandFilter()}\n >\n <CommandInput placeholder=\"Search city...\" />\n <CommandList>\n {isLoading ? (\n loadingIndicator\n ) : (\n <>\n {EmptyItem()}\n\n {!selectFirstItem && (\n <CommandItem value=\"-\" className=\"hidden\" />\n )}\n {Object.entries(selectables).map(([key, dropdowns]) => (\n <CommandGroup\n key={key}\n heading={key}\n className=\"h-full overflow-auto\"\n >\n {dropdowns.map((option) => (\n <CommandItem\n key={option.value}\n value={option.label}\n disabled={option.disable}\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length);\n return;\n }\n setInputValue(\"\");\n const newOptions = [...selected, option];\n setSelected(newOptions);\n onChange?.(newOptions);\n }}\n className={cn(\n \"cursor-pointer\",\n option.disable &&\n \"cursor-default text-muted-foreground\"\n )}\n >\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nMultipleSelector.displayName = \"MultipleSelector\";\nexport default MultipleSelector;\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\n\nexport function useColumnNames() {\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const availableFields = getColumnNames();\n\n return availableFields;\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { PivotTableSettings } from \"./definition\";\nimport { useColumnNames } from \"./useColumnNames\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\n\nconst AGGREGATION_OPTIONS = [\n { label: \"Sum\", value: \"sum\" },\n { label: \"Count\", value: \"count\" },\n { label: \"Average\", value: \"avg\" },\n { label: \"Min\", value: \"min\" },\n { label: \"Max\", value: \"max\" },\n { label: \"Median\", value: \"median\" },\n { label: \"Mode\", value: \"mode\" },\n { label: \"StdDev\", value: \"stddev\" },\n { label: \"Variance\", value: \"variance\" },\n { label: \"Count Unique\", value: \"countUnique\" },\n { label: \"Single Value\", value: \"singleValue\" },\n] as const;\n\nexport function PivotTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<PivotTableSettings>) {\n const availableFields = useColumnNames();\n\n const fieldOptions = availableFields.map((f) => ({\n label: f,\n value: f,\n }));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Row Fields</Label>\n <div className=\"max-w-[400px]\">\n <MultiSelect\n options={fieldOptions}\n value={settings.rowFields.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n rowFields: values.map((v) => v.value),\n })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"max-w-[400px]\">\n <FieldSelector\n label=\"Column Field\"\n value={settings.columnField}\n onChange={(value) =>\n onSettingsChange({ ...settings, columnField: value })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Value Fields</Label>\n <div className=\"max-w-[400px] space-y-2\">\n {settings.valueFields.map((valueField, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <ComboBox\n options={fieldOptions}\n value={fieldOptions.find((f) => f.value === valueField.field)}\n onChange={(option) => {\n const newValueFields = [...settings.valueFields];\n newValueFields[index] = {\n ...valueField,\n field: option?.value || valueField.field,\n };\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n optionToString={(option) => option.label}\n />\n </div>\n <div className=\"flex-1\">\n <ComboBox\n options={AGGREGATION_OPTIONS}\n value={AGGREGATION_OPTIONS.find(\n (o) => o.value === valueField.aggregation\n )}\n onChange={(option) => {\n if (!option) {\n return;\n }\n const newValueFields = [...settings.valueFields];\n newValueFields[index] = {\n ...valueField,\n aggregation: option.value,\n };\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n optionToString={(option) => option.label}\n />\n </div>\n <button\n className=\"p-2 hover:bg-gray-100 rounded\"\n onClick={() => {\n const newValueFields = settings.valueFields.filter(\n (_, i) => i !== index\n );\n onSettingsChange({\n ...settings,\n valueFields: newValueFields,\n });\n }}\n >\n ×\n </button>\n </div>\n ))}\n <button\n className=\"text-sm text-blue-600 hover:text-blue-800\"\n onClick={() => {\n onSettingsChange({\n ...settings,\n valueFields: [\n ...settings.valueFields,\n {\n field: availableFields[0],\n aggregation: \"count\",\n },\n ],\n });\n }}\n >\n + Add Value Field\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { ValueFilter } from \"@/types/FilterTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Table } from \"lucide-react\";\n\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { PivotTable } from \"./PivotTable\";\nimport { PivotTableSettingsPanel } from \"./PivotTableSettingsPanel\";\n\nexport interface PivotTableSettings extends BaseChartSettings {\n type: \"pivot\";\n rowFields: string[];\n columnField: string;\n valueFields: Array<{\n field: string;\n aggregation:\n | \"sum\"\n | \"count\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"median\"\n | \"mode\"\n | \"stddev\"\n | \"variance\"\n | \"countUnique\"\n | \"singleValue\";\n formula?: string;\n label?: string;\n }>;\n showTotals: {\n row: boolean;\n column: boolean;\n grand: boolean;\n };\n dateBinning?: {\n field: string;\n type: \"day\" | \"month\" | \"year\";\n };\n}\n\nexport const pivotTableDefinition: ChartDefinition<PivotTableSettings> = {\n type: \"pivot\",\n name: \"Pivot Table\",\n description: \"Interactive pivot table for data analysis\",\n icon: Table,\n\n component: PivotTable,\n settingsPanel: PivotTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"pivot\",\n title: \"Pivot Table\",\n layout,\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\n rowFields: [],\n columnField: \"\",\n valueFields: [{ field: \"\", aggregation: \"count\" }],\n showTotals: {\n row: true,\n column: true,\n grand: true,\n },\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return (\n settings.rowFields.length > 0 ||\n settings.columnField !== \"\" ||\n settings.valueFields.length > 0\n );\n },\n\n getFilterFunction: (\n settings: PivotTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Get all value filters for row and column fields\n const rowFilters = settings.filters.filter(\n (f): f is ValueFilter =>\n f.type === \"value\" && settings.rowFields.includes(f.field)\n );\n const columnFilters = settings.filters.filter(\n (f): f is ValueFilter =>\n f.type === \"value\" && f.field === settings.columnField\n );\n\n const noMatchingFilters =\n rowFilters.length === 0 && columnFilters.length === 0;\n\n return (d: IdType) => {\n if (noMatchingFilters) {\n return true;\n }\n\n // Check if the data point matches all active row filters\n const matchesRowFilters = rowFilters.some((filter) => {\n const dataHash = fieldGetter(filter.field);\n return applyFilter(dataHash[d], filter);\n });\n\n // Check if the data point matches all active column filters\n const matchesColumnFilters = columnFilters.some((filter) => {\n const dataHash = fieldGetter(filter.field);\n return applyFilter(dataHash[d], filter);\n });\n\n // if there are only row filters, return true if any row filter matches\n if (columnFilters.length === 0) {\n return matchesRowFilters;\n }\n\n // if there are only column filters, return true if any column filter matches\n if (rowFilters.length === 0) {\n return matchesColumnFilters;\n }\n\n // if there are both row and column filters, return true if any row or column filter matches\n return matchesRowFilters && matchesColumnFilters;\n };\n },\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div className=\"relative w-full overflow-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-muted-foreground h-10 px-2 text-left align-middle font-medium [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-0.5 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","export interface FilterBase {\n type: string;\n field: string;\n}\n\nexport interface ValueFilter extends FilterBase {\n type: \"value\";\n values: Array<datum>;\n}\n\nexport interface RangeFilter extends FilterBase {\n type: \"range\";\n min?: number;\n max?: number;\n}\n\nexport interface TextFilter extends FilterBase {\n type: \"text\";\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\";\n value: string;\n}\n\nexport type Filter = ValueFilter | RangeFilter | TextFilter;\n\nexport interface ChartFilters {\n filters: Filter[];\n}\n\nexport type datum = string | number | boolean | undefined;\n\n// Helper type guards\nexport const isValueFilter = (filter: Filter): filter is ValueFilter => {\n return filter.type === \"value\";\n};\n\nexport const isRangeFilter = (filter: Filter): filter is RangeFilter => {\n return filter.type === \"range\";\n};\n\nexport const isTextFilter = (filter: Filter): filter is TextFilter => {\n return filter.type === \"text\";\n};\n","import { TableBody, TableCell, TableRow } from \"@/components/ui/table\";\nimport { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\n\nimport { isTextFilter } from \"@/types/FilterTypes\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableBodyProps {\n settings: DataTableSettings;\n}\n\n// Helper function to check if a value is numeric\nfunction isNumeric(value: any): boolean {\n if (typeof value === \"number\") {\n return true;\n }\n if (typeof value !== \"string\") {\n return false;\n }\n return !isNaN(Number(value)) && !isNaN(parseFloat(value));\n}\n\n// Helper function to compare values with natural sort\nfunction compareValues(a: any, b: any): number {\n // Handle null/undefined values\n if (a === null || a === undefined) {\n return 1;\n }\n if (b === null || b === undefined) {\n return -1;\n }\n if (a === b) {\n return 0;\n }\n\n // Convert to strings for comparison if not numeric\n const aStr = String(a);\n const bStr = String(b);\n\n // If both values are numeric, compare as numbers\n if (isNumeric(a) && isNumeric(b)) {\n return Number(a) - Number(b);\n }\n\n // For strings, use localeCompare for natural sort\n return aStr.localeCompare(bStr);\n}\n\n// Helper function to check if a row matches the global search\nfunction matchesGlobalSearch(\n row: Record<string, any>,\n searchTerm: string\n): boolean {\n if (!searchTerm) {\n return true;\n }\n const searchLower = searchTerm.toLowerCase();\n\n return Object.values(row).some((value) => {\n if (value === null || value === undefined) {\n return false;\n }\n const strValue = String(value).toLowerCase();\n return strValue.includes(searchLower);\n });\n}\n\nexport function DataTableBody({ settings }: DataTableBodyProps) {\n const {\n pageSize,\n currentPage,\n sortBy,\n sortDirection,\n filters,\n globalSearch,\n } = settings;\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: IdType; [key: string]: any } => row !== undefined\n ) || [];\n\n // Apply global search\n const searchFilteredData = globalSearch\n ? filteredData.filter((row) => matchesGlobalSearch(row, globalSearch))\n : filteredData;\n\n // Apply column filters\n const filteredByColumns = searchFilteredData.filter((row) => {\n // Get all text filters\n const textFilters = filters.filter(isTextFilter);\n\n // If no text filters, return true\n if (textFilters.length === 0) {\n return true;\n }\n\n // Check if row matches all text filters\n return textFilters.every((filter) => {\n const cellValue = row[filter.field];\n if (cellValue === null || cellValue === undefined) {\n return false;\n }\n\n const value = String(cellValue).toLowerCase();\n const filterValue = filter.value.toLowerCase();\n\n switch (filter.operator) {\n case \"contains\":\n return value.includes(filterValue);\n case \"equals\":\n return value === filterValue;\n case \"startsWith\":\n return value.startsWith(filterValue);\n case \"endsWith\":\n return value.endsWith(filterValue);\n default:\n return true;\n }\n });\n });\n\n // Sort data if sortBy is set\n const sortedData = sortBy\n ? [...filteredByColumns].sort((a, b) => {\n const aValue = a[sortBy];\n const bValue = b[sortBy];\n const comparison = compareValues(aValue, bValue);\n return sortDirection === \"asc\" ? comparison : -comparison;\n })\n : filteredByColumns;\n\n // Calculate pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n // Get paginated data\n const paginatedData = sortedData.slice(startIndex, endIndex);\n\n return (\n <TableBody>\n {paginatedData.map((row) => (\n <TableRow key={String(row.__ID)}>\n {settings.columns.map((column) => (\n <TableCell key={column.id} style={{ width: column.width }}>\n {row[column.id]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground aria-invalid:border-destructive ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import { Input } from \"@/components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Button } from \"@/components/ui/button\";\nimport { X } from \"lucide-react\";\nimport { useState } from \"react\";\n\ninterface ColumnFilterProps {\n columnId: string;\n columnLabel: string;\n value: string;\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\";\n onChange: (\n columnId: string,\n value: string,\n operator: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\"\n ) => void;\n onClear: () => void;\n}\n\nexport function ColumnFilter({\n columnId,\n columnLabel,\n value,\n operator,\n onChange,\n onClear,\n}: ColumnFilterProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={operator}\n onValueChange={(value: typeof operator) =>\n onChange(columnId, value, value)\n }\n >\n <SelectTrigger className=\"h-8 w-[100px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"contains\">Contains</SelectItem>\n <SelectItem value=\"equals\">Equals</SelectItem>\n <SelectItem value=\"startsWith\">Starts with</SelectItem>\n <SelectItem value=\"endsWith\">Ends with</SelectItem>\n </SelectContent>\n </Select>\n <Input\n placeholder={`Filter ${columnLabel}...`}\n value={value}\n onChange={(e) => onChange(columnId, e.target.value, operator)}\n className=\"h-8 w-[200px]\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={onClear}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { TableHead, TableHeader, TableRow } from \"@/components/ui/table\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Filter, TextFilter } from \"@/types/FilterTypes\";\nimport { ChevronDown, ChevronUp, Filter as FilterIcon } from \"lucide-react\";\nimport React, { useState } from \"react\";\nimport { ColumnFilter } from \"./components/ColumnFilter\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableHeaderProps {\n settings: DataTableSettings;\n}\n\nexport function DataTableHeader({ settings }: DataTableHeaderProps) {\n const { columns, sortBy, sortDirection, filters } = settings;\n const updateChart = useDataLayer((state) => state.updateChart);\n const [activeFilter, setActiveFilter] = useState<string | null>(null);\n const [resizingColumn, setResizingColumn] = useState<string | null>(null);\n const [tempWidths, setTempWidths] = useState<Record<string, number>>({});\n\n const handleSort = (columnId: string) => {\n if (sortBy === columnId) {\n // Toggle sort direction\n updateChart(settings.id, {\n sortDirection: sortDirection === \"asc\" ? \"desc\" : \"asc\",\n });\n } else {\n // Set new sort column\n updateChart(settings.id, {\n sortBy: columnId,\n sortDirection: \"asc\",\n });\n }\n };\n\n const handleFilterChange = (\n columnId: string,\n value: string,\n operator: TextFilter[\"operator\"]\n ) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column) {\n return;\n }\n\n // Create new filters array with updated text filter\n const newFilters = filters.filter(\n (f: Filter) => f.type !== \"text\" || f.field !== column.field\n );\n\n if (value) {\n const textFilter: TextFilter = {\n type: \"text\",\n field: column.field,\n operator,\n value,\n };\n newFilters.push(textFilter);\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n const handleFilterClear = (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column) {\n return;\n }\n\n // Remove text filter for this column\n const newFilters = filters.filter(\n (f: Filter) => f.type !== \"text\" || f.field !== column.field\n );\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n const handleResizeStart = (e: React.MouseEvent, columnId: string) => {\n e.preventDefault();\n setResizingColumn(columnId);\n\n const startX = e.pageX;\n const column = columns.find((col) => col.id === columnId);\n const startWidth = column?.width || 0;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingColumn) {\n return;\n }\n\n const diff = e.pageX - startX;\n const newWidth = Math.max(50, startWidth + diff); // Minimum width of 50px\n setTempWidths((prev) => ({ ...prev, [columnId]: newWidth }));\n };\n\n const handleMouseUp = () => {\n if (!resizingColumn) {\n return;\n }\n\n const newWidth = tempWidths[columnId];\n if (newWidth) {\n const newColumns = columns.map((col) =>\n col.id === columnId ? { ...col, width: newWidth } : col\n );\n updateChart(settings.id, { columns: newColumns });\n }\n\n setResizingColumn(null);\n setTempWidths({});\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n };\n\n return (\n <TableHeader>\n <TableRow>\n {columns.map((column) => {\n const textFilter = filters.find(\n (f: Filter): f is TextFilter =>\n f.type === \"text\" && f.field === column.field\n );\n\n return (\n <TableHead\n key={column.id}\n className=\"relative select-none\"\n style={{\n width:\n resizingColumn === column.id\n ? tempWidths[column.id] || column.width\n : column.width,\n }}\n >\n <div\n className=\"flex items-center gap-2 cursor-pointer\"\n onClick={() => handleSort(column.id)}\n >\n {column.field}\n {sortBy === column.id &&\n (sortDirection === \"asc\" ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown className=\"h-4 w-4\" />\n ))}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"flex items-center gap-2\"\n onClick={() =>\n setActiveFilter(\n activeFilter === column.id ? null : column.id\n )\n }\n >\n <FilterIcon className=\"h-4 w-4\" />\n </Button>\n {activeFilter === column.id && (\n <ColumnFilter\n columnId={column.id}\n columnLabel={column.id}\n value={textFilter?.value || \"\"}\n operator={textFilter?.operator || \"contains\"}\n onChange={handleFilterChange}\n onClear={() => handleFilterClear(column.id)}\n />\n )}\n </div>\n <div\n className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-primary\"\n onMouseDown={(e) => handleResizeStart(e, column.id)}\n />\n </TableHead>\n );\n })}\n </TableRow>\n </TableHeader>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTablePaginationProps {\n settings: DataTableSettings;\n}\n\nconst PAGE_SIZE_OPTIONS = [\n { label: \"10 rows\", value: 10 },\n { label: \"25 rows\", value: 25 },\n { label: \"50 rows\", value: 50 },\n { label: \"100 rows\", value: 100 },\n];\n\nexport function DataTablePagination({ settings }: DataTablePaginationProps) {\n const { pageSize, currentPage } = settings;\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n const updateChart = useDataLayer((state) => state.updateChart);\n\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: number; [key: string]: any } => row !== undefined\n ) || [];\n\n const totalPages = Math.ceil(filteredData.length / pageSize);\n\n const handlePageSizeChange = (value: string) => {\n const newPageSize = parseInt(value, 10);\n const newCurrentPage = Math.min(\n Math.ceil((currentPage * pageSize) / newPageSize),\n Math.ceil(filteredData.length / newPageSize)\n );\n updateChart(settings.id, {\n pageSize: newPageSize,\n currentPage: newCurrentPage,\n });\n };\n\n const handlePageChange = (newPage: number) => {\n if (newPage >= 1 && newPage <= totalPages) {\n updateChart(settings.id, { currentPage: newPage });\n }\n };\n\n return (\n <div className=\"flex items-center justify-between px-2 py-4\">\n <div className=\"flex items-center space-x-2\">\n <p className=\"text-sm text-gray-700\">{filteredData.length} rows</p>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Select\n value={pageSize.toString()}\n onValueChange={handlePageSizeChange}\n >\n <SelectTrigger className=\"h-8 w-[100px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PAGE_SIZE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <p className=\"text-sm text-gray-700\">\n Page {currentPage} of {totalPages}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Download, Search } from \"lucide-react\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableToolbarProps {\n settings: DataTableSettings;\n}\n\nexport function DataTableToolbar({ settings }: DataTableToolbarProps) {\n const updateChart = useDataLayer((state) => state.updateChart);\n const data = useDataLayer((state) => state.data);\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n\n const handleSearch = (value: string) => {\n updateChart(settings.id, {\n ...settings,\n globalSearch: value,\n currentPage: 1, // Reset to first page when searching\n });\n };\n\n const handleExport = () => {\n // Get filtered data from liveItems\n const filteredData =\n liveItems?.items\n .filter((item) => item.value > 0)\n .map((item) => data.find((row) => row.__ID === item.key))\n .filter(\n (row): row is { __ID: number; [key: string]: any } =>\n row !== undefined\n ) || [];\n\n // Apply global search if present\n const searchFilteredData = settings.globalSearch\n ? filteredData.filter((row) => {\n const searchLower = settings.globalSearch.toLowerCase();\n return Object.values(row).some((value) => {\n if (value === null || value === undefined) {\n return false;\n }\n const strValue = String(value).toLowerCase();\n return strValue.includes(searchLower);\n });\n })\n : filteredData;\n\n // Create CSV content\n const headers = settings.columns.map((col) => col.field).join(\",\");\n const rows = searchFilteredData.map((row) =>\n settings.columns\n .map((col) => {\n const value = row[col.id];\n // Escape commas and quotes in the value\n if (\n typeof value === \"string\" &&\n (value.includes(\",\") || value.includes('\"'))\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n })\n .join(\",\")\n );\n\n const csvContent = [headers, ...rows].join(\"\\n\");\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.setAttribute(\"href\", url);\n link.setAttribute(\n \"download\",\n `table-export-${new Date().toISOString()}.csv`\n );\n link.style.visibility = \"hidden\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n return (\n <div className=\"flex items-center justify-between p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n className=\"pl-8\"\n value={settings.globalSearch}\n onChange={(e) => handleSearch(e.target.value)}\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-2\"\n onClick={handleExport}\n >\n <Download className=\"h-4 w-4\" />\n Export\n </Button>\n </div>\n </div>\n );\n}\n","import { BaseChartProps } from \"@/types/ChartTypes\";\nimport { DataTableBody } from \"./DataTableBody\";\nimport { DataTableHeader } from \"./DataTableHeader\";\nimport { DataTablePagination } from \"./DataTablePagination\";\nimport { DataTableToolbar } from \"./DataTableToolbar\";\nimport { DataTableSettings } from \"./definition\";\n\ninterface DataTableProps extends BaseChartProps {\n settings: DataTableSettings;\n}\n\nexport function DataTable({ settings, width, height }: DataTableProps) {\n return (\n <div className=\"flex flex-col h-full w-full\">\n <DataTableToolbar settings={settings} />\n <div\n className=\"flex-1 overflow-auto relative\"\n style={{ maxHeight: `${height - 100}px` }} // Subtract toolbar and pagination height\n >\n <table className=\"w-full border-collapse\">\n <DataTableHeader settings={settings} />\n <DataTableBody settings={settings} />\n </table>\n </div>\n <DataTablePagination settings={settings} />\n </div>\n );\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { useColumnNames } from \"../PivotTable/useColumnNames\";\nimport { DataTableSettings } from \"./definition\";\n\nconst PAGE_SIZE_OPTIONS = [\n { label: \"10 rows\", value: 10 },\n { label: \"25 rows\", value: 25 },\n { label: \"50 rows\", value: 50 },\n { label: \"100 rows\", value: 100 },\n] as const;\n\nexport function DataTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<DataTableSettings>) {\n const availableFields = useColumnNames();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Columns</Label>\n <MultiSelect\n options={availableFields.map((f) => ({\n label: f,\n value: f,\n }))}\n value={settings.columns.map((col) => ({\n label: col.field,\n value: col.field,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n columns: values.map((v) => ({\n id: v.value,\n field: v.value,\n })),\n })\n }\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Page Size</Label>\n <ComboBox\n options={PAGE_SIZE_OPTIONS}\n value={PAGE_SIZE_OPTIONS.find((o) => o.value === settings.pageSize)}\n onChange={(option) =>\n onSettingsChange({\n ...settings,\n pageSize: option?.value || 25,\n })\n }\n optionToString={(option) => option.label}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Global Search</Label>\n <Input\n placeholder=\"Search all columns...\"\n value={settings.globalSearch}\n onChange={(e) =>\n onSettingsChange({\n ...settings,\n globalSearch: e.target.value,\n })\n }\n />\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Table } from \"lucide-react\";\n\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DataTable } from \"./DataTable\";\nimport { DataTableSettingsPanel } from \"./DataTableSettingsPanel\";\n\nexport interface DataTableSettings extends BaseChartSettings {\n type: \"data-table\";\n columns: Array<{\n id: string;\n field: string;\n width?: number;\n }>;\n pageSize: number;\n currentPage: number;\n sortBy?: string;\n sortDirection: \"asc\" | \"desc\";\n filters: Filter[];\n globalSearch: string;\n tableHeight: number;\n}\n\nexport const dataTableDefinition: ChartDefinition<DataTableSettings> = {\n type: \"data-table\",\n name: \"Data Table\",\n description: \"Interactive data table with sorting and filtering\",\n icon: Table,\n\n component: DataTable,\n settingsPanel: DataTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"data-table\",\n title: \"Data Table\",\n layout,\n margin: { top: 5, right: 5, bottom: 5, left: 5 },\n columns: [],\n pageSize: 25,\n currentPage: 1,\n sortDirection: \"asc\",\n filters: [],\n globalSearch: \"\",\n tableHeight: 400,\n }),\n\n validateSettings: (settings) => {\n return settings.columns.length > 0;\n },\n\n getFilterFunction: (\n settings: DataTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // If no filters are active, return true\n if (settings.filters.length === 0) {\n return (d: IdType) => true;\n }\n\n // Create filter functions for each active filter\n const filterFunctions = settings.filters.map((filter) => {\n const column = settings.columns.find((col) => col.field === filter.field);\n if (!column) {\n return () => true;\n }\n\n const dataHash = fieldGetter(column.field);\n\n return (d: IdType) => {\n const value = dataHash[d];\n if (value === undefined) {\n return false;\n }\n\n if (applyFilter(value, filter)) {\n return true;\n }\n\n return false;\n };\n });\n\n // Combine all filter functions with AND logic\n return (d: IdType) => filterFunctions.every((fn) => fn(d));\n },\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n\nexport { Progress };\n","import { datum } from \"@/types/ChartTypes\";\n\nexport type DataType = \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n\nexport function detectColumnType(columnData: {\n [key: number]: datum;\n}): DataType {\n // Convert object to array for easier processing\n const values = Object.values(columnData);\n\n // Skip null/undefined values for type detection\n const nonNullValues = values.filter((v) => v != null);\n if (nonNullValues.length === 0) {\n return \"categorical\";\n }\n\n // Check if all values are boolean\n const booleanValues = new Set([\"true\", \"false\", true, false]);\n if (nonNullValues.every((v) => booleanValues.has(v as string | boolean))) {\n return \"boolean\";\n }\n\n // Check if all values are numbers or can be converted to numbers\n if (nonNullValues.every((v) => !isNaN(Number(v)))) {\n return \"numeric\";\n }\n\n // Check if all values are valid dates\n if (nonNullValues.every((v) => !isNaN(Date.parse(String(v))))) {\n return \"datetime\";\n }\n\n // Default to categorical if no other type matches\n return \"categorical\";\n}\n","import { datum } from \"@/types/ChartTypes\";\n\nexport interface SamplingOptions {\n sampleSize?: number;\n method: \"random\" | \"systematic\";\n seed?: number;\n}\n\nexport function sampleData(\n data: { [key: number]: datum },\n options: SamplingOptions = { method: \"random\", sampleSize: 1000 }\n): { [key: number]: datum } {\n const values = Object.entries(data);\n const totalSize = values.length;\n const sampleSize = Math.min(options.sampleSize || 1000, totalSize);\n\n if (options.method === \"systematic\") {\n const step = Math.floor(totalSize / sampleSize);\n return Object.fromEntries(\n values.filter((_, index) => index % step === 0).slice(0, sampleSize)\n );\n }\n\n // Random sampling\n const shuffled = [...values];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n\n return Object.fromEntries(shuffled.slice(0, sampleSize));\n}\n\nexport function estimateStatisticalSignificance(\n sampleSize: number,\n populationSize: number\n): {\n marginOfError: number;\n confidenceInterval: [number, number];\n} {\n // Using standard error formula for finite populations\n const z = 1.96; // z-score for 95% confidence level\n const p = 0.5; // assuming maximum variance\n const marginOfError =\n z *\n Math.sqrt((p * (1 - p)) / sampleSize) *\n Math.sqrt((populationSize - sampleSize) / (populationSize - 1));\n\n return {\n marginOfError,\n confidenceInterval: [0.5 - marginOfError, 0.5 + marginOfError],\n };\n}\n","import { datum } from \"@/types/ChartTypes\";\nimport { DataType } from \"./dataTypeDetection\";\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ninterface ColumnStatistics {\n dataType: DataType;\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\nexport function calculateColumnStatistics(\n columnData: { [key: number]: datum },\n dataType: DataType\n): ColumnStatistics {\n const values = Object.values(columnData);\n const totalCount = values.length;\n const nullCount = values.filter((v) => v == null).length;\n const uniqueValues = new Set(values);\n const uniqueCount = uniqueValues.size;\n\n if (dataType === \"numeric\") {\n const numericValues = values\n .filter((v) => v != null)\n .map((v) => Number(v))\n .filter((v) => !isNaN(v));\n\n if (numericValues.length === 0) {\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n };\n }\n\n const sorted = [...numericValues].sort((a, b) => a - b);\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n const sum = numericValues.reduce((a, b) => a + b, 0);\n const mean = sum / numericValues.length;\n const median =\n sorted.length % 2 === 0\n ? (sorted[sorted.length / 2 - 1] + sorted[sorted.length / 2]) / 2\n : sorted[Math.floor(sorted.length / 2)];\n const squaredDiffs = numericValues.map((v) => Math.pow(v - mean, 2));\n const variance =\n squaredDiffs.reduce((a, b) => a + b, 0) / numericValues.length;\n const stdDev = Math.sqrt(variance);\n\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n statistics: {\n min,\n max,\n mean,\n median,\n stdDev,\n },\n };\n } else {\n // For non-numeric types, calculate category statistics\n const distribution: Record<string, number> = {};\n values.forEach((v) => {\n const key = String(v);\n distribution[key] = (distribution[key] || 0) + 1;\n });\n\n const topValues = Object.entries(distribution)\n .map(([value, count]) => ({ value, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n dataType,\n totalCount,\n uniqueCount,\n nullCount,\n categories: {\n topValues,\n distribution,\n },\n };\n }\n}\n","import { Calendar, Hash, HelpCircle, ToggleLeft, Type } from \"lucide-react\";\nimport { DataType } from \"../utils/dataTypeDetection\";\n\ninterface DataTypeIconProps {\n type: DataType | \"unknown\";\n}\n\nexport function DataTypeIcon({ type }: DataTypeIconProps) {\n const iconMap: Record<\n DataType | \"unknown\",\n { icon: typeof Hash; label: string }\n > = {\n numeric: { icon: Hash, label: \"Numeric\" },\n datetime: { icon: Calendar, label: \"Date/Time\" },\n categorical: { icon: Type, label: \"Categorical\" },\n boolean: { icon: ToggleLeft, label: \"Boolean\" },\n unknown: { icon: HelpCircle, label: \"Unknown\" },\n };\n\n const { icon: Icon, label } = iconMap[type];\n\n return <Icon className=\"h-4 w-4\" />;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-w-sm rounded-md px-3 py-1.5 text-xs\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { Badge } from \"@/components/ui/badge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { ArrowDown, ArrowUp, Hash } from \"lucide-react\";\nimport { LucideIcon } from \"lucide-react\";\n\ninterface StatBadgeProps {\n type: \"min\" | \"max\" | \"common\";\n value: string | number;\n count?: number;\n icon?: LucideIcon;\n}\n\nconst defaultIcons: Record<StatBadgeProps[\"type\"], LucideIcon> = {\n min: ArrowDown,\n max: ArrowUp,\n common: Hash,\n};\n\nexport function StatBadge({\n type,\n value,\n count,\n icon: IconProp,\n}: StatBadgeProps) {\n const Icon = IconProp || defaultIcons[type];\n const tooltipContent = count !== undefined ? `Count: ${count}` : value;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Icon className=\"h-3 w-3\" />\n <span className=\"truncate max-w-[100px]\">{value}</span>\n </Badge>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartType } from \"@/types/ChartTypes\";\n\nexport function useCreateCharts() {\n const addChart = useDataLayer((s) => s.addChart);\n\n const createChart = (type: ChartType, field: string) => {\n const layout = {\n x: 5,\n y: 0,\n w: 6,\n h: 4,\n };\n\n const definition = getChartDefinition(type);\n if (!definition) {\n throw new Error(`Chart type ${type} not registered`);\n }\n\n const settings = definition.createDefaultSettings(layout, field);\n addChart(settings);\n };\n\n return { createChart };\n}\n","import { Button } from \"@/components/ui/button\";\nimport { BarChart, LineChart, ScatterChart, Table2 } from \"lucide-react\";\nimport { useCreateCharts } from \"@/hooks/useCreateCharts\";\n\ninterface ChartActionsProps {\n columnName: string;\n dataType: \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n}\n\nexport function ChartActions({ columnName, dataType }: ChartActionsProps) {\n const { createChart } = useCreateCharts();\n\n return (\n <div className=\"flex gap-1\">\n {dataType === \"categorical\" && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"row\", columnName)}\n >\n <BarChart className=\"h-4 w-4 rotate-90\" />\n </Button>\n )}\n\n {dataType === \"numeric\" && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"bar\", columnName)}\n >\n <BarChart className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"scatter\", columnName)}\n >\n <ScatterChart className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n\n {(dataType === \"categorical\" || dataType === \"datetime\") && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => createChart(\"pivot\", columnName)}\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { ArrowUpDown, AlertCircle } from \"lucide-react\";\nimport { DataTypeIcon } from \"./DataTypeIcon\";\nimport { StatBadge } from \"./StatBadge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { ChartActions } from \"./ChartActions\";\nimport { DataType } from \"../utils/dataTypeDetection\";\n\ninterface ColumnSummary {\n name: string;\n dataType: DataType | \"unknown\";\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ninterface CompactSummaryTableProps {\n data: ColumnSummary[];\n onSort: (column: keyof ColumnSummary) => void;\n totalRows: number;\n}\n\nexport function CompactSummaryTable({\n data,\n onSort,\n totalRows,\n}: CompactSummaryTableProps) {\n return (\n <div className=\"rounded-md border\">\n <div className=\"flex items-center justify-between border-b px-4 py-2\">\n <span className=\"text-sm text-muted-foreground\">\n Rows available: {totalRows.toLocaleString()}\n </span>\n </div>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-24\"></TableHead>\n <TableHead>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n onClick={() => onSort(\"name\")}\n className=\"h-8 text-left font-medium\"\n >\n Column\n <ArrowUpDown className=\"ml-2 h-4 w-4\" />\n </Button>\n </div>\n </TableHead>\n <TableHead className=\"w-16\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <span>Count</span>\n </TooltipTrigger>\n <TooltipContent>\n <p>Unique values / Total values</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </TableHead>\n <TableHead>Stats</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((summary) => (\n <TableRow key={summary.name}>\n <TableCell>\n <div className=\"flex gap-1\">\n <ChartActions\n columnName={summary.name}\n dataType={\n summary.dataType === \"unknown\"\n ? \"categorical\"\n : summary.dataType\n }\n />\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <DataTypeIcon type={summary.dataType} />\n <span className=\"font-semibold\">{summary.name}</span>\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex items-center gap-1\">\n <span>{summary.uniqueCount}</span>\n {summary.nullCount > 0 && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger>\n <AlertCircle className=\"h-4 w-4 text-yellow-500\" />\n </TooltipTrigger>\n <TooltipContent>\n <p>{summary.nullCount} null values</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex gap-2\">\n {summary.statistics && (\n <>\n <StatBadge type=\"min\" value={summary.statistics.min} />\n <StatBadge type=\"max\" value={summary.statistics.max} />\n </>\n )}\n {summary.categories && summary.categories.topValues[0] && (\n <StatBadge\n type=\"common\"\n value={summary.categories.topValues[0].value}\n count={summary.categories.topValues[0].count}\n />\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Download, Loader2 } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { detectColumnType } from \"../../SummaryTable/utils/dataTypeDetection\";\nimport {\n estimateStatisticalSignificance,\n sampleData,\n} from \"../../SummaryTable/utils/samplingStrategy\";\nimport { calculateColumnStatistics } from \"../../SummaryTable/utils/statisticsCalculator\";\n\nimport { Slider } from \"@/components/ui/slider\";\nimport { toast } from \"sonner\";\nimport { DataType } from \"../../SummaryTable/utils/dataTypeDetection\";\nimport { CompactSummaryTable } from \"../../SummaryTable/components/CompactSummaryTable\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\n\ninterface ColumnSummary {\n name: string;\n dataType: DataType | \"unknown\";\n totalCount: number;\n uniqueCount: number;\n nullCount: number;\n statistics?: NumericStatistics;\n categories?: CategoryStatistics;\n}\n\ninterface NumericStatistics {\n min: number;\n max: number;\n mean: number;\n median: number;\n stdDev: number;\n}\n\ninterface CategoryStatistics {\n topValues: Array<{ value: string; count: number }>;\n distribution: Record<string, number>;\n}\n\ntype SortConfig = {\n column: keyof ColumnSummary | null;\n direction: \"asc\" | \"desc\";\n};\n\n// Add this function before the SummaryTable component\nconst exportToCSV = (summaries: ColumnSummary[]) => {\n // Create CSV header\n const headers = [\n \"Column\",\n \"Type\",\n \"Total\",\n \"Unique\",\n \"Null\",\n \"Min\",\n \"Max\",\n \"Mean\",\n \"Median\",\n \"StdDev\",\n \"Top Values\",\n ];\n\n // Convert summaries to CSV rows\n const rows = summaries.map((summary) => {\n const stats = summary.statistics || ({} as NumericStatistics);\n const categories = summary.categories || ({} as CategoryStatistics);\n\n return [\n summary.name,\n summary.dataType,\n summary.totalCount,\n summary.uniqueCount,\n summary.nullCount,\n stats.min !== undefined ? stats.min.toFixed(2) : \"\",\n stats.max !== undefined ? stats.max.toFixed(2) : \"\",\n stats.mean !== undefined ? stats.mean.toFixed(2) : \"\",\n stats.median !== undefined ? stats.median.toFixed(2) : \"\",\n stats.stdDev !== undefined ? stats.stdDev.toFixed(2) : \"\",\n categories.topValues\n ? categories.topValues.map((v) => `${v.value}(${v.count})`).join(\"; \")\n : \"\",\n ];\n });\n\n // Combine headers and rows\n const csvContent = [\n headers.join(\",\"),\n ...rows.map((row) => row.map((cell) => `\"${cell}\"`).join(\",\")),\n ].join(\"\\n\");\n\n // Create and trigger download\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", \"summary_table.csv\");\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n toast.success(\"Summary table exported to CSV\");\n};\n\nexport function SummaryTable({ height }: BaseChartProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const [sortConfig, setSortConfig] = useState<SortConfig>({\n column: null,\n direction: \"asc\",\n });\n const [useSampling, setUseSampling] = useState(true);\n const [sampleSize, setSampleSize] = useState(1000);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingProgress, setProcessingProgress] = useState(0);\n\n // Progressive loading state\n const [processedColumns, setProcessedColumns] = useState<Set<string>>(\n new Set()\n );\n const [processingQueue, setProcessingQueue] = useState<string[]>([]);\n const [columnSummaryData, setColumnSummaryData] = useState<\n Record<string, ColumnSummary>\n >({});\n\n // Get total row count\n const totalRowCount = useCallback(() => {\n const firstColumn = getColumnNames()[0];\n return firstColumn ? Object.keys(getColumnData(firstColumn)).length : 0;\n }, [getColumnNames, getColumnData]);\n\n // Determine if sampling should be available\n const samplingAvailable = totalRowCount() > sampleSize;\n\n // Ensure sampling is disabled when not available\n useEffect(() => {\n if (!samplingAvailable && useSampling) {\n setUseSampling(false);\n }\n }, [samplingAvailable, useSampling]);\n\n const columnSummaries = useCallback(() => {\n const columnNames = getColumnNames();\n\n // Initialize processing queue if empty\n if (processingQueue.length === 0 && processedColumns.size === 0) {\n setProcessingQueue(columnNames);\n }\n\n return columnNames.map((columnName) => {\n // Return cached data if already processed\n if (columnSummaryData[columnName]) {\n return columnSummaryData[columnName];\n }\n\n // Return placeholder data for unprocessed columns\n return {\n name: columnName,\n dataType: \"unknown\" as const,\n totalCount: 0,\n uniqueCount: 0,\n nullCount: 0,\n };\n });\n }, [getColumnNames, processingQueue, processedColumns, columnSummaryData]);\n\n // Process columns progressively\n const processNextColumn = useCallback(async () => {\n if (processingQueue.length === 0 || isProcessing) {\n return;\n }\n\n setIsProcessing(true);\n const columnName = processingQueue[0];\n\n try {\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const columnData = getColumnData(columnName);\n const shouldUseSampling = useSampling && samplingAvailable;\n const sampledData = shouldUseSampling\n ? sampleData(columnData, { method: \"random\", sampleSize })\n : columnData;\n\n const dataType = detectColumnType(sampledData);\n const statistics = calculateColumnStatistics(sampledData, dataType);\n\n setColumnSummaryData((prev) => ({\n ...prev,\n [columnName]: {\n name: columnName,\n ...statistics,\n },\n }));\n\n setProcessedColumns((prev) => new Set([...prev, columnName]));\n setProcessingQueue((prev) => prev.slice(1));\n\n const progress =\n ((processedColumns.size + 1) /\n (processedColumns.size + processingQueue.length)) *\n 100;\n setProcessingProgress(progress);\n\n if (processingQueue.length === 1) {\n toast.success(\"Processing Complete\");\n }\n } catch (error) {\n toast.error(`Error processing column ${columnName}`);\n } finally {\n setIsProcessing(false);\n }\n }, [\n processingQueue,\n isProcessing,\n processedColumns,\n getColumnData,\n useSampling,\n sampleSize,\n samplingAvailable,\n ]);\n\n // Process columns when queue changes\n useEffect(() => {\n if (processingQueue.length > 0) {\n processNextColumn();\n }\n }, [processingQueue, processNextColumn]);\n\n const handleSampleSizeChange = useCallback(\n (value: number[]) => {\n setSampleSize(value[0]);\n // Reset processing state to reanalyze with new sample size\n setProcessedColumns(new Set());\n setProcessingQueue(getColumnNames());\n setColumnSummaryData({});\n setProcessingProgress(0);\n },\n [getColumnNames]\n );\n\n const significance = useMemo(() => {\n if (!useSampling) {\n return null;\n }\n return estimateStatisticalSignificance(sampleSize, totalRowCount());\n }, [useSampling, sampleSize, totalRowCount]);\n\n const sortedSummaries = useMemo(() => {\n const summaries = columnSummaries();\n if (!sortConfig.column) {\n return summaries;\n }\n\n return [...summaries].sort((a, b) => {\n const aValue = a[sortConfig.column as keyof ColumnSummary];\n const bValue = b[sortConfig.column as keyof ColumnSummary];\n\n if (aValue === bValue) {\n return 0;\n }\n if (aValue == null) {\n return 1;\n }\n if (bValue == null) {\n return -1;\n }\n\n // Handle different types of values\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n return sortConfig.direction === \"asc\"\n ? aValue - bValue\n : bValue - aValue;\n }\n\n // Convert to strings for comparison\n const aStr = String(aValue);\n const bStr = String(bValue);\n return sortConfig.direction === \"asc\"\n ? aStr.localeCompare(bStr)\n : bStr.localeCompare(aStr);\n });\n }, [columnSummaries, sortConfig]);\n\n const handleSort = (column: keyof ColumnSummary) => {\n setSortConfig((current) => ({\n column,\n direction:\n current.column === column && current.direction === \"asc\"\n ? \"desc\"\n : \"asc\",\n }));\n };\n\n return (\n <div className=\"space-y-4 overflow-auto\" style={{ height }}>\n <div className=\"space-y-4\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-4\">\n <div>\n {samplingAvailable && (\n <Badge variant={useSampling ? \"default\" : \"outline\"}>\n {useSampling ? \"Sampling Enabled\" : \"Full Dataset\"}\n </Badge>\n )}\n {!samplingAvailable && (\n <Badge variant=\"secondary\">\n Using Full Dataset ({totalRowCount()} rows)\n </Badge>\n )}\n\n {samplingAvailable && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setUseSampling(!useSampling);\n setProcessedColumns(new Set());\n setProcessingQueue(getColumnNames());\n setProcessingProgress(0);\n }}\n >\n Toggle Sampling\n </Button>\n )}\n </div>\n\n {useSampling && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n Sample Size: {sampleSize}\n </span>\n {significance && (\n <span className=\"text-sm text-muted-foreground\">\n Margin of Error:{\" \"}\n {(significance.marginOfError * 100).toFixed(2)}%\n </span>\n )}\n </div>\n <Slider\n value={[sampleSize]}\n min={100}\n max={10000}\n step={100}\n onValueChange={handleSampleSizeChange}\n />\n </div>\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => exportToCSV(sortedSummaries)}\n disabled={isProcessing || processingQueue.length > 0}\n >\n <Download className=\"mr-2 h-4 w-4\" />\n Export to CSV\n </Button>\n </div>\n\n {(isProcessing || processingQueue.length > 0) && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm text-muted-foreground\">\n Processing columns... {processedColumns.size} of{\" \"}\n {processedColumns.size + processingQueue.length}\n </span>\n </div>\n <Progress value={processingProgress} />\n </div>\n )}\n </div>\n\n <CompactSummaryTable\n data={sortedSummaries}\n onSort={handleSort}\n totalRows={totalRowCount()}\n />\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { SummaryTableSettings } from \"./definition\";\n\nexport function SummaryTableSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<SummaryTableSettings>) {\n // Summary table has no additional settings beyond the base settings\n return null;\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Info } from \"lucide-react\";\n\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { SummaryTable } from \"./SummaryTable\";\nimport { SummaryTableSettingsPanel } from \"./SummaryTableSettingsPanel\";\n\nexport interface SummaryTableSettings extends BaseChartSettings {\n type: \"summary\";\n // Summary table is a simple display of statistics\n // It inherits all base settings and doesn't need additional settings\n}\n\nexport const summaryTableDefinition: ChartDefinition<SummaryTableSettings> = {\n type: \"summary\",\n name: \"Summary Table\",\n description: \"Display summary statistics for your data\",\n icon: Info,\n\n component: SummaryTable,\n settingsPanel: SummaryTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"summary\",\n title: \"Summary Table\",\n layout,\n margin: { top: 20, right: 20, bottom: 20, left: 20 },\n }),\n\n validateSettings: (settings) => {\n // Summary table is always valid as it shows basic statistics\n return true;\n },\n\n getFilterFunction: (\n settings: SummaryTableSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n // Summary table doesn't support filtering\n return (d: IdType) => true;\n },\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0 transition-[color,box-shadow]\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-2 min-w-9\",\n sm: \"h-8 px-1.5 min-w-8\",\n lg: \"h-10 px-2.5 min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Toggle, toggleVariants };\n","import * as React from \"react\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport { type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\nimport { toggleVariants } from \"@/components/ui/toggle\";\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants>\n>({\n size: \"default\",\n variant: \"default\",\n});\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n className={cn(\n \"group/toggle-group flex items-center justify-center rounded-md data-[variant=outline]:shadow-xs\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n );\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n \"min-w-0 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l\",\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n","import { useCurrentEditor } from \"@tiptap/react\";\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport {\n ChevronDown,\n ChevronUp,\n Bold,\n Italic,\n Strikethrough,\n Code,\n X,\n Trash2,\n PilcrowSquare,\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n List,\n ListOrdered,\n Quote,\n Minus,\n WrapText,\n Undo2,\n Redo2,\n Palette,\n Eye,\n Type,\n Monitor,\n} from \"lucide-react\";\n\ntype DisplayMode = \"icon\" | \"text\" | \"both\";\n\nexport function MenuBar() {\n const { editor } = useCurrentEditor();\n const [showControls, setShowControls] = useState(false);\n const [displayMode, setDisplayMode] = useState<DisplayMode>(\"icon\");\n\n if (!editor) {\n return null;\n }\n\n const renderContent = (icon: React.ReactNode, text: string) => {\n if (displayMode === \"icon\") {\n return icon;\n }\n if (displayMode === \"text\") {\n return text;\n }\n return (\n <>\n {icon}\n <span className=\"ml-2\">{text}</span>\n </>\n );\n };\n\n return (\n <div className=\"control-group\">\n <div className=\"flex gap-2 mb-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowControls(!showControls)}\n title={\n showControls ? \"Hide toolbar controls\" : \"Show toolbar controls\"\n }\n >\n {showControls ? (\n <>\n Hide Controls <ChevronUp className=\"ml-2 h-4 w-4\" />\n </>\n ) : (\n <>\n Show Controls <ChevronDown className=\"ml-2 h-4 w-4\" />\n </>\n )}\n </Button>\n {showControls && (\n <ToggleGroup\n type=\"single\"\n value={displayMode}\n onValueChange={(value) =>\n value && setDisplayMode(value as DisplayMode)\n }\n >\n <ToggleGroupItem value=\"icon\" title=\"Show icons only\">\n <Eye className=\"h-4 w-4\" />\n <span className=\"ml-2\">Icons Only</span>\n </ToggleGroupItem>\n <ToggleGroupItem value=\"text\" title=\"Show text only\">\n <Type className=\"h-4 w-4\" />\n <span className=\"ml-2\">Text Only</span>\n </ToggleGroupItem>\n <ToggleGroupItem value=\"both\" title=\"Show both icons and text\">\n <Monitor className=\"h-4 w-4\" />\n <span className=\"ml-2\">Icons & Text</span>\n </ToggleGroupItem>\n </ToggleGroup>\n )}\n </div>\n {showControls && (\n <div className=\"button-group flex flex-wrap gap-2\">\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n disabled={!editor.can().chain().focus().toggleBold().run()}\n className={editor.isActive(\"bold\") ? \"is-active\" : \"\"}\n title=\"Toggle bold text\"\n >\n {renderContent(<Bold className=\"h-4 w-4\" />, \"Bold\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n disabled={!editor.can().chain().focus().toggleItalic().run()}\n className={editor.isActive(\"italic\") ? \"is-active\" : \"\"}\n title=\"Toggle italic text\"\n >\n {renderContent(<Italic className=\"h-4 w-4\" />, \"Italic\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n disabled={!editor.can().chain().focus().toggleStrike().run()}\n className={editor.isActive(\"strike\") ? \"is-active\" : \"\"}\n title=\"Toggle strikethrough text\"\n >\n {renderContent(<Strikethrough className=\"h-4 w-4\" />, \"Strike\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n disabled={!editor.can().chain().focus().toggleCode().run()}\n className={editor.isActive(\"code\") ? \"is-active\" : \"\"}\n title=\"Toggle inline code\"\n >\n {renderContent(<Code className=\"h-4 w-4\" />, \"Code\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().unsetAllMarks().run()}\n title=\"Clear all text formatting\"\n >\n {renderContent(<X className=\"h-4 w-4\" />, \"Clear marks\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().clearNodes().run()}\n title=\"Clear all block formatting\"\n >\n {renderContent(<Trash2 className=\"h-4 w-4\" />, \"Clear nodes\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().setParagraph().run()}\n className={editor.isActive(\"paragraph\") ? \"is-active\" : \"\"}\n title=\"Convert to paragraph\"\n >\n {renderContent(<PilcrowSquare className=\"h-4 w-4\" />, \"Paragraph\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 1 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 1\"\n >\n {renderContent(<Heading1 className=\"h-4 w-4\" />, \"H1\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 2 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 2\"\n >\n {renderContent(<Heading2 className=\"h-4 w-4\" />, \"H2\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 3 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 3\"\n >\n {renderContent(<Heading3 className=\"h-4 w-4\" />, \"H3\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 4 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 4 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 4\"\n >\n {renderContent(<Heading4 className=\"h-4 w-4\" />, \"H4\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 5 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 5 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 5\"\n >\n {renderContent(<Heading5 className=\"h-4 w-4\" />, \"H5\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 6 }).run()\n }\n className={\n editor.isActive(\"heading\", { level: 6 }) ? \"is-active\" : \"\"\n }\n title=\"Toggle heading 6\"\n >\n {renderContent(<Heading6 className=\"h-4 w-4\" />, \"H6\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n className={editor.isActive(\"bulletList\") ? \"is-active\" : \"\"}\n title=\"Toggle bullet list\"\n >\n {renderContent(<List className=\"h-4 w-4\" />, \"Bullet list\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n className={editor.isActive(\"orderedList\") ? \"is-active\" : \"\"}\n title=\"Toggle ordered list\"\n >\n {renderContent(<ListOrdered className=\"h-4 w-4\" />, \"Ordered list\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n className={editor.isActive(\"codeBlock\") ? \"is-active\" : \"\"}\n title=\"Toggle code block\"\n >\n {renderContent(<Code className=\"h-4 w-4\" />, \"Code block\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n className={editor.isActive(\"blockquote\") ? \"is-active\" : \"\"}\n title=\"Toggle blockquote\"\n >\n {renderContent(<Quote className=\"h-4 w-4\" />, \"Blockquote\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Insert horizontal rule\"\n >\n {renderContent(<Minus className=\"h-4 w-4\" />, \"Horizontal rule\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().setHardBreak().run()}\n title=\"Insert hard break\"\n >\n {renderContent(<WrapText className=\"h-4 w-4\" />, \"Hard break\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().chain().focus().undo().run()}\n title=\"Undo last change\"\n >\n {renderContent(<Undo2 className=\"h-4 w-4\" />, \"Undo\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().chain().focus().redo().run()}\n title=\"Redo last change\"\n >\n {renderContent(<Redo2 className=\"h-4 w-4\" />, \"Redo\")}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => editor.chain().focus().setColor(\"#958DF1\").run()}\n className={\n editor.isActive(\"textStyle\", { color: \"#958DF1\" })\n ? \"is-active\"\n : \"\"\n }\n title=\"Set text color to purple\"\n >\n {renderContent(<Palette className=\"h-4 w-4\" />, \"Purple\")}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","import \"./styles.css\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport ListItem from \"@tiptap/extension-list-item\";\nimport TextStyle from \"@tiptap/extension-text-style\";\nimport { EditorProvider } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { MarkdownSettings } from \"./definition\";\n\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { MenuBar } from \"./MenuBar\";\n\nexport function Markdown({\n settings,\n width,\n height,\n}: BaseChartProps<MarkdownSettings>) {\n const updateChart = useDataLayer((s) => s.updateChart);\n\n return (\n <div style={{ width, height }} className=\"flex flex-col overflow-auto p-1\">\n <EditorProvider\n slotBefore={<MenuBar />}\n extensions={extensions}\n content={settings.content}\n onUpdate={(value) => {\n updateChart(settings.id, {\n ...settings,\n content: value.editor.getHTML(),\n });\n }}\n />\n </div>\n );\n}\n\nconst extensions = [\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\n TextStyle.configure({ types: [ListItem.name] }),\n StarterKit.configure({\n bulletList: {\n keepMarks: true,\n keepAttributes: false,\n },\n orderedList: {\n keepMarks: true,\n keepAttributes: false,\n },\n }),\n];\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { FileText } from \"lucide-react\";\nimport { Markdown } from \"./Markdown\";\n\nexport interface MarkdownSettings extends BaseChartSettings {\n type: \"markdown\";\n content: string;\n}\n\nexport const markdownDefinition: ChartDefinition<MarkdownSettings> = {\n type: \"markdown\",\n name: \"Markdown\",\n description: \"A markdown editor for rich text content\",\n icon: FileText,\n\n component: Markdown,\n settingsPanel: () => null,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"markdown\",\n content: \"\",\n layout,\n }),\n\n validateSettings: (settings) => {\n return settings.type === \"markdown\";\n },\n\n getFilterFunction: () => () => true, // No filtering for markdown\n};\n","import { BoxPlotSettings } from \"./definition\";\n\nexport interface BoxPlotStats {\n q1: number;\n median: number;\n q3: number;\n iqr: number;\n whiskerLow: number;\n whiskerHigh: number;\n outliers: number[];\n totalCount: number;\n}\n\nfunction getQuartile(sortedData: number[], q: number): number {\n const pos = (sortedData.length - 1) * q;\n const base = Math.floor(pos);\n const rest = pos - base;\n if (sortedData[base + 1] !== undefined) {\n return sortedData[base] + rest * (sortedData[base + 1] - sortedData[base]);\n } else {\n return sortedData[base];\n }\n}\n\nexport function calculateBoxPlotStats(\n data: number[],\n whiskerType: BoxPlotSettings[\"whiskerType\"]\n): BoxPlotStats {\n if (data.length === 0) {\n return {\n q1: 0,\n median: 0,\n q3: 0,\n iqr: 0,\n whiskerLow: 0,\n whiskerHigh: 0,\n outliers: [],\n totalCount: 0,\n };\n }\n\n const sortedData = [...data].sort((a, b) => a - b);\n const q1 = getQuartile(sortedData, 0.25);\n const median = getQuartile(sortedData, 0.5);\n const q3 = getQuartile(sortedData, 0.75);\n const iqr = q3 - q1;\n\n let whiskerLow: number;\n let whiskerHigh: number;\n let outliers: number[];\n\n switch (whiskerType) {\n case \"tukey\": {\n const lowerFence = q1 - 1.5 * iqr;\n const upperFence = q3 + 1.5 * iqr;\n\n whiskerLow = Math.max(lowerFence, sortedData[0]);\n whiskerHigh = Math.min(upperFence, sortedData[sortedData.length - 1]);\n\n if (whiskerLow > whiskerHigh) {\n whiskerLow = sortedData[0];\n whiskerHigh = sortedData[sortedData.length - 1];\n }\n\n outliers = sortedData.filter((x) => x < whiskerLow || x > whiskerHigh);\n break;\n }\n case \"minmax\": {\n whiskerLow = sortedData[0];\n whiskerHigh = sortedData[sortedData.length - 1];\n outliers = [];\n break;\n }\n case \"stdDev\": {\n const mean =\n sortedData.reduce((sum, x) => sum + x, 0) / sortedData.length;\n const stdDev = Math.sqrt(\n sortedData.reduce((sum, x) => sum + Math.pow(x - mean, 2), 0) /\n sortedData.length\n );\n\n whiskerLow = mean - 2 * stdDev;\n whiskerHigh = mean + 2 * stdDev;\n outliers = sortedData.filter((x) => x < whiskerLow || x > whiskerHigh);\n break;\n }\n }\n\n return {\n q1,\n median,\n q3,\n iqr,\n whiskerLow,\n whiskerHigh,\n outliers,\n totalCount: data.length,\n };\n}\n\nexport function calculateKernelDensity(\n data: number[],\n bandwidth: number,\n numPoints: number = 100\n): [number, number][] {\n const sortedData = [...data].sort((a, b) => a - b);\n const min = sortedData[0];\n const max = sortedData[sortedData.length - 1];\n const range = max - min;\n\n const points = Array.from({ length: numPoints }, (_, i) => {\n const t = i / (numPoints - 1);\n return min + t * range;\n });\n\n const density = points.map((x) => {\n const sum = sortedData.reduce((acc, xi) => {\n const diff = x - xi;\n return acc + Math.exp(-(diff * diff) / (2 * bandwidth * bandwidth));\n }, 0);\n const densityValue =\n sum / (sortedData.length * bandwidth * Math.sqrt(2 * Math.PI));\n\n return [x, densityValue] as [number, number];\n });\n\n const maxDensity = Math.max(...density.map(([_, y]) => y));\n\n return density.map(([x, y]) => [x, y / maxDensity] as [number, number]);\n}\n\nexport function calculateBeeSwarmPositions(\n data: number[],\n width: number,\n maxPoints: number = 1000\n): [number, number][] {\n if (data.length > maxPoints) {\n const sampledData = [...data]\n .sort(() => Math.random() - 0.5)\n .slice(0, maxPoints);\n return calculateBeeSwarmPositionsForData(sampledData, width);\n }\n return calculateBeeSwarmPositionsForData(data, width);\n}\n\nfunction calculateBeeSwarmPositionsForData(\n data: number[],\n width: number\n): [number, number][] {\n const positions: [number, number][] = [];\n const radius = 2;\n const spacing = radius * 2;\n\n const sortedData = [...data].sort((a, b) => a - b);\n\n for (const value of sortedData) {\n let x = 0;\n const y = value;\n let attempts = 0;\n const maxAttempts = 100;\n\n while (attempts < maxAttempts) {\n const overlaps = positions.some(([px, py]) => {\n const dx = x - px;\n const dy = y - py;\n return Math.sqrt(dx * dx + dy * dy) < spacing;\n });\n\n if (!overlaps) {\n break;\n }\n\n x = (x + spacing) % width;\n attempts++;\n }\n\n positions.push([x, y]);\n }\n\n return positions;\n}\n","import {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { Filter, datum } from \"@/types/FilterTypes\";\nimport { ScaleLinear, scaleBand, scaleLinear } from \"d3-scale\";\nimport natsort from \"natsort\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport {\n calculateBeeSwarmPositions,\n calculateBoxPlotStats,\n calculateKernelDensity,\n} from \"./boxPlotCalculations\";\nimport { BoxPlotSettings } from \"./definition\";\n\nconst Y_SCALE_PADDING = 0.1; // 10% padding for whiskers\nconst BOX_PADDING = 0.2; // Padding between boxes in a group\n\nexport function BoxPlot({\n settings,\n width,\n height,\n facetIds,\n}: BaseChartProps<BoxPlotSettings>) {\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n\n // Get all data for axis limits calculation\n const allData = useGetColumnDataForIds(settings.field);\n\n // Get filtered data for rendering\n const liveData = useGetLiveData(settings, settings.field, facetIds);\n\n // Get color field data if specified\n const colorFieldData = useGetLiveData(\n settings,\n settings.colorField,\n facetIds\n );\n const hasColorField = !!settings.colorField;\n\n // Chart dimensions\n const margin = settings.margin;\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Group data by color field if specified\n const groupedData = useMemo(() => {\n if (!hasColorField) {\n const validData = liveData.map(Number).filter((x) => !isNaN(x));\n\n const result = [\n {\n group: \"All Data\",\n data: validData,\n },\n ];\n return result;\n }\n\n const groups = new Map<string | number, number[]>();\n\n liveData.forEach((value, index) => {\n const colorValue = colorFieldData[index];\n const numValue = Number(value);\n\n if (colorValue === undefined || colorValue === null) {\n return;\n }\n\n if (isNaN(numValue)) {\n return;\n }\n\n if (typeof colorValue === \"string\" || typeof colorValue === \"number\") {\n if (!groups.has(colorValue)) {\n groups.set(colorValue, []);\n }\n groups.get(colorValue)?.push(numValue);\n }\n });\n\n const result = Array.from(groups.entries()).map(([group, data]) => ({\n group,\n data,\n }));\n\n // If we have no valid groups but we do have data, fall back to single group\n if (result.length === 0 && liveData.length > 0) {\n const validData = liveData.map(Number).filter((x) => !isNaN(x));\n\n return [\n {\n group: \"All Data\",\n data: validData,\n },\n ];\n }\n\n return result;\n }, [liveData, colorFieldData, hasColorField]);\n\n // Calculate statistics for all groups\n const groupStats = useMemo(() => {\n const stats = groupedData.map(({ group, data }) => ({\n group,\n stats: calculateBoxPlotStats(data, settings.whiskerType),\n }));\n return stats;\n }, [groupedData, settings.whiskerType]);\n\n // Calculate KDE for each group if violin overlay is enabled\n const groupKDEs = useMemo(() => {\n if (!settings.violinOverlay) {\n return null;\n }\n\n return groupedData.map(({ group, data }) => {\n // Calculate bandwidth using Silverman's rule of thumb\n const stdDev = Math.sqrt(\n data.reduce(\n (sum, x) =>\n sum +\n Math.pow(x - data.reduce((a, b) => a + b, 0) / data.length, 2),\n 0\n ) / data.length\n );\n const autoBandwidth = 1.06 * stdDev * Math.pow(data.length, -0.2);\n\n const bandwidth = settings.autoBandwidth\n ? autoBandwidth\n : settings.violinBandwidth;\n\n return {\n group,\n kde: calculateKernelDensity(data, bandwidth),\n };\n });\n }, [\n settings.violinOverlay,\n settings.autoBandwidth,\n settings.violinBandwidth,\n groupedData,\n ]);\n\n // Create scales\n const xScale = useMemo(() => {\n const groups = groupedData.map((g) => g.group?.toString() ?? \"All Data\");\n\n // Sort groups based on settings\n const sortedGroups = [...groups].sort((a, b) => {\n if (settings.sortBy === \"median\") {\n const aStats = groupStats.find((g) => g.group?.toString() === a)?.stats;\n const bStats = groupStats.find((g) => g.group?.toString() === b)?.stats;\n return (bStats?.median ?? 0) - (aStats?.median ?? 0);\n }\n return natsort()(a, b);\n });\n\n const scale = scaleBand()\n .domain(sortedGroups)\n .range([0, innerWidth])\n .padding(BOX_PADDING);\n\n return scale;\n }, [groupedData, innerWidth, settings.sortBy, groupStats]);\n\n // Create path generator for violin shapes\n const createPath = useCallback((points: [number, number][]) => {\n if (points.length === 0) {\n return \"\";\n }\n return points\n .map((point, i) => `${i === 0 ? \"M\" : \"L\"} ${point[0]} ${point[1]}`)\n .join(\" \");\n }, []);\n\n // Calculate bee swarm positions for each group if enabled\n const groupBeeSwarmPositions = useMemo(() => {\n if (!settings.beeSwarmOverlay) {\n return null;\n }\n\n return groupedData.map(({ group, data }) => {\n return {\n group,\n positions: calculateBeeSwarmPositions(data, xScale.bandwidth(), 1000),\n };\n });\n }, [groupedData, settings.beeSwarmOverlay, xScale]);\n\n // Get global axis limits if in a facet\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create y scale with synchronized limits if in a facet\n const yScale = useMemo(() => {\n const allStats = groupStats.map((g) => g.stats);\n const min = Math.min(...allStats.map((s) => s.whiskerLow));\n const max = Math.max(...allStats.map((s) => s.whiskerHigh));\n const range = max - min;\n const padding = range * Y_SCALE_PADDING;\n\n const globalMin =\n globalYLimits?.type === \"numerical\" ? globalYLimits.min : min - padding;\n const globalMax =\n globalYLimits?.type === \"numerical\" ? globalYLimits.max : max + padding;\n\n const scale = scaleLinear()\n .domain([globalMin, globalMax])\n .range([innerHeight, 0]);\n\n return scale;\n }, [groupStats, innerHeight, globalYLimits]) as ScaleLinear<number, number>;\n\n // Register axis limits with the facet context\n useEffect(() => {\n if (facetIds && allData.length > 0) {\n registerAxisLimits(settings.id, \"y\", {\n type: \"numerical\",\n min: yScale.domain()[0],\n max: yScale.domain()[1],\n });\n\n if (settings.colorField) {\n registerAxisLimits(settings.id, \"x\", {\n type: \"categorical\",\n categories: new Set(\n groupedData.map((g) => g.group?.toString() ?? \"\")\n ),\n });\n }\n }\n }, [\n settings.id,\n settings.colorField,\n facetIds,\n allData,\n groupStats,\n registerAxisLimits,\n yScale,\n groupedData,\n ]);\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n if (!extent) {\n // Remove range filter for the field\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.field\n );\n updateChart(settings.id, { filters: newFilters });\n return;\n }\n\n const [, [, y1]] = extent;\n const yStart = yScale.invert(y1);\n const yEnd = yScale.invert(extent[0][1]);\n\n // Create new filters array with updated range filter\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.field\n );\n\n newFilters.push({\n type: \"range\",\n field: settings.field,\n min: Math.min(yStart, yEnd),\n max: Math.max(yStart, yEnd),\n });\n\n updateChart(settings.id, { filters: newFilters });\n },\n [settings.id, settings.field, settings.filters, updateChart, yScale]\n );\n\n const activeFilter = useMemo(() => {\n return settings.filters.find(\n (f: Filter) => f.field === settings.colorField\n );\n }, [settings.filters, settings.colorField]);\n\n const handleBoxClick = useCallback(\n (group: string | number) => {\n if (!settings.colorField) {\n return;\n }\n\n let newValues: datum[] = [];\n if (activeFilter && activeFilter.type === \"value\") {\n // If group is already in filter, remove it\n if (activeFilter.values.includes(group)) {\n newValues = activeFilter.values.filter((v) => v !== group);\n } else {\n // Add group to existing filter\n newValues = [...activeFilter.values, group];\n }\n } else {\n // Create new filter with just this group\n newValues = [group];\n }\n\n // Create a new filter for the color field\n const newFilters = settings.filters.filter(\n (f: Filter) => f.field !== settings.colorField\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.colorField,\n values: newValues,\n });\n }\n\n updateChart(settings.id, { filters: newFilters });\n },\n [\n settings.colorField,\n settings.filters,\n settings.id,\n activeFilter,\n updateChart,\n ]\n );\n\n // Helper function to check if a group matches the current filter\n const isGroupFiltered = useCallback(\n (group: string | number) => {\n if (!settings.colorField) {\n return true;\n }\n\n if (\n !activeFilter ||\n activeFilter.type !== \"value\" ||\n !activeFilter.values\n ) {\n return true;\n }\n\n return applyFilter(group, activeFilter);\n },\n [settings.colorField, activeFilter]\n );\n\n return (\n <div style={{ width, height }}>\n <TooltipProvider>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n brushingMode=\"2d\"\n onBrushChange={handleBrushChange}\n settings={settings}\n >\n {/* Axis labels */}\n {settings.xAxisLabel && (\n <text\n x={innerWidth / 2}\n y={innerHeight + margin.bottom - 5}\n textAnchor=\"middle\"\n className=\"text-sm fill-muted-foreground\"\n >\n {settings.xAxisLabel}\n </text>\n )}\n {settings.yAxisLabel && (\n <text\n x={-innerHeight / 2}\n y={-margin.left + 15}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n className=\"text-sm fill-muted-foreground\"\n >\n {settings.yAxisLabel}\n </text>\n )}\n\n {/* Main content */}\n {groupStats.map(({ group, stats }) => {\n const isFiltered = isGroupFiltered(group);\n const boxColor = isFiltered\n ? getColorForValue(\n settings.colorScaleId,\n group ?? settings.styles.boxFill\n )\n : \"rgb(156 163 175)\";\n const xPos = xScale(group?.toString() ?? \"\") ?? 0;\n const boxWidth = xScale.bandwidth();\n\n // Get KDE for this group if violin overlay is enabled\n const kde = groupKDEs?.find((g) => g.group === group)?.kde;\n\n // Get bee swarm positions for this group if enabled\n const beeSwarmPositions = groupBeeSwarmPositions?.find(\n (g) => g.group === group\n )?.positions;\n\n // Create tooltip content for the box\n const boxTooltipContent = (\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{group?.toString() ?? \"All Data\"}</p>\n <p>Total Points: {stats.totalCount}</p>\n <p>Outliers: {stats.outliers.length}</p>\n <p>Q1: {stats.q1.toFixed(2)}</p>\n <p>Median: {stats.median.toFixed(2)}</p>\n <p>Q3: {stats.q3.toFixed(2)}</p>\n <p>IQR: {stats.iqr.toFixed(2)}</p>\n </div>\n );\n\n // Create tooltip content for whiskers\n const whiskerTooltipContent = (\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{group?.toString() ?? \"All Data\"}</p>\n <p>Lower Whisker: {stats.whiskerLow.toFixed(2)}</p>\n <p>Upper Whisker: {stats.whiskerHigh.toFixed(2)}</p>\n </div>\n );\n\n return (\n <g\n key={group?.toString() ?? \"default\"}\n transform={`translate(${xPos}, 0)`}\n >\n {/* Whiskers */}\n <Tooltip>\n <TooltipTrigger asChild>\n <line\n x1={boxWidth / 2}\n x2={boxWidth / 2}\n y1={yScale(stats.whiskerHigh)}\n y2={yScale(stats.whiskerLow)}\n stroke={boxColor}\n strokeWidth={settings.styles.whiskerStrokeWidth}\n />\n </TooltipTrigger>\n <TooltipContent>{whiskerTooltipContent}</TooltipContent>\n </Tooltip>\n\n {/* Box */}\n <Tooltip>\n <TooltipTrigger asChild>\n <rect\n x={0}\n y={yScale(stats.q3)}\n width={boxWidth}\n height={yScale(stats.q1) - yScale(stats.q3)}\n fill={boxColor}\n stroke={settings.styles.boxStroke}\n strokeWidth={settings.styles.boxStrokeWidth}\n onClick={() => handleBoxClick(group)}\n style={{\n cursor: settings.colorField ? \"pointer\" : \"default\",\n }}\n />\n </TooltipTrigger>\n <TooltipContent>{boxTooltipContent}</TooltipContent>\n </Tooltip>\n\n {/* Median line */}\n <line\n x1={0}\n x2={boxWidth}\n y1={yScale(stats.median)}\n y2={yScale(stats.median)}\n stroke={settings.styles.medianStroke}\n strokeWidth={settings.styles.medianStrokeWidth}\n />\n\n {/* Outliers */}\n {settings.showOutliers &&\n stats.outliers.map((value: number, i: number) => (\n <Tooltip key={i}>\n <TooltipTrigger asChild>\n <circle\n cx={boxWidth / 2}\n cy={yScale(value)}\n r={settings.styles.outlierSize}\n fill={boxColor}\n stroke={settings.styles.outlierStroke}\n />\n </TooltipTrigger>\n <TooltipContent>\n <p>Outlier: {value.toFixed(2)}</p>\n </TooltipContent>\n </Tooltip>\n ))}\n\n {/* Violin plot overlay */}\n {settings.violinOverlay && kde && (\n <g>\n <path\n d={createPath(\n settings.beeSwarmOverlay\n ? // If bee swarm is enabled, only show left half of violin\n [\n [boxWidth / 2, yScale(kde[0][0])] as [\n number,\n number,\n ],\n ...kde.map(\n ([x, y]) =>\n [\n boxWidth / 2 - y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n [\n boxWidth / 2,\n yScale(kde[kde.length - 1][0]),\n ] as [number, number],\n ]\n : // Otherwise show full violin\n [\n [boxWidth / 2, yScale(kde[0][0])] as [\n number,\n number,\n ],\n ...kde.map(\n ([x, y]) =>\n [\n boxWidth / 2 + y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n ...kde\n .reverse()\n .map(\n ([x, y]) =>\n [\n boxWidth / 2 - y * boxWidth * 0.4,\n yScale(x),\n ] as [number, number]\n ),\n ]\n )}\n fill={boxColor}\n fillOpacity={0.2}\n stroke={boxColor}\n strokeWidth={1}\n pointerEvents=\"none\"\n />\n </g>\n )}\n\n {/* Bee swarm overlay */}\n {settings.beeSwarmOverlay && beeSwarmPositions && (\n <g>\n {beeSwarmPositions.map(([x, y], i) => (\n <circle\n key={i}\n cx={\n settings.violinOverlay\n ? boxWidth / 2 + Math.abs(x)\n : boxWidth / 2 + x\n }\n cy={yScale(y)}\n r={2}\n fill={boxColor}\n fillOpacity={0.5}\n stroke=\"none\"\n pointerEvents=\"none\"\n />\n ))}\n </g>\n )}\n </g>\n );\n })}\n </BaseChart>\n </TooltipProvider>\n </div>\n );\n}\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { BoxPlotSettings } from \"./definition\";\n\nexport function BoxPlotSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<BoxPlotSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"field\">Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"colorField\">Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n colorScaleId: value ? getOrCreateScaleForField(value) : undefined,\n })\n }\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"whiskerType\">Whisker Type</Label>\n <ComboBox\n value={settings.whiskerType}\n options={[\"tukey\", \"minmax\", \"stdDev\"]}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n whiskerType: value as BoxPlotSettings[\"whiskerType\"],\n })\n }\n placeholder=\"Select whisker type\"\n optionToString={(option) => option}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"showOutliers\">Show Outliers</Label>\n <Switch\n id=\"showOutliers\"\n checked={settings.showOutliers}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, showOutliers: checked })\n }\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"sortBy\">Sort By</Label>\n <ComboBox\n value={settings.sortBy}\n options={[\"median\", \"label\"]}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n sortBy: value as BoxPlotSettings[\"sortBy\"],\n })\n }\n placeholder=\"Select sorting method\"\n optionToString={(option) => option}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"violinOverlay\">Violin Overlay</Label>\n <Switch\n id=\"violinOverlay\"\n checked={settings.violinOverlay}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, violinOverlay: checked })\n }\n />\n </div>\n\n {settings.violinOverlay && (\n <>\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"autoBandwidth\">Auto Bandwidth</Label>\n <Switch\n id=\"autoBandwidth\"\n checked={settings.autoBandwidth}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, autoBandwidth: checked })\n }\n />\n </div>\n {!settings.autoBandwidth && (\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"violinBandwidth\">Bandwidth</Label>\n <input\n type=\"number\"\n id=\"violinBandwidth\"\n min=\"0.1\"\n max=\"1\"\n step=\"0.1\"\n value={settings.violinBandwidth}\n onChange={(e) =>\n onSettingsChange({\n ...settings,\n violinBandwidth: parseFloat(e.target.value),\n })\n }\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n )}\n </>\n )}\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"beeSwarmOverlay\">Bee Swarm</Label>\n <Switch\n id=\"beeSwarmOverlay\"\n checked={settings.beeSwarmOverlay}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, beeSwarmOverlay: checked })\n }\n />\n </div>\n </div>\n );\n}\n","export function BoxPlotIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"200\"\n height=\"200\"\n viewBox=\"0 0 32 32\"\n className={className}\n >\n <path\n fill=\"currentColor\"\n d=\"M22 6V4H12v2h4v2h-4v12h4v2h-4v2h10v-2h-4v-2h4V8h-4V6Zm-8 12v-3h6v3Zm6-5h-6v-3h6Z\"\n />\n <path fill=\"currentColor\" d=\"M30 30H4a2 2 0 0 1-2-2V2h2v26h26Z\" />\n </svg>\n );\n}\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { Box } from \"lucide-react\";\nimport { BoxPlot } from \"./BoxPlot\";\nimport { BoxPlotSettingsPanel } from \"./BoxPlotSettingsPanel\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { BoxPlotIcon } from \"./BoxPlotIcon\";\n\nexport interface BoxPlotStyleSettings {\n boxFill: string;\n boxStroke: string;\n boxStrokeWidth: number;\n medianStroke: string;\n medianStrokeWidth: number;\n whiskerStroke: string;\n whiskerStrokeWidth: number;\n outlierSize: number;\n outlierStroke: string;\n outlierFill: string;\n}\n\nexport interface BoxPlotSettings extends BaseChartSettings {\n type: \"boxplot\";\n whiskerType: \"tukey\" | \"minmax\" | \"stdDev\";\n showOutliers: boolean;\n violinOverlay: boolean;\n beeSwarmOverlay: boolean;\n styles: BoxPlotStyleSettings;\n filters: Filter[];\n sortBy: \"median\" | \"label\";\n violinBandwidth: number;\n autoBandwidth: boolean;\n}\n\nexport const boxPlotDefinition: ChartDefinition<BoxPlotSettings> = {\n type: \"boxplot\",\n name: \"Box Plot\",\n description: \"Display distribution of values with quartiles and outliers\",\n icon: BoxPlotIcon,\n\n component: BoxPlot,\n settingsPanel: BoxPlotSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n field: field ?? \"\",\n type: \"boxplot\",\n title: \"Box Plot\",\n layout,\n whiskerType: \"tukey\",\n showOutliers: true,\n violinOverlay: false,\n beeSwarmOverlay: false,\n sortBy: \"label\",\n violinBandwidth: 0.3,\n autoBandwidth: true,\n styles: {\n boxFill: \"hsl(217.2 91.2% 59.8%)\",\n boxStroke: \"black\",\n boxStrokeWidth: 1,\n medianStroke: \"white\",\n medianStrokeWidth: 2,\n whiskerStroke: \"black\",\n whiskerStrokeWidth: 1,\n outlierSize: 3,\n outlierStroke: \"black\",\n outlierFill: \"none\",\n },\n filters: [],\n xAxis: DEFAULT_CHART_SETTINGS.xAxis,\n yAxis: DEFAULT_CHART_SETTINGS.yAxis,\n margin: DEFAULT_CHART_SETTINGS.margin,\n facet: DEFAULT_CHART_SETTINGS.facet,\n colorScaleId: undefined,\n colorField: undefined,\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n }),\n\n validateSettings: (settings) => {\n return !!settings.field;\n },\n\n getFilterFunction: (settings, fieldGetter) => {\n if (!settings.colorField) {\n return () => true;\n }\n\n const dataHash = fieldGetter(settings.colorField);\n\n const filter = settings.filters.find(\n (f): f is Filter => f.field === settings.colorField\n );\n\n return (d) => {\n const value = dataHash[d];\n\n if (filter) {\n if (!applyFilter(value, filter)) {\n return false;\n }\n }\n\n return true;\n };\n },\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground rounded-xl border shadow-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\"flex flex-col gap-1.5 p-6\", className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"p-6 pt-0\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","// Utility function to determine text color based on background color\nexport function getContrastTextColor(backgroundColor: string): string {\n // Convert hex to RGB\n const hex = backgroundColor.replace(\"#\", \"\");\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n\n // Calculate relative luminance\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n return luminance > 0.5 ? \"#000000\" : \"#ffffff\";\n}\n","import { ColorScaleType } from \"@/types/ColorScaleTypes\";\n\nimport { getContrastTextColor } from \"./getContrastTextColor\";\n\ninterface ColorScaleProps {\n scale: ColorScaleType;\n wrap: boolean;\n numericalBreakpoints?: number;\n getColorForValue: (scaleId: string, value: number) => string;\n}\nexport function ColorScale({\n scale,\n wrap,\n numericalBreakpoints = 5,\n getColorForValue,\n}: ColorScaleProps) {\n if (!scale?.palette) {\n console.error(\"Missing palette for scale:\", scale);\n return <div className=\"h-8 rounded-md bg-muted\">Invalid color scale</div>;\n }\n\n if (scale.type === \"numerical\") {\n // Create discrete colors based on breakpoints\n const steps = numericalBreakpoints;\n const min = scale.min;\n const max = scale.max;\n const range = max - min;\n const stepSize = range / (steps - 1);\n\n const breakpoints = Array.from({ length: steps }, (_, i) => {\n const value = min + i * stepSize;\n return {\n value,\n color: getColorForValue(scale.id, value),\n };\n });\n\n return (\n <div className=\"rounded-md\">\n <div className={`flex h-full ${wrap ? \"flex-wrap\" : \"\"}`}>\n {breakpoints.map(({ value, color }, i) => (\n <div\n key={i}\n className=\"h-8 flex items-center justify-center\"\n style={{\n backgroundColor: color,\n color: getContrastTextColor(color),\n flexBasis: wrap ? \"20%\" : `${100 / steps}%`,\n }}\n >\n <span className=\"text-xs truncate px-1\">\n {value.toLocaleString(undefined, {\n maximumFractionDigits: 1,\n })}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-md\">\n <div className={`flex h-full ${wrap ? \"flex-wrap\" : \"\"}`}>\n {Array.from(scale.mapping.entries()).map(([value, color], i) => (\n <div\n key={i}\n className=\"h-8 flex items-center justify-center\"\n style={{\n backgroundColor: color,\n color: getContrastTextColor(color),\n flexBasis: wrap ? \"20%\" : \"auto\",\n flexGrow: wrap ? 0 : 1,\n }}\n >\n <span className=\"text-xs truncate px-1\">{value}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { Card } from \"@/components/ui/card\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ColorLegendSettings } from \"./definition\";\nimport { ColorScale } from \"./ColorScale\";\n\nexport function ColorLegendChart({\n settings,\n width,\n height,\n}: BaseChartProps<ColorLegendSettings>) {\n const { colorScales, getOrCreateScaleForField, getColorForValue } =\n useColorScales();\n\n if (settings.fields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-muted-foreground\">\n Select a field to see a legend\n </div>\n );\n }\n\n return (\n <div\n className=\"flex flex-col p-4 gap-4 overflow-y-auto\"\n style={{ width, height }}\n >\n <ScrollArea className=\"flex-1\">\n <div className=\"grid gap-4 grid-cols-1\">\n {settings.fields.map((field) => {\n // Get or create a color scale for this field\n const scaleId = getOrCreateScaleForField(field);\n const scale = colorScales.find((s) => s.id === scaleId);\n\n if (!scale) {\n console.error(\"No scale found for field:\", field);\n return null;\n }\n\n return (\n <Card key={field} className=\"p-4\">\n <div className=\"font-medium mb-2\">{field}</div>\n <ColorScale\n scale={scale}\n wrap={settings.wrap}\n numericalBreakpoints={settings.numericalBreakpoints}\n getColorForValue={getColorForValue}\n />\n </Card>\n );\n })}\n </div>\n </ScrollArea>\n </div>\n );\n}\n","import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ColorLegendSettings } from \"./definition\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport MultiSelect, { Option } from \"@/components/ui/multi-select\";\nimport { useColumnNames } from \"@/components/charts/PivotTable/useColumnNames\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\n\nexport function ColorLegendSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ColorLegendSettings>) {\n const availableFields = useColumnNames();\n\n const fieldOptions = availableFields.map((f) => ({\n label: f,\n value: f,\n }));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Fields to Show</Label>\n <div className=\"max-w-[400px]\">\n <MultiSelect\n options={fieldOptions}\n value={settings.fields.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) =>\n onSettingsChange({\n ...settings,\n fields: values.map((v) => v.value),\n })\n }\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Numerical Scale Breakpoints</Label>\n <NumericInputEnter\n value={settings.numericalBreakpoints}\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n numericalBreakpoints: value,\n })\n }\n min={2}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"wrap\"\n checked={settings.wrap}\n onCheckedChange={(checked) =>\n onSettingsChange({ ...settings, wrap: checked })\n }\n />\n <Label htmlFor=\"wrap\">Wrap Colors</Label>\n </div>\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { Palette } from \"lucide-react\";\nimport { ColorLegendChart } from \"./ColorLegendChart\";\nimport { ColorLegendSettingsPanel } from \"./ColorLegendSettingsPanel\";\n\nexport interface ColorLegendSettings extends BaseChartSettings {\n type: \"color-legend\";\n fields: string[];\n numericalBreakpoints: number;\n wrap: boolean;\n}\n\nexport const colorLegendDefinition: ChartDefinition<ColorLegendSettings> = {\n type: \"color-legend\",\n name: \"Color Legend\",\n description: \"Display and manage color scales used in visualizations\",\n icon: Palette,\n component: ColorLegendChart,\n settingsPanel: ColorLegendSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n id: crypto.randomUUID(),\n type: \"color-legend\",\n title: \"Color Legend\",\n field: \"\",\n layout,\n colorScaleId: undefined,\n colorField: undefined,\n facet: {\n enabled: false,\n type: \"grid\",\n rowVariable: \"\",\n columnVariable: \"\",\n },\n xAxis: {},\n yAxis: {},\n margin: {},\n filters: [],\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 0,\n yGridLines: 0,\n fields: [],\n numericalBreakpoints: 5,\n wrap: false,\n }),\n\n validateSettings: () => true,\n getFilterFunction: () => () => true,\n};\n","export interface DataPoint {\n x: number;\n y: number;\n}\n\nexport interface ReducedDataPoint extends DataPoint {\n type: \"min\" | \"max\" | \"start\";\n}\n\n/**\n * Reduces a dataset to a fixed number of buckets using min-max-start algorithm.\n * For each bucket, it keeps the start point, minimum point, and maximum point.\n * If the input data length is less than buckets * 3, returns original data.\n *\n * @param data Array of data points with x and y values\n * @param numBuckets Number of buckets to divide the data into (typically chart width)\n * @returns Array of reduced data points with type information\n */\nexport function reduceDataPoints(\n data: DataPoint[],\n numBuckets: number\n): ReducedDataPoint[] {\n // Handle edge cases\n if (!data || data.length === 0) {\n return [];\n }\n\n // Ensure numBuckets is valid and reasonable\n const validBuckets = Math.max(1, Math.min(1000, Math.floor(numBuckets)));\n\n // If data is small enough, just convert to ReducedDataPoint format\n if (data.length <= validBuckets * 3) {\n return data.map((point) => ({ ...point, type: \"start\" as const }));\n }\n\n const xExtent = {\n min: Math.min(...data.map((d) => d.x)),\n max: Math.max(...data.map((d) => d.x)),\n };\n\n // If all x values are the same, return just one point\n if (xExtent.min === xExtent.max) {\n return [{ ...data[0], type: \"start\" as const }];\n }\n\n const buckets: ReducedDataPoint[][] = Array(validBuckets)\n .fill(null)\n .map(() => []);\n\n // Distribute points into buckets\n data.forEach((point) => {\n const bucketIndex = Math.min(\n Math.floor(\n ((point.x - xExtent.min) / (xExtent.max - xExtent.min)) * validBuckets\n ),\n validBuckets - 1\n );\n buckets[bucketIndex].push({ ...point, type: \"start\" });\n });\n\n // Process each bucket to find min, max, and start points\n const result: ReducedDataPoint[] = [];\n buckets.forEach((bucket) => {\n if (bucket.length === 0) {\n return;\n }\n\n // Always include the first point as start\n result.push({ ...bucket[0], type: \"start\" });\n\n if (bucket.length > 1) {\n const minPoint = bucket.reduce((min, p) => (p.y < min.y ? p : min));\n const maxPoint = bucket.reduce((max, p) => (p.y > max.y ? p : max));\n\n // Only add min/max if they're different from the start point\n if (minPoint !== bucket[0]) {\n result.push({ ...minPoint, type: \"min\" });\n }\n if (maxPoint !== bucket[0] && maxPoint !== minPoint) {\n result.push({ ...maxPoint, type: \"max\" });\n }\n }\n });\n\n return result.sort((a, b) => a.x - b.x);\n}\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(line);\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { reduceDataPoints } from \"@/lib/chartUtils\";\nimport { cn } from \"@/lib/utils\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { type BaseChartProps } from \"@/types/ChartTypes\";\nimport { extent } from \"d3-array\";\nimport { scaleLinear } from \"d3-scale\";\nimport { curveLinear, curveMonotoneX, curveStepAfter, line } from \"d3-shape\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useEffect, useMemo, type FC } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport {\n useGetColumnDataForIds,\n useGetColumnDataForMultipleIds,\n} from \"../useGetColumnData\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { type LineChartSettings } from \"./definition\";\n\nconst curveTypes = {\n linear: curveLinear,\n monotoneX: curveMonotoneX,\n step: curveStepAfter,\n} as const;\n\ntype CurveType = keyof typeof curveTypes;\n\n// Define color palettes\nconst COLOR_PALETTES = {\n default: [\n \"#2563eb\", // blue-600\n \"#dc2626\", // red-600\n \"#9333ea\", // purple-600\n \"#ea580c\", // orange-600\n \"#0891b2\", // cyan-600\n \"#4f46e5\", // indigo-600\n \"#be123c\", // rose-600\n \"#ca8a04\", // yellow-600\n \"#16a34a\", // green-600\n \"#059669\", // emerald-600\n ],\n} as const;\n\nconst getRandomHslColor = () => {\n const hue = Math.floor(Math.random() * 360);\n return `hsl(${hue}, 50%, 50%)`;\n};\n\nconst defaultSeriesSettings = {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n} as const;\n\nexport const LineChart: FC<BaseChartProps<LineChartSettings>> = ({\n settings,\n width,\n height,\n facetIds,\n}) => {\n const updateChart = useDataLayer((state) => state.updateChart);\n\n // Get all data for axis limits calculation\n const allXData = useGetColumnDataForIds(settings.xField);\n\n // Get filtered data for rendering\n const liveXData = useGetLiveData(settings, settings.xField, facetIds);\n\n // Get all series data using the new hook\n const liveSeriesData = useGetColumnDataForMultipleIds(\n settings.seriesField,\n facetIds\n );\n\n const margin = settings.margin;\n\n // Adjust margins based on legend position\n if (settings.showLegend) {\n switch (settings.legendPosition) {\n case \"top\":\n margin.top += 40;\n break;\n case \"bottom\":\n margin.bottom += 40;\n break;\n case \"right\":\n margin.right += 120;\n break;\n case \"left\":\n margin.left += 120;\n break;\n }\n }\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Convert data to numbers for d3\n const processedLiveSeriesData = useMemo(() => {\n return settings.seriesField.map((field) => {\n const data =\n liveSeriesData[field]?.map((d, i) => ({\n x: Number(liveXData[i] ?? 0),\n y: d != null ? Number(d) : 0,\n })) ?? [];\n\n // Reduce the data points based on chart width\n const reducedData = reduceDataPoints(data, innerWidth);\n\n return {\n name: field,\n data: reducedData,\n };\n });\n }, [settings.seriesField, liveSeriesData, liveXData, innerWidth]);\n\n // Ensure consistent color assignment for series with better distribution\n const seriesColors = useMemo(() => {\n const colors: Record<string, string> = {};\n const palette = COLOR_PALETTES.default;\n\n // First pass - keep existing colors and track which palette colors are used\n const usedPaletteColors = new Set<string>();\n settings.seriesField.forEach((field) => {\n const existingColor = settings.seriesSettings[field]?.lineColor;\n if (existingColor && existingColor !== \"#000000\") {\n colors[field] = existingColor;\n if ((palette as readonly string[]).includes(existingColor)) {\n usedPaletteColors.add(existingColor);\n }\n }\n });\n\n // Get unused palette colors\n const unusedPaletteColors = (palette as readonly string[]).filter(\n (color) => !usedPaletteColors.has(color)\n );\n\n // Second pass - assign colors to series that need them\n // splice off the first color from the unused palette colors\n settings.seriesField.forEach((field) => {\n const nextColor = unusedPaletteColors.shift();\n if (colors[field]) {\n return;\n }\n\n // Use an unused palette color\n colors[field] = nextColor ?? getRandomHslColor();\n });\n\n return colors;\n }, [settings.seriesField, settings.seriesSettings]);\n\n // Store assigned colors back into settings using updateChart\n useEffect(() => {\n requestAnimationFrame(() => {\n const newSeriesSettings = { ...settings.seriesSettings };\n let hasChanges = false;\n\n settings.seriesField.forEach((field) => {\n if (!newSeriesSettings[field]) {\n newSeriesSettings[field] = { ...defaultSeriesSettings };\n hasChanges = true;\n }\n\n // Only update if color is undefined or \"default\"\n if (\n !newSeriesSettings[field]?.lineColor ||\n newSeriesSettings[field]?.lineColor === \"default\"\n ) {\n newSeriesSettings[field]!.lineColor = seriesColors[field];\n hasChanges = true;\n }\n });\n\n if (hasChanges) {\n updateChart(settings.id, {\n seriesSettings: newSeriesSettings,\n });\n }\n });\n }, [\n seriesColors,\n settings.id,\n settings.seriesField,\n settings.seriesSettings,\n updateChart,\n ]);\n\n if (processedLiveSeriesData.length === 0) {\n return null;\n }\n\n // Process data and create scales\n const xExtent = extent(allXData.map((d) => (d != null ? Number(d) : 0))) as [\n number,\n number,\n ];\n\n // Calculate y extent across all series\n const leftAxisSeries = processedLiveSeriesData.filter(\n (series) => !settings.seriesSettings[series.name]?.useRightAxis\n );\n const rightAxisSeries = processedLiveSeriesData.filter(\n (series) => settings.seriesSettings[series.name]?.useRightAxis\n );\n\n const leftYExtent = extent(\n leftAxisSeries.flatMap((series) => series.data.map((d) => d.y))\n ) as [number, number];\n\n const rightYExtent = extent(\n rightAxisSeries.flatMap((series) => series.data.map((d) => d.y))\n ) as [number, number];\n\n const xScale = scaleLinear().domain(xExtent).range([0, innerWidth]).nice();\n const leftYScale = scaleLinear()\n .domain(leftYExtent)\n .range([innerHeight, 0])\n .nice();\n const rightYScale = scaleLinear()\n .domain(rightYExtent)\n .range([innerHeight, 0])\n .nice();\n\n // Create line generator with dynamic y-accessor\n const createLineGenerator = (yField: string) =>\n line<(typeof processedLiveSeriesData)[0][\"data\"][0]>()\n .x((d) => xScale(d.x))\n .y((d) =>\n settings.seriesSettings[yField]?.useRightAxis\n ? rightYScale(d.y)\n : leftYScale(d.y)\n )\n .curve(curveTypes[settings.styles.curveType as CurveType]);\n\n // Legend component\n const Legend = () => {\n if (!settings.showLegend) {\n return null;\n }\n\n const legendItems = processedLiveSeriesData.map((series) => {\n const seriesSettings = settings.seriesSettings[series.name] ?? {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n };\n\n return {\n name: series.name,\n color: seriesColors[series.name],\n lineStyle: seriesSettings.lineStyle,\n useRightAxis: seriesSettings.useRightAxis,\n };\n });\n\n const handleAxisToggle = (seriesName: string) => {\n const currentSettings = settings.seriesSettings[seriesName] ?? {\n ...defaultSeriesSettings,\n };\n updateChart(settings.id, {\n seriesSettings: {\n ...settings.seriesSettings,\n [seriesName]: {\n ...currentSettings,\n useRightAxis: !currentSettings.useRightAxis,\n },\n },\n });\n };\n\n const isVertical =\n settings.legendPosition === \"left\" || settings.legendPosition === \"right\";\n\n return (\n <div\n className={cn(\n \"absolute flex gap-4 text-sm items-center\",\n isVertical ? \"flex-col\" : \"flex-row\",\n settings.legendPosition === \"top\" && \"top-0 left-[60px] right-[60px]\",\n settings.legendPosition === \"bottom\" &&\n \"bottom-0 left-[60px] right-[60px]\",\n settings.legendPosition === \"left\" &&\n \"left-0 top-[20px] bottom-[30px] w-[100px]\",\n settings.legendPosition === \"right\" &&\n \"right-0 top-[20px] bottom-[30px] w-[100px]\"\n )}\n >\n {legendItems.map((item) => (\n <div key={item.name} className=\"flex items-center gap-2\">\n <div\n className=\"flex items-center gap-2 px-2 py-1 rounded cursor-pointer hover:bg-accent/50\"\n style={{\n border: `1px solid ${item.color}`,\n }}\n onClick={() => handleAxisToggle(item.name)}\n >\n <svg width=\"20\" height=\"2\" className=\"flex-shrink-0\">\n <line\n x1=\"0\"\n y1=\"1\"\n x2=\"20\"\n y2=\"1\"\n stroke={item.color}\n strokeWidth=\"2\"\n strokeDasharray={\n item.lineStyle === \"dashed\"\n ? \"4,4\"\n : item.lineStyle === \"dotted\"\n ? \"2,2\"\n : undefined\n }\n />\n </svg>\n <span className=\"text-sm text-muted-foreground truncate\">\n {item.name}\n </span>\n {item.useRightAxis && (\n <ArrowRight\n className=\"h-3 w-3 text-muted-foreground\"\n style={{ color: item.color }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"relative\" style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={leftYScale}\n settings={settings}\n >\n <TooltipProvider>\n <g>\n {/* Grid */}\n {settings.showXGrid && (\n <g>\n {leftYScale.ticks(5).map((tick: number) => (\n <line\n key={tick}\n x1={0}\n x2={innerWidth}\n y1={leftYScale(tick)}\n y2={leftYScale(tick)}\n stroke=\"currentColor\"\n strokeOpacity={0.1}\n />\n ))}\n </g>\n )}\n {settings.showYGrid && (\n <g>\n {xScale.ticks(5).map((tick: number) => (\n <line\n key={tick}\n x1={xScale(tick)}\n x2={xScale(tick)}\n y1={0}\n y2={innerHeight}\n stroke=\"currentColor\"\n strokeOpacity={0.1}\n />\n ))}\n </g>\n )}\n\n {/* Right Y-Axis */}\n {rightAxisSeries.length > 0 && (\n <g transform={`translate(${innerWidth}, 0)`}>\n {rightYScale.ticks(5).map((tick: number) => (\n <g\n key={tick}\n transform={`translate(0, ${rightYScale(tick)})`}\n >\n <line x1={0} x2={6} y1={0} y2={0} stroke=\"currentColor\" />\n <text\n x={9}\n y={0}\n dy=\".32em\"\n fontSize={10}\n textAnchor=\"start\"\n fill=\"currentColor\"\n >\n {tick}\n </text>\n </g>\n ))}\n </g>\n )}\n\n {/* Lines */}\n {processedLiveSeriesData.map((series) => {\n const lineGenerator = createLineGenerator(series.name);\n const seriesSettings = settings.seriesSettings[series.name] ?? {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n };\n\n const seriesColor = seriesColors[series.name];\n\n return (\n <g key={series.name}>\n <path\n d={lineGenerator(series.data) || undefined}\n fill=\"none\"\n stroke={seriesColor}\n strokeWidth={seriesSettings.lineWidth}\n strokeOpacity={seriesSettings.lineOpacity}\n strokeDasharray={\n seriesSettings.lineStyle === \"dashed\"\n ? \"5,5\"\n : seriesSettings.lineStyle === \"dotted\"\n ? \"2,2\"\n : undefined\n }\n />\n {seriesSettings.showPoints &&\n series.data.map((d, j) => (\n <Tooltip key={j}>\n <TooltipTrigger asChild>\n <circle\n cx={xScale(d.x)}\n cy={\n seriesSettings.useRightAxis\n ? rightYScale(d.y)\n : leftYScale(d.y)\n }\n r={seriesSettings.pointSize}\n fill={seriesColor}\n fillOpacity={seriesSettings.pointOpacity}\n />\n </TooltipTrigger>\n <TooltipContent>\n <div className=\"space-y-1\">\n <div className=\"font-medium\">{series.name}</div>\n <div>\n {settings.xField}: {d.x}\n </div>\n <div>\n {series.name}: {d.y}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n ))}\n </g>\n );\n })}\n </g>\n </TooltipProvider>\n </BaseChart>\n <Legend />\n </div>\n );\n};\n","import { ComboBox } from \"@/components/ComboBox\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { Card } from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { type FC } from \"react\";\nimport { type SeriesSettings } from \"./definition\";\n\ninterface LineSeriesSettingsProps {\n seriesName: string;\n settings: SeriesSettings;\n onSettingsChange: (settings: SeriesSettings) => void;\n}\n\nexport const LineSeriesSettings: FC<LineSeriesSettingsProps> = ({\n seriesName,\n settings,\n onSettingsChange,\n}) => {\n const updateSettings = (updates: Partial<SeriesSettings>) => {\n onSettingsChange({ ...settings, ...updates });\n };\n\n const lineStyleOptions = [\n { label: \"Solid\", value: \"solid\" as const },\n { label: \"Dashed\", value: \"dashed\" as const },\n { label: \"Dotted\", value: \"dotted\" as const },\n ];\n\n return (\n <Card className=\"p-2\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 justify-between\">\n <div className=\"font-medium\">{seriesName}</div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-4 ml-4\">\n <div className=\"flex items-center gap-1\">\n <Label className=\"text-xs\">Points</Label>\n <Switch\n className=\"scale-75\"\n checked={settings.showPoints}\n onCheckedChange={(checked) =>\n updateSettings({ showPoints: checked })\n }\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <Label className=\"text-xs\">Right Y</Label>\n <Switch\n className=\"scale-75\"\n checked={settings.useRightAxis}\n onCheckedChange={(checked) =>\n updateSettings({ useRightAxis: checked })\n }\n />\n </div>\n </div>\n <div className=\"col-span-1\">\n <ComboBox\n value={lineStyleOptions.find(\n (opt) => opt.value === settings.lineStyle\n )}\n options={lineStyleOptions}\n onChange={(option) =>\n updateSettings({ lineStyle: option?.value ?? \"solid\" })\n }\n optionToString={(option) => option.label}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-6 gap-2\">\n <div className=\"col-span-1\">\n <input\n type=\"color\"\n value={settings.lineColor ?? \"#000000\"}\n onChange={(e) => updateSettings({ lineColor: e.target.value })}\n className=\"h-8 w-full rounded-md border\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.lineWidth}\n onChange={(value) => updateSettings({ lineWidth: value })}\n min={1}\n max={10}\n stepSmall={1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.lineOpacity}\n onChange={(value) => updateSettings({ lineOpacity: value })}\n min={0}\n max={1}\n stepSmall={0.1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.pointSize}\n onChange={(value) => updateSettings({ pointSize: value })}\n min={1}\n max={20}\n stepSmall={1}\n className=\"h-8\"\n />\n </div>\n <div className=\"col-span-1\">\n <NumericInputEnter\n value={settings.pointOpacity}\n onChange={(value) => updateSettings({ pointOpacity: value })}\n min={0}\n max={1}\n stepSmall={0.1}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n </Card>\n );\n};\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background data-[state=active]:text-foreground ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 inline-flex items-center justify-center gap-2 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 aria-invalid:focus-visible:ring-0 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 flex-1 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { type ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { type FC } from \"react\";\nimport {\n type LineChartSettings,\n type SeriesSettings,\n DEFAULT_SERIES_SETTINGS,\n} from \"./definition\";\nimport { LineSeriesSettings } from \"./LineSeriesSettings\";\nimport { ComboBox } from \"@/components/ComboBox\";\nimport MultiSelect, { type Option } from \"@/components/ui/multi-select\";\nimport { useColumnNames } from \"@/components/charts/PivotTable/useColumnNames\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport const LineChartSettingsPanel: FC<\n ChartSettingsPanelProps<LineChartSettings>\n> = ({ settings, onSettingsChange }) => {\n const updateSettings = (updates: Partial<LineChartSettings>) => {\n onSettingsChange({ ...settings, ...updates });\n };\n\n const updateStyles = (updates: Partial<LineChartSettings[\"styles\"]>) => {\n updateSettings({\n styles: { ...settings.styles, ...updates },\n });\n };\n\n const updateSeriesSettings = (\n seriesName: string,\n seriesSettings: SeriesSettings\n ) => {\n updateSettings({\n seriesSettings: {\n ...settings.seriesSettings,\n [seriesName]: seriesSettings,\n },\n });\n };\n\n const availableFields = useColumnNames();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => updateSettings({ xField: value })}\n />\n\n <Label>Series Fields</Label>\n <MultiSelect\n options={availableFields.map((f) => ({\n label: f,\n value: f,\n }))}\n value={settings.seriesField.map((f) => ({\n label: f,\n value: f,\n }))}\n onChange={(values: Option[]) => {\n const newSeriesFields = values.map((v) => v.value);\n const newSeriesSettings = { ...settings.seriesSettings };\n\n // Add default settings for new series\n newSeriesFields.forEach((field) => {\n if (!newSeriesSettings[field]) {\n newSeriesSettings[field] = { ...DEFAULT_SERIES_SETTINGS };\n }\n });\n\n // Remove settings for removed series\n Object.keys(newSeriesSettings).forEach((field) => {\n if (!newSeriesFields.includes(field)) {\n delete newSeriesSettings[field];\n }\n });\n\n updateSettings({\n seriesField: newSeriesFields,\n seriesSettings: newSeriesSettings,\n });\n }}\n />\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Line Style</Label>\n <ComboBox\n value={{\n label:\n settings.styles.curveType === \"linear\"\n ? \"Linear\"\n : settings.styles.curveType === \"monotoneX\"\n ? \"Smooth\"\n : \"Step\",\n value: settings.styles.curveType,\n }}\n options={[\n { label: \"Linear\", value: \"linear\" as const },\n { label: \"Smooth\", value: \"monotoneX\" as const },\n { label: \"Step\", value: \"step\" as const },\n ]}\n onChange={(option) =>\n updateStyles({ curveType: option?.value ?? \"linear\" })\n }\n optionToString={(option) => option.label}\n />\n\n <Label>Show Legend</Label>\n <div className=\"flex items-center\">\n <Switch\n checked={settings.showLegend}\n onCheckedChange={(checked) =>\n updateSettings({ showLegend: checked })\n }\n />\n </div>\n\n {settings.showLegend && (\n <>\n <Label>Legend Position</Label>\n <ComboBox\n value={{\n label:\n settings.legendPosition.charAt(0).toUpperCase() +\n settings.legendPosition.slice(1),\n value: settings.legendPosition,\n }}\n options={[\n { label: \"Top\", value: \"top\" as const },\n { label: \"Right\", value: \"right\" as const },\n { label: \"Bottom\", value: \"bottom\" as const },\n { label: \"Left\", value: \"left\" as const },\n ]}\n onChange={(option) =>\n updateSettings({\n legendPosition: option?.value ?? \"top\",\n })\n }\n optionToString={(option) => option.label}\n />\n </>\n )}\n </div>\n\n <Tabs defaultValue=\"general\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"series\">Series</TabsTrigger>\n <TabsTrigger value=\"axis\">Axis</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"series\">\n <div className=\"space-y-4\">\n {settings.seriesField.map((field) => (\n <LineSeriesSettings\n key={field}\n seriesName={field}\n settings={\n settings.seriesSettings[field] ?? DEFAULT_SERIES_SETTINGS\n }\n onSettingsChange={(newSettings) =>\n updateSeriesSettings(field, newSettings)\n }\n />\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"axis\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label className=\"font-medium\">Grid Lines</Label>\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={settings.showXGrid}\n onCheckedChange={(checked) =>\n updateSettings({ showXGrid: checked })\n }\n />\n <Label>Show X Grid</Label>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={settings.showYGrid}\n onCheckedChange={(checked) =>\n updateSettings({ showYGrid: checked })\n }\n />\n <Label>Show Y Grid</Label>\n </div>\n </div>\n </div>\n </TabsContent>\n </Tabs>\n </div>\n );\n};\n","import {\n type BaseChartSettings,\n type ChartDefinition,\n type ChartLayout,\n} from \"@/types/ChartTypes\";\nimport { LineChart as LineChartIcon } from \"lucide-react\";\nimport { LineChart } from \"./LineChart\";\nimport { LineChartSettingsPanel } from \"./LineChartSettingsPanel\";\n\nexport interface SeriesSettings {\n showPoints: boolean;\n pointSize: number;\n pointOpacity: number;\n lineWidth: number;\n lineOpacity: number;\n lineColor?: string;\n lineStyle: \"solid\" | \"dashed\" | \"dotted\";\n useRightAxis: boolean;\n}\n\nexport interface LineChartSettings extends BaseChartSettings {\n type: \"line\";\n\n // Data fields\n xField: string;\n seriesField: string[];\n\n // Series settings\n seriesSettings: Record<string, SeriesSettings>;\n\n // Global line styling\n styles: {\n curveType: \"linear\" | \"monotoneX\" | \"step\";\n };\n\n // Grid options\n showXGrid: boolean;\n showYGrid: boolean;\n\n // Legend options\n showLegend: boolean;\n legendPosition: \"top\" | \"right\" | \"bottom\" | \"left\";\n}\n\nexport const DEFAULT_SERIES_SETTINGS: SeriesSettings = {\n showPoints: false,\n pointSize: 4,\n pointOpacity: 1,\n lineWidth: 2,\n lineOpacity: 0.8,\n lineStyle: \"solid\",\n useRightAxis: false,\n};\n\nexport const lineChartDefinition: ChartDefinition<LineChartSettings> = {\n type: \"line\",\n name: \"Line Chart\",\n description: \"Display data as connected points over time or sequence\",\n icon: LineChartIcon,\n component: LineChart,\n settingsPanel: LineChartSettingsPanel,\n createDefaultSettings: (layout: ChartLayout): LineChartSettings => ({\n id: \"\",\n type: \"line\",\n title: \"\",\n field: \"\",\n layout,\n colorScaleId: undefined,\n colorField: undefined,\n facet: {\n enabled: false,\n type: \"grid\",\n rowVariable: \"\",\n columnVariable: \"\",\n },\n xAxis: {},\n yAxis: {},\n margin: { top: 20, right: 60, bottom: 30, left: 60 },\n filters: [],\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n xGridLines: 5,\n yGridLines: 5,\n xField: \"\",\n seriesField: [],\n seriesSettings: {},\n styles: {\n curveType: \"linear\",\n },\n showXGrid: true,\n showYGrid: true,\n showLegend: true,\n legendPosition: \"top\",\n }),\n validateSettings: (settings: LineChartSettings): boolean => {\n return settings.xField !== \"\" && settings.seriesField.length > 0;\n },\n getFilterFunction: (settings: LineChartSettings) => {\n return (d: number) => true;\n },\n};\n","import { BaseChartProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useFacetAxis } from \"@/providers/FacetAxisProvider\";\nimport { datum, Filter, ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand, scaleLinear } from \"d3-scale\";\nimport { useEffect, useMemo } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { useGetLiveData } from \"../useGetLiveData\";\n\ntype RowChartProps = BaseChartProps<RowChartSettings>;\n\nexport function RowChart({ settings, width, height, facetIds }: RowChartProps) {\n const data = useGetLiveData(settings, settings.field, facetIds);\n\n const { getColorForValue } = useColorScales();\n const getGlobalAxisLimits = useFacetAxis((s) => s.getGlobalAxisLimits);\n const registerAxisLimits = useFacetAxis((s) => s.registerAxisLimits);\n\n const updateChart = useDataLayer((s) => s.updateChart);\n\n const valueFilter = settings.filters.find(\n (f: Filter): f is ValueFilter =>\n f.type === \"value\" && f.field === settings.field\n );\n const filterValues = valueFilter?.values ?? [];\n\n const handleBarClick = (label: datum) => {\n if (label === \"Others\") {\n // Don't allow filtering on \"Others\" category\n return;\n }\n\n const newValues = filterValues.includes(label)\n ? filterValues.filter((f) => f !== label)\n : [...filterValues, label];\n\n // Create new filters array with updated value filter\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n // Chart dimensions\n const margin = settings.margin;\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Calculate counts and handle overflow\n const { displayCounts } = useMemo(() => {\n const countMap = new Map<datum, number>();\n data.forEach((value) => {\n const key = value === undefined ? \"undefined\" : value;\n countMap.set(key, (countMap.get(key) || 0) + 1);\n });\n\n // Convert to array and sort by count descending\n const sortedCounts = Array.from(countMap.entries())\n .map(([label, count]) => ({ label, count }))\n .sort((a, b) => b.count - a.count);\n\n // Calculate how many rows we can fit based on min and max row height constraints\n const availableHeight = height - margin.top - margin.bottom;\n const rowHeight = Math.max(\n settings.minRowHeight,\n Math.min(settings.maxRowHeight, availableHeight / sortedCounts.length)\n );\n const maxRows = Math.floor(availableHeight / rowHeight);\n\n // If we have more items than we can display, create an \"Others\" category\n if (sortedCounts.length > maxRows) {\n const visibleCounts = sortedCounts.slice(0, maxRows - 1);\n const otherSum = sortedCounts\n .slice(maxRows - 1)\n .reduce((sum, item) => sum + item.count, 0);\n\n return {\n displayCounts: [...visibleCounts, { label: \"Others\", count: otherSum }],\n };\n }\n\n return {\n displayCounts: sortedCounts,\n };\n }, [\n data,\n height,\n margin.top,\n margin.bottom,\n settings.minRowHeight,\n settings.maxRowHeight,\n ]);\n\n // Register axis limits with the facet context if in a facet\n useEffect(() => {\n if (facetIds && displayCounts.length > 0) {\n // Register x-axis limits (numerical for row chart)\n const maxValue = Math.max(...displayCounts.map((d) => d.count));\n registerAxisLimits(settings.id, \"x\", {\n type: \"numerical\",\n min: 0,\n max: maxValue,\n });\n }\n }, [settings.id, facetIds, displayCounts, registerAxisLimits]);\n\n // Get global axis limits if in a facet\n const globalXLimits = facetIds ? getGlobalAxisLimits(\"x\") : null;\n const globalYLimits = facetIds ? getGlobalAxisLimits(\"y\") : null;\n\n // Create scales with synchronized limits if in a facet\n const xScale = useMemo(() => {\n const maxValue = Math.max(...displayCounts.map((d) => d.count));\n\n if (globalXLimits && globalXLimits.type === \"numerical\") {\n return scaleLinear()\n .domain([0, globalXLimits.max])\n .range([0, innerWidth])\n .nice();\n }\n\n return scaleLinear().domain([0, maxValue]).range([0, innerWidth]).nice();\n }, [displayCounts, innerWidth, globalXLimits]);\n\n const yScale = useMemo(() => {\n if (globalYLimits && globalYLimits.type === \"categorical\") {\n const allCategories = Array.from(globalYLimits.categories);\n return scaleBand()\n .domain(allCategories)\n .range([0, innerHeight])\n .padding(0.1);\n }\n\n return scaleBand()\n .domain(displayCounts.map((d) => String(d.label)))\n .range([0, innerHeight])\n .padding(0.1);\n }, [displayCounts, innerHeight, globalYLimits]);\n\n if (displayCounts.length === 0) {\n return <div style={{ width, height }}>No data to display</div>;\n }\n\n return (\n <div style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n settings={settings}\n >\n <g className=\"select-none\">\n {/* Bars */}\n {displayCounts.map(({ label, count }) => {\n let isFiltered = true;\n if (valueFilter) {\n isFiltered = applyFilter(label, valueFilter);\n }\n\n const color =\n valueFilter && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(\n settings.colorScaleId,\n String(label),\n \"hsl(217.2 91.2% 59.8%)\"\n );\n\n const barWidth = xScale(count);\n const barHeight = yScale.bandwidth();\n\n if (barWidth < 1 || barHeight < 1) {\n return null;\n }\n\n return (\n <rect\n key={String(label)}\n x={0}\n y={yScale(String(label))}\n width={barWidth}\n height={barHeight}\n className={`${\n label === \"Others\"\n ? \"fill-muted/80 hover:fill-muted\"\n : \"cursor-pointer\"\n }`}\n style={{ fill: color }}\n onClick={() => handleBarClick(label)}\n />\n );\n })}\n\n {/* Count labels */}\n {displayCounts.map(({ label, count }) => (\n <text\n key={String(label)}\n x={xScale(count) + 5}\n y={yScale(String(label))! + yScale.bandwidth() / 2}\n dominantBaseline=\"middle\"\n className=\"text-sm fill-foreground\"\n >\n {count}\n </text>\n ))}\n </g>\n </BaseChart>\n </div>\n );\n}\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { ChartSettingsPanelProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nexport function RowChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<RowChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Data Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field ?? \"\"}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label htmlFor=\"minRowHeight\">Min Row Height</Label>\n <NumericInputEnter\n value={settings.minRowHeight || 30}\n onChange={(value) =>\n onSettingsChange({ ...settings, minRowHeight: value })\n }\n min={20}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Enter minimum row height\"\n />\n\n <Label htmlFor=\"maxRowHeight\">Max Row Height</Label>\n <NumericInputEnter\n value={settings.maxRowHeight || 50}\n onChange={(value) =>\n onSettingsChange({ ...settings, maxRowHeight: value })\n }\n min={30}\n max={200}\n stepSmall={1}\n stepMedium={10}\n stepLarge={20}\n placeholder=\"Enter maximum row height\"\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"colorField\"\n checked={settings.field === settings.colorField}\n onCheckedChange={(checked) => {\n onSettingsChange({\n ...settings,\n colorField: checked ? settings.field : undefined,\n colorScaleId:\n checked && settings.field\n ? getOrCreateScaleForField(settings.field)\n : undefined,\n });\n }}\n />\n <Label htmlFor=\"colorField\">Use as color field</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { BarChart } from \"lucide-react\";\n\nimport { RowChart } from \"@/components/charts/RowChart/RowChart\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport {\n ChartDefinition,\n ChartLayout,\n RowChartSettings,\n datum,\n} from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DEFAULT_ROW_SETTINGS } from \"@/utils/defaultSettings\";\nimport { RowChartSettingsPanel } from \"./RowChartSettingsPanel\";\n\nexport const rowChartDefinition: ChartDefinition<RowChartSettings> = {\n type: \"row\",\n name: \"Row Chart\",\n description: \"A horizontal bar chart showing values by category\",\n icon: BarChart,\n\n component: RowChart,\n settingsPanel: RowChartSettingsPanel,\n\n createDefaultSettings: (layout: ChartLayout, field?: string) => ({\n ...DEFAULT_ROW_SETTINGS,\n id: crypto.randomUUID(),\n layout,\n field: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return Boolean(settings.field);\n },\n\n getFilterFunction: (\n settings: RowChartSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const dataHash = fieldGetter(settings.field);\n const valueFilter = settings.filters.find(\n (f): f is Filter => f.type === \"value\" && f.field === settings.field\n );\n\n return (d: IdType) => {\n if (!valueFilter) {\n return true;\n }\n\n const value = dataHash[d];\n return applyFilter(value, valueFilter);\n };\n },\n};\n","import { barChartDefinition } from \"@/components/charts/BarChart/definition\";\nimport { scatterPlotDefinition } from \"@/components/charts/ScatterPlot/definition\";\nimport { threeDScatterDefinition } from \"@/components/charts/ThreeDScatter/definition\";\nimport { pivotTableDefinition } from \"@/components/charts/PivotTable/definition\";\nimport { dataTableDefinition } from \"@/components/charts/DataTable/definition\";\nimport { summaryTableDefinition } from \"@/components/charts/SummaryTable/definition\";\nimport { markdownDefinition } from \"@/components/charts/Markdown/definition\";\nimport { boxPlotDefinition } from \"@/components/charts/BoxPlot/definition\";\nimport { colorLegendDefinition } from \"@/components/charts/ColorLegend/definition\";\nimport { lineChartDefinition } from \"@/components/charts/LineChart/definition\";\nimport {\n BaseChartSettings,\n ChartDefinition,\n ChartSettings,\n} from \"@/types/ChartTypes\";\nimport { rowChartDefinition } from \"../components/charts/RowChart/definition\";\n\ntype ChartType = string;\n\nexport interface ChartRegistry {\n register<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n ): void;\n get(type: ChartType): ChartDefinition<ChartSettings> | undefined;\n getAll(): ChartDefinition<ChartSettings>[];\n has(type: ChartType): boolean;\n}\n\nexport class ChartRegistryImpl implements ChartRegistry {\n private definitions = new Map<ChartType, ChartDefinition<ChartSettings>>();\n\n register<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n ): void {\n if (this.definitions.has(definition.type)) {\n console.error(`Chart type ${definition.type} is already registered`);\n return;\n }\n this.definitions.set(\n definition.type,\n definition as unknown as ChartDefinition<ChartSettings>\n );\n }\n\n get(type: ChartType): ChartDefinition<ChartSettings> | undefined {\n return this.definitions.get(type);\n }\n\n getAll(): ChartDefinition<ChartSettings>[] {\n return Array.from(this.definitions.values());\n }\n\n has(type: ChartType): boolean {\n return this.definitions.has(type);\n }\n}\n\n// Singleton instance\nexport const chartRegistry = new ChartRegistryImpl();\n\n// Helper functions\nexport function registerChart<TSettings extends BaseChartSettings>(\n definition: ChartDefinition<TSettings>\n): void {\n chartRegistry.register(definition);\n}\n\nexport function getChartDefinition(\n type: ChartType\n): ChartDefinition<ChartSettings> {\n const def = chartRegistry.get(type);\n if (!def) {\n throw new Error(`Chart type ${type} not registered`);\n }\n return def;\n}\n\nexport function useChartDefinition(type: ChartType) {\n const definition = chartRegistry.get(type);\n\n if (!definition) {\n throw new Error(`Chart type ${type} not registered`);\n }\n\n return definition;\n}\n\nexport function registerAllCharts() {\n chartRegistry.register(rowChartDefinition);\n chartRegistry.register(barChartDefinition);\n chartRegistry.register(scatterPlotDefinition);\n chartRegistry.register(threeDScatterDefinition);\n chartRegistry.register(pivotTableDefinition);\n chartRegistry.register(dataTableDefinition);\n chartRegistry.register(summaryTableDefinition);\n chartRegistry.register(markdownDefinition);\n chartRegistry.register(boxPlotDefinition);\n chartRegistry.register(colorLegendDefinition);\n chartRegistry.register(lineChartDefinition);\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport crossfilter from \"crossfilter2\";\nimport isEqual from \"react-fast-compare\";\n\ntype FieldValue = string | number | boolean | undefined;\n\ntype ChartDimension<TData, TId extends IdType> = {\n dimension: crossfilter.Dimension<TData, TId>;\n chart: ChartSettings;\n};\n\nexport class CrossfilterWrapper<T> {\n ref: crossfilter.Crossfilter<T>;\n charts: Map<string, ChartDimension<T, IdType>> = new Map();\n idFunction: (item: T) => IdType;\n\n // assume this gets set after creation\n fieldGetter: (name: string) => Record<IdType, FieldValue> = () => ({});\n\n constructor(data: T[], idFunction: (item: T) => IdType) {\n this.ref = crossfilter(data);\n this.idFunction = idFunction;\n }\n\n setFieldGetter(fieldGetter: (name: string) => Record<IdType, FieldValue>) {\n this.fieldGetter = fieldGetter;\n }\n\n updateChart(chart: ChartSettings) {\n // check if the filters have changed\n const oldChart = this.charts.get(chart.id);\n\n // Compare filters directly\n if (!isEqual(oldChart?.chart.filters, chart.filters)) {\n this.updateChartFilters(chart);\n }\n\n // need to update internal defs so diff works again\n\n if (!oldChart) {\n // will hit this case if we did an update and should have done remove/add\n this.charts.set(chart.id, {\n dimension: this.ref.dimension(this.idFunction),\n chart,\n });\n } else {\n this.charts.set(chart.id, {\n ...oldChart,\n chart,\n });\n }\n }\n\n updateChartFilters(chart: ChartSettings) {\n // get the filters from the chart\n const filterFunc = this.getFilterFunction(chart);\n\n const foundChart = this.charts.get(chart.id);\n\n // apply the filters to the dimension\n const dimension = foundChart?.dimension;\n if (!dimension) {\n console.error(\"updateChartFilters: dimension not found\", {\n chart,\n charts: this.charts,\n });\n return;\n }\n\n dimension.filterFunction(filterFunc);\n\n // this gives an object with key + value\n // the value will be 1 if the item should be rendered\n // will still need to check the value = 1 items in the actual chart with the filter func again\n // ideally wire up the hook to the raw crossfilter obj so charts can get IDs to render per dim\n }\n\n addChart(chart: ChartSettings) {\n // need to create a dimension for the chart\n const dimension = this.ref.dimension(this.idFunction);\n\n const chartDimension: ChartDimension<T, IdType> = {\n dimension,\n chart,\n };\n\n this.charts.set(chart.id, chartDimension);\n\n this.updateChartFilters(chart);\n }\n\n removeChart(chart: ChartSettings) {\n const savedChart = this.charts.get(chart.id);\n if (!savedChart) {\n throw new Error(`Chart ${chart.id} not found`);\n }\n\n savedChart.dimension.filterAll();\n savedChart.dimension.dispose();\n this.charts.delete(chart.id);\n }\n\n removeAllCharts() {\n // Clear and dispose all dimensions\n for (const chart of this.charts.values()) {\n chart.dimension.filterAll();\n chart.dimension.dispose();\n }\n // Clear the charts map\n this.charts.clear();\n }\n\n getFilterFunction(chart: ChartSettings): (d: IdType) => boolean {\n const definition = getChartDefinition(chart.type);\n return definition.getFilterFunction(chart, this.fieldGetter);\n }\n\n getAllData() {\n // obj with key as id and value as datum\n\n // id -> count\n const data: LiveItemMap = {};\n\n const commonNonce = new Date().getTime();\n\n for (const chart of this.charts.values()) {\n data[chart.chart.id] = {\n items: chart.dimension.group<IdType, number>().all(),\n nonce: commonNonce,\n };\n }\n\n return data;\n }\n}\n\nexport type LiveItem = {\n items: readonly crossfilter.Grouping<IdType, number>[];\n nonce: number;\n};\n\nexport type LiveItemMap = Record<string, LiveItem>;\n","import { datum } from \"@/types/ChartTypes\";\nimport { timeFormat } from \"d3-time-format\";\nimport {\n type AdvancedExpression,\n type BasicExpression,\n type CalculationContext,\n type CalculationResult,\n type Expression,\n type FunctionExpression,\n type GroupExpression,\n type LiteralExpression,\n type RankExpression,\n type TernaryExpression,\n type UnaryExpression,\n} from \"../types\";\n\ntype CalcFunction = (...args: any[]) => any;\n\nexport class Calculator {\n constructor(private context: CalculationContext) {}\n\n evaluate(expression: Expression): CalculationResult {\n try {\n let result: any;\n let funcResult: CalculationResult;\n\n switch (expression.type) {\n case \"basic\":\n result = this.evaluateBasic(expression as BasicExpression);\n break;\n case \"function\":\n funcResult = this.evaluateFunction(expression as FunctionExpression);\n if (!funcResult.success) {\n console.error(\n `[Calculator.evaluate] Function evaluation failed: ${funcResult.error}`\n );\n return funcResult;\n }\n result = funcResult.value;\n break;\n case \"group\":\n result = this.evaluateGroup(expression as GroupExpression);\n break;\n case \"rank\":\n result = this.evaluateRank(expression as RankExpression);\n break;\n case \"advanced\":\n result = this.evaluateAdvanced(expression as AdvancedExpression);\n break;\n case \"ternary\":\n result = this.evaluateTernary(expression as TernaryExpression);\n break;\n case \"unary\":\n result = this.evaluateUnary(expression as UnaryExpression);\n break;\n case \"literal\":\n result = this.evaluateLiteral(expression as LiteralExpression);\n break;\n default:\n throw new Error(\n `Unknown expression type: ${(expression as any).type}`\n );\n }\n\n // Ensure we return a proper CalculationResult\n return {\n success: true,\n value: result,\n };\n } catch (error: unknown) {\n console.error(\n `[Calculator.evaluate] Error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n return {\n success: false,\n value: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private evaluateBasic(expression: BasicExpression): datum {\n if (!expression.left || !expression.right) {\n throw new Error(`Invalid basic expression: missing operands`);\n }\n\n const leftResult = this.evaluate(expression.left);\n if (!leftResult.success) {\n throw new Error(`Failed to evaluate left operand: ${leftResult.error}`);\n }\n\n const rightResult = this.evaluate(expression.right);\n if (!rightResult.success) {\n throw new Error(`Failed to evaluate right operand: ${rightResult.error}`);\n }\n\n const left = leftResult.value;\n const right = rightResult.value;\n\n // Convert operands to numbers if they're strings that look like numbers\n const leftNum = typeof left === \"string\" ? Number(left) : left;\n const rightNum = typeof right === \"string\" ? Number(right) : right;\n\n if (isNaN(leftNum) || isNaN(rightNum)) {\n throw new Error(\n `Invalid operands for operator ${expression.operator}: ${left}, ${right}`\n );\n }\n\n switch (expression.operator) {\n case \"+\":\n return leftNum + rightNum;\n case \"-\":\n return leftNum - rightNum;\n case \"*\":\n return leftNum * rightNum;\n case \"/\":\n if (rightNum === 0) {\n throw new Error(\"Division by zero\");\n }\n return leftNum / rightNum;\n case \"^\":\n return Math.pow(leftNum, rightNum);\n default:\n throw new Error(`Unknown operator: ${expression.operator}`);\n }\n }\n\n private evaluateFunction(expression: FunctionExpression): CalculationResult {\n // Get the function implementation first\n const func = this.getFunction(expression.functionName);\n if (!func) {\n console.error(\n `[Calculator.evaluateFunction] Unknown function: ${expression.functionName}`\n );\n return {\n success: false,\n value: null,\n error: `Unknown function: ${expression.functionName}`,\n };\n }\n\n try {\n // Evaluate all arguments\n\n const evaluatedArgs = expression.arguments.map((arg: Expression) => {\n if (arg.type === \"literal\") {\n const literalArg = arg as LiteralExpression;\n\n // If it has a numeric value, use it directly\n if (literalArg.value !== undefined) {\n if (typeof literalArg.value === \"number\") {\n return literalArg.value;\n }\n\n // If it's a string literal, use it directly\n if (typeof literalArg.value === \"string\") {\n // Check if it's a variable reference\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalArg.value)) {\n const value = this.context.variables.get(literalArg.value);\n if (value !== undefined) {\n return value;\n }\n }\n return literalArg.value;\n }\n\n return literalArg.value;\n }\n\n // If name is defined and it's a number, use it directly\n if (typeof literalArg.name === \"string\") {\n // If it looks like a number, convert it\n if (!isNaN(Number(literalArg.name))) {\n return Number(literalArg.name);\n }\n\n // If it looks like a variable, try to resolve it\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalArg.name)) {\n const value = this.context.variables.get(literalArg.name);\n if (value !== undefined) {\n return value;\n }\n }\n\n return literalArg.name;\n }\n\n return literalArg.value !== undefined\n ? literalArg.value\n : literalArg.name;\n }\n\n const result = this.evaluate(arg);\n if (!result.success) {\n throw new Error(`Failed to evaluate argument: ${result.error}`);\n }\n return result.value;\n });\n\n // For date functions, ensure the first argument is a Date object\n if (\n expression.functionName.toLowerCase() === \"formatdate\" ||\n expression.functionName.toLowerCase() === \"extractdatecomponent\"\n ) {\n if (!(evaluatedArgs[0] instanceof Date)) {\n try {\n // If it's a variable name, try to get the actual date from variables\n if (\n typeof evaluatedArgs[0] === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(evaluatedArgs[0])\n ) {\n const dateValue = this.context.variables.get(evaluatedArgs[0]);\n if (dateValue instanceof Date) {\n evaluatedArgs[0] = dateValue;\n } else if (dateValue !== undefined) {\n evaluatedArgs[0] = new Date(dateValue);\n }\n } else {\n evaluatedArgs[0] = new Date(evaluatedArgs[0]);\n }\n\n if (isNaN(evaluatedArgs[0].getTime())) {\n console.error(\n `[Calculator.evaluateFunction] Invalid date:`,\n evaluatedArgs[0]\n );\n return {\n success: false,\n value: null,\n error: `Invalid date: ${evaluatedArgs[0]}`,\n };\n }\n } catch (error) {\n console.error(\n `[Calculator.evaluateFunction] Date conversion error:`,\n error\n );\n return {\n success: false,\n value: null,\n error: `Failed to convert argument to Date: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n }\n\n // Execute the function with evaluated arguments\n const result = func(...evaluatedArgs);\n return {\n success: true,\n value: result,\n };\n } catch (error) {\n console.error(`[Calculator.evaluateFunction] Error:`, error);\n return {\n success: false,\n value: null,\n error: `Error executing function ${expression.functionName}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n\n private evaluateGroup(expression: GroupExpression): Record<string, datum> {\n const groupBy = expression.groupBy;\n const aggregation = expression.aggregation;\n\n // Group the data\n const groups = new Map<string, any[]>();\n for (const row of this.context.data) {\n const key = groupBy.map((field: string) => row[field]).join(\":\");\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n }\n\n // Apply aggregation to each group\n const results = new Map<string, any>();\n for (const [key, groupData] of groups) {\n results.set(key, this.aggregate(groupData, aggregation));\n }\n\n return Object.fromEntries(results);\n }\n\n private evaluateRank(expression: RankExpression): Record<number, number> {\n const rankBy = expression.rankBy;\n const isNormalized = expression.isNormalized;\n const isCumulative = expression.isCumulative;\n\n // Sort the data\n const sortedData = [...this.context.data].sort((a, b) => {\n for (const field of rankBy) {\n if (a[field] < b[field]) {\n return -1;\n }\n if (a[field] > b[field]) {\n return 1;\n }\n }\n return 0;\n });\n\n // Assign ranks\n const ranks = new Map<number, number>();\n sortedData.forEach((row, index) => {\n const rank = index + 1;\n ranks.set(row.id, isNormalized ? rank / sortedData.length : rank);\n });\n\n if (isCumulative) {\n let sum = 0;\n const sortedRanks = Array.from(ranks.entries()).sort(([id1], [id2]) => {\n const row1 = sortedData.find((row) => row.id === id1);\n const row2 = sortedData.find((row) => row.id === id2);\n if (!row1 || !row2) {\n return 0;\n }\n for (const field of rankBy) {\n if (row1[field] < row2[field]) {\n return -1;\n }\n if (row1[field] > row2[field]) {\n return 1;\n }\n }\n return 0;\n });\n\n for (const [id, value] of sortedRanks) {\n sum += value;\n ranks.set(id, sum);\n }\n }\n\n return Object.fromEntries(ranks);\n }\n\n private evaluateAdvanced(expression: AdvancedExpression): Promise<any> {\n // This would be implemented based on the specific advanced analytics needed\n throw new Error(\"Advanced analytics not implemented yet\");\n }\n\n private getFunction(name: string): CalcFunction | undefined {\n console.log(`[Calculator.getFunction] Looking up function: ${name}`);\n const functions: Record<string, CalcFunction> = {\n sum: (...values: number[]) => {\n return values.reduce((a, b) => Number(a) + Number(b), 0);\n },\n avg: (...values: number[]) => {\n return (\n values.reduce((a, b) => Number(a) + Number(b), 0) / values.length\n );\n },\n min: (...values: number[]) => {\n return Math.min(...values.map((v) => Number(v)));\n },\n max: (...values: number[]) => {\n return Math.max(...values.map((v) => Number(v)));\n },\n count: (...values: any[]) => {\n return values.length;\n },\n formatdate: (date: Date, format: string) => {\n return this.formatDate(date, format);\n },\n extractdatecomponent: (\n date: Date,\n component: \"year\" | \"month\" | \"day\" | \"quarter\" | \"week\"\n ) => {\n return this.extractDateComponent(date, component);\n },\n };\n\n // First try exact match\n if (name in functions) {\n return functions[name];\n }\n\n // Try case-insensitive match\n const lowerName = name.toLowerCase();\n const functionKey = Object.keys(functions).find(\n (key) => key.toLowerCase() === lowerName\n );\n return functionKey ? functions[functionKey] : undefined;\n }\n\n private aggregate(data: any[], type: string): any {\n const values = data.map((row) => row.value);\n\n switch (type) {\n case \"sum\":\n return values.reduce((a, b) => a + b, 0);\n case \"average\":\n return values.reduce((a, b) => a + b, 0) / values.length;\n case \"min\":\n return Math.min(...values);\n case \"max\":\n return Math.max(...values);\n case \"count\":\n return values.length;\n case \"countUnique\":\n return new Set(values).size;\n default:\n throw new Error(`Unknown aggregation type: ${type}`);\n }\n }\n\n private evaluateExpression(expr: Expression): number {\n if (expr.type === \"literal\") {\n const literalExpr = expr as LiteralExpression;\n if (literalExpr.value !== undefined) {\n // If it's a string and looks like an identifier, try to resolve it from variables\n if (\n typeof literalExpr.value === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalExpr.value)\n ) {\n const value = this.context.variables.get(literalExpr.value);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${literalExpr.value}`);\n }\n return Number(value);\n }\n return Number(literalExpr.value);\n }\n // Handle identifiers in the name field\n if (\n typeof literalExpr.name === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(literalExpr.name)\n ) {\n const value = this.context.variables.get(literalExpr.name);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${literalExpr.name}`);\n }\n return Number(value);\n }\n return Number(literalExpr.name);\n }\n\n if (expr.type === \"basic\") {\n const basicExpr = expr as BasicExpression;\n if (!basicExpr.left || !basicExpr.right) {\n throw new Error(`Invalid basic expression: missing operands`);\n }\n\n const left = this.evaluateExpression(basicExpr.left);\n const right = this.evaluateExpression(basicExpr.right);\n\n switch (basicExpr.operator) {\n case \"+\":\n return left + right;\n case \"-\":\n return left - right;\n case \"*\":\n return left * right;\n case \"/\":\n if (right === 0) {\n throw new Error(\"Division by zero\");\n }\n return left / right;\n case \"^\":\n return Math.pow(left, right);\n default:\n throw new Error(`Unknown operator: ${basicExpr.operator}`);\n }\n }\n\n if (expr.type === \"unary\") {\n const unaryExpr = expr as UnaryExpression;\n if (!unaryExpr.operand) {\n throw new Error(`Invalid unary expression: missing operand`);\n }\n\n const operand = this.evaluateExpression(unaryExpr.operand);\n\n switch (unaryExpr.operator) {\n case \"-\":\n return -operand;\n case \"+\":\n return operand;\n default:\n throw new Error(`Unknown unary operator: ${unaryExpr.operator}`);\n }\n }\n\n if (expr.type === \"ternary\") {\n const ternaryExpr = expr as TernaryExpression;\n if (\n !ternaryExpr.condition ||\n !ternaryExpr.trueBranch ||\n !ternaryExpr.falseBranch\n ) {\n throw new Error(`Invalid ternary expression: missing branches`);\n }\n\n const condition = this.evaluateExpression(ternaryExpr.condition);\n return condition\n ? this.evaluateExpression(ternaryExpr.trueBranch)\n : this.evaluateExpression(ternaryExpr.falseBranch);\n }\n\n throw new Error(`Unsupported expression type: ${expr.type}`);\n }\n\n private evaluateUnary(expression: UnaryExpression): datum {\n if (!expression.operand) {\n throw new Error(`Invalid unary expression: missing operand`);\n }\n return this.evaluateExpression(expression);\n }\n\n private evaluateTernary(expression: TernaryExpression): datum {\n if (\n !expression.condition ||\n !expression.trueBranch ||\n !expression.falseBranch\n ) {\n throw new Error(`Invalid ternary expression: missing branches`);\n }\n return this.evaluateExpression(expression);\n }\n\n // Date Processing Functions\n private formatDate(date: Date, format: string): string {\n console.log(\n `[Calculator.formatDate] Formatting date with format: ${format}`,\n date\n );\n try {\n const formatter = timeFormat(format);\n const result = formatter(date);\n console.log(`[Calculator.formatDate] Result:`, result);\n return result;\n } catch (error) {\n console.error(`[Calculator.formatDate] Error:`, error);\n throw new Error(\n `Error formatting date: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private getISOWeek(date: Date): number {\n try {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n d.setDate(d.getDate() + 3 - ((d.getDay() + 6) % 7));\n const week1 = new Date(d.getFullYear(), 0, 4);\n return (\n 1 +\n Math.round(\n ((d.getTime() - week1.getTime()) / 86400000 -\n 3 +\n ((week1.getDay() + 6) % 7)) /\n 7\n )\n );\n } catch (error) {\n throw new Error(\n `Error calculating ISO week: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private extractDateComponent(\n date: Date,\n component: \"year\" | \"month\" | \"day\" | \"quarter\" | \"week\"\n ): number {\n try {\n let result: number;\n switch (component) {\n case \"year\":\n result = date.getFullYear();\n break;\n case \"month\":\n result = date.getMonth() + 1; // Adding 1 since getMonth() returns 0-11\n break;\n case \"day\":\n result = date.getDate();\n break;\n case \"quarter\":\n result = Math.floor(date.getMonth() / 3) + 1;\n break;\n case \"week\":\n result = this.getISOWeek(date);\n break;\n default:\n throw new Error(`Unknown date component: ${component}`);\n }\n return result;\n } catch (error) {\n console.error(`[Calculator.extractDateComponent] Error:`, error);\n throw new Error(\n `Error extracting date component: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n // String Operation Functions\n private concatenateStrings(strings: string[]): string {\n throw new Error(\"String concatenation not implemented\");\n }\n\n private extractSubstring(str: string, start: number, end?: number): string {\n throw new Error(\"Substring extraction not implemented\");\n }\n\n private patternMatch(\n str: string,\n pattern: string,\n replacement?: string\n ): string | string[] {\n throw new Error(\"Pattern matching not implemented\");\n }\n\n // Statistical Functions\n private calculatePercentile(values: number[], percentile: number): number {\n throw new Error(\"Percentile calculation not implemented\");\n }\n\n private calculateStandardDeviation(values: number[]): number {\n throw new Error(\"Standard deviation calculation not implemented\");\n }\n\n private calculateVariance(values: number[]): number {\n throw new Error(\"Variance calculation not implemented\");\n }\n\n private calculateMedian(values: number[]): number {\n throw new Error(\"Median calculation not implemented\");\n }\n\n private calculateZScore(value: number, mean: number, stdDev: number): number {\n throw new Error(\"Z-score calculation not implemented\");\n }\n\n // Advanced Analytics Functions\n private performSOM(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"Self-organizing maps not implemented\");\n }\n\n private performPCA(data: number[][], components: number): number[][] {\n throw new Error(\"PCA not implemented\");\n }\n\n private performUMAP(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"UMAP transformation not implemented\");\n }\n\n private performTSNE(\n data: number[][],\n options: Record<string, any>\n ): number[][] {\n throw new Error(\"t-SNE transformation not implemented\");\n }\n\n // Regression Analysis Functions\n private performLinearRegression(\n x: number[],\n y: number[]\n ): Record<string, any> {\n throw new Error(\"Linear regression not implemented\");\n }\n\n private performPolynomialRegression(\n x: number[],\n y: number[],\n degree: number\n ): Record<string, any> {\n throw new Error(\"Polynomial regression not implemented\");\n }\n\n private calculateResiduals(\n observed: number[],\n predicted: number[]\n ): number[] {\n throw new Error(\"Residuals calculation not implemented\");\n }\n\n private performANOVA(groups: number[][]): Record<string, any> {\n throw new Error(\"ANOVA not implemented\");\n }\n\n // Data Transformation Functions\n private normalizeData(values: number[]): number[] {\n throw new Error(\"Data normalization not implemented\");\n }\n\n private standardizeData(values: number[]): number[] {\n throw new Error(\"Data standardization not implemented\");\n }\n\n private logTransform(values: number[], base?: number): number[] {\n throw new Error(\"Logarithmic transformation not implemented\");\n }\n\n private binData(\n values: number[],\n binCount: number\n ): Record<string, number[]> {\n throw new Error(\"Data binning not implemented\");\n }\n\n private createDummyVariables(categories: string[]): Record<string, number[]> {\n throw new Error(\"Dummy variable creation not implemented\");\n }\n\n private evaluateLiteral(expression: LiteralExpression): any {\n // If value is defined, use it first\n if (expression.value !== undefined) {\n // If it's a string that looks like an identifier, try to resolve it from variables\n if (\n typeof expression.value === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(expression.value)\n ) {\n const value = this.context.variables.get(expression.value);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${expression.value}`);\n }\n return value;\n }\n // If it's a string that looks like a number, convert it\n if (\n typeof expression.value === \"string\" &&\n !isNaN(Number(expression.value))\n ) {\n return Number(expression.value);\n }\n return expression.value;\n }\n\n // If name is defined and looks like an identifier, try to resolve it from variables\n if (\n typeof expression.name === \"string\" &&\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(expression.name)\n ) {\n const value = this.context.variables.get(expression.name);\n if (value === undefined) {\n throw new Error(`Undefined variable: ${expression.name}`);\n }\n return value;\n }\n\n // If name is a string that looks like a number, convert it\n if (\n typeof expression.name === \"string\" &&\n !isNaN(Number(expression.name))\n ) {\n return Number(expression.name);\n }\n\n return expression.name;\n }\n}\n","import { DatumObject, HasId } from \"@/providers/DataLayerProvider\";\nimport { Calculator } from \"./engine/Calculator\";\nimport { CalculationContext, Expression } from \"./types\";\nimport { datum } from \"@/types/ChartTypes\";\n\nexport interface CalculationDefinition {\n expression: Expression;\n resultColumnName: string;\n}\n\nexport interface CalculationStateType {\n calculations: CalculationDefinition[];\n calculationResults: Map<string, Map<number, any>>;\n dependencyGraph: Map<string, Set<string>>;\n}\n\nexport const createCalculationState = (): CalculationStateType => {\n return {\n calculations: [],\n calculationResults: new Map(),\n dependencyGraph: new Map(),\n };\n};\n\nexport class CalculationManager<T extends DatumObject> {\n private calculator: Calculator | null = null;\n private state: CalculationStateType;\n\n constructor(private data: (T & HasId)[]) {\n this.state = createCalculationState();\n }\n\n /**\n * Add a new calculation definition\n */\n addCalculation(calculation: CalculationDefinition): Set<string> {\n // Check if a calculation with this result column name already exists\n const existingIndex = this.state.calculations.findIndex(\n (calc) => calc.resultColumnName === calculation.resultColumnName\n );\n\n if (existingIndex !== -1) {\n throw new Error(\n `A calculation with result column name '${calculation.resultColumnName}' already exists`\n );\n }\n\n this.state.calculations.push(calculation);\n this.updateDependencyGraph(calculation);\n\n // Execute the calculation and collect all affected columns\n const affectedColumns = new Set<string>([calculation.resultColumnName]);\n\n // Find all dependent calculations that were executed\n const dependents = this.findDependents(calculation.resultColumnName);\n for (const dependent of dependents) {\n affectedColumns.add(dependent);\n }\n\n return affectedColumns;\n }\n\n /**\n * Remove a calculation by result column name\n */\n removeCalculation(resultColumnName: string): void {\n this.state.calculations = this.state.calculations.filter(\n (calc) => calc.resultColumnName !== resultColumnName\n );\n this.state.calculationResults.delete(resultColumnName);\n this.state.dependencyGraph.delete(resultColumnName);\n\n // Remove this calculation from other calculations' dependencies\n for (const [, dependencies] of this.state.dependencyGraph.entries()) {\n dependencies.delete(resultColumnName);\n }\n }\n\n /**\n * Get all calculation definitions\n */\n getCalculations(): CalculationDefinition[] {\n return [...this.state.calculations];\n }\n\n getPreceedingCalculations(\n calculation: CalculationDefinition\n ): CalculationDefinition[] {\n const precedents = new Set<string>();\n\n // find all calculations that come before this one in the dependency graph\n // do it recursively until we have all precedents\n const visited = new Set<string>();\n const visit = (resultColumnName: string) => {\n if (visited.has(resultColumnName)) {\n return;\n }\n visited.add(resultColumnName);\n\n for (const [calcName, deps] of this.state.dependencyGraph.entries()) {\n if (deps.has(resultColumnName)) {\n precedents.add(calcName);\n visit(calcName);\n }\n }\n };\n\n visit(calculation.resultColumnName);\n\n if (precedents.size === 0) {\n return [];\n }\n\n const precedentsArray = Array.from(precedents);\n return precedentsArray\n .map(\n (name) =>\n this.state.calculations.find(\n (calc) => calc.resultColumnName === name\n ) || undefined\n )\n .filter(Boolean) as CalculationDefinition[];\n }\n\n /**\n * Execute a specific calculation\n */\n executeCalculation(calculation: CalculationDefinition): Map<number, datum> {\n if (!this.calculator) {\n this.initializeCalculator();\n }\n\n const precedents = this.getPreceedingCalculations(calculation);\n for (const precedent of precedents) {\n this.executeCalculation(precedent);\n }\n\n const resultMap = new Map<number, datum>();\n\n // Execute the calculation for each row\n for (const row of this.data) {\n const context: CalculationContext = {\n data: this.data,\n variables: this.createVariablesForRow(row),\n };\n\n this.calculator = new Calculator(context);\n const result = this.calculator.evaluate(calculation.expression);\n\n if (result.success) {\n resultMap.set(row.__ID, result.value);\n } else {\n console.error(\n `Calculation error for ${calculation.resultColumnName}:`,\n result.error\n );\n resultMap.set(row.__ID, undefined);\n }\n }\n\n // Store the results\n this.state.calculationResults.set(calculation.resultColumnName, resultMap);\n\n return resultMap;\n }\n\n /**\n * Find all calculations that depend on a given calculation\n */\n private findDependents(resultColumnName: string): Set<string> {\n const dependents = new Set<string>();\n\n // Find calculations that directly depend on this calculation's result column\n for (const [\n calcName,\n dependencies,\n ] of this.state.dependencyGraph.entries()) {\n // Check if this calculation depends on the target calculation\n if (dependencies.has(resultColumnName)) {\n dependents.add(calcName);\n\n // Recursively find dependents of this dependent\n const nestedDependents = this.findDependents(calcName);\n for (const nestedName of nestedDependents) {\n dependents.add(nestedName);\n }\n }\n }\n\n return dependents;\n }\n\n /**\n * Update the dependency graph for a calculation\n */\n private updateDependencyGraph(calculation: CalculationDefinition): void {\n // Extract variable dependencies from the expression\n const dependencies = new Set<string>(calculation.expression.dependencies);\n\n // Update the dependency graph\n this.state.dependencyGraph.set(calculation.resultColumnName, dependencies);\n }\n\n /**\n * Initialize the calculator with current data\n */\n private initializeCalculator(): void {\n const context: CalculationContext = {\n data: this.data,\n variables: new Map(),\n };\n\n this.calculator = new Calculator(context);\n }\n\n /**\n * Create variables map for a specific row\n */\n private createVariablesForRow(row: T & HasId): Map<string, any> {\n const variables = new Map<string, any>();\n\n // Add all row fields as variables\n for (const [key, value] of Object.entries(row)) {\n if (key !== \"__ID\") {\n variables.set(key, value);\n }\n }\n\n // Add results from already calculated fields\n for (const calculation of this.state.calculations) {\n const results = this.state.calculationResults.get(\n calculation.resultColumnName\n );\n if (results && results.has(row.__ID)) {\n variables.set(calculation.resultColumnName, results.get(row.__ID));\n }\n }\n\n return variables;\n }\n}\n","import { SavedProject } from \"@/providers/DataLayerProvider\";\n\nconst PROJECTS_KEY = \"data-viz-projects\";\n\nexport function saveProjects(projects: SavedProject[]): void {\n localStorage.setItem(PROJECTS_KEY, JSON.stringify(projects));\n}\n\nexport function loadProjects(): SavedProject[] {\n const projectsJson = localStorage.getItem(PROJECTS_KEY);\n if (!projectsJson) {\n return [];\n }\n return JSON.parse(projectsJson);\n}\n\nexport function saveProject(project: SavedProject): void {\n const projects = loadProjects();\n const existingIndex = projects.findIndex(\n (p) => p.sourceDataPath === project.sourceDataPath\n );\n\n if (existingIndex >= 0) {\n projects[existingIndex] = project;\n } else {\n projects.push(project);\n }\n\n saveProjects(projects);\n}\n\nexport function deleteProject(sourceDataPath: string): void {\n const projects = loadProjects();\n const filteredProjects = projects.filter(\n (p) => p.sourceDataPath !== sourceDataPath\n );\n saveProjects(filteredProjects);\n}\n","import { getChartDefinition } from \"@/charts/registry\";\nimport {\n CrossfilterWrapper,\n LiveItem,\n LiveItemMap,\n} from \"@/hooks/CrossfilterWrapper\";\nimport {\n CalculationDefinition,\n CalculationManager,\n} from \"@/lib/calculations/CalculationState\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { ColorScaleType } from \"@/types/ColorScaleTypes\";\nimport {\n GridSettings,\n SerializedColorScale,\n ViewMetadata,\n} from \"@/types/SavedDataTypes\";\nimport { SavedDataStructure } from \"@/types/SavedDataStructure\";\nimport { saveProject } from \"@/utils/localStorage\";\nimport { createContext, useContext, useRef } from \"react\";\nimport { createStore, useStore } from \"zustand\";\n\ntype DatumObject = { [key: string]: datum };\nexport type { DatumObject };\n\n// Props and State interfaces\ninterface DataLayerProps<T extends DatumObject> {\n data?: T[];\n charts?: ChartSettings[];\n savedData?: SavedDataStructure;\n}\n\n// Add ID to the data type\nexport type IdType = number;\nexport type HasId = { __ID: IdType };\n\ninterface DataLayerState<T extends DatumObject> extends DataLayerProps<T> {\n data: (T & HasId)[];\n emptyColumn: Record<IdType, datum>;\n fileName: string | undefined;\n setData: (data: T[], fileName?: string) => void;\n\n liveItems: LiveItemMap;\n\n // Chart state\n charts: ChartSettings[];\n addChart: (chart: Omit<ChartSettings, \"id\">) => void;\n removeChart: (chart: ChartSettings) => void;\n removeAllCharts: () => void;\n updateChart: (id: string, settings: Partial<ChartSettings>) => void;\n\n // Color scale state\n colorScales: ColorScaleType[];\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => ColorScaleType;\n removeColorScale: (id: string) => void;\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => void;\n\n // Filter state (placeholder)\n clearAllFilters: () => void;\n clearFilter: (chart: ChartSettings) => void;\n\n crossfilterWrapper: CrossfilterWrapper<T & HasId>;\n nonce: number;\n getLiveItems: (chart: ChartSettings) => LiveItem | undefined;\n\n // data and key functions\n getColumnData: (field: string | undefined) => Record<IdType, datum>;\n getColumnNames: () => string[];\n columnCache: Record<string, Record<IdType, datum>>;\n\n // Project and View Management\n currentProject: SavedProject | null;\n setCurrentProject: (project: SavedProject) => void;\n saveCurrentView: (name: string) => void;\n loadView: (view: SavedView) => void;\n\n // Calculation state\n calculationManager: CalculationManager<T>;\n calculations: CalculationDefinition[];\n addCalculation: (\n calculation: Omit<CalculationDefinition, \"id\">\n ) => Promise<CalculationDefinition>;\n removeCalculation: (resultColumnName: string) => void;\n updateCalculation: (\n resultColumnName: string,\n newCalculation: CalculationDefinition\n ) => void;\n\n calcColumnCache: Record<string, Record<IdType, datum> | undefined>;\n\n // Grid settings\n gridSettings: GridSettings;\n updateGridSettings: (settings: Partial<GridSettings>) => void;\n\n // Save/Restore functionality\n saveToStructure: () => SavedDataStructure;\n restoreFromStructure: (savedData: SavedDataStructure) => void;\n}\n\n// Store type\ntype DataLayerStore<T extends DatumObject> = ReturnType<\n typeof createDataLayerStore<T>\n>;\n\nfunction getDataAndCrossfilterWrapper<T extends DatumObject>(\n data: T[],\n fieldGetter?: (name: string) => Record<IdType, datum>,\n charts?: ChartSettings[]\n): Partial<DataLayerState<T>> {\n const dataWithIds = data.map((row, index) => ({\n ...row,\n __ID: index,\n }));\n const newCrossFilter = new CrossfilterWrapper<T & HasId>(\n dataWithIds,\n (d) => d.__ID\n );\n\n if (fieldGetter) {\n newCrossFilter.setFieldGetter(fieldGetter);\n }\n\n if (charts) {\n charts.forEach((chart) => {\n newCrossFilter.addChart(chart);\n });\n }\n\n return {\n data: dataWithIds,\n emptyColumn: data.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper: newCrossFilter,\n charts: charts ?? [],\n colorScales: [],\n calculationManager: new CalculationManager<T>(dataWithIds),\n calculations: [],\n };\n}\n\n// Store creator\nconst getInitialStoreState = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n): Required<\n Pick<\n DataLayerState<T>,\n | \"data\"\n | \"emptyColumn\"\n | \"crossfilterWrapper\"\n | \"calculationManager\"\n | \"calculations\"\n | \"charts\"\n | \"colorScales\"\n | \"gridSettings\"\n | \"columnCache\"\n | \"calcColumnCache\"\n | \"nonce\"\n | \"currentProject\"\n | \"fileName\"\n >\n> => {\n const {\n data: initData,\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n } = getDataAndCrossfilterWrapper(initProps?.data ?? []);\n\n if (!crossfilterWrapper || !initData || !ogCalculationManager) {\n throw new Error(\n \"Data, crossfilterWrapper, or calculationManager not found\"\n );\n }\n\n // Initialize with saved data if provided\n if (initProps?.savedData) {\n const savedData = initProps.savedData;\n\n // Restore calculations\n const newCalculations: CalculationDefinition[] = [];\n savedData.calculations.forEach((calc) => {\n ogCalculationManager.addCalculation(calc);\n newCalculations.push(calc);\n });\n\n // Restore color scales with proper Map objects\n const restoredColorScales: ColorScaleType[] = savedData.colorScales.map(\n (scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: new Map(scale.mapping),\n };\n }\n return scale;\n }\n );\n\n return {\n data: initData,\n emptyColumn: initData.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: newCalculations,\n charts: savedData.charts,\n colorScales: restoredColorScales,\n gridSettings: savedData.gridSettings,\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n fileName: undefined,\n };\n }\n\n // Return default state if no saved data\n return {\n data: initData,\n emptyColumn: initData.reduce(\n (acc, row) => {\n acc[row.__ID as IdType] = undefined;\n return acc;\n },\n {} as Record<IdType, datum>\n ),\n crossfilterWrapper,\n calculationManager: ogCalculationManager,\n calculations: [],\n charts: initProps?.charts ?? [],\n colorScales: [],\n gridSettings: {\n columnCount: 12,\n rowHeight: 100,\n containerPadding: 10,\n showBackgroundMarkers: true,\n },\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n fileName: undefined,\n };\n};\n\nconst createDataLayerStore = <T extends DatumObject>(\n initProps?: Partial<DataLayerProps<T>>\n) => {\n const initialState = getInitialStoreState(initProps);\n const { crossfilterWrapper } = initialState;\n\n if (!crossfilterWrapper) {\n throw new Error(\"crossfilterWrapper not found in initial state\");\n }\n\n const store = createStore<DataLayerState<T>>()((set, get) => ({\n ...initialState,\n liveItems: {},\n setData: (rawData, fileName) => {\n // Get fresh crossfilter and data with IDs\n const {\n data: newData,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n } = getDataAndCrossfilterWrapper(rawData, get().getColumnData);\n\n // Create default summary chart\n const definition = getChartDefinition(\"summary\");\n\n const summaryChart = definition.createDefaultSettings({\n x: 0,\n y: 0,\n w: 4,\n h: 6,\n });\n\n // Reset everything to initial state\n set({\n data: newData,\n fileName,\n crossfilterWrapper: newCrossfilter,\n calculationManager: newCalculationManager,\n calculations: [],\n charts: [summaryChart],\n colorScales: [],\n liveItems: {},\n columnCache: {},\n calcColumnCache: {},\n nonce: 0,\n currentProject: null,\n });\n },\n\n addChart: (chartSettings) => {\n const { crossfilterWrapper } = get();\n const newChart = {\n ...chartSettings,\n id: crypto.randomUUID(),\n } as ChartSettings;\n\n crossfilterWrapper.addChart(newChart);\n set((state) => ({\n charts: [...state.charts, newChart],\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n removeChart: (chart) => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeChart(chart);\n set((state) => ({\n charts: state.charts.filter((ogChart) => ogChart.id !== chart.id),\n }));\n },\n\n removeAllCharts: () => {\n const { crossfilterWrapper } = get();\n crossfilterWrapper.removeAllCharts();\n set({ charts: [] });\n },\n\n updateChart: (id, settings) => {\n const { crossfilterWrapper } = get();\n\n const chart = get().charts.find((chart) => chart.id === id);\n\n if (!chart) {\n console.error(\"updateChart: chart not found\", { id });\n return;\n }\n\n let updatedChart: ChartSettings;\n\n if (id !== settings.id && settings.id) {\n // goal here is to catch obvious problem where id has changed\n\n // remove the old chart, add the new one\n crossfilterWrapper.removeChart(chart);\n crossfilterWrapper.addChart(settings as ChartSettings);\n\n updatedChart = settings as ChartSettings;\n } else {\n updatedChart = {\n ...chart,\n ...settings,\n } as ChartSettings;\n\n crossfilterWrapper.updateChart(updatedChart);\n }\n set((state) => ({\n charts: state.charts.map((chart) =>\n chart.id === id ? updatedChart : chart\n ),\n liveItems: crossfilterWrapper.getAllData(),\n }));\n },\n\n addColorScale: (scale: Omit<ColorScaleType, \"id\">) => {\n const newScale = {\n ...scale,\n id: crypto.randomUUID(),\n } as ColorScaleType;\n\n set((state) => ({\n colorScales: [...state.colorScales, newScale],\n }));\n\n return newScale;\n },\n\n removeColorScale: (id: string) => {\n set((state) => ({\n colorScales: state.colorScales.filter((scale) => scale.id !== id),\n }));\n },\n\n updateColorScale: (id: string, updates: Partial<ColorScaleType>) => {\n set((state) => ({\n colorScales: state.colorScales.map((scale) =>\n scale.id === id ? ({ ...scale, ...updates } as ColorScaleType) : scale\n ),\n }));\n },\n\n clearAllFilters: () => {\n const { charts, crossfilterWrapper } = get();\n\n const newCharts = charts.map((chart) => ({\n ...chart,\n filters: [],\n })) as ChartSettings[];\n\n for (const chart of newCharts) {\n crossfilterWrapper.updateChart(chart);\n }\n\n // Update all live items in a single update\n set({\n charts: newCharts,\n liveItems: crossfilterWrapper.getAllData(),\n });\n },\n\n clearFilter: (chart) => {\n const { updateChart } = get();\n updateChart(chart.id, { filters: [] });\n },\n\n getLiveItems: (chart) => {\n const { liveItems } = get();\n\n const liveItemsForChart = liveItems[chart.id] ?? undefined;\n\n return liveItemsForChart;\n },\n\n getColumnNames() {\n const { data, calculations } = get();\n const baseColumns = Object.keys(data[0] || {});\n\n const calcFields = calculations.map((calc) => calc.resultColumnName);\n\n return [...baseColumns, ...calcFields];\n },\n\n getColumnData(field: string | undefined) {\n const {\n columnCache,\n data,\n calcColumnCache,\n calculations,\n emptyColumn,\n calculationManager,\n } = get();\n\n if (!field) {\n return emptyColumn;\n }\n\n if (columnCache[field]) {\n return columnCache[field] as Record<string, datum>;\n }\n\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === field\n );\n\n if (calculation) {\n if (calcColumnCache[field]) {\n return calcColumnCache[field] as Record<string, datum>;\n }\n\n // Otherwise, calculate the column data\n // TODO: Implement calculation in the manager for whole column\n // needs to account for dependencies\n const resultMap = calculationManager.executeCalculation(calculation);\n\n // convert to Record<IdType, datum>\n const columnData: { [key: IdType]: datum } = {};\n resultMap.forEach((value, key) => {\n columnData[key] = value;\n });\n\n // update the column cache\n // doing the RAF since this is called in the render loop\n requestAnimationFrame(() => {\n set((state) => {\n const newCalcColumnCache = { ...state.calcColumnCache };\n newCalcColumnCache[field] = columnData;\n return { calcColumnCache: newCalcColumnCache };\n });\n });\n\n return columnData;\n }\n\n // check if field is in the data -- if not, return all undefined\n // do not add to column cache\n if (!data.some((row) => field in row)) {\n return emptyColumn;\n }\n\n // Otherwise, it's a regular column\n const columnData: { [key: IdType]: datum } = {};\n data.forEach((row) => {\n columnData[row.__ID] = row[field];\n });\n\n // doing the RAF since this is called in the render loop\n requestAnimationFrame(() => {\n set((state) => {\n const newColumnCache = { ...state.columnCache };\n newColumnCache[field] = columnData;\n return { columnCache: newColumnCache };\n });\n });\n\n return columnData;\n },\n\n setCurrentProject: (project: SavedProject) => {\n set({ currentProject: project });\n // Only save to storage if the project is marked as saved\n if (project.isSaved) {\n saveProject(project);\n }\n },\n\n saveCurrentView: (name: string) => {\n const { charts, currentProject, calculations } = get();\n\n if (!currentProject) {\n console.error(\"No project selected\");\n return;\n }\n\n const newView: SavedView = {\n version: 1,\n name,\n charts: [...charts],\n calculations: [...calculations],\n };\n\n const updatedProject: SavedProject = {\n ...currentProject,\n views: [...currentProject.views, newView],\n };\n\n set({ currentProject: updatedProject });\n // Only save to storage if the project is marked as saved\n if (updatedProject.isSaved) {\n saveProject(updatedProject);\n }\n },\n\n loadView: (view: SavedView) => {\n const { crossfilterWrapper, calculationManager } = get();\n\n // Clear existing charts\n crossfilterWrapper.charts.forEach((_, chartId) => {\n crossfilterWrapper.removeChart({ id: chartId } as ChartSettings);\n });\n\n // Load new charts\n set({ charts: view.charts });\n\n // Initialize crossfilter for new charts\n view.charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // Load calculations if they exist\n if (view.calculations) {\n // Clear existing calculations\n calculationManager?.getCalculations().forEach((calc) => {\n calculationManager.removeCalculation(calc.resultColumnName);\n });\n\n // Add new calculations\n const newCalculations: CalculationDefinition[] = [];\n view.calculations.forEach(async (calc) => {\n if (calculationManager) {\n try {\n await calculationManager.addCalculation(calc);\n newCalculations.push(calc);\n } catch (error) {\n console.error(\"Error adding calculation:\", error);\n }\n }\n });\n\n set({ calculations: newCalculations });\n }\n\n set({ liveItems: crossfilterWrapper.getAllData() });\n },\n\n // Calculation management\n addCalculation: async (calculation) => {\n const { calculationManager } = get();\n\n if (!calculationManager) {\n throw new Error(\"Calculation manager not initialized\");\n }\n\n const affectedColumns = calculationManager.addCalculation(calculation);\n\n set((state) => {\n const newCalculations = [...state.calculations, calculation];\n const newCalcColumnCache = { ...state.calcColumnCache };\n for (const columnName of affectedColumns) {\n newCalcColumnCache[columnName] = undefined;\n }\n return {\n calculations: newCalculations,\n calcColumnCache: newCalcColumnCache,\n nonce: state.nonce + 1,\n };\n });\n\n return calculation;\n },\n\n removeCalculation: (resultColumnName) => {\n const { calculationManager } = get();\n if (!calculationManager) {\n throw new Error(\"Calculation manager not initialized\");\n }\n\n calculationManager.removeCalculation(resultColumnName);\n\n set((state) => ({\n calculations: state.calculations.filter(\n (calc) => calc.resultColumnName !== resultColumnName\n ),\n }));\n\n // Remove from column cache\n set((state) => {\n const newColumnCache = { ...state.columnCache };\n if (resultColumnName in newColumnCache) {\n delete newColumnCache[resultColumnName];\n }\n return { columnCache: newColumnCache };\n });\n },\n\n updateCalculation: (resultColumnName, newCalculation) => {\n const { addCalculation, removeCalculation } = get();\n\n removeCalculation(resultColumnName);\n addCalculation(newCalculation);\n },\n\n updateGridSettings: (settings) => {\n set((state) => ({\n gridSettings: {\n ...state.gridSettings,\n ...settings,\n },\n }));\n },\n\n // Save/Restore functionality\n saveToStructure: () => {\n const state = get();\n const metadata: ViewMetadata = {\n name: state.currentProject?.name ?? \"Untitled\",\n version: 1,\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n };\n\n // Convert Map objects in colorScales to arrays for serialization\n const serializedColorScales: SerializedColorScale[] =\n state.colorScales.map((scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: Array.from(scale.mapping.entries()),\n };\n }\n return scale;\n });\n\n return {\n charts: state.charts,\n calculations: state.calculations,\n gridSettings: state.gridSettings,\n metadata,\n colorScales: serializedColorScales,\n };\n },\n\n restoreFromStructure: (savedData: SavedDataStructure) => {\n const { crossfilterWrapper, calculationManager } = get();\n\n // Clear existing charts\n crossfilterWrapper.removeAllCharts();\n\n savedData.charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // Restore calculations\n const newCalculations: CalculationDefinition[] = [];\n savedData.calculations.forEach(async (calc) => {\n if (calculationManager) {\n try {\n await calculationManager.addCalculation(calc);\n newCalculations.push(calc);\n } catch (error) {\n console.error(\"Error restoring calculation:\", error);\n }\n }\n });\n\n // Restore color scales with proper Map objects\n const restoredColorScales: ColorScaleType[] = savedData.colorScales.map(\n (scale) => {\n if (scale.type === \"categorical\") {\n return {\n ...scale,\n mapping: new Map(scale.mapping),\n };\n }\n return scale;\n }\n );\n\n set((state) => ({\n gridSettings: savedData.gridSettings,\n charts: savedData.charts,\n calculations: newCalculations,\n colorScales: restoredColorScales,\n liveItems: crossfilterWrapper.getAllData(),\n nonce: state.nonce + 1,\n }));\n },\n }));\n\n // this stuff is done down here because we need the store methods to exist\n // before plumbing them into the crossfilter wrapper\n // not ideal... but it works.\n\n // this madness passes the column getter back into the crossfilter wrapper\n // this ensures that crossfilter has access to calculated fields\n crossfilterWrapper.setFieldGetter(store.getState().getColumnData);\n\n // add the initial charts to crossfilter\n store.getState().charts.forEach((chart) => {\n crossfilterWrapper.addChart(chart);\n });\n\n // set the live items\n store.setState({ liveItems: crossfilterWrapper.getAllData() });\n\n return store;\n};\n\n// Create context\nexport const DataLayerContext = createContext<DataLayerStore<any> | null>(null);\n\n// Provider wrapper\ntype DataLayerProviderProps<T extends DatumObject> = React.PropsWithChildren<\n DataLayerProps<T>\n>;\n\nexport function DataLayerProvider<T extends DatumObject>({\n children,\n ...props\n}: DataLayerProviderProps<T>) {\n const storeRef = useRef<DataLayerStore<T> | null>(null);\n if (!storeRef.current) {\n storeRef.current = createDataLayerStore<T>(props);\n // Initialize with saved data if provided\n }\n return (\n <DataLayerContext.Provider value={storeRef.current}>\n {children}\n </DataLayerContext.Provider>\n );\n}\n\n// Custom hook that mimics the hook returned by `create`\nexport function useDataLayer<T extends DatumObject, U>(\n selector: (state: DataLayerState<T>) => U\n): U {\n const store = useContext(DataLayerContext);\n if (!store) {\n throw new Error(\"Missing DataLayerContext.Provider in the tree\");\n }\n return useStore(store, selector);\n}\n\ntype SavedView = {\n version: 1;\n charts: ChartSettings[];\n name: string;\n calculations?: CalculationDefinition[];\n};\n\ntype SavedProject = {\n version: 1;\n name: string;\n sourceDataPath: string;\n views: SavedView[];\n isSaved: boolean;\n};\n\nexport type { SavedProject, SavedView };\n","import { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport {\n CategoricalColorScale,\n ColorScaleType,\n NumericalColorScale,\n} from \"@/types/ColorScaleTypes\";\nimport {\n interpolateCool,\n interpolateInferno,\n interpolateMagma,\n interpolatePlasma,\n interpolateViridis,\n interpolateWarm,\n schemeCategory10,\n schemeSet3,\n} from \"d3-scale-chromatic\";\nimport { Hash, Palette, Shapes } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { HexColorPicker } from \"react-colorful\";\n\nconst NUMERICAL_PALETTES = [\n { name: \"Viridis\", interpolator: interpolateViridis },\n { name: \"Inferno\", interpolator: interpolateInferno },\n { name: \"Magma\", interpolator: interpolateMagma },\n { name: \"Plasma\", interpolator: interpolatePlasma },\n { name: \"Warm\", interpolator: interpolateWarm },\n { name: \"Cool\", interpolator: interpolateCool },\n];\n\nconst CATEGORICAL_PALETTES = [\n { name: \"Category10\", colors: [...schemeCategory10] },\n { name: \"Set3\", colors: [...schemeSet3] },\n];\n\ninterface ColorScaleEditorState {\n scales: ColorScaleType[];\n isDirty: boolean;\n}\n\nfunction NumericalScalePreview({ palette }: { palette: string }) {\n const interpolator = NUMERICAL_PALETTES.find(\n (p) => p.name === palette\n )?.interpolator;\n if (!interpolator) {\n return null;\n }\n\n return (\n <div className=\"w-full h-8 rounded-md overflow-hidden\">\n <div\n className=\"w-full h-full\"\n style={{\n background: `linear-gradient(to right, ${Array.from(\n { length: 10 },\n (_, i) => interpolator(i / 9)\n ).join(\", \")})`,\n }}\n />\n </div>\n );\n}\n\nfunction CategoricalScalePreview({ colors }: { colors: string[] }) {\n return (\n <div className=\"flex w-full h-8 rounded-md overflow-hidden\">\n {colors.map((color, i) => (\n <div\n key={i}\n className=\"flex-1 h-full\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n );\n}\n\nfunction NumericalScaleEditor({\n scale,\n onUpdate,\n}: {\n scale: NumericalColorScale;\n onUpdate: (scale: NumericalColorScale) => void;\n}) {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n value={scale.name}\n onChange={(e) => onUpdate({ ...scale, name: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label>Min</Label>\n <Input\n type=\"number\"\n value={scale.min}\n onChange={(e) =>\n onUpdate({\n ...scale,\n min: parseFloat(e.target.value),\n })\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Max</Label>\n <Input\n type=\"number\"\n value={scale.max}\n onChange={(e) =>\n onUpdate({\n ...scale,\n max: parseFloat(e.target.value),\n })\n }\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Palette</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {NUMERICAL_PALETTES.map((p) => (\n <Button\n key={p.name}\n variant={scale.palette === p.name ? \"default\" : \"outline\"}\n className=\"w-full h-auto p-2\"\n onClick={() => onUpdate({ ...scale, palette: p.name })}\n >\n <div className=\"w-full space-y-2\">\n <span>{p.name}</span>\n <NumericalScalePreview palette={p.name} />\n </div>\n </Button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction CategoricalScaleEditor({\n scale,\n onUpdate,\n}: {\n scale: CategoricalColorScale;\n onUpdate: (scale: CategoricalColorScale) => void;\n}) {\n const [editingColor, setEditingColor] = useState<{\n value: string;\n color: string;\n } | null>(null);\n\n const updateColor = useCallback(\n (value: string, newColor: string) => {\n const newMapping = new Map(scale.mapping);\n newMapping.set(value, newColor);\n const newPalette = Array.from(newMapping.values());\n onUpdate({ ...scale, mapping: newMapping, palette: newPalette });\n },\n [scale, onUpdate]\n );\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n value={scale.name}\n onChange={(e) => onUpdate({ ...scale, name: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Preset Palettes</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {CATEGORICAL_PALETTES.map((p) => (\n <Button\n key={p.name}\n variant=\"outline\"\n className=\"w-full h-auto p-2\"\n onClick={() => {\n const newMapping = new Map();\n Array.from(scale.mapping.keys()).forEach((value, i) => {\n newMapping.set(value, p.colors[i % p.colors.length]);\n });\n onUpdate({\n ...scale,\n mapping: newMapping,\n palette: Array.from(newMapping.values()),\n });\n }}\n >\n <div className=\"w-full space-y-2\">\n <span>{p.name}</span>\n <CategoricalScalePreview colors={p.colors} />\n </div>\n </Button>\n ))}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Category Colors</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n {Array.from(scale.mapping.entries()).map(([value, color]) => (\n <Button\n key={value}\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => setEditingColor({ value, color })}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <div\n className=\"w-4 h-4 rounded\"\n style={{ backgroundColor: color }}\n />\n <span className=\"truncate\">{value}</span>\n </div>\n </Button>\n ))}\n </div>\n </div>\n\n {editingColor && (\n <Dialog open={true} onOpenChange={() => setEditingColor(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit Color for {editingColor.value}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <HexColorPicker\n color={editingColor.color}\n onChange={(newColor) =>\n updateColor(editingColor.value, newColor)\n }\n />\n <Input\n value={editingColor.color}\n onChange={(e) =>\n updateColor(editingColor.value, e.target.value)\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )}\n </div>\n );\n}\n\nfunction ScaleListItem({\n scale,\n isSelected,\n onClick,\n}: {\n scale: ColorScaleType;\n isSelected: boolean;\n onClick: () => void;\n}) {\n return (\n <Button\n variant={isSelected ? \"default\" : \"ghost\"}\n className=\"w-full justify-start\"\n onClick={onClick}\n >\n <div className=\"flex items-center gap-2 w-full\">\n {scale.type === \"numerical\" ? (\n <Hash className=\"w-4 h-4\" />\n ) : (\n <Shapes className=\"w-4 h-4\" />\n )}\n <span className=\"truncate\">{scale.name}</span>\n </div>\n </Button>\n );\n}\n\nexport function ColorScaleManager() {\n const { colorScales, updateColorScale } = useColorScales();\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [selectedScaleId, setSelectedScaleId] = useState<string | null>(\n colorScales[0]?.id ?? null\n );\n const [state, setState] = useState<ColorScaleEditorState>({\n scales: colorScales,\n isDirty: false,\n });\n\n useEffect(() => {\n setState({ scales: colorScales, isDirty: false });\n }, [colorScales]);\n\n const filteredScales = useMemo(() => {\n return state.scales.filter((scale) =>\n scale.name.toLowerCase().includes(searchQuery.toLowerCase())\n );\n }, [state.scales, searchQuery]);\n\n const selectedScale = useMemo(\n () => state.scales.find((s) => s.id === selectedScaleId),\n [state.scales, selectedScaleId]\n );\n\n const handleSave = () => {\n state.scales.forEach((scale) => {\n const { id, ...scaleWithoutId } = scale;\n updateColorScale(id, scaleWithoutId);\n });\n setState((prev) => ({ ...prev, isDirty: false }));\n };\n\n const handleScaleUpdate = (updatedScale: ColorScaleType) => {\n setState((prev) => ({\n scales: prev.scales.map((s) =>\n s.id === updatedScale.id ? updatedScale : s\n ),\n isDirty: true,\n }));\n };\n\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Palette className=\"w-4 h-4 mr-2\" />\n Color Scales\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-[80vw] max-h-[80vh] min-h-[50vh]\">\n <DialogHeader>\n <DialogTitle>Color Scale Manager</DialogTitle>\n <DialogDescription>\n Manage color scales for your visualizations\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex gap-6\">\n {/* Left Sidebar */}\n <div className=\"w-64 border-r pr-4 space-y-4\">\n <Input\n placeholder=\"Search scales...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n <div className=\"space-y-1 overflow-y-auto\">\n {filteredScales.map((scale) => (\n <ScaleListItem\n key={scale.id}\n scale={scale}\n isSelected={scale.id === selectedScaleId}\n onClick={() => setSelectedScaleId(scale.id)}\n />\n ))}\n </div>\n </div>\n\n {/* Right Content */}\n <div className=\"overflow-y-auto w-[400px]\">\n {selectedScale && (\n <div className=\"space-y-4\">\n {selectedScale.type === \"numerical\" ? (\n <NumericalScaleEditor\n scale={selectedScale}\n onUpdate={handleScaleUpdate}\n />\n ) : (\n <CategoricalScaleEditor\n scale={selectedScale}\n onUpdate={handleScaleUpdate}\n />\n )}\n {selectedScale.type === \"numerical\" ? (\n <NumericalScalePreview palette={selectedScale.palette} />\n ) : (\n <CategoricalScalePreview colors={selectedScale.palette} />\n )}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setState({ scales: colorScales, isDirty: false })}\n >\n Reset\n </Button>\n <Button onClick={handleSave} disabled={!state.isDirty}>\n Save Changes\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Plus } from \"lucide-react\";\nimport { useCreateCharts } from \"@/hooks/useCreateCharts\";\nimport { chartRegistry } from \"@/charts/registry\";\n\nexport function ChartCreationButtons() {\n const { createChart } = useCreateCharts();\n const chartDefinitions = chartRegistry\n .getAll()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"flex items-center gap-2\">\n <Plus className=\"h-4 w-4\" />\n Add Blank Chart...\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {chartDefinitions.map((chartDef) => {\n const Icon = chartDef.icon;\n return (\n <DropdownMenuItem\n key={chartDef.type}\n onClick={() => createChart(chartDef.type, \"\")}\n className=\"flex items-center gap-2\"\n >\n <Icon className=\"h-4 w-4\" />\n {chartDef.name}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import { SavedDataStructure } from \"@/types/SavedDataStructure\";\n\nexport async function saveToClipboard(data: SavedDataStructure): Promise<void> {\n try {\n const jsonString = JSON.stringify(data);\n await navigator.clipboard.writeText(jsonString);\n } catch (error) {\n console.error(\"Error saving to clipboard:\", error);\n throw new Error(\"Failed to save data to clipboard\");\n }\n}\n\nexport async function loadFromClipboard(): Promise<SavedDataStructure | null> {\n try {\n const text = await navigator.clipboard.readText();\n const data = JSON.parse(text);\n if (validateSavedData(data)) {\n return migrateDataVersion(data);\n }\n return null;\n } catch (error) {\n console.error(\"Error loading from clipboard:\", error);\n return null;\n }\n}\n\nexport function validateSavedData(data: unknown): data is SavedDataStructure {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const { charts, calculations, gridSettings, metadata, colorScales } =\n data as SavedDataStructure;\n\n // Validate required properties exist\n if (!charts || !calculations || !gridSettings || !metadata || !colorScales) {\n return false;\n }\n\n // Validate metadata\n if (\n typeof metadata.name !== \"string\" ||\n typeof metadata.version !== \"number\" ||\n typeof metadata.createdAt !== \"string\" ||\n typeof metadata.modifiedAt !== \"string\"\n ) {\n return false;\n }\n\n // Validate gridSettings\n if (\n typeof gridSettings.columnCount !== \"number\" ||\n typeof gridSettings.rowHeight !== \"number\" ||\n typeof gridSettings.containerPadding !== \"number\" ||\n typeof gridSettings.showBackgroundMarkers !== \"boolean\"\n ) {\n return false;\n }\n\n // Basic array checks\n if (\n !Array.isArray(charts) ||\n !Array.isArray(calculations) ||\n !Array.isArray(colorScales)\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function migrateDataVersion(\n data: SavedDataStructure\n): SavedDataStructure {\n // Currently we only have version 1, so no migration needed\n // This function will be expanded when we add new versions\n return data;\n}\n\nexport async function saveRawDataToClipboard(data: unknown): Promise<void> {\n try {\n const jsonString = JSON.stringify(data);\n await navigator.clipboard.writeText(jsonString);\n } catch (error) {\n console.error(\"Error saving raw data to clipboard:\", error);\n throw new Error(\"Failed to save raw data to clipboard\");\n }\n}\n","import { GridSettings } from \"@/types/SavedDataTypes\";\nimport { cn } from \"@/lib/utils\";\n\ninterface GridBackgroundProps {\n settings: GridSettings;\n width: number;\n height: number;\n className?: string;\n}\n\nexport function GridBackground({\n settings,\n width,\n height,\n className,\n}: GridBackgroundProps) {\n if (!settings.showBackgroundMarkers) {\n return null;\n }\n\n const columnWidth =\n (width - settings.containerPadding * 2) / settings.columnCount;\n\n return (\n <div\n className={cn(\"absolute inset-0 pointer-events-none\", className)}\n style={{\n width,\n height,\n }}\n >\n <div\n className=\"absolute inset-0 border border-dashed border-gray-200\"\n style={{\n margin: settings.containerPadding,\n }}\n >\n {/* Vertical grid lines */}\n {Array.from({ length: settings.columnCount - 1 }).map((_, i) => (\n <div\n key={i}\n className=\"absolute top-0 bottom-0 border-l border-dashed border-gray-200\"\n style={{\n left: (i + 1) * columnWidth,\n }}\n />\n ))}\n\n {/* Horizontal grid lines */}\n {Array.from({\n length: Math.floor(height / settings.rowHeight) - 1,\n }).map((_, i) => (\n <div\n key={i}\n className=\"absolute left-0 right-0 border-t border-dashed border-gray-200\"\n style={{\n top: (i + 1) * settings.rowHeight,\n }}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { Resizable } from \"react-resizable\";\nimport { ReactNode } from \"react\";\nimport GridLayout from \"react-grid-layout\";\nimport \"react-grid-layout/css/styles.css\";\nimport \"react-resizable/css/styles.css\";\nimport type { Layout } from \"react-grid-layout\";\nimport type { ChartSettings } from \"@/types/ChartTypes\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { GridBackground } from \"./GridBackground\";\n\nimport React from \"react\";\n\ninterface ChartGridLayoutProps {\n children: ReactNode;\n charts: ChartSettings[];\n onLayoutChange: (layout: Layout[]) => void;\n containerWidth: number;\n}\n\nexport function ChartGridLayout({\n children,\n charts,\n onLayoutChange,\n containerWidth,\n}: ChartGridLayoutProps) {\n const gridSettings = useDataLayer((s) => s.gridSettings);\n\n // Calculate the total height based on the layout\n const totalHeight = Math.max(\n ...charts.map(\n (chart) => (chart.layout.y + chart.layout.h) * gridSettings.rowHeight\n ),\n 400 // minimum height\n );\n\n const layout: Layout[] = charts.map((chart) => ({\n ...chart.layout,\n i: chart.id,\n }));\n\n return (\n <div className=\"relative w-full\">\n <GridBackground\n settings={gridSettings}\n width={containerWidth}\n height={totalHeight}\n />\n <GridLayout\n className=\"layout\"\n layout={layout}\n cols={gridSettings.columnCount}\n rowHeight={gridSettings.rowHeight}\n width={containerWidth}\n margin={[0, 0]}\n containerPadding={[\n gridSettings.containerPadding,\n gridSettings.containerPadding,\n ]}\n onLayoutChange={onLayoutChange}\n draggableHandle=\".drag-handle\"\n style={{ position: \"absolute\", inset: 0 }}\n resizeHandle={<BottomRightHandle />}\n >\n {children}\n </GridLayout>\n </div>\n );\n}\n\nconst SouthEastArrow = () => {\n // Parameters for the curved triangle\n const size = 100; // SVG viewBox size\n const margin = 20; // Margin from edges\n\n // Right edge is perfectly aligned\n const rightEdgeX = size - margin;\n\n // Calculate points for the triangle\n const startX = margin;\n const startY = size - margin;\n const bottomRightX = rightEdgeX; // Aligned with top right\n const bottomRightY = size - margin;\n const topRightX = rightEdgeX; // Aligned with bottom right\n const topRightY = margin;\n\n // Control point for the curve\n const controlX = Math.floor(startX + (rightEdgeX - startX) * 0.7);\n const controlY = Math.floor(startY - (startY - topRightY) * 0.3);\n\n // Create the SVG path for a triangle with curved hypotenuse\n const path = `\n M ${startX} ${startY}\n L ${bottomRightX} ${bottomRightY}\n L ${topRightX} ${topRightY}\n Q ${controlX} ${controlY} ${startX} ${startY}\n Z\n `;\n\n return (\n <svg\n width=\"20px\"\n height=\"20px\"\n version=\"1.1\"\n viewBox={`0 0 ${size} ${size}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d={path} fill=\"currentColor\" />\n </svg>\n );\n};\n\nexport const BottomRightHandle = React.forwardRef<HTMLDivElement>(\n (props, ref) => {\n return (\n <div\n style={{\n width: \"20px\",\n height: \"20px\",\n position: \"absolute\",\n bottom: 0,\n right: 0,\n padding: 0,\n cursor: \"se-resize\",\n }}\n className=\"handle-se\"\n ref={ref}\n {...props}\n >\n {\" \"}\n <SouthEastArrow />{\" \"}\n </div>\n );\n }\n);\n","import { useChartDefinition } from \"@/charts/registry\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\n\ninterface ChartRendererProps {\n settings: ChartSettings;\n width: number;\n height: number;\n facetIds?: IdType[];\n}\n\nexport function ChartRenderer({\n settings,\n width,\n height,\n facetIds,\n}: ChartRendererProps) {\n const definition = useChartDefinition(settings.type);\n const ChartComponent = definition.component;\n\n return (\n <ChartComponent\n settings={settings}\n width={width}\n height={height}\n facetIds={facetIds}\n />\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { ChartRenderer } from \"../ChartRenderer\";\nimport { FacetData } from \"./FacetContainer\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\n\ninterface FacetGridLayoutProps {\n width: number;\n height: number;\n rowVariable: string;\n columnVariable: string;\n facetData: FacetData[];\n settings: ChartSettings;\n}\n\nexport function FacetGridLayout({\n width,\n height,\n rowVariable,\n columnVariable,\n facetData,\n settings,\n}: FacetGridLayoutProps) {\n // Extract unique row and column values\n const { rows, columns, grid } = useMemo(() => {\n const rows = Array.from(new Set(facetData.map((d) => d.rowValue))).sort();\n const columns = Array.from(\n new Set(\n facetData\n .filter((d) => d.columnValue !== null)\n .map((d) => d.columnValue as string)\n )\n ).sort();\n\n // Create a grid of facets\n const grid: Record<string, Record<string, IdType[]>> = {};\n\n rows.forEach((row) => {\n grid[row] = {};\n columns.forEach((col) => {\n grid[row][col] = [];\n });\n });\n\n facetData.forEach((facet) => {\n if (facet.rowValue && facet.columnValue) {\n grid[facet.rowValue][facet.columnValue] = facet.ids;\n }\n });\n\n return { rows, columns, grid };\n }, [facetData]);\n\n // Calculate cell dimensions based on the number of rows and columns\n const cellWidth = width / (columns.length + 1); // +1 for the row headers\n const cellHeight = height / (rows.length + 1); // +1 for the column headers\n\n return (\n <div className=\"w-full h-full overflow-auto\">\n <table className=\"w-full h-full border-collapse\">\n <thead>\n <tr>\n {/* Top-left empty cell */}\n <th className=\"border p-2 bg-muted/50 font-semibold\">\n {rowVariable} / {columnVariable}\n </th>\n\n {/* Column headers */}\n {columns.map((col) => (\n <th key={col} className=\"border p-2 bg-muted/50 font-semibold\">\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row}>\n {/* Row header */}\n <th className=\"border p-2 bg-muted/50 font-semibold text-left\">\n {row}\n </th>\n\n {/* Facet cells */}\n {columns.map((col) => (\n <td key={`${row}-${col}`} className=\"border p-0\">\n <div\n style={{\n width: cellWidth,\n height: cellHeight,\n }}\n >\n {grid[row]?.[col]?.length > 0 ? (\n <ChartRenderer\n settings={settings}\n width={cellWidth}\n height={cellHeight}\n facetIds={grid[row][col]}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-muted-foreground\">\n No data\n </div>\n )}\n </div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { ChartRenderer } from \"../ChartRenderer\";\nimport { FacetData } from \"./FacetContainer\";\n\ninterface FacetWrapLayoutProps {\n width: number;\n height: number;\n columns: number;\n facetData: FacetData[];\n settings: ChartSettings;\n}\n\nexport function FacetWrapLayout({\n width,\n height,\n columns,\n facetData,\n settings,\n}: FacetWrapLayoutProps) {\n // Calculate dimensions based on the number of facet values\n const facetWidth = width / (columns || 1);\n const rows = Math.ceil(facetData.length / (columns || 1));\n const facetHeight = height / (rows || 1);\n\n return (\n <div\n className=\"w-full h-full grid gap-2\"\n style={{\n gridTemplateColumns: `repeat(${columns || 1}, 1fr)`,\n gridAutoRows: `${facetHeight}px`,\n }}\n >\n {facetData.map((facet) => (\n <div key={facet.id} className=\"border p-2\">\n <div className=\"font-medium mb-1\">{facet.rowValue}</div>\n <div style={{ height: facetHeight - 30 }}>\n <ChartRenderer\n settings={settings}\n width={facetWidth - 16} // Adjust for padding\n height={facetHeight - 30} // Adjust for header and padding\n facetIds={facet.ids}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings, datum } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { FacetGridLayout } from \"./FacetGridLayout\";\nimport { FacetWrapLayout } from \"./FacetWrapLayout\";\nimport { useGetAllIds } from \"../useGetLiveData\";\n\ninterface FacetContainerProps {\n settings: ChartSettings;\n width: number;\n height: number;\n}\n\nexport interface FacetData {\n id: string;\n rowValue: string;\n columnValue: string | null;\n ids: IdType[];\n}\n\nexport function FacetContainer({\n settings,\n width,\n height,\n}: FacetContainerProps) {\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const allIds = useGetAllIds();\n\n const facetData = useMemo(() => {\n if (!settings.facet?.enabled) {\n return [] as FacetData[];\n }\n\n const facet = settings.facet;\n const rowVariable = facet.rowVariable;\n\n if (!rowVariable) {\n return [] as FacetData[];\n }\n\n const rowData = getColumnData(rowVariable);\n const columnData =\n facet.type === \"grid\" ? getColumnData(facet.columnVariable) : null;\n\n // Group data by facet variables\n const facets: Record<string, IdType[]> = {};\n\n allIds.forEach((id) => {\n const rowValue = rowData[id] ?? \"undefined\";\n const colValue = columnData\n ? (columnData[id as IdType] ?? \"undefined\")\n : null;\n\n const rowLabel = getFacetLabel(rowValue);\n const colLabel = colValue !== null ? getFacetLabel(colValue) : null;\n\n const facetKey = colLabel ? `${rowLabel}__${colLabel}` : rowLabel;\n\n if (!facets[facetKey]) {\n facets[facetKey] = [];\n }\n\n facets[facetKey].push(id);\n });\n\n return Object.entries(facets).map(([key, ids]) => {\n let rowValue: string;\n let columnValue: string | null = null;\n\n if (facet.type === \"grid\" && key.includes(\"__\")) {\n const parts = key.split(\"__\");\n rowValue = parts[0];\n columnValue = parts[1];\n } else {\n rowValue = key;\n }\n\n return {\n id: key,\n rowValue,\n columnValue,\n ids,\n };\n }) as FacetData[];\n }, [settings.facet, getColumnData, allIds]);\n\n if (!settings.facet?.enabled) {\n return null;\n }\n\n return (\n <div className=\"w-full h-full\">\n {settings.facet.type === \"grid\" ? (\n <FacetGridLayout\n width={width}\n height={height}\n rowVariable={settings.facet.rowVariable}\n columnVariable={settings.facet.columnVariable}\n facetData={facetData}\n settings={settings}\n />\n ) : (\n <FacetWrapLayout\n width={width}\n height={height}\n columns={settings.facet.columnCount}\n facetData={facetData}\n settings={settings}\n />\n )}\n </div>\n );\n}\n\nfunction getFacetLabel(value: datum) {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return String(value);\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return \"unknown\";\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { Label } from \"../ui/label\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { Switch } from \"../ui/switch\";\n\ninterface AdvancedSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function AdvancedSettingsTab({\n settings,\n onSettingChange,\n}: AdvancedSettingsTabProps) {\n return (\n <div className=\"space-y-6\">\n {/* General Chart Settings */}\n <div className=\"space-y-4\">\n <h3 className=\"font-medium text-sm\">General Settings</h3>\n\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"margin\">Chart Margin</Label>\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"col-start-2\">\n <NumericInputEnter\n value={settings.margin?.top || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n top: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Top\"\n />\n </div>\n <div className=\"col-start-1 row-start-2\">\n <NumericInputEnter\n value={settings.margin?.left || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n left: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Left\"\n />\n </div>\n <div className=\"col-start-3 row-start-2\">\n <NumericInputEnter\n value={settings.margin?.right || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n right: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Right\"\n />\n </div>\n <div className=\"col-start-2 row-start-3\">\n <NumericInputEnter\n value={settings.margin?.bottom || 20}\n onChange={(value) =>\n onSettingChange(\"margin\", {\n ...settings.margin,\n bottom: value,\n })\n }\n min={0}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Bottom\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { RotateCcw } from \"lucide-react\";\nimport { ComboBox } from \"../ComboBox\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { Button } from \"../ui/button\";\nimport { Label } from \"../ui/label\";\n\ninterface AxisSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\ninterface ScaleType {\n value: string;\n label: string;\n}\n\nconst SCALE_TYPES: ScaleType[] = [\n { value: \"linear\", label: \"Linear\" },\n { value: \"log\", label: \"Logarithmic\" },\n { value: \"time\", label: \"Time\" },\n { value: \"band\", label: \"Band\" },\n];\n\nconst DEFAULT_AXIS_SETTINGS = {\n scaleType: \"linear\",\n grid: false,\n min: 0,\n max: 100,\n};\n\nexport function AxisSettingsTab({\n settings,\n onSettingChange,\n}: AxisSettingsTabProps) {\n const handleAxisChange = (axis: \"x\" | \"y\", key: string, value: any) => {\n onSettingChange(`${axis}Axis`, {\n ...settings[`${axis}Axis`],\n [key]: value,\n });\n };\n\n const handleAxisReset = () => {\n onSettingChange(\"xAxis\", DEFAULT_AXIS_SETTINGS);\n onSettingChange(\"yAxis\", DEFAULT_AXIS_SETTINGS);\n onSettingChange(\"xGridLines\", 5);\n onSettingChange(\"yGridLines\", 5);\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr_1fr] gap-x-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAxisReset}\n className=\"h-8 px-2\"\n >\n <RotateCcw className=\"h-4 w-4 mr-1\" />\n Reset\n </Button>\n <h4 className=\"font-medium text-sm text-center\">X Axis</h4>\n <h4 className=\"font-medium text-sm text-center\">Y Axis</h4>\n </div>\n\n <div className=\"grid grid-cols-[120px_1fr_1fr] gap-x-4 gap-y-6 items-center\">\n <Label>Scale Type</Label>\n <ComboBox\n value={SCALE_TYPES.find(\n (option) => option.value === (settings.xAxis?.scaleType || \"linear\")\n )}\n options={SCALE_TYPES}\n onChange={(option) =>\n handleAxisChange(\"x\", \"scaleType\", option?.value)\n }\n optionToString={(option) => option.label}\n placeholder=\"X Scale\"\n />\n <ComboBox\n value={SCALE_TYPES.find(\n (option) => option.value === (settings.yAxis?.scaleType || \"linear\")\n )}\n options={SCALE_TYPES}\n onChange={(option) =>\n handleAxisChange(\"y\", \"scaleType\", option?.value)\n }\n optionToString={(option) => option.label}\n placeholder=\"Y Scale\"\n />\n\n <Label>Grid Lines</Label>\n <NumericInputEnter\n value={settings.xGridLines ?? 5}\n onChange={(value) => onSettingChange(\"xGridLines\", value)}\n min={0}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n placeholder=\"X Grid Lines\"\n />\n <NumericInputEnter\n value={settings.yGridLines ?? 5}\n onChange={(value) => onSettingChange(\"yGridLines\", value)}\n min={0}\n max={20}\n stepSmall={1}\n stepMedium={2}\n stepLarge={5}\n placeholder=\"Y Grid Lines\"\n />\n\n <Label>Domain Min</Label>\n <NumericInputEnter\n value={settings.xAxis?.min || 0}\n onChange={(value) => handleAxisChange(\"x\", \"min\", value)}\n placeholder=\"X Min\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n <NumericInputEnter\n value={settings.yAxis?.min || 0}\n onChange={(value) => handleAxisChange(\"y\", \"min\", value)}\n placeholder=\"Y Min\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n\n <Label>Domain Max</Label>\n <NumericInputEnter\n value={settings.xAxis?.max || 100}\n onChange={(value) => handleAxisChange(\"x\", \"max\", value)}\n placeholder=\"X Max\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n <NumericInputEnter\n value={settings.yAxis?.max || 100}\n onChange={(value) => handleAxisChange(\"y\", \"max\", value)}\n placeholder=\"Y Max\"\n min={-1000}\n max={1000}\n stepSmall={1}\n stepMedium={10}\n stepLarge={100}\n />\n </div>\n </div>\n );\n}\n","import {\n ChartSettings,\n FacetSettings,\n GridFacetSettings,\n WrapFacetSettings,\n} from \"@/types/ChartTypes\";\nimport { Label } from \"../ui/label\";\nimport { Switch } from \"../ui/switch\";\nimport { FieldSelector } from \"../FieldSelector\";\nimport { NumericInputEnter } from \"../NumericInputEnter\";\nimport { ComboBox } from \"../ComboBox\";\n\ninterface FacetSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nconst FACET_TYPES = [\n { value: \"wrap\", label: \"Wrap\" },\n { value: \"grid\", label: \"Grid\" },\n];\n\nexport function FacetSettingsTab({\n settings,\n onSettingChange,\n}: FacetSettingsTabProps) {\n const handleFacetChange = (key: string, value: any) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n [key]: value,\n });\n };\n\n const handleFacetTypeChange = (type: FacetSettings[\"type\"]) => {\n if (type === \"wrap\") {\n onSettingChange(\"facet\", {\n ...settings.facet,\n type,\n columnCount: 2,\n } as WrapFacetSettings);\n } else if (type === \"grid\") {\n onSettingChange(\"facet\", {\n ...settings.facet,\n type,\n columnVariable: \"\",\n } as GridFacetSettings);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"enableFacet\">Enable Faceting</Label>\n <div className=\"flex items-center\">\n <Switch\n id=\"enableFacet\"\n checked={!!settings.facet?.enabled}\n onCheckedChange={(checked) => {\n if (checked) {\n onSettingChange(\"facet\", {\n enabled: true,\n type: \"wrap\",\n rowVariable: \"\",\n columnCount: 2,\n });\n } else {\n handleFacetChange(\"enabled\", false);\n }\n }}\n />\n </div>\n\n {settings.facet?.enabled && (\n <>\n <Label htmlFor=\"facetType\">Facet Type</Label>\n <ComboBox\n value={FACET_TYPES.find(\n (option) => option.value === settings.facet?.type\n )}\n options={FACET_TYPES}\n onChange={(option) =>\n handleFacetTypeChange(option?.value as FacetSettings[\"type\"])\n }\n optionToString={(option) => option.label}\n placeholder=\"Select facet type\"\n />\n\n <Label>Row Variable</Label>\n <FieldSelector\n label=\"\"\n value={settings.facet.rowVariable || \"\"}\n onChange={(value) => handleFacetChange(\"rowVariable\", value)}\n />\n\n {settings.facet.type === \"grid\" ? (\n <>\n <Label>Column Variable</Label>\n <FieldSelector\n label=\"\"\n value={\n (settings.facet as GridFacetSettings).columnVariable || \"\"\n }\n onChange={(value) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n columnVariable: value,\n enabled: true,\n type: \"grid\",\n } as GridFacetSettings);\n }}\n />\n </>\n ) : (\n <>\n <Label htmlFor=\"columns\">Number of Columns</Label>\n <NumericInputEnter\n value={(settings.facet as WrapFacetSettings).columnCount || 2}\n onChange={(value) => {\n onSettingChange(\"facet\", {\n ...settings.facet,\n columnCount: value,\n enabled: true,\n type: \"wrap\",\n } as WrapFacetSettings);\n }}\n min={1}\n max={10}\n stepSmall={1}\n stepMedium={1}\n stepLarge={2}\n placeholder=\"Enter number of columns\"\n />\n </>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { ChartSettings } from \"@/types/ChartTypes\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\n\ninterface LabelsSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function LabelsSettingsTab({\n settings,\n onSettingChange,\n}: LabelsSettingsTabProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Title Text</Label>\n <Input\n value={settings.title || \"\"}\n onChange={(e) => onSettingChange(\"title\", e.target.value)}\n placeholder=\"Enter chart title\"\n />\n\n <Label>X Axis Label</Label>\n <Input\n value={settings.xAxisLabel || \"\"}\n onChange={(e) => onSettingChange(\"xAxisLabel\", e.target.value)}\n placeholder=\"Enter X axis label\"\n />\n\n <Label>Y Axis Label</Label>\n <Input\n value={settings.yAxisLabel || \"\"}\n onChange={(e) => onSettingChange(\"yAxisLabel\", e.target.value)}\n placeholder=\"Enter Y axis label\"\n />\n </div>\n </div>\n );\n}\n","import { chartRegistry, useChartDefinition } from \"@/charts/registry\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { ComboBox } from \"../ComboBox\";\nimport { Label } from \"../ui/label\";\n\ninterface MainSettingsTabProps {\n settings: ChartSettings;\n onSettingChange: (key: string, value: any) => void;\n}\n\nexport function MainSettingsTab({\n settings,\n onSettingChange,\n}: MainSettingsTabProps) {\n const chartDefinition = useChartDefinition(settings.type);\n const chartTypes = chartRegistry.getAll();\n\n // this magic flies in the right settings for the chart type\n const SettingsPanel = chartDefinition.settingsPanel;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label htmlFor=\"chartType\">Chart Type</Label>\n <ComboBox\n value={chartDefinition}\n options={chartTypes}\n onChange={(option) => {\n if (option) {\n const newSettings = option.createDefaultSettings(\n settings.layout,\n settings.field\n );\n Object.entries(newSettings).forEach(([key, value]) => {\n onSettingChange(key, value);\n });\n }\n }}\n optionToNode={(option) => {\n const Icon = option.icon;\n return (\n <div className=\"flex items-center gap-2\">\n <Icon className=\"h-4 w-4\" />\n <span>{option.name}</span>\n </div>\n );\n }}\n optionToString={(option) => option.name}\n placeholder=\"Select chart type\"\n />\n </div>\n\n <SettingsPanel\n settings={settings}\n onSettingsChange={(newSettings) => {\n Object.entries(newSettings).forEach(([key, value]) => {\n onSettingChange(key, value);\n });\n }}\n />\n </div>\n );\n}\n","import { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\ninterface TabContainerProps {\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n children: {\n [key: string]: React.ReactNode;\n };\n tabs: {\n value: string;\n label: string;\n }[];\n}\n\nexport function TabContainer({\n activeTab,\n onTabChange,\n children,\n tabs,\n}: TabContainerProps) {\n return (\n <Tabs\n defaultValue={activeTab || tabs[0].value}\n onValueChange={onTabChange}\n className=\"w-full\"\n >\n <TabsList className=\"w-full\">\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value} className=\"flex-1\">\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsContent key={tab.value} value={tab.value}>\n {children[tab.value]}\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { mergeWithDefaultSettings } from \"@/utils/defaultSettings\";\nimport { useEffect, useState } from \"react\";\nimport { AdvancedSettingsTab } from \"./settings/AdvancedSettingsTab\";\nimport { AxisSettingsTab } from \"./settings/AxisSettingsTab\";\nimport { FacetSettingsTab } from \"./settings/FacetSettingsTab\";\nimport { LabelsSettingsTab } from \"./settings/LabelsSettingsTab\";\nimport { MainSettingsTab } from \"./settings/MainSettingsTab\";\nimport { TabContainer } from \"./settings/TabContainer\";\nimport { Button } from \"./ui/button\";\n\ninterface ChartSettingsContentProps {\n settings: ChartSettings;\n}\n\nexport function ChartSettingsContent({ settings }: ChartSettingsContentProps) {\n // Local state for settings\n const [localSettings, setLocalSettings] = useState<ChartSettings>(\n mergeWithDefaultSettings(settings)\n );\n\n const updateChart = useDataLayer((s) => s.updateChart);\n\n // Update local settings when prop changes\n useEffect(() => {\n setLocalSettings(mergeWithDefaultSettings(settings));\n }, [settings]);\n\n const handleSettingChange = (key: string, value: any) => {\n setLocalSettings((prev) => {\n const newSettings = {\n ...prev,\n [key]: value,\n };\n return mergeWithDefaultSettings(newSettings);\n });\n };\n\n const handleUpdate = () => {\n updateChart(settings.id, localSettings);\n };\n\n const tabs = [\n { value: \"main\", label: \"Main\" },\n { value: \"facet\", label: \"Facet\" },\n { value: \"axis\", label: \"Axis\" },\n { value: \"labels\", label: \"Labels\" },\n { value: \"advanced\", label: \"Advanced\" },\n ];\n\n return (\n <div className=\"space-y-4 max-h-[90vh] overflow-y-auto\">\n <TabContainer tabs={tabs}>\n {{\n main: (\n <MainSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n facet: (\n <FacetSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n axis: (\n <AxisSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n labels: (\n <LabelsSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n advanced: (\n <AdvancedSettingsTab\n settings={localSettings}\n onSettingChange={handleSettingChange}\n />\n ),\n }}\n </TabContainer>\n\n <Button className=\"w-full\" onClick={handleUpdate}>\n Update Chart\n </Button>\n </div>\n );\n}\n","import { create } from \"zustand\";\n\ntype AlertStore = {\n isOpen: boolean;\n title: string;\n description: string;\n resolve: ((value: boolean) => void) | null;\n id: number;\n showAlert: (title: string, description: string) => Promise<boolean>;\n closeAlert: (result: boolean) => void;\n};\n\nexport const useAlertStore = create<AlertStore>((set, get) => ({\n isOpen: false,\n title: \"\",\n description: \"\",\n resolve: null,\n id: 0,\n\n showAlert: async (title: string, description: string) => {\n return new Promise<boolean>((resolve) => {\n const { id } = get();\n set({\n isOpen: true,\n title,\n description,\n resolve,\n id: id + 1,\n });\n });\n },\n\n closeAlert: (result: boolean) => {\n const { resolve } = get();\n if (resolve) {\n resolve(result);\n }\n set({\n isOpen: false,\n title: \"\",\n description: \"\",\n resolve: null,\n });\n },\n}));\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { FacetAxisProvider } from \"@/providers/FacetAxisProvider\";\nimport { ChartSettings } from \"@/types/ChartTypes\";\nimport { Copy, FilterX, GripVertical, Settings2, X } from \"lucide-react\";\nimport { ChartRenderer } from \"./charts/ChartRenderer\";\nimport { FacetContainer } from \"./charts/FacetRelated/FacetContainer\";\nimport { ChartSettingsContent } from \"./ChartSettingsContent\";\nimport { Button } from \"./ui/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/popover\";\nimport { useAlertStore } from \"@/stores/alertStore\";\n\ninterface PlotChartPanelProps {\n settings: ChartSettings;\n onDelete: () => void;\n onDuplicate: () => void;\n width: number;\n height: number;\n}\n\nexport function PlotChartPanel({\n settings,\n onDelete,\n onDuplicate,\n width,\n height,\n}: PlotChartPanelProps) {\n const clearFilter = useDataLayer((state) => state.clearFilter);\n const showAlert = useAlertStore((state) => state.showAlert);\n\n const handleDelete = async () => {\n const confirmed = await showAlert(\n \"Delete Chart\",\n \"Are you sure you want to delete this chart? This action cannot be undone.\"\n );\n if (confirmed) {\n onDelete();\n }\n };\n\n // shrink the panel by 8px on each side to account for the border\n const widthWithPadding = width - 8;\n const heightWithPadding = height - 8;\n\n return (\n <div\n className=\"bg-card border rounded-lg flex flex-col overflow-hidden m-1\"\n style={{ width: widthWithPadding, height: heightWithPadding }}\n >\n <div\n className=\"flex items-center justify-between select-none px-2\"\n style={{ height: 24 }}\n >\n <div className=\"drag-handle cursor-move flex items-center gap-2\">\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n <h3 className=\"font-medium\">{settings.title}</h3>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onDuplicate}>\n <Copy className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => clearFilter(settings)}\n >\n <FilterX className=\"h-4 w-4\" />\n </Button>\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"min-w-120\" side=\"left\" align=\"start\">\n <ChartSettingsContent settings={settings} />\n </PopoverContent>\n </Popover>\n <Button variant=\"ghost\" size=\"icon\" onClick={handleDelete}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <div className=\"flex-1\">\n <FacetAxisProvider>\n {settings.facet?.enabled ? (\n <FacetContainer\n settings={settings}\n width={width - 32}\n height={height - 36}\n />\n ) : (\n <ChartRenderer\n settings={settings}\n width={width - 32}\n height={height - 36}\n />\n )}\n </FacetAxisProvider>\n </div>\n </div>\n );\n}\n","import { type Expression } from \"../types\";\nimport * as ohm from \"ohm-js\";\n\n// Define the grammar inline\nconst grammarSource = `Calculation {\n Expression = IfExpr | TernaryExpr | LogicalExpr\n\n LogicalExpr = LogicalExpr LogicalOp ComparisonExpr -- binary\n | ComparisonExpr -- term\n\n ComparisonExpr = ComparisonExpr ComparisonOp AddExpr -- binary\n | AddExpr -- term\n\n AddExpr = AddExpr (\"+\" | \"-\") MulExpr -- binary\n | MulExpr -- term\n\n MulExpr = MulExpr (\"*\" | \"/\") PowerExpr -- binary\n | PowerExpr -- term\n\n PowerExpr = Term \"^\" PowerExpr -- binary\n | Term -- term\n\n TernaryExpr = LogicalExpr \"?\" Expression \":\" Expression\n Term = UnaryExpr | FunctionCall | ParenTerm | number | string | boolean | null | identifier\n UnaryExpr = UnaryOperator Term\n FunctionCall = identifier \"(\" ListOf<Expression, \",\"> \")\"\n ParenTerm = \"(\" Expression \")\"\n IfExpr = \"if\" Expression \"then\" Expression \"else\" Expression\n\n ComparisonOp = \"==\" | \"!=\" | \"<=\" | \">=\" | \"<\" | \">\"\n LogicalOp = \"&&\" | \"||\"\n UnaryOperator = \"-\" | \"+\" | \"!\"\n\n identifier = ~keyword letter (letter | digit | \"_\")*\n number = digit+ (\".\" digit+)?\n string = \"\\\\\"\" stringChar* \"\\\\\"\"\n stringChar = ~(\"\\\\\"\" | \"\\\\\\\\\") any -- nonEscape\n | \"\\\\\\\\\" any -- escape\n boolean = \"true\" | \"false\"\n null = \"null\"\n\n // Built-in keywords\n keyword = \"if\" | \"then\" | \"else\" | \"true\" | \"false\" | \"null\"\n\n // Whitespace handling\n space += comment\n comment = \"//\" (~\"\\\\n\" any)* \"\\\\n\" // Single line comments\n}`;\n\n// Create the grammar\nconst grammar = ohm.grammar(grammarSource);\n\nexport interface ParsedExpression {\n type: string;\n value?: any;\n children?: ParsedExpression[];\n operator?: string;\n left?: ParsedExpression;\n right?: ParsedExpression;\n name?: string;\n arguments?: ParsedExpression[];\n operand?: ParsedExpression;\n condition?: ParsedExpression;\n trueBranch?: ParsedExpression;\n falseBranch?: ParsedExpression;\n dependencies?: string[];\n expression?: string;\n}\n\ntype Node = ohm.Node;\n\n// Create semantics\nconst semantics = grammar.createSemantics();\n\nsemantics.addOperation<ParsedExpression>(\"eval\", {\n Expression(e: Node): ParsedExpression {\n return e.eval();\n },\n LogicalExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n LogicalExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n ComparisonExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n ComparisonExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n AddExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n AddExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n MulExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n MulExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n PowerExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n PowerExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n LogicalExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n ComparisonExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n AddExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n MulExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n PowerExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n TernaryExpr(\n condition: Node,\n _q: Node,\n trueBranch: Node,\n _c: Node,\n falseBranch: Node\n ): ParsedExpression {\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"?:\",\n name: `${condition.sourceString} ? ${trueBranch.sourceString} : ${falseBranch.sourceString}`,\n };\n },\n IfExpr(\n _if: Node,\n condition: Node,\n _then: Node,\n trueBranch: Node,\n _else: Node,\n falseBranch: Node\n ): ParsedExpression {\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"if\",\n name: `if ${condition.sourceString} then ${trueBranch.sourceString} else ${falseBranch.sourceString}`,\n };\n },\n UnaryExpr(op: Node, expr: Node): ParsedExpression {\n return {\n type: \"unary\",\n operator: op.sourceString,\n expression: op.sourceString,\n operand: expr.eval(),\n };\n },\n FunctionCall(\n name: Node,\n _open: Node,\n args: Node,\n _close: Node\n ): ParsedExpression {\n return {\n type: \"function\",\n name: name.sourceString,\n arguments: args.asIteration().children.map((arg: Node) => arg.eval()),\n };\n },\n ParenTerm(_open: Node, expr: Node, _close: Node): ParsedExpression {\n return expr.eval();\n },\n number(digits: Node, _dot: Node, decimals: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: parseFloat(this.sourceString),\n expression: this.sourceString,\n };\n },\n string(_open: Node, chars: Node, _close: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: chars.sourceString.replace(/\\\\(.)/g, \"$1\"),\n expression: chars.sourceString,\n };\n },\n boolean(_: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: this.sourceString === \"true\",\n expression: this.sourceString,\n };\n },\n null(_: Node): ParsedExpression {\n return {\n type: \"literal\",\n value: null,\n expression: \"null\",\n };\n },\n identifier(first: Node, rest: Node): ParsedExpression {\n return {\n type: \"identifier\",\n name: this.sourceString,\n expression: this.sourceString,\n };\n },\n});\n\nexport function parseExpression(input: string): Expression {\n const matchResult = grammar.match(input);\n\n if (matchResult.failed()) {\n throw new Error(`Parse error: ${matchResult.message}`);\n }\n\n const parsed = semantics(matchResult).eval();\n\n // Convert the parsed expression to our Expression type\n return convertToExpression(parsed, input);\n}\n\nfunction convertToExpression(\n parsed: ParsedExpression,\n rawInput: string\n): Expression {\n const id = crypto.randomUUID();\n\n switch (parsed.type) {\n case \"basic\":\n if (!parsed.left || !parsed.right) {\n throw new Error(\"Basic expression must have left and right operands\");\n }\n return {\n id,\n type: \"basic\",\n name: `${parsed.left?.name || \"\"} ${parsed.operator} ${\n parsed.right?.name || \"\"\n }`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n left: convertToExpression(parsed.left, \"\"),\n right: convertToExpression(parsed.right, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"unary\":\n if (!parsed.operand) {\n throw new Error(\"Unary expression must have an operand\");\n }\n return {\n id,\n type: \"unary\",\n name: `${parsed.operator}${parsed.operand?.name || \"\"}`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n operand: convertToExpression(parsed.operand, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"ternary\":\n if (!parsed.condition || !parsed.trueBranch || !parsed.falseBranch) {\n throw new Error(\n \"Ternary expression must have condition and both branches\"\n );\n }\n return {\n id,\n type: \"ternary\",\n name:\n parsed.name ||\n `${parsed.condition?.name || \"\"} ? ${\n parsed.trueBranch?.name || \"\"\n } : ${parsed.falseBranch?.name || \"\"}`,\n expression: parsed.expression || \"?:\",\n dependencies: getDependencies(parsed),\n condition: convertToExpression(parsed.condition, \"\"),\n trueBranch: convertToExpression(parsed.trueBranch, \"\"),\n falseBranch: convertToExpression(parsed.falseBranch, \"\"),\n rawInput,\n };\n case \"function\":\n return {\n id,\n type: \"function\",\n name: parsed.name || \"\",\n expression: \"\",\n functionName: parsed.name || \"\",\n arguments:\n parsed.arguments?.map((arg) => convertToExpression(arg, \"\")) || [],\n dependencies: getDependencies(parsed),\n rawInput,\n };\n case \"identifier\":\n // Create a literal expression for identifiers instead of basic\n return {\n id,\n type: \"literal\",\n name: parsed.name || \"\",\n expression: parsed.name || \"\",\n dependencies: [parsed.name || \"\"],\n value: parsed.name || \"\",\n rawInput,\n };\n case \"literal\":\n return {\n id,\n type: \"literal\",\n name: String(parsed.value),\n expression: String(parsed.value),\n dependencies: [],\n value: parsed.value,\n rawInput,\n };\n default:\n throw new Error(`Unsupported expression type: ${parsed.type}`);\n }\n}\n\nfunction getDependencies(parsed: ParsedExpression): string[] {\n const deps = new Set<string>();\n\n function collect(expr: ParsedExpression) {\n if (expr.type === \"identifier\") {\n deps.add(expr.name || \"\");\n }\n if (expr.arguments) {\n expr.arguments.forEach(collect);\n }\n if (expr.left) {\n collect(expr.left);\n }\n if (expr.right) {\n collect(expr.right);\n }\n if (expr.operand) {\n collect(expr.operand);\n }\n if (expr.condition) {\n collect(expr.condition);\n collect(expr.trueBranch!);\n collect(expr.falseBranch!);\n }\n }\n\n collect(parsed);\n return Array.from(deps);\n}\n\nexport default semantics;\n","import { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { Dispatch, SetStateAction, useState } from \"react\";\n\nexport interface CalculationFormProps {\n resultColumnName: string;\n setResultColumnName: Dispatch<SetStateAction<string>>;\n expression: string;\n setExpression: Dispatch<SetStateAction<string>>;\n availableFields: string[];\n\n onSubmit: () => void;\n onCancel: () => void;\n submitButtonText: string;\n}\n\nexport function CalculationForm({\n resultColumnName,\n setResultColumnName,\n expression,\n setExpression,\n availableFields,\n onSubmit,\n onCancel,\n submitButtonText,\n}: CalculationFormProps) {\n const [error, setError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<{\n text: string;\n type: \"success\" | \"error\" | null;\n }>({\n text: \"\",\n type: null,\n });\n\n const handleValidate = () => {\n try {\n parseExpression(expression);\n setError(null);\n setStatusMessage({ text: \"Expression is valid!\", type: \"success\" });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setStatusMessage({ text: \"Invalid expression\", type: \"error\" });\n }\n };\n\n const handleInsertField = (field: string) => {\n setExpression((prev) => prev + field);\n };\n\n return (\n <form\n onSubmit={(ev) => {\n ev.preventDefault();\n onSubmit();\n }}\n >\n <div className=\"grid gap-4 py-4\">\n <div className=\"grid grid-cols-[200px_1fr] gap-4\">\n <div className=\"space-y-2 \">\n <Label htmlFor=\"result-column\" className=\"block mb-2\">\n Result Column Name\n </Label>\n <Input\n id=\"result-column\"\n value={resultColumnName}\n onChange={(e) => setResultColumnName(e.target.value)}\n placeholder=\"calculated_field\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"expression\">Expression</Label>\n <div className=\"flex gap-2\">\n <Input\n id=\"expression\"\n value={expression}\n onChange={(e) => setExpression(e.target.value)}\n placeholder=\"Enter your expression...\"\n className=\"flex-1\"\n />\n <Button onClick={handleValidate} variant=\"secondary\">\n Validate\n </Button>\n </div>\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\n {statusMessage.text && (\n <p\n className={`text-sm ${\n statusMessage.type === \"success\"\n ? \"text-green-500\"\n : statusMessage.type === \"error\"\n ? \"text-red-500\"\n : \"\"\n }`}\n >\n {statusMessage.text}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <Card className=\"p-4\">\n <h3 className=\"font-semibold mb-2\">Available Fields</h3>\n <div className=\"flex flex-wrap gap-2\">\n {availableFields.map((field) => (\n <Button\n key={field}\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleInsertField(field)}\n >\n {field}\n </Button>\n ))}\n </div>\n </Card>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\">{submitButtonText}</Button>\n </div>\n </div>\n </form>\n );\n}\n","import { useGetColumnData } from \"@/components/charts/useGetColumnData\";\nimport { Card } from \"@/components/ui/card\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { CalculationDefinition } from \"@/lib/calculations/CalculationState\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useMemo } from \"react\";\n\ninterface CalculationPreviewProps {\n calculation: CalculationDefinition;\n\n previewRows?: number;\n}\n\nexport function CalculationPreview({\n calculation,\n previewRows = 10,\n}: CalculationPreviewProps) {\n const rawData = useGetColumnData(calculation.resultColumnName);\n\n // Prepare the preview data\n const previewData = useMemo(() => {\n return Object.entries(rawData).map(([id, result]) => ({\n __ID: id,\n [calculation.resultColumnName]: result,\n }));\n }, [rawData, calculation.resultColumnName]);\n\n const totalRows = useDataLayer((state) => state.data.length);\n\n return (\n <div className=\"space-y-4\">\n <p>Expression: {calculation.expression.rawInput}</p>\n\n <div>\n <h4 className=\"text-sm font-medium mb-2\">Preview Data</h4>\n <div className=\"border rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>ID</TableHead>\n <TableHead>Result</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {previewData.slice(0, previewRows).map((row) => (\n <TableRow key={row.__ID}>\n <TableCell>{row.__ID}</TableCell>\n <TableCell>{row[calculation.resultColumnName]}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {totalRows > previewRows && (\n <p className=\"text-sm text-muted-foreground mt-2\">\n Showing {previewRows} of {totalRows} rows\n </p>\n )}\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Edit, Eye, PlusCircle, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { CalculationForm } from \"./CalculationForm\";\nimport { CalculationPreview } from \"./CalculationPreview\";\n\nexport type CalcBuilder = {\n name: string;\n resultColumnName: string;\n expressionString: string;\n};\n\nexport function CalculationManager() {\n const calculations = useDataLayer((state) => state.calculations);\n const addCalculation = useDataLayer((state) => state.addCalculation);\n const removeCalculation = useDataLayer((state) => state.removeCalculation);\n const updateCalculation = useDataLayer((state) => state.updateCalculation);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const data = useDataLayer((state) => state.data);\n\n const [isFormDialogOpen, setIsFormDialogOpen] = useState(false);\n const [isPreviewDialogOpen, setIsPreviewDialogOpen] = useState(false);\n const [currentCalculation, setCurrentCalculation] = useState<string | null>(\n null\n );\n const [dialogMode, setDialogMode] = useState<\"add\" | \"edit\">(\"add\");\n\n const [newCalcColumn, setNewCalcColumn] = useState(\"\");\n const [newExpression, setNewExpression] = useState(\"\");\n\n const availableFields = getColumnNames();\n\n const handleAddCalculation = async () => {\n if (!newCalcColumn.trim()) {\n toast.error(\"Please enter a result column name\");\n return;\n }\n\n if (!newExpression.trim()) {\n toast.error(\"Please enter an expression\");\n return;\n }\n\n try {\n await addCalculation({\n resultColumnName: newCalcColumn,\n expression: parseExpression(newExpression),\n });\n\n toast.success(\"Calculation added successfully\");\n setIsFormDialogOpen(false);\n resetNewCalculationForm();\n } catch (error) {\n toast.error(\n `Failed to add calculation: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n };\n\n const handleRemoveCalculation = (resultColumnName: string) => {\n removeCalculation(resultColumnName);\n toast.success(\"Calculation removed\");\n };\n\n const handleEditCalculation = (resultColumnName: string) => {\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === resultColumnName\n );\n if (calculation) {\n setCurrentCalculation(resultColumnName);\n setNewCalcColumn(calculation.resultColumnName);\n setNewExpression(calculation.expression.rawInput);\n setDialogMode(\"edit\");\n setIsFormDialogOpen(true);\n }\n };\n\n const handlePreviewCalculation = (resultColumnName: string) => {\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === resultColumnName\n );\n if (calculation) {\n setCurrentCalculation(resultColumnName);\n setIsPreviewDialogOpen(true);\n }\n };\n\n const handleUpdateCalculation = async () => {\n if (!currentCalculation) {\n return;\n }\n\n if (!newCalcColumn.trim()) {\n toast.error(\"Please enter a result column name\");\n return;\n }\n\n if (!newExpression.trim()) {\n toast.error(\"Please enter an expression\");\n return;\n }\n\n try {\n updateCalculation(currentCalculation, {\n resultColumnName: newCalcColumn,\n expression: parseExpression(newExpression),\n });\n\n toast.success(\"Calculation updated successfully\");\n setIsFormDialogOpen(false);\n } catch (error) {\n toast.error(\n `Failed to update calculation: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n };\n\n const resetNewCalculationForm = () => {\n setNewCalcColumn(\"\");\n setNewExpression(\"\");\n };\n\n const openAddDialog = () => {\n resetNewCalculationForm();\n setDialogMode(\"add\");\n setCurrentCalculation(null);\n setIsFormDialogOpen(true);\n };\n\n const handleFormSubmit = () => {\n if (dialogMode === \"add\") {\n handleAddCalculation();\n } else {\n handleUpdateCalculation();\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center\">\n <h2 className=\"text-xl font-semibold\">Calculations</h2>\n <Button\n variant=\"outline\"\n className=\"flex items-center gap-2\"\n onClick={openAddDialog}\n >\n <PlusCircle className=\"h-4 w-4\" />\n Add Calculation\n </Button>\n </div>\n\n {calculations.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n No calculations defined. Add one to get started.\n </div>\n ) : (\n <div className=\"border rounded-md\">\n <Table className=\"border-collapse\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[120px] border border-border\">\n Actions\n </TableHead>\n\n <TableHead className=\"w-[200px] text-center border border-border\">\n Result Column\n </TableHead>\n <TableHead className=\"w-full border border-border\">\n Expression\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {calculations.map((calc) => (\n <TableRow key={calc.resultColumnName}>\n <TableCell className=\"w-[120px] border border-border\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handlePreviewCalculation(calc.resultColumnName)\n }\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handleEditCalculation(calc.resultColumnName)\n }\n >\n <Edit className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() =>\n handleRemoveCalculation(calc.resultColumnName)\n }\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </TableCell>\n\n <TableCell className=\"w-[200px] text-center border border-border\">\n {calc.resultColumnName}\n </TableCell>\n <TableCell className=\"font-mono text-sm w-full border border-border\">\n {calc.expression.rawInput}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n\n {/* Combined Add/Edit Dialog */}\n <Dialog open={isFormDialogOpen} onOpenChange={setIsFormDialogOpen}>\n <DialogContent className=\"max-w-3xl max-h-[80vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {dialogMode === \"add\"\n ? \"Add New Calculation\"\n : \"Edit Calculation\"}\n </DialogTitle>\n <DialogDescription>\n {dialogMode === \"add\"\n ? \"Create a new calculation to transform your data\"\n : \"Update your calculation\"}\n </DialogDescription>\n </DialogHeader>\n <CalculationForm\n resultColumnName={newCalcColumn}\n setResultColumnName={setNewCalcColumn}\n expression={newExpression}\n setExpression={setNewExpression}\n availableFields={availableFields}\n onSubmit={handleFormSubmit}\n onCancel={() => setIsFormDialogOpen(false)}\n submitButtonText={\n dialogMode === \"add\" ? \"Add Calculation\" : \"Update Calculation\"\n }\n />\n </DialogContent>\n </Dialog>\n\n {/* Preview Dialog */}\n <Dialog open={isPreviewDialogOpen} onOpenChange={setIsPreviewDialogOpen}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>Calculation Preview</DialogTitle>\n <DialogDescription>Preview calculation results</DialogDescription>\n </DialogHeader>\n {currentCalculation && (\n <div className=\"py-4\">\n {calculations.find(\n (calc) => calc.resultColumnName === currentCalculation\n )?.expression && (\n <CalculationPreview\n calculation={\n calculations.find(\n (calc) => calc.resultColumnName === currentCalculation\n )!\n }\n previewRows={10}\n />\n )}\n </div>\n )}\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n onClick={() => setIsPreviewDialogOpen(false)}\n >\n Close\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Label } from \"../ui/label\";\nimport { Input } from \"../ui/input\";\nimport { Switch } from \"../ui/switch\";\n\nexport function GridSettingsPanel() {\n const gridSettings = useDataLayer((s) => s.gridSettings);\n const updateGridSettings = useDataLayer((s) => s.updateGridSettings);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Column Count</Label>\n <Input\n type=\"number\"\n value={gridSettings.columnCount}\n onChange={(e) =>\n updateGridSettings({\n columnCount: parseInt(e.target.value),\n })\n }\n min={1}\n max={24}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Row Height (px)</Label>\n <Input\n type=\"number\"\n value={gridSettings.rowHeight}\n onChange={(e) =>\n updateGridSettings({\n rowHeight: parseInt(e.target.value),\n })\n }\n min={20}\n max={200}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label>Container Padding (px)</Label>\n <Input\n type=\"number\"\n value={gridSettings.containerPadding}\n onChange={(e) =>\n updateGridSettings({\n containerPadding: parseInt(e.target.value),\n })\n }\n min={0}\n max={50}\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"show-markers\"\n checked={gridSettings.showBackgroundMarkers}\n onCheckedChange={(checked) =>\n updateGridSettings({ showBackgroundMarkers: checked })\n }\n />\n <Label htmlFor=\"show-markers\">Show Grid Markers</Label>\n </div>\n </div>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { ColorScaleManager } from \"./ColorScaleManager\";\nimport { ChartCreationButtons } from \"./plot/ChartCreationButtons\";\n\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport type { ChartLayout } from \"@/types/ChartTypes\";\nimport { saveRawDataToClipboard, saveToClipboard } from \"@/utils/saveDataUtils\";\nimport {\n Calculator,\n Copy,\n FilterX,\n Grid,\n MoreHorizontal,\n X,\n} from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Layout } from \"react-grid-layout\";\nimport { toast } from \"sonner\";\nimport { ChartGridLayout } from \"./ChartGridLayout\";\nimport { PlotChartPanel } from \"./PlotChartPanel\";\nimport { CalculationManager } from \"./calculations/CalculationManager\";\nimport { GridSettingsPanel } from \"./settings/GridSettingsPanel\";\nimport { useAlertStore } from \"@/stores/alertStore\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\n\n// Add this conversion function\nconst gridToPixels = (\n layout: ChartLayout,\n containerWidth: number,\n gridSettings: {\n columnCount: number;\n containerPadding: number;\n rowHeight: number;\n }\n) => {\n const columnWidth =\n (containerWidth - gridSettings.containerPadding * 2) /\n gridSettings.columnCount;\n\n // Ensure width doesn't exceed available space\n const maxColumns = Math.min(layout.w, gridSettings.columnCount);\n const width = maxColumns * columnWidth;\n\n return {\n width,\n height: layout.h * gridSettings.rowHeight,\n };\n};\n\nexport function PlotManager() {\n const charts = useDataLayer((state) => state.charts);\n const updateChart = useDataLayer((state) => state.updateChart);\n const addChart = useDataLayer((state) => state.addChart);\n const removeChart = useDataLayer((state) => state.removeChart);\n const removeAllCharts = useDataLayer((state) => state.removeAllCharts);\n const clearAllFilters = useDataLayer((state) => state.clearAllFilters);\n const gridSettings = useDataLayer((state) => state.gridSettings);\n const saveToStructure = useDataLayer((state) => state.saveToStructure);\n const data = useDataLayer((state) => state.data);\n const showAlert = useAlertStore((state) => state.showAlert);\n\n const [activeTab, setActiveTab] = useState(\"charts\");\n\n // Add ref and state for container dimensions\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Add useEffect to measure container\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const handleLayoutChange = (newLayout: Layout[]) => {\n charts.forEach((chart) => {\n const updatedLayout = newLayout.find((l) => l.i === chart.id);\n if (updatedLayout) {\n updateChart(chart.id, {\n layout: {\n x: updatedLayout.x,\n y: updatedLayout.y,\n w: updatedLayout.w,\n h: updatedLayout.h,\n },\n });\n }\n });\n };\n\n const copyChartsToClipboard = async () => {\n if (charts.length === 0) {\n toast(\"No charts to copy\");\n return;\n }\n\n try {\n const savedData = saveToStructure();\n await saveToClipboard(savedData);\n\n toast(\"Configuration saved to clipboard\");\n } catch (error) {\n console.error(\"Failed to copy to clipboard:\", error);\n toast.error(\"Failed to copy configuration to clipboard\");\n }\n };\n\n const copyDataToClipboard = async () => {\n if (!data || data.length === 0) {\n toast(\"No data to copy\");\n return;\n }\n\n try {\n await saveRawDataToClipboard(data);\n\n toast(\"Data saved to clipboard\");\n } catch (error) {\n console.error(\"Failed to copy data to clipboard:\", error);\n toast.error(\"Failed to copy data to clipboard\");\n }\n };\n\n const handleRemoveAllCharts = async () => {\n const confirmed = await showAlert(\n \"Remove All Charts\",\n \"Are you sure you want to remove all charts? This action cannot be undone.\"\n );\n\n if (confirmed) {\n removeAllCharts();\n toast(\"All charts have been removed\");\n }\n };\n\n return (\n <div className=\"w-full pb-40\" ref={containerRef}>\n <div className=\"flex justify-between items-center mb-4\">\n <div className=\"flex items-center gap-2\">\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"w-full\"\n >\n <TabsList>\n <TabsTrigger value=\"charts\" className=\"flex items-center gap-2\">\n Charts\n </TabsTrigger>\n <TabsTrigger\n value=\"calculations\"\n className=\"flex items-center gap-2\"\n >\n <Calculator className=\"h-4 w-4\" />\n Calculations\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <ChartCreationButtons />\n </div>\n <div className=\"flex items-center gap-2\">\n {charts.length > 0 && activeTab === \"charts\" && (\n <>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={clearAllFilters}\n title=\"Clear All Filters\"\n >\n <FilterX className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onClick={copyChartsToClipboard}\n className=\"flex items-center gap-2\"\n >\n <Copy className=\"h-4 w-4\" />\n Copy Charts\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={copyDataToClipboard}\n className=\"flex items-center gap-2\"\n >\n <Copy className=\"h-4 w-4\" />\n Copy Data\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={handleRemoveAllCharts}\n className=\"flex items-center gap-2 text-destructive\"\n >\n <X className=\"h-4 w-4\" />\n Remove All Charts\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n <ColorScaleManager />\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Grid className=\"h-4 w-4 mr-2\" />\n Grid Settings\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Grid Settings</DialogTitle>\n <DialogDescription>\n Configure the grid layout settings for all charts\n </DialogDescription>\n </DialogHeader>\n <GridSettingsPanel />\n </DialogContent>\n </Dialog>\n </div>\n </div>\n\n <Tabs value={activeTab} className=\"w-full\">\n <TabsContent value=\"charts\" className=\"mt-0\">\n <ChartGridLayout\n charts={charts}\n onLayoutChange={handleLayoutChange}\n containerWidth={containerWidth}\n >\n {charts.map((chart) => {\n if (!chart.layout) {\n return null;\n }\n const size = gridToPixels(\n chart.layout,\n containerWidth,\n gridSettings\n );\n return (\n <div key={chart.id}>\n <PlotChartPanel\n settings={chart}\n onDelete={() => removeChart(chart)}\n onDuplicate={() => {\n const { id, ...chartWithoutId } = chart;\n addChart(chartWithoutId);\n }}\n width={size.width}\n height={size.height}\n />\n </div>\n );\n })}\n </ChartGridLayout>\n </TabsContent>\n <TabsContent value=\"calculations\" className=\"mt-0\">\n <Card>\n <CardContent className=\"pt-6\">\n <CalculationManager />\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Toaster as Sonner, ToasterProps } from \"sonner\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme();\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport { cn } from \"@/lib/utils\";\nimport { buttonVariants } from \"@/components/ui/button\";\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n );\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n {...props}\n />\n );\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { useAlertStore } from \"@/stores/alertStore\";\n\nexport function GlobalAlertDialog() {\n const { isOpen, title, description, closeAlert, id } = useAlertStore();\n\n return (\n <AlertDialog\n key={id}\n open={isOpen}\n onOpenChange={(open) => !open && closeAlert(false)}\n >\n <AlertDialogContent\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n const action = document.getElementById(`alert-dialog-action-${id}`);\n if (action) {\n action.focus();\n }\n }}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction\n onClick={() => closeAlert(true)}\n autoFocus\n id={`alert-dialog-action-${id}`}\n >\n Continue\n </AlertDialogAction>\n <AlertDialogCancel\n onClick={() => closeAlert(false)}\n autoFocus={false}\n >\n Cancel\n </AlertDialogCancel>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import type { DatumObject } from \"@/providers/DataLayerProvider\";\nimport { DataLayerProvider } from \"@/providers/DataLayerProvider\";\nimport { SavedDataStructure } from \"@/types/SavedDataStructure\";\nimport { PlotManager } from \"./PlotManager\";\nimport { registerAllCharts } from \"@/charts/registry\";\nimport { Toaster } from \"./ui/sonner\";\nimport { GlobalAlertDialog } from \"./GlobalAlertDialog\";\n\nimport \"../index.css\";\n\nregisterAllCharts();\n\nexport function ExplorEda({\n data,\n savedData,\n}: {\n data: DatumObject[];\n savedData: SavedDataStructure | undefined;\n}) {\n return (\n <DataLayerProvider data={data} savedData={savedData}>\n <div className=\"bg-background text-foreground\">\n <PlotManager />\n <GlobalAlertDialog />\n <Toaster />\n </div>\n </DataLayerProvider>\n );\n}\n\nexport type { SavedDataStructure };\n"]}
|