exploreda 0.0.5 → 0.1.0
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/README.md +144 -0
- package/dist/ExplorEda.cjs +4608 -10858
- package/dist/ExplorEda.cjs.map +1 -1
- package/dist/ExplorEda.css +2332 -1653
- package/dist/ExplorEda.css.map +1 -1
- package/dist/ExplorEda.d.cts +125 -278
- package/dist/ExplorEda.d.ts +125 -278
- package/dist/ExplorEda.js +4521 -10782
- package/dist/ExplorEda.js.map +1 -1
- package/dist/calculations.cjs +18 -0
- package/dist/calculations.cjs.map +1 -0
- package/dist/calculations.d.cts +63 -0
- package/dist/calculations.d.ts +63 -0
- package/dist/calculations.js +3 -0
- package/dist/calculations.js.map +1 -0
- package/dist/charts/bar.cjs +27 -0
- package/dist/charts/bar.cjs.map +1 -0
- package/dist/charts/bar.d.cts +2 -0
- package/dist/charts/bar.d.ts +2 -0
- package/dist/charts/bar.js +18 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/box-plot.cjs +26 -0
- package/dist/charts/box-plot.cjs.map +1 -0
- package/dist/charts/box-plot.d.cts +2 -0
- package/dist/charts/box-plot.d.ts +2 -0
- package/dist/charts/box-plot.js +17 -0
- package/dist/charts/box-plot.js.map +1 -0
- package/dist/charts/color-legend.cjs +22 -0
- package/dist/charts/color-legend.cjs.map +1 -0
- package/dist/charts/color-legend.d.cts +2 -0
- package/dist/charts/color-legend.d.ts +2 -0
- package/dist/charts/color-legend.js +13 -0
- package/dist/charts/color-legend.js.map +1 -0
- package/dist/charts/data-table.cjs +22 -0
- package/dist/charts/data-table.cjs.map +1 -0
- package/dist/charts/data-table.d.cts +2 -0
- package/dist/charts/data-table.d.ts +2 -0
- package/dist/charts/data-table.js +13 -0
- package/dist/charts/data-table.js.map +1 -0
- package/dist/charts/line.cjs +30 -0
- package/dist/charts/line.cjs.map +1 -0
- package/dist/charts/line.d.cts +2 -0
- package/dist/charts/line.d.ts +2 -0
- package/dist/charts/line.js +17 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/markdown.cjs +16 -0
- package/dist/charts/markdown.cjs.map +1 -0
- package/dist/charts/markdown.css +77 -0
- package/dist/charts/markdown.css.map +1 -0
- package/dist/charts/markdown.d.cts +2 -0
- package/dist/charts/markdown.d.ts +2 -0
- package/dist/charts/markdown.js +7 -0
- package/dist/charts/markdown.js.map +1 -0
- package/dist/charts/pivot-table.cjs +23 -0
- package/dist/charts/pivot-table.cjs.map +1 -0
- package/dist/charts/pivot-table.d.cts +2 -0
- package/dist/charts/pivot-table.d.ts +2 -0
- package/dist/charts/pivot-table.js +14 -0
- package/dist/charts/pivot-table.js.map +1 -0
- package/dist/charts/row.cjs +27 -0
- package/dist/charts/row.cjs.map +1 -0
- package/dist/charts/row.d.cts +6 -0
- package/dist/charts/row.d.ts +6 -0
- package/dist/charts/row.js +18 -0
- package/dist/charts/row.js.map +1 -0
- package/dist/charts/scatter.cjs +24 -0
- package/dist/charts/scatter.cjs.map +1 -0
- package/dist/charts/scatter.d.cts +2 -0
- package/dist/charts/scatter.d.ts +2 -0
- package/dist/charts/scatter.js +15 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/summary-table.cjs +19 -0
- package/dist/charts/summary-table.cjs.map +1 -0
- package/dist/charts/summary-table.d.cts +2 -0
- package/dist/charts/summary-table.d.ts +2 -0
- package/dist/charts/summary-table.js +10 -0
- package/dist/charts/summary-table.js.map +1 -0
- package/dist/charts/three-d-scatter.cjs +24 -0
- package/dist/charts/three-d-scatter.cjs.map +1 -0
- package/dist/charts/three-d-scatter.d.cts +6 -0
- package/dist/charts/three-d-scatter.d.ts +6 -0
- package/dist/charts/three-d-scatter.js +15 -0
- package/dist/charts/three-d-scatter.js.map +1 -0
- package/dist/chunk-3PGYFLE3.cjs +499 -0
- package/dist/chunk-3PGYFLE3.cjs.map +1 -0
- package/dist/chunk-4HNDKMWF.js +167 -0
- package/dist/chunk-4HNDKMWF.js.map +1 -0
- package/dist/chunk-4QNENKTV.cjs +1214 -0
- package/dist/chunk-4QNENKTV.cjs.map +1 -0
- package/dist/chunk-54M32JJB.js +132 -0
- package/dist/chunk-54M32JJB.js.map +1 -0
- package/dist/chunk-5B23JVH3.cjs +2238 -0
- package/dist/chunk-5B23JVH3.cjs.map +1 -0
- package/dist/chunk-5LH6NSNL.js +456 -0
- package/dist/chunk-5LH6NSNL.js.map +1 -0
- package/dist/chunk-6DOKKCJ5.cjs +313 -0
- package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
- package/dist/chunk-6HZX5CBT.cjs +1074 -0
- package/dist/chunk-6HZX5CBT.cjs.map +1 -0
- package/dist/chunk-6U5DOIQM.js +1071 -0
- package/dist/chunk-6U5DOIQM.js.map +1 -0
- package/dist/chunk-7GBZIK2R.cjs +80 -0
- package/dist/chunk-7GBZIK2R.cjs.map +1 -0
- package/dist/chunk-7PTJNIOD.js +520 -0
- package/dist/chunk-7PTJNIOD.js.map +1 -0
- package/dist/chunk-AHZYQ7FN.js +319 -0
- package/dist/chunk-AHZYQ7FN.js.map +1 -0
- package/dist/chunk-AOODAOL4.cjs +55 -0
- package/dist/chunk-AOODAOL4.cjs.map +1 -0
- package/dist/chunk-ASKFIRMC.cjs +165 -0
- package/dist/chunk-ASKFIRMC.cjs.map +1 -0
- package/dist/chunk-B7OQUBH4.cjs +171 -0
- package/dist/chunk-B7OQUBH4.cjs.map +1 -0
- package/dist/chunk-BIMEHDLB.js +72 -0
- package/dist/chunk-BIMEHDLB.js.map +1 -0
- package/dist/chunk-C62KHV7S.js +1225 -0
- package/dist/chunk-C62KHV7S.js.map +1 -0
- package/dist/chunk-C7GQT65O.cjs +1119 -0
- package/dist/chunk-C7GQT65O.cjs.map +1 -0
- package/dist/chunk-CGDWDV4Z.js +1211 -0
- package/dist/chunk-CGDWDV4Z.js.map +1 -0
- package/dist/chunk-CJQQFNEY.js +69 -0
- package/dist/chunk-CJQQFNEY.js.map +1 -0
- package/dist/chunk-DHYLSXNR.js +964 -0
- package/dist/chunk-DHYLSXNR.js.map +1 -0
- package/dist/chunk-DKFA4KOJ.cjs +87 -0
- package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
- package/dist/chunk-DS5BS7PP.cjs +357 -0
- package/dist/chunk-DS5BS7PP.cjs.map +1 -0
- package/dist/chunk-EGMFQSGK.js +909 -0
- package/dist/chunk-EGMFQSGK.js.map +1 -0
- package/dist/chunk-EU5EFHO5.cjs +53 -0
- package/dist/chunk-EU5EFHO5.cjs.map +1 -0
- package/dist/chunk-FM46QSDM.js +837 -0
- package/dist/chunk-FM46QSDM.js.map +1 -0
- package/dist/chunk-GV2LRR32.cjs +843 -0
- package/dist/chunk-GV2LRR32.cjs.map +1 -0
- package/dist/chunk-H3XKFSA5.cjs +322 -0
- package/dist/chunk-H3XKFSA5.cjs.map +1 -0
- package/dist/chunk-H5AVMMCE.js +347 -0
- package/dist/chunk-H5AVMMCE.js.map +1 -0
- package/dist/chunk-JDMUN4VK.cjs +986 -0
- package/dist/chunk-JDMUN4VK.cjs.map +1 -0
- package/dist/chunk-JNO7OXCC.js +2171 -0
- package/dist/chunk-JNO7OXCC.js.map +1 -0
- package/dist/chunk-JQMG4ZR7.js +111 -0
- package/dist/chunk-JQMG4ZR7.js.map +1 -0
- package/dist/chunk-L2Q2R43U.cjs +118 -0
- package/dist/chunk-L2Q2R43U.cjs.map +1 -0
- package/dist/chunk-LBTZVERO.js +466 -0
- package/dist/chunk-LBTZVERO.js.map +1 -0
- package/dist/chunk-LUUGGTTK.cjs +1227 -0
- package/dist/chunk-LUUGGTTK.cjs.map +1 -0
- package/dist/chunk-MEEPH7ZC.cjs +911 -0
- package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
- package/dist/chunk-MJPDJ5AS.js +184 -0
- package/dist/chunk-MJPDJ5AS.js.map +1 -0
- package/dist/chunk-MJROUIDZ.cjs +219 -0
- package/dist/chunk-MJROUIDZ.cjs.map +1 -0
- package/dist/chunk-MUWSBYJS.js +528 -0
- package/dist/chunk-MUWSBYJS.js.map +1 -0
- package/dist/chunk-NDF5LCST.js +1088 -0
- package/dist/chunk-NDF5LCST.js.map +1 -0
- package/dist/chunk-NGWTPED4.js +311 -0
- package/dist/chunk-NGWTPED4.js.map +1 -0
- package/dist/chunk-PP4VCONW.js +739 -0
- package/dist/chunk-PP4VCONW.js.map +1 -0
- package/dist/chunk-PRMC2A6P.cjs +488 -0
- package/dist/chunk-PRMC2A6P.cjs.map +1 -0
- package/dist/chunk-PST6UU6S.cjs +742 -0
- package/dist/chunk-PST6UU6S.cjs.map +1 -0
- package/dist/chunk-Q7LK2UWH.js +33 -0
- package/dist/chunk-Q7LK2UWH.js.map +1 -0
- package/dist/chunk-SFV5LZPD.js +162 -0
- package/dist/chunk-SFV5LZPD.js.map +1 -0
- package/dist/chunk-SKXGYJJG.cjs +370 -0
- package/dist/chunk-SKXGYJJG.cjs.map +1 -0
- package/dist/chunk-SWLNKY6R.js +477 -0
- package/dist/chunk-SWLNKY6R.js.map +1 -0
- package/dist/chunk-TGVLNHUB.cjs +483 -0
- package/dist/chunk-TGVLNHUB.cjs.map +1 -0
- package/dist/chunk-TLLRW6S3.js +74 -0
- package/dist/chunk-TLLRW6S3.js.map +1 -0
- package/dist/chunk-TRAIXZ6M.cjs +140 -0
- package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
- package/dist/chunk-U74A5VK5.cjs +74 -0
- package/dist/chunk-U74A5VK5.cjs.map +1 -0
- package/dist/chunk-UAVDLBTA.cjs +74 -0
- package/dist/chunk-UAVDLBTA.cjs.map +1 -0
- package/dist/chunk-UJWS6TRV.js +354 -0
- package/dist/chunk-UJWS6TRV.js.map +1 -0
- package/dist/chunk-UUJMUPB3.cjs +531 -0
- package/dist/chunk-UUJMUPB3.cjs.map +1 -0
- package/dist/chunk-VTKHZIJB.cjs +549 -0
- package/dist/chunk-VTKHZIJB.cjs.map +1 -0
- package/dist/chunk-YXPAWUXO.js +51 -0
- package/dist/chunk-YXPAWUXO.js.map +1 -0
- package/dist/chunk-ZD64SCZB.js +80 -0
- package/dist/chunk-ZD64SCZB.js.map +1 -0
- package/dist/core.cjs +28 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +22 -0
- package/dist/core.d.ts +22 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
- package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
- package/package.json +32 -52
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/charts/BarChart/bins.ts","../src/components/charts/BarChart/barPlan.ts","../src/components/charts/BarChart/barTrace.ts","../src/components/charts/BarChart/BarChart.tsx","../src/components/ui/slider.tsx","../src/components/charts/BarChart/BarChartSettingsPanel.tsx","../src/components/charts/BarChart/definition.ts"],"names":["jsxs","jsx","useMemo","useState","aggregate","Fragment"],"mappings":"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","file":"chunk-DHYLSXNR.js","sourcesContent":["export function numericBins(all: number[], values: number[], count: number) {\n const low = Math.min(...all);\n const high = Math.max(...all);\n if (!Number.isFinite(low) || !Number.isFinite(high)) return [];\n const min = low === high ? low - 0.5 : low;\n const max = low === high ? high + 0.5 : high;\n const size = Math.max(2, Math.min(100, Math.round(count)));\n const step = (max - min) / size;\n const bins = Array.from({ length: size }, (_, i) => {\n const start = min + i * step;\n const end = min + (i + 1) * step;\n return {\n label: `[${start}, ${end}${i === size - 1 ? \"]\" : \")\"}`,\n start,\n end,\n value: 0,\n isNumeric: true as const,\n };\n });\n for (const value of values) {\n if (!Number.isFinite(value) || value < min || value > max) continue;\n bins[Math.min(size - 1, Math.floor((value - min) / step))]!.value++;\n }\n return bins;\n}\n","import { applyFilter } from \"@/hooks/applyFilter\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport {\n calculateGroupedAggregate,\n type AggregateResult,\n type AggregateResultRow,\n} from \"@/lib/aggregates\";\nimport {\n categoryKey,\n categoryLabel,\n categoryValue,\n} from \"@/lib/categories\";\nimport {\n finiteNumber,\n finiteNumbers,\n isMissingValue,\n isNumberLike,\n} from \"@/lib/numeric\";\nimport type { IdType } from \"@/providers/DataLayerProvider\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport type { ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand } from \"d3-scale\";\nimport { formatTick } from \"../Axis/Axis\";\nimport {\n planAxes,\n planChartMargin,\n type AxisDomainSource,\n type ChartAxesPlan,\n type ScaleDescriptor,\n describeScale,\n} from \"../Axis/axisPlan\";\nimport { numericScale } from \"../Axis/numericScale\";\nimport { getChartAxisLabel } from \"../chartAccessibility\";\nimport { numericBins } from \"./bins\";\nimport type { BarChartSettings } from \"./definition\";\n\n/** Grouped aggregate, count per category, or count per numeric bin. */\nexport type BarMode = \"aggregate\" | \"count\" | \"bin\";\n\nconst X_SCALE_PADDING = 0.05;\nconst Y_SCALE_PADDING = 0.1;\nconst DEFAULT_FILL = \"#3479a8\";\nconst FILTERED_OUT_FILL = \"rgb(156 163 175)\";\n\nexport interface BarSnapshot {\n revision: string;\n /** Every source value of the field. Count and bin domains use it. */\n allValues: datum[];\n /** Rows after other charts' filters and the current facet. */\n liveIds: IdType[];\n fieldData: Record<IdType, datum>;\n fieldType?: string;\n /** The grouped aggregate result for an aggregate bar chart. */\n aggregate?: AggregateResult;\n}\n\nexport interface BarPlanInput {\n settings: BarChartSettings;\n snapshot: BarSnapshot;\n width: number;\n height: number;\n getColor: (value: datum) => string;\n getFieldLabel: (field: string) => string;\n formatFieldValue?: (field: string, value: datum) => string;\n /** Describes the rows an aggregate result uses. */\n aggregateScope?: string;\n}\n\nexport type BarFillSource =\n | { kind: \"color-scale\"; scaleId?: string; value: datum }\n | {\n kind: \"own-filter\";\n scaleId?: string;\n value: datum;\n baseFill: string;\n };\n\nexport interface BarMark {\n id: string;\n order: number;\n label: string;\n groupValue: datum;\n bin?: { start: number; end: number; closed: boolean };\n value: number;\n x: number;\n y: number;\n width: number;\n height: number;\n baseline: number;\n fill: string;\n fillSource: BarFillSource;\n /** Whether this chart's value filter includes the bar, when one exists. */\n selected?: boolean;\n /** The aggregate, count or bin row that sets the bar's value. */\n row: AggregateResultRow;\n}\n\nexport interface BarDomain {\n population: \"current result\" | \"all source rows\";\n values: { id: string; label: string; value: number }[];\n lower: { source: \"zero\" | \"bar\"; id?: string; label?: string; value: number };\n upper: { source: \"zero\" | \"bar\"; id?: string; label?: string; value: number };\n padding: string;\n domain: [number, number];\n}\n\nexport interface BarChartPlan {\n revision: string;\n mode: BarMode;\n width: number;\n height: number;\n field: string;\n fieldLabel: string;\n valueLabel: string;\n aggregation: string;\n axes: ChartAxesPlan;\n xScale: ScaleDescriptor;\n yScale: ScaleDescriptor;\n bars: BarMark[];\n groupOrder: string[];\n /** Rows without a finite value have no bar. */\n unplotted: { row: AggregateResultRow; reason: string }[];\n domain: BarDomain;\n zeroBaseline: number;\n scopeNote: string;\n}\n\nexport function isNumericBarField(\n settings: BarChartSettings,\n snapshot: Pick<BarSnapshot, \"allValues\" | \"fieldType\">\n) {\n // A numeric field needs one finite value; Infinity and NaN still count as numbers.\n return (\n !settings.aggregateId &&\n snapshot.fieldType !== \"categorical\" &&\n !settings.forceString &&\n snapshot.allValues.some((value) => finiteNumber(value) !== undefined) &&\n snapshot.allValues\n .filter((value) => !isMissingValue(value))\n .every(isNumberLike)\n );\n}\n\nfunction countRows(\n settings: BarChartSettings,\n snapshot: BarSnapshot\n): AggregateResult {\n const spec = {\n id: `${settings.id}:count`,\n name: `Count by ${settings.field}`,\n groupField: settings.field,\n aggregation: \"count\" as const,\n };\n const result = calculateGroupedAggregate(\n snapshot.liveIds.map((id) => ({\n __ID: id,\n [settings.field]: snapshot.fieldData[id],\n })),\n spec\n );\n const byKey = new Map(\n result.rows.map((row) => [categoryKey(row.groupValue), row])\n );\n const categories = new Map(\n snapshot.allValues.map((value) => [categoryKey(value), categoryValue(value)])\n );\n // Categories come from every source row, so a filtered-out category keeps its place.\n const rows = [...categories].map(\n ([key, category]) =>\n byKey.get(key) ?? {\n id: `${spec.id}:${key}`,\n groupValue: category,\n groupLabel: categoryLabel(category),\n value: 0,\n rowCount: 0,\n contributors: [],\n }\n );\n return { ...result, rows };\n}\n\ntype BinRow = AggregateResultRow & { bin: { start: number; end: number } };\n\nfunction binRows(settings: BarChartSettings, snapshot: BarSnapshot): BinRow[] {\n const all = finiteNumbers(snapshot.allValues);\n // Blank and nonfinite values are not measurements, so they match no bin.\n const live = snapshot.liveIds.flatMap((id) => {\n const value = finiteNumber(snapshot.fieldData[id]);\n return value === undefined ? [] : [{ id, value }];\n });\n const bins = numericBins(\n all,\n live.map((item) => item.value),\n settings.binCount || 20\n );\n const members = bins.map(() => [] as { id: IdType; value: number }[]);\n if (bins.length) {\n const min = bins[0]!.start;\n const max = bins[bins.length - 1]!.end;\n const step = (max - min) / bins.length;\n // Same rule as numericBins: half-open bins, with the last bin closed.\n for (const item of live) {\n if (item.value < min || item.value > max) continue;\n members[\n Math.min(bins.length - 1, Math.floor((item.value - min) / step))\n ]!.push(item);\n }\n }\n return bins.map((bin, index) => ({\n bin: { start: bin.start, end: bin.end },\n id: `bin:${bin.start}:${bin.end}`,\n groupValue: bin.start,\n groupLabel: bin.label,\n value: bin.value,\n rowCount: members[index]!.length,\n contributors: members[index]!.map((item) => ({\n sourceId: item.id,\n input: snapshot.fieldData[item.id],\n included: true,\n })),\n }));\n}\n\nfunction extremes(values: BarDomain[\"values\"]) {\n const lower = values.reduce<BarDomain[\"values\"][number] | undefined>(\n (winner, item) =>\n item.value < (winner?.value ?? 0) ? item : winner,\n undefined\n );\n const upper = values.reduce<BarDomain[\"values\"][number] | undefined>(\n (winner, item) =>\n item.value > (winner?.value ?? 0) ? item : winner,\n undefined\n );\n const end = (item: typeof lower) =>\n item\n ? { source: \"bar\" as const, id: item.id, label: item.label, value: item.value }\n : { source: \"zero\" as const, value: 0 };\n return { lower: end(lower), upper: end(upper) };\n}\n\n/**\n * Plans every bar, both scales, the axes and the Y domain from one snapshot.\n * BarChart draws this plan and the trace reads it, so both use the same numbers.\n */\nexport function planBarChart({\n settings,\n snapshot,\n width,\n height,\n getColor,\n getFieldLabel,\n formatFieldValue,\n aggregateScope = \"This result uses the current globally filtered source rows\",\n}: BarPlanInput): BarChartPlan {\n const numeric = isNumericBarField(settings, snapshot);\n const mode: BarMode = settings.aggregateId\n ? \"aggregate\"\n : numeric\n ? \"bin\"\n : \"count\";\n const spec = snapshot.aggregate?.spec;\n const result =\n mode === \"aggregate\"\n ? snapshot.aggregate\n : mode === \"count\"\n ? countRows(settings, snapshot)\n : undefined;\n const rows: (AggregateResultRow & Partial<Pick<BinRow, \"bin\">>)[] =\n mode === \"bin\" ? binRows(settings, snapshot) : (result?.rows ?? []);\n\n // Y domain: an aggregate uses its current values; counts use every source row\n // so bars keep their scale while other charts filter.\n let domainValues: BarDomain[\"values\"];\n if (mode === \"aggregate\") {\n domainValues = rows.flatMap((row) =>\n typeof row.value === \"number\" && Number.isFinite(row.value)\n ? [{ id: row.id, label: row.groupLabel, value: row.value }]\n : []\n );\n } else if (mode === \"bin\") {\n const all = finiteNumbers(snapshot.allValues);\n domainValues = numericBins(all, all, settings.binCount || 20).map(\n (bin) => ({ id: `bin:${bin.start}:${bin.end}`, label: bin.label, value: bin.value })\n );\n } else {\n const counts = new Map<string, { id: string; label: string; value: number }>();\n for (const value of snapshot.allValues) {\n const key = categoryKey(value);\n const item = counts.get(key);\n if (item) item.value += 1;\n else\n counts.set(key, {\n id: `${settings.id}:count:${key}`,\n label: categoryLabel(categoryValue(value)),\n value: 1,\n });\n }\n domainValues = [...counts.values()];\n }\n const { lower, upper } = extremes(domainValues);\n let yDomain: [number, number];\n let padding: string;\n if (mode === \"aggregate\") {\n const pad =\n lower.value === upper.value ? 0.5 : (upper.value - lower.value) * Y_SCALE_PADDING;\n yDomain = [lower.value - (lower.value < 0 ? pad : 0), upper.value + pad];\n padding =\n lower.value === upper.value ? \"0.5 above and below\" : \"10% of the value span\";\n } else {\n yDomain = [0, Math.max(1, upper.value * (1 + Y_SCALE_PADDING))];\n padding = \"10% above the tallest bar\";\n }\n\n const xField = mode === \"aggregate\" && spec ? spec.groupField : settings.field;\n const yField =\n mode === \"aggregate\" && spec && spec.aggregation !== \"count\"\n ? spec.measureField\n : undefined;\n const xLabel = getChartAxisLabel(\n xField,\n settings.xAxisLabel,\n getFieldLabel\n );\n const yLabel =\n settings.yAxisLabel ||\n (mode === \"aggregate\" && spec\n ? spec.aggregation === \"count\"\n ? \"Count\"\n : getFieldLabel(spec.measureField ?? \"Measure\")\n : \"\");\n const { margin, policy } = planChartMargin({\n margin: settings.margin,\n width,\n yDomain,\n hasXLabel: Boolean(xLabel),\n hasYLabel: Boolean(yLabel),\n });\n const plotWidth = width - margin.left - margin.right;\n const plotHeight = height - margin.top - margin.bottom;\n\n let xScale;\n let xDomainSource: AxisDomainSource | undefined;\n if (mode === \"bin\") {\n const all = finiteNumbers(snapshot.allValues);\n const low = Math.min(...all);\n const high = Math.max(...all);\n const min = low === high ? low - 0.5 : low;\n const max = low === high ? high + 0.5 : high;\n const pad = (max - min) * X_SCALE_PADDING;\n xScale = numericScale(settings.xAxis)\n .domain([min - pad, max + pad])\n .range([0, plotWidth]);\n xDomainSource = {\n population: \"all source rows\",\n rows: all.length,\n bounds: [low, high],\n padding: \"5% on each side\",\n };\n } else {\n const labels =\n mode === \"aggregate\"\n ? rows.map((row) => row.groupLabel)\n : Array.from(new Set(snapshot.allValues.map(categoryLabel)));\n xScale = scaleBand<string>().domain(labels).range([0, plotWidth]).padding(0.3);\n }\n const yScale = numericScale(settings.yAxis)\n .domain(yDomain)\n .range([plotHeight, 0]);\n const baseline = yScale(0);\n\n const format = (field: string | undefined) => (value: string | number) =>\n field && formatFieldValue ? formatFieldValue(field, value) : formatTick(value);\n const symlog = (label: string, type?: string) =>\n [label, type === \"symlog\" && \"symlog\"].filter(Boolean).join(\" · \");\n const axes = planAxes({\n plotWidth,\n plotHeight,\n margin,\n marginPolicy: policy,\n x: {\n scale: xScale,\n scaleType: settings.xAxis.scaleType,\n field: xField,\n fieldLabel: xField ? getFieldLabel(xField) : undefined,\n density: settings.xGridLines,\n grid: settings.xAxis.grid,\n format: format(xField),\n label: symlog(xLabel, settings.xAxis.scaleType),\n labelSource: settings.xAxisLabel ? \"chart-setting\" : \"field-label\",\n domainSource: xDomainSource,\n },\n y: {\n scale: yScale,\n scaleType: settings.yAxis.scaleType,\n field: yField,\n fieldLabel: yLabel || undefined,\n density: settings.yGridLines,\n grid: settings.yAxis.grid ?? true,\n format: format(yField),\n label: symlog(yLabel, settings.yAxis.scaleType),\n labelSource: settings.yAxisLabel ? \"chart-setting\" : \"field-label\",\n zero: true,\n domainSource: {\n population:\n mode === \"aggregate\" ? \"the current aggregate result\" : \"all source rows\",\n rows: domainValues.length,\n bounds: [lower.value, upper.value],\n padding,\n lower: lower.label ? { label: lower.label, value: lower.value } : undefined,\n upper: upper.label ? { label: upper.label, value: upper.value } : undefined,\n },\n },\n });\n\n const valueFilter =\n mode === \"aggregate\"\n ? undefined\n : settings.filters.find(\n (filter): filter is ValueFilter =>\n filter.type === \"value\" && filter.field === settings.field\n );\n const rangeFilter =\n mode === \"bin\"\n ? getRangeFilterForField(settings.filters, settings.field)\n : undefined;\n const bars: BarMark[] = [];\n const unplotted: BarChartPlan[\"unplotted\"] = [];\n rows.forEach((row, order) => {\n if (typeof row.value !== \"number\" || !Number.isFinite(row.value)) {\n unplotted.push({ row, reason: \"No valid numbers\" });\n return;\n }\n let x: number;\n let barWidth: number;\n let bin: BarMark[\"bin\"];\n if (row.bin) {\n const linear = xScale as ReturnType<typeof numericScale>;\n const { start, end } = row.bin;\n bin = { start, end, closed: order === rows.length - 1 };\n x = linear(start);\n const span = linear(end) - x;\n if (span < 1) return;\n barWidth = Math.max(0, span - 1);\n } else {\n const band = xScale as ReturnType<typeof scaleBand<string>>;\n const at = band(row.groupLabel);\n if (at === undefined || band.bandwidth() < 1) return;\n x = at;\n barWidth = band.bandwidth();\n }\n const valuePosition = yScale(row.value);\n const baseFill = getColor(row.groupValue) || DEFAULT_FILL;\n const passes =\n rangeFilter\n ? applyFilter(row.groupValue, rangeFilter)\n : valueFilter\n ? applyFilter(row.groupValue, valueFilter)\n : true;\n bars.push({\n id: `bar:${row.id}`,\n order,\n label: row.groupLabel,\n groupValue: row.groupValue,\n bin,\n value: row.value,\n x,\n y: Math.min(baseline, valuePosition),\n width: barWidth,\n height: Math.max(1, Math.abs(baseline - valuePosition)),\n baseline,\n fill: passes ? baseFill : FILTERED_OUT_FILL,\n fillSource: passes\n ? { kind: \"color-scale\", scaleId: settings.colorScaleId, value: row.groupValue }\n : {\n kind: \"own-filter\",\n scaleId: settings.colorScaleId,\n value: row.groupValue,\n baseFill,\n },\n selected:\n mode === \"count\" && valueFilter\n ? applyFilter(row.groupValue, valueFilter)\n : undefined,\n row,\n });\n });\n\n return {\n revision: snapshot.revision,\n mode,\n width,\n height,\n field: xField,\n fieldLabel: getFieldLabel(xField),\n valueLabel: yLabel || \"Row count\",\n aggregation:\n mode === \"aggregate\" && spec\n ? `${spec.aggregation}${spec.measureField ? ` of ${getFieldLabel(spec.measureField)}` : \"\"}`\n : \"count\",\n axes,\n xScale: describeScale(xScale, settings.xAxis.scaleType),\n yScale: describeScale(yScale, settings.yAxis.scaleType),\n bars,\n groupOrder: rows.map((row) => row.groupLabel),\n unplotted,\n domain: {\n population: mode === \"aggregate\" ? \"current result\" : \"all source rows\",\n values: domainValues,\n lower,\n upper,\n padding,\n domain: yDomain,\n },\n zeroBaseline: baseline,\n scopeNote:\n mode === \"aggregate\"\n ? aggregateScope\n : mode === \"count\"\n ? \"Rows after other chart filters; this chart's selected categories are shown in color\"\n : \"Rows after other chart filters; this chart's range is shown in color\",\n };\n}\n\n/** The bar that counts a source row, if one is drawn. */\nexport function findBarForRow(plan: BarChartPlan, id: number) {\n return plan.bars.find((bar) =>\n bar.row.contributors.some((contributor) => contributor.sourceId === id)\n );\n}\n\n/** The bar under a point in plot coordinates. */\nexport function barAt(plan: BarChartPlan, x: number, y: number) {\n return plan.bars.find(\n (bar) =>\n x >= bar.x &&\n x <= bar.x + bar.width &&\n y >= bar.y &&\n y <= bar.y + bar.height\n );\n}\n","import {\n guideTargets,\n resolveGuideTrace,\n type GuideTrace,\n type TraceTarget,\n} from \"../trace/traceTypes\";\nimport { findBarForRow, type BarChartPlan, type BarMark } from \"./barPlan\";\n\nexport interface BarTrace {\n kind: \"bar\";\n id: string;\n revision: string;\n mark: BarMark;\n mode: BarChartPlan[\"mode\"];\n field: string;\n fieldLabel: string;\n valueLabel: string;\n aggregation: string;\n groupOrder: string[];\n domain: BarChartPlan[\"domain\"];\n xScale: BarChartPlan[\"xScale\"];\n yScale: BarChartPlan[\"yScale\"];\n scopeNote: string;\n}\n\n/** Explains one planned bar or guide. Returns undefined when the plan no longer draws it. */\nexport function resolveBarTrace(\n plan: BarChartPlan,\n kind: string,\n id: string\n): BarTrace | GuideTrace | undefined {\n if (kind === \"guide\") return resolveGuideTrace(plan.axes, id, plan.revision);\n if (kind !== \"bar\") return undefined;\n const mark = plan.bars.find((bar) => bar.id === id);\n if (!mark) return undefined;\n return {\n kind: \"bar\",\n id,\n revision: plan.revision,\n mark,\n mode: plan.mode,\n field: plan.field,\n fieldLabel: plan.fieldLabel,\n valueLabel: plan.valueLabel,\n aggregation: plan.aggregation,\n groupOrder: plan.groupOrder,\n domain: plan.domain,\n xScale: plan.xScale,\n yScale: plan.yScale,\n scopeNote: plan.scopeNote,\n };\n}\n\nexport function barTraceTargets(plan: BarChartPlan): TraceTarget[] {\n return [\n ...plan.bars.map((bar) => ({\n kind: \"bar\",\n id: bar.id,\n label: `Bar: ${bar.label}`,\n })),\n ...guideTargets(plan.axes),\n ];\n}\n\nexport function findBarTraceRow(plan: BarChartPlan, id: number) {\n const bar = findBarForRow(plan, id);\n return bar && { kind: \"bar\", id: bar.id };\n}\n","import { categoryEqual, categoryIncludes } from \"@/lib/categories\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { BaseChartProps } from \"@/types/ChartTypes\";\nimport { ValueFilter } from \"@/types/FilterTypes\";\nimport type { ScaleLinear } from \"d3-scale\";\nimport { useCallback, useId, useMemo, useState } from \"react\";\nimport { BaseChart } from \"../BaseChart\";\nimport { buildScale, findAxisGuide } from \"../Axis/axisPlan\";\nimport { useGetColumnData, useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { useGetLiveIds } from \"../useGetLiveData\";\nimport { displayAggregateValue, type AggregateResult } from \"@/lib/aggregates\";\nimport { barAt, planBarChart, type BarChartPlan } from \"./barPlan\";\nimport { barTraceTargets, findBarTraceRow, resolveBarTrace } from \"./barTrace\";\nimport { BarChartSettings } from \"./definition\";\nimport {\n useChartTrace,\n useChartTraceApi,\n useTraceRevision,\n useTraceSource,\n} from \"../trace/ChartTraceScope\";\nimport type { TraceSource } from \"../trace/traceTypes\";\n\ntype BarChartProps = BaseChartProps<BarChartSettings> & {\n aggregateResult?: AggregateResult;\n aggregateScope?: string;\n};\n\nfunction HoverReadout({ plan, id }: { plan: BarChartPlan; id: string }) {\n const bar = plan.bars.find((item) => item.id === id);\n const guide = bar ? undefined : findAxisGuide(plan.axes, id)?.guide;\n if (!bar && !guide) return null;\n return (\n <div\n className=\"pointer-events-none absolute left-2 top-2 max-w-[min(16rem,70%)] rounded border border-border bg-card/95 px-2 py-1 text-xs text-card-foreground shadow-sm\"\n role=\"status\"\n >\n {bar ? (\n <>\n <div>Bar · {bar.label}</div>\n <div>\n {bar.bin\n ? `Bin interval: ${bar.bin.start} to ${bar.bin.end}`\n : `Value: ${bar.value}`}\n </div>\n </>\n ) : (\n <>\n <div>\n {guide!.axis === \"x\" ? \"Horizontal\" : \"Vertical\"} {guide!.role}\n </div>\n {guide!.value !== undefined && <div>Value: {String(guide!.value)}</div>}\n {guide!.role !== \"zero\" && guide!.label && (\n <div>Label: {guide!.label.fullText}</div>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport function BarChart({\n settings,\n width,\n height,\n facetIds,\n aggregateResult,\n aggregateScope,\n}: BarChartProps) {\n const getAggregateResult = useDataLayer((s) => s.getAggregateResult);\n const getFieldLabel = useDataLayer((s) => s.getFieldLabel);\n const formatFieldValue = useDataLayer((s) => s.formatFieldValue);\n const fieldSettings = useDataLayer((s) => s.fieldSettings);\n const nonce = useDataLayer((s) => s.nonce);\n const aggregates = useDataLayer((s) => s.aggregates);\n const updateChart = useDataLayer((s) => s.updateChart);\n const { getColorForValue } = useColorScales();\n const liveIds = useGetLiveIds(settings, facetIds);\n const allValues = useGetColumnDataForIds(settings.field);\n const fieldData = useGetColumnData(settings.field);\n const revision = useTraceRevision(settings);\n const trace = useChartTrace();\n const traceApi = useChartTraceApi();\n const owner = useId();\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n const resolvedAggregate = useMemo(() => {\n void aggregates;\n void fieldSettings;\n void nonce;\n return settings.aggregateId\n ? getAggregateResult(settings.aggregateId, liveIds)\n : undefined;\n }, [\n settings.aggregateId,\n getAggregateResult,\n aggregates,\n fieldSettings,\n liveIds,\n nonce,\n ]);\n\n const plan = useMemo(\n () =>\n planBarChart({\n settings,\n width,\n height,\n snapshot: {\n revision,\n allValues,\n liveIds,\n fieldData,\n fieldType: fieldSettings[settings.field]?.type,\n aggregate: aggregateResult ?? resolvedAggregate,\n },\n getColor: (value) =>\n getColorForValue(settings.colorScaleId, value, \"#3479a8\"),\n getFieldLabel,\n formatFieldValue,\n aggregateScope,\n }),\n // Label and format getters are stable; field settings carry their changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n settings,\n width,\n height,\n revision,\n allValues,\n liveIds,\n fieldData,\n fieldSettings,\n aggregateResult,\n resolvedAggregate,\n getColorForValue,\n aggregateScope,\n ]\n );\n const xScale = useMemo(() => buildScale(plan.xScale), [plan.xScale]);\n const yScale = useMemo(\n () => buildScale(plan.yScale) as ScaleLinear<number, number>,\n [plan.yScale]\n );\n\n const source = useMemo(\n (): TraceSource => ({\n role: \"chart\",\n revision: plan.revision,\n resolve: (kind, id) => resolveBarTrace(plan, kind, id),\n findRow: (id) => findBarTraceRow(plan, id),\n targets: () => barTraceTargets(plan),\n }),\n [plan]\n );\n useTraceSource(owner, source);\n const inspect = useCallback(\n (kind: string, id: string) => traceApi?.inspect(owner, kind, id),\n [owner, traceApi]\n );\n const selected =\n trace?.selection?.owner === owner ? trace.selection : undefined;\n\n const valueFilter = settings.filters.find(\n (f): f is ValueFilter => f.type === \"value\" && f.field === settings.field\n );\n\n const toggleCategory = useCallback(\n (label: datum) => {\n const filterValues = valueFilter?.values ?? [];\n const newValues = categoryIncludes(filterValues, label)\n ? filterValues.filter((f) => !categoryEqual(f, label))\n : [...filterValues, label];\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n updateChart(settings.id, { filters: newFilters });\n },\n [settings.id, settings.field, settings.filters, updateChart, valueFilter]\n );\n\n const handleBrushChange = useCallback(\n (extent: [[number, number], [number, number]] | null) => {\n const newFilters = settings.filters.filter(\n (f) => f.field !== settings.field\n );\n if (extent && plan.mode === \"bin\") {\n const linear = xScale as ScaleLinear<number, number>;\n newFilters.push({\n type: \"range\",\n field: settings.field,\n min: linear.invert(extent[0][0]),\n max: linear.invert(extent[1][0]),\n });\n } else if (extent) {\n return;\n }\n updateChart(settings.id, { filters: newFilters });\n },\n [plan.mode, settings.field, settings.filters, settings.id, updateChart, xScale]\n );\n\n const isCount = plan.mode === \"count\";\n const isAggregate = plan.mode === \"aggregate\";\n\n return (\n <div className=\"relative\" style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n axes={plan.axes}\n brushingMode={plan.mode === \"bin\" ? \"horizontal\" : \"none\"}\n onBrushChange={handleBrushChange}\n settings={settings}\n onInspectGuide={(id) => inspect(\"guide\", id)}\n onHoverTarget={setHoveredId}\n onInspectPlot={([x, y]) => {\n const bar = barAt(plan, x, y);\n return bar ? Boolean(inspect(\"bar\", bar.id)) : false;\n }}\n activeGuideId={selected?.kind === \"guide\" ? selected.id : hoveredId}\n >\n <g>\n {plan.bars.map((bar) => {\n const measureLabel = isAggregate\n ? displayAggregateValue(bar.value)\n : `${bar.value} records`;\n const clickable = isCount || plan.mode === \"bin\";\n return (\n <rect\n key={bar.id}\n data-plan-id={bar.id}\n data-aggregate-row-id={bar.row.id}\n x={bar.x}\n y={bar.y}\n width={bar.width}\n height={bar.height}\n rx={1.5}\n role=\"button\"\n tabIndex={0}\n aria-label={`${bar.label}: ${measureLabel}`}\n aria-pressed={bar.selected}\n className={`chart-mark ${clickable ? \"cursor-pointer\" : \"\"}`}\n style={{\n fill: bar.fill,\n ...(selected?.id === bar.id\n ? { stroke: \"var(--primary)\", strokeWidth: 2 }\n : {}),\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n if (event.altKey && event.key === \"Enter\") {\n event.preventDefault();\n inspect(\"bar\", bar.id);\n } else if (isCount && !event.altKey) {\n event.preventDefault();\n toggleCategory(bar.groupValue);\n }\n }}\n onClick={(event) => {\n if (event.altKey) {\n event.preventDefault();\n event.stopPropagation();\n inspect(\"bar\", bar.id);\n } else if (isCount) {\n toggleCategory(bar.groupValue);\n }\n }}\n />\n );\n })}\n </g>\n </BaseChart>\n {hoveredId && <HoverReadout plan={plan} id={hoveredId} />}\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 { finiteNumber } from \"@/lib/numeric\";\nimport { 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 type { AggregateAggregation } from \"@/lib/aggregates\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { useMemo, useState } from \"react\";\n\nfunction getAggregateName(\n aggregation: AggregateAggregation,\n groupField: string,\n measureField?: string\n) {\n if (aggregation === \"count\") {\n return `Count by ${groupField}`;\n }\n return `${aggregation === \"sum\" ? \"Sum\" : \"Average\"} of ${measureField ?? \"\"} by ${groupField}`;\n}\n\nexport function BarChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<BarChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n const aggregate = useDataLayer((state) =>\n settings.aggregateId ? state.getAggregate(settings.aggregateId) : undefined\n );\n const addAggregate = useDataLayer((state) => state.addAggregate);\n const updateAggregate = useDataLayer((state) => state.updateAggregate);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const calculations = useDataLayer((state) => state.calculations);\n const fieldProfiles = useDataLayer((state) => state.fieldProfiles);\n const fieldNames = useMemo(() => {\n void calculations;\n return getColumnNames();\n }, [getColumnNames, calculations]);\n const measureFields = useMemo(() => {\n const numeric = fieldNames.filter((field) =>\n fieldProfiles.some(\n (profile) => profile.name === field && profile.dataType === \"numeric\"\n )\n );\n calculations.forEach((calculation) => {\n const values = Object.values(getColumnData(calculation.resultColumnName));\n if (\nvalues.some((value) => finiteNumber(value) !== undefined)\n ) {\n numeric.push(calculation.resultColumnName);\n }\n });\n if (aggregate?.measureField && !numeric.includes(aggregate.measureField)) {\n numeric.unshift(aggregate.measureField);\n }\n return numeric;\n }, [\n aggregate?.measureField,\n calculations,\n fieldNames,\n fieldProfiles,\n getColumnData,\n ]);\n const [error, setError] = useState<string>();\n\n const createAggregate = (aggregation: AggregateAggregation) => {\n const measureField = measureFields[0];\n if (aggregation !== \"count\" && !measureField) {\n setError(\"Sum and average need a numeric measure field.\");\n return;\n }\n try {\n const aggregate = addAggregate({\n name: getAggregateName(aggregation, settings.field, measureField),\n groupField: settings.field,\n aggregation,\n ...(aggregation === \"count\" ? {} : { measureField }),\n });\n onSettingsChange({\n ...settings,\n field: aggregate.measureField ?? aggregate.groupField,\n aggregateId: aggregate.id,\n title: aggregate.name,\n xAxisLabel: \"\",\n yAxisLabel: \"\",\n });\n setError(undefined);\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Could not create grouped bar\"\n );\n }\n };\n\n if (settings.aggregateId) {\n if (!aggregate) {\n return (\n <p className=\"text-sm text-destructive\">Bar aggregation not found.</p>\n );\n }\n const updateDefinition = (updates: Partial<typeof aggregate>) => {\n try {\n const next = { ...aggregate, ...updates };\n const name = getAggregateName(\n next.aggregation,\n next.groupField,\n next.measureField\n );\n updateAggregate(settings.aggregateId!, { ...updates, name });\n onSettingsChange({\n ...settings,\n field:\n next.aggregation === \"count\"\n ? next.groupField\n : (next.measureField ?? next.groupField),\n ...(settings.title === aggregate.name ? { title: name } : {}),\n });\n setError(undefined);\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not update grouped summary\"\n );\n }\n };\n return (\n <div className=\"space-y-4\">\n {error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Group by</Label>\n <FieldSelector\n label=\"\"\n placeholder=\"Group by\"\n value={aggregate.groupField}\n onChange={(value) => updateDefinition({ groupField: value })}\n />\n\n <Label htmlFor=\"bar-operation\">Operation</Label>\n <select\n id=\"bar-operation\"\n className=\"h-9 rounded-md border-input bg-background px-2 text-sm\"\n value={aggregate.aggregation}\n onChange={(event) => {\n if (event.target.value === \"category\") {\n onSettingsChange({\n ...settings,\n field: aggregate.groupField,\n aggregateId: undefined,\n ...(settings.title === aggregate.name ? { title: \"\" } : {}),\n });\n return;\n }\n updateDefinition({\n aggregation: event.target.value as typeof aggregate.aggregation,\n ...(event.target.value !== \"count\" && !aggregate.measureField\n ? { measureField: measureFields[0] }\n : {}),\n });\n }}\n >\n <option value=\"category\">Category counts / bins</option>\n <option value=\"count\">Count rows</option>\n <option value=\"sum\" disabled={!measureFields.length}>\n Sum\n </option>\n <option value=\"average\" disabled={!measureFields.length}>\n Average\n </option>\n </select>\n\n {aggregate.aggregation !== \"count\" && (\n <>\n <Label>Measure</Label>\n <FieldSelector\n label=\"\"\n placeholder=\"Measure\"\n value={aggregate.measureField ?? \"\"}\n fields={measureFields}\n onChange={(value) => updateDefinition({ measureField: value })}\n />\n </>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Group by</Label>\n <FieldSelector\n label=\"\"\n placeholder=\"Group by\"\n value={settings.field}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label htmlFor=\"bar-operation\">Operation</Label>\n <select\n id=\"bar-operation\"\n className=\"h-9 rounded-md border-input bg-background px-2 text-sm\"\n defaultValue=\"category\"\n onChange={(event) => {\n if (event.target.value !== \"category\") {\n createAggregate(event.target.value as AggregateAggregation);\n }\n }}\n >\n <option value=\"category\">Count rows</option>\n <option value=\"sum\" disabled={!measureFields.length}>\n Sum\n </option>\n <option value=\"average\" disabled={!measureFields.length}>\n Average\n </option>\n </select>\n\n <Label>Bins · {settings.binCount ?? 10}</Label>\n <Slider\n aria-label=\"Histogram bin count\"\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\">Treat values as categories</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 aggregateId?: string;\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 filter = settings.aggregateId\n ? [...settings.filters]\n .reverse()\n .find(\n (f): f is Filter => f.type === \"range\" || f.type === \"date-range\"\n )\n : settings.filters.find((f): f is Filter => f.field === settings.field);\n const dataHash = fieldGetter(filter?.field ?? settings.field);\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"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
function useGetColumnData(field) {
|
|
7
|
+
const getColumnData = chunk5B23JVH3_cjs.useDataLayer((s) => s.getColumnData);
|
|
8
|
+
const nonce = chunk5B23JVH3_cjs.useDataLayer((s) => s.nonce);
|
|
9
|
+
return react.useMemo(() => {
|
|
10
|
+
return getColumnData(field);
|
|
11
|
+
}, [nonce, field, getColumnData]);
|
|
12
|
+
}
|
|
13
|
+
function useGetColumnDataForIds(field, ids) {
|
|
14
|
+
const getColumnData = chunk5B23JVH3_cjs.useDataLayer((s) => s.getColumnData);
|
|
15
|
+
const nonce = chunk5B23JVH3_cjs.useDataLayer((s) => s.nonce);
|
|
16
|
+
return react.useMemo(() => {
|
|
17
|
+
const data = getColumnData(field);
|
|
18
|
+
if (!ids) {
|
|
19
|
+
return Object.values(data);
|
|
20
|
+
}
|
|
21
|
+
return ids.map((id) => data[id]);
|
|
22
|
+
}, [nonce, field, getColumnData, ids]);
|
|
23
|
+
}
|
|
24
|
+
function useGetColumnDataForMultipleIds(fields, ids) {
|
|
25
|
+
const getColumnData = chunk5B23JVH3_cjs.useDataLayer((s) => s.getColumnData);
|
|
26
|
+
const nonce = chunk5B23JVH3_cjs.useDataLayer((s) => s.nonce);
|
|
27
|
+
return react.useMemo(() => {
|
|
28
|
+
if (!fields) {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
const result = {};
|
|
32
|
+
for (const field of fields) {
|
|
33
|
+
const data = getColumnData(field);
|
|
34
|
+
if (!ids) {
|
|
35
|
+
result[field] = Object.values(data);
|
|
36
|
+
} else {
|
|
37
|
+
result[field] = ids.map((id) => data[id]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}, [nonce, fields, getColumnData, ids]);
|
|
42
|
+
}
|
|
43
|
+
var EMPTY_DATA = [];
|
|
44
|
+
function useGetLiveData(settings, field, facetIds) {
|
|
45
|
+
const liveItems = chunk5B23JVH3_cjs.useDataLayer((state) => state.getLiveItems(settings));
|
|
46
|
+
const liveIdsPerFacet = react.useMemo(() => {
|
|
47
|
+
if (!liveItems) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const facetIdSet = new Set(facetIds);
|
|
51
|
+
const liveIds = liveItems.items.filter((c) => c.value > 0).filter(
|
|
52
|
+
(c) => facetIds && facetIds.length > 0 ? facetIdSet.has(c.key) : true
|
|
53
|
+
).map((d) => d.key);
|
|
54
|
+
return liveIds;
|
|
55
|
+
}, [facetIds, liveItems]);
|
|
56
|
+
const data = useGetColumnDataForIds(field, liveIdsPerFacet);
|
|
57
|
+
if (!field) {
|
|
58
|
+
return EMPTY_DATA;
|
|
59
|
+
}
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
function useGetLiveIds(settings, facetIds) {
|
|
63
|
+
const liveItems = chunk5B23JVH3_cjs.useDataLayer((state) => state.getLiveItems(settings));
|
|
64
|
+
return react.useMemo(() => {
|
|
65
|
+
if (!liveItems) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const facetIdSet = new Set(facetIds);
|
|
69
|
+
return liveItems.items.filter((c) => c.value > 0).filter(
|
|
70
|
+
(c) => facetIds && facetIds.length > 0 ? facetIdSet.has(c.key) : true
|
|
71
|
+
).map((d) => d.key);
|
|
72
|
+
}, [facetIds, liveItems]);
|
|
73
|
+
}
|
|
74
|
+
function useGetAllIds() {
|
|
75
|
+
const data = chunk5B23JVH3_cjs.useDataLayer((s) => s.data);
|
|
76
|
+
const allIds = react.useMemo(() => data.map((row) => row.__ID), [data]);
|
|
77
|
+
return allIds;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
exports.useGetAllIds = useGetAllIds;
|
|
81
|
+
exports.useGetColumnData = useGetColumnData;
|
|
82
|
+
exports.useGetColumnDataForIds = useGetColumnDataForIds;
|
|
83
|
+
exports.useGetColumnDataForMultipleIds = useGetColumnDataForMultipleIds;
|
|
84
|
+
exports.useGetLiveData = useGetLiveData;
|
|
85
|
+
exports.useGetLiveIds = useGetLiveIds;
|
|
86
|
+
//# sourceMappingURL=chunk-DKFA4KOJ.cjs.map
|
|
87
|
+
//# sourceMappingURL=chunk-DKFA4KOJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/charts/useGetColumnData.tsx","../src/components/charts/useGetLiveData.tsx"],"names":["useDataLayer","useMemo"],"mappings":"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","file":"chunk-DKFA4KOJ.cjs","sourcesContent":["import { IdType, useDataLayer } from \"@/providers/DataLayerProvider\";\nimport type { datum } from \"@/types/ChartTypes\";\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, datum[]> = {};\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 } from \"@/types/ChartTypes\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport { useMemo } from \"react\";\nimport { useGetColumnDataForIds } from \"./useGetColumnData\";\n\nconst EMPTY_DATA: datum[] = [];\n\nexport function useGetLiveData(\n settings: ChartSettings,\n field: string | undefined,\n facetIds?: IdType[]\n) {\n const liveItems = useDataLayer((state) => state.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 }, [facetIds, liveItems]);\n\n const data = useGetColumnDataForIds(field, liveIdsPerFacet);\n\n if (!field) {\n return EMPTY_DATA;\n }\n\n return data;\n}\n\nexport function useGetLiveIds(settings: ChartSettings, facetIds?: IdType[]) {\n const liveItems = useDataLayer((state) => state.getLiveItems(settings));\n return useMemo(() => {\n if (!liveItems) {\n return [];\n }\n\n const facetIdSet = new Set(facetIds);\n return 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 }, [facetIds, liveItems]);\n}\n\nexport function useGetAllIds() {\n const data = useDataLayer((s) => s.data);\n\n const allIds = useMemo(() => data.map((row) => row.__ID), [data]);\n\n return allIds;\n}\n"]}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUUJMUPB3_cjs = require('./chunk-UUJMUPB3.cjs');
|
|
4
|
+
var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var d3Scale = require('d3-scale');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
// src/components/charts/Axis/Axis.tsx
|
|
10
|
+
function formatTick(value) {
|
|
11
|
+
if (typeof value === "string") return value;
|
|
12
|
+
return new Intl.NumberFormat("en-US", {
|
|
13
|
+
notation: Math.abs(value) >= 1e4 ? "compact" : "standard",
|
|
14
|
+
maximumFractionDigits: Math.abs(value) < 1 ? 3 : 2
|
|
15
|
+
}).format(value);
|
|
16
|
+
}
|
|
17
|
+
function useFilterExtent({
|
|
18
|
+
settings,
|
|
19
|
+
xScale,
|
|
20
|
+
yScale,
|
|
21
|
+
innerHeight
|
|
22
|
+
}) {
|
|
23
|
+
const convertFilterRangeToExtent = react.useCallback(
|
|
24
|
+
(filter, scale) => {
|
|
25
|
+
if (!filter || filter.min === void 0 || filter.max === void 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const min = Math.round(scale(filter.min) * 1e4) / 1e4;
|
|
29
|
+
const max = Math.round(scale(filter.max) * 1e4) / 1e4;
|
|
30
|
+
return [min, max];
|
|
31
|
+
},
|
|
32
|
+
[]
|
|
33
|
+
);
|
|
34
|
+
const extent = react.useMemo(() => {
|
|
35
|
+
switch (settings.type) {
|
|
36
|
+
case "scatter": {
|
|
37
|
+
const xFilter = chunkUUJMUPB3_cjs.getRangeFilterForField(
|
|
38
|
+
settings.filters,
|
|
39
|
+
settings.xField
|
|
40
|
+
);
|
|
41
|
+
const yFilter = chunkUUJMUPB3_cjs.getRangeFilterForField(
|
|
42
|
+
settings.filters,
|
|
43
|
+
settings.yField
|
|
44
|
+
);
|
|
45
|
+
if (!xFilter || !yFilter) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const xExtent = convertFilterRangeToExtent(xFilter, xScale);
|
|
49
|
+
const yExtent = convertFilterRangeToExtent(yFilter, yScale);
|
|
50
|
+
if (!xExtent || !yExtent) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return [
|
|
54
|
+
[xExtent[0], yExtent[1]],
|
|
55
|
+
[xExtent[1], yExtent[0]]
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
case "line":
|
|
59
|
+
case "bar": {
|
|
60
|
+
if ("bandwidth" in xScale) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const rangeFilter = chunkUUJMUPB3_cjs.getRangeFilterForField(
|
|
64
|
+
settings.filters,
|
|
65
|
+
settings.type === "line" ? settings.xField : settings.field
|
|
66
|
+
);
|
|
67
|
+
if (!rangeFilter) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const xExtent = convertFilterRangeToExtent(rangeFilter, xScale);
|
|
71
|
+
if (!xExtent) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return [
|
|
75
|
+
[xExtent[0], 0],
|
|
76
|
+
[xExtent[1], innerHeight]
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
case "row":
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}, [settings, xScale, yScale, innerHeight, convertFilterRangeToExtent]);
|
|
83
|
+
return extent;
|
|
84
|
+
}
|
|
85
|
+
function planIdFromTarget(target) {
|
|
86
|
+
if (!(target instanceof Element)) return void 0;
|
|
87
|
+
return target.closest("[data-plan-id]")?.getAttribute("data-plan-id") ?? void 0;
|
|
88
|
+
}
|
|
89
|
+
function BaseChart({
|
|
90
|
+
width,
|
|
91
|
+
height,
|
|
92
|
+
xScale,
|
|
93
|
+
yScale,
|
|
94
|
+
axes: plannedAxes,
|
|
95
|
+
brushingMode = "none",
|
|
96
|
+
onBrushChange,
|
|
97
|
+
children,
|
|
98
|
+
overlay,
|
|
99
|
+
className,
|
|
100
|
+
settings,
|
|
101
|
+
axisFields: axisFieldsOverride,
|
|
102
|
+
xTickFormatter,
|
|
103
|
+
yTickFormatter,
|
|
104
|
+
onInspectGuide,
|
|
105
|
+
onHoverTarget,
|
|
106
|
+
onInspectPlot,
|
|
107
|
+
activeGuideId
|
|
108
|
+
}) {
|
|
109
|
+
const margin = plannedAxes?.margin ?? settings.margin;
|
|
110
|
+
const innerWidth = width - margin.left - margin.right;
|
|
111
|
+
const innerHeight = height - margin.top - margin.bottom;
|
|
112
|
+
const svgRef = react.useRef(null);
|
|
113
|
+
const [altPointer, setAltPointer] = react.useState(false);
|
|
114
|
+
const [altHover, setAltHover] = react.useState(false);
|
|
115
|
+
const chartId = react.useId();
|
|
116
|
+
const getFieldLabel = chunk5B23JVH3_cjs.useDataLayer((state) => state.getFieldLabel);
|
|
117
|
+
const formatFieldValue = chunk5B23JVH3_cjs.useDataLayer((state) => state.formatFieldValue);
|
|
118
|
+
const fieldSettings = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldSettings);
|
|
119
|
+
const axisFields = axisFieldsOverride ?? chunk5B23JVH3_cjs.getChartAxisFields(settings);
|
|
120
|
+
const formatAxisValue = (field, override) => override ?? (field && formatFieldValue ? (value) => formatFieldValue(field, value) : formatTick);
|
|
121
|
+
const xLabel = [
|
|
122
|
+
chunk5B23JVH3_cjs.getChartAxisLabel(axisFields.x, settings.xAxisLabel, getFieldLabel),
|
|
123
|
+
settings.xAxis.scaleType === "symlog" && "symlog"
|
|
124
|
+
].filter(Boolean).join(" \xB7 ");
|
|
125
|
+
const yLabel = [
|
|
126
|
+
chunk5B23JVH3_cjs.getChartAxisLabel(axisFields.y, settings.yAxisLabel, getFieldLabel),
|
|
127
|
+
settings.yAxis.scaleType === "symlog" && "symlog"
|
|
128
|
+
].filter(Boolean).join(" \xB7 ");
|
|
129
|
+
const axes = react.useMemo(
|
|
130
|
+
() => plannedAxes ?? chunkUUJMUPB3_cjs.planAxes({
|
|
131
|
+
plotWidth: innerWidth,
|
|
132
|
+
plotHeight: innerHeight,
|
|
133
|
+
margin,
|
|
134
|
+
x: {
|
|
135
|
+
scale: xScale,
|
|
136
|
+
scaleType: settings.xAxis.scaleType,
|
|
137
|
+
field: axisFields.x,
|
|
138
|
+
density: settings.xGridLines,
|
|
139
|
+
grid: settings.xAxis?.grid,
|
|
140
|
+
format: formatAxisValue(axisFields.x, xTickFormatter),
|
|
141
|
+
label: xLabel,
|
|
142
|
+
labelSource: settings.xAxisLabel ? "chart-setting" : "field-label"
|
|
143
|
+
},
|
|
144
|
+
y: {
|
|
145
|
+
scale: yScale,
|
|
146
|
+
scaleType: settings.yAxis.scaleType,
|
|
147
|
+
field: axisFields.y,
|
|
148
|
+
density: settings.yGridLines,
|
|
149
|
+
grid: settings.yAxis?.grid,
|
|
150
|
+
format: formatAxisValue(axisFields.y, yTickFormatter),
|
|
151
|
+
label: yLabel,
|
|
152
|
+
labelSource: settings.yAxisLabel ? "chart-setting" : "field-label"
|
|
153
|
+
}
|
|
154
|
+
}),
|
|
155
|
+
// Formatters read field settings, so they rerun when those change.
|
|
156
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
157
|
+
[
|
|
158
|
+
plannedAxes,
|
|
159
|
+
innerWidth,
|
|
160
|
+
innerHeight,
|
|
161
|
+
margin,
|
|
162
|
+
xScale,
|
|
163
|
+
yScale,
|
|
164
|
+
settings.xAxis,
|
|
165
|
+
settings.yAxis,
|
|
166
|
+
settings.xGridLines,
|
|
167
|
+
settings.yGridLines,
|
|
168
|
+
settings.xAxisLabel,
|
|
169
|
+
settings.yAxisLabel,
|
|
170
|
+
axisFields.x,
|
|
171
|
+
axisFields.y,
|
|
172
|
+
xLabel,
|
|
173
|
+
yLabel,
|
|
174
|
+
xTickFormatter,
|
|
175
|
+
yTickFormatter,
|
|
176
|
+
fieldSettings
|
|
177
|
+
]
|
|
178
|
+
);
|
|
179
|
+
const descriptionId = `${chartId}-description`;
|
|
180
|
+
const inspectedByBrush = react.useRef(false);
|
|
181
|
+
const chartTitle = chunk5B23JVH3_cjs.getChartTitle(settings, getFieldLabel);
|
|
182
|
+
const chartDescription = [
|
|
183
|
+
`Interactive ${settings.type} chart.`,
|
|
184
|
+
settings.xAxisLabel && `Horizontal axis: ${settings.xAxisLabel}.`,
|
|
185
|
+
settings.yAxisLabel && `Vertical axis: ${settings.yAxisLabel}.`
|
|
186
|
+
].filter(Boolean).join(" ");
|
|
187
|
+
const xIsLinear = "invert" in xScale;
|
|
188
|
+
const yIsLinear = "invert" in yScale;
|
|
189
|
+
const extent = useFilterExtent({
|
|
190
|
+
settings: xIsLinear && yIsLinear ? settings : { ...settings, filters: [] },
|
|
191
|
+
xScale: xIsLinear ? xScale : d3Scale.scaleLinear().domain([0, 1]).range([0, innerWidth]),
|
|
192
|
+
yScale: yIsLinear ? yScale : d3Scale.scaleLinear().domain([0, 1]).range([0, innerHeight]),
|
|
193
|
+
innerHeight
|
|
194
|
+
});
|
|
195
|
+
const guideAt = (target) => {
|
|
196
|
+
const id = planIdFromTarget(target);
|
|
197
|
+
return id && chunkUUJMUPB3_cjs.findAxisGuide(axes, id) ? id : void 0;
|
|
198
|
+
};
|
|
199
|
+
const inspectTarget = (event) => {
|
|
200
|
+
if (!event.altKey || !onInspectGuide) return false;
|
|
201
|
+
const id = guideAt(event.target);
|
|
202
|
+
if (!id) return false;
|
|
203
|
+
onInspectGuide(id);
|
|
204
|
+
return true;
|
|
205
|
+
};
|
|
206
|
+
const inspectPlot = (event) => {
|
|
207
|
+
if (!event.altKey || !onInspectPlot) return false;
|
|
208
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
209
|
+
const point = [
|
|
210
|
+
event.clientX - rect.left - margin.left,
|
|
211
|
+
event.clientY - rect.top - margin.top
|
|
212
|
+
];
|
|
213
|
+
if (point[0] < 0 || point[0] > innerWidth || point[1] < 0 || point[1] > innerHeight) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
return onInspectPlot(
|
|
217
|
+
point,
|
|
218
|
+
new DOMRect(event.clientX, event.clientY, 0, 0)
|
|
219
|
+
);
|
|
220
|
+
};
|
|
221
|
+
const brush = chunkUUJMUPB3_cjs.useBrush({
|
|
222
|
+
svgRef,
|
|
223
|
+
marginLeft: margin.left,
|
|
224
|
+
marginTop: margin.top,
|
|
225
|
+
innerWidth,
|
|
226
|
+
innerHeight,
|
|
227
|
+
mode: brushingMode,
|
|
228
|
+
onBrushChange,
|
|
229
|
+
onPlotClick: (_, event) => {
|
|
230
|
+
const handled = inspectTarget(event);
|
|
231
|
+
inspectedByBrush.current = handled;
|
|
232
|
+
return event.altKey || handled;
|
|
233
|
+
},
|
|
234
|
+
defaultExtent: extent
|
|
235
|
+
});
|
|
236
|
+
if (width < 1 || height < 1) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const interactive = Boolean(onInspectGuide);
|
|
240
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
241
|
+
"svg",
|
|
242
|
+
{
|
|
243
|
+
ref: svgRef,
|
|
244
|
+
width,
|
|
245
|
+
height,
|
|
246
|
+
role: "group",
|
|
247
|
+
"aria-label": chartTitle,
|
|
248
|
+
"aria-describedby": descriptionId,
|
|
249
|
+
className: chunk5B23JVH3_cjs.cn("select-none", className),
|
|
250
|
+
style: {
|
|
251
|
+
cursor: altHover ? "pointer" : brush.getCursor(),
|
|
252
|
+
touchAction: brushingMode === "none" ? "auto" : "none"
|
|
253
|
+
},
|
|
254
|
+
tabIndex: brushingMode === "none" ? void 0 : 0,
|
|
255
|
+
onKeyDown: (event) => {
|
|
256
|
+
if (event.key === "Escape") {
|
|
257
|
+
event.stopPropagation();
|
|
258
|
+
brush.clear();
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
onPointerDownCapture: (event) => {
|
|
262
|
+
onHoverTarget?.(null);
|
|
263
|
+
setAltHover(false);
|
|
264
|
+
if (interactive && guideAt(event.target)) {
|
|
265
|
+
if (!event.altKey) event.preventDefault();
|
|
266
|
+
else setAltPointer(true);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (interactive && event.altKey) {
|
|
270
|
+
setAltPointer(true);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
brush.handlePointerDown(event);
|
|
274
|
+
},
|
|
275
|
+
onPointerMoveCapture: (event) => {
|
|
276
|
+
brush.handlePointerMove(event);
|
|
277
|
+
const id = planIdFromTarget(event.target);
|
|
278
|
+
onHoverTarget?.(id ?? null);
|
|
279
|
+
setAltHover(Boolean(event.altKey && interactive && id));
|
|
280
|
+
},
|
|
281
|
+
onPointerUpCapture: brush.handlePointerUp,
|
|
282
|
+
onPointerCancel: () => {
|
|
283
|
+
setAltPointer(false);
|
|
284
|
+
setAltHover(false);
|
|
285
|
+
onHoverTarget?.(null);
|
|
286
|
+
brush.cancel();
|
|
287
|
+
},
|
|
288
|
+
onLostPointerCapture: () => {
|
|
289
|
+
setAltPointer(false);
|
|
290
|
+
setAltHover(false);
|
|
291
|
+
onHoverTarget?.(null);
|
|
292
|
+
brush.cancel();
|
|
293
|
+
},
|
|
294
|
+
onPointerLeave: () => {
|
|
295
|
+
setAltHover(false);
|
|
296
|
+
onHoverTarget?.(null);
|
|
297
|
+
},
|
|
298
|
+
onClick: (event) => {
|
|
299
|
+
if (inspectedByBrush.current) inspectedByBrush.current = false;
|
|
300
|
+
else if (!inspectTarget(event)) inspectPlot(event);
|
|
301
|
+
setAltPointer(false);
|
|
302
|
+
},
|
|
303
|
+
onKeyDownCapture: (event) => {
|
|
304
|
+
if (event.altKey && event.key === "Enter" && inspectTarget(event)) {
|
|
305
|
+
event.preventDefault();
|
|
306
|
+
event.stopPropagation();
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
"data-alt-hover": altHover ? "true" : void 0,
|
|
310
|
+
children: [
|
|
311
|
+
/* @__PURE__ */ jsxRuntime.jsx("desc", { id: descriptionId, children: chartDescription }),
|
|
312
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: `${chartId}-plot`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
313
|
+
"rect",
|
|
314
|
+
{
|
|
315
|
+
x: 0,
|
|
316
|
+
y: 0,
|
|
317
|
+
width: Math.max(0, innerWidth),
|
|
318
|
+
height: Math.max(0, innerHeight)
|
|
319
|
+
}
|
|
320
|
+
) }) }),
|
|
321
|
+
/* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${margin.left},${margin.top})`, children: [
|
|
322
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
323
|
+
chunkUUJMUPB3_cjs.PlannedGrid,
|
|
324
|
+
{
|
|
325
|
+
plan: axes,
|
|
326
|
+
interactive,
|
|
327
|
+
activeId: activeGuideId
|
|
328
|
+
}
|
|
329
|
+
),
|
|
330
|
+
/* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: `url(#${chartId}-plot)`, children }),
|
|
331
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
332
|
+
"g",
|
|
333
|
+
{
|
|
334
|
+
clipPath: `url(#${chartId}-plot)`,
|
|
335
|
+
style: { pointerEvents: altPointer ? "none" : void 0 },
|
|
336
|
+
children: brush.renderBrush
|
|
337
|
+
}
|
|
338
|
+
),
|
|
339
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
340
|
+
chunkUUJMUPB3_cjs.PlannedAxes,
|
|
341
|
+
{
|
|
342
|
+
plan: axes,
|
|
343
|
+
interactive,
|
|
344
|
+
activeId: activeGuideId
|
|
345
|
+
}
|
|
346
|
+
),
|
|
347
|
+
overlay
|
|
348
|
+
] })
|
|
349
|
+
]
|
|
350
|
+
}
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
exports.BaseChart = BaseChart;
|
|
355
|
+
exports.formatTick = formatTick;
|
|
356
|
+
//# sourceMappingURL=chunk-DS5BS7PP.cjs.map
|
|
357
|
+
//# sourceMappingURL=chunk-DS5BS7PP.cjs.map
|