@carto/ps-react-ui 4.11.2 → 4.12.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.
Files changed (82) hide show
  1. package/dist/chat.js +962 -733
  2. package/dist/chat.js.map +1 -1
  3. package/dist/csv-item-hH_Gt7ur.js +32 -0
  4. package/dist/csv-item-hH_Gt7ur.js.map +1 -0
  5. package/dist/png-item-9dNbB37T.js +57 -0
  6. package/dist/png-item-9dNbB37T.js.map +1 -0
  7. package/dist/table-B3ZWWhJt.js +383 -0
  8. package/dist/table-B3ZWWhJt.js.map +1 -0
  9. package/dist/types/chat/containers/chat-footer.d.ts +1 -1
  10. package/dist/types/chat/containers/styles.d.ts +79 -12
  11. package/dist/types/chat/index.d.ts +1 -1
  12. package/dist/types/chat/types.d.ts +21 -0
  13. package/dist/types/chat/use-typewriter.d.ts +5 -3
  14. package/dist/types/widgets-v2/actions/download/constants.d.ts +12 -0
  15. package/dist/types/widgets-v2/actions/download/csv-item.d.ts +38 -0
  16. package/dist/types/widgets-v2/actions/download/icons.d.ts +6 -0
  17. package/dist/types/widgets-v2/actions/download/index.d.ts +3 -1
  18. package/dist/types/widgets-v2/actions/index.d.ts +1 -1
  19. package/dist/types/widgets-v2/wrapper/style.d.ts +5 -12
  20. package/dist/widgets-v2/actions.js +40 -36
  21. package/dist/widgets-v2/actions.js.map +1 -1
  22. package/dist/widgets-v2/bar.js +77 -84
  23. package/dist/widgets-v2/bar.js.map +1 -1
  24. package/dist/widgets-v2/category.js +50 -55
  25. package/dist/widgets-v2/category.js.map +1 -1
  26. package/dist/widgets-v2/formula.js +37 -43
  27. package/dist/widgets-v2/formula.js.map +1 -1
  28. package/dist/widgets-v2/histogram.js +138 -144
  29. package/dist/widgets-v2/histogram.js.map +1 -1
  30. package/dist/widgets-v2/markdown.js +18 -17
  31. package/dist/widgets-v2/markdown.js.map +1 -1
  32. package/dist/widgets-v2/pie.js +67 -73
  33. package/dist/widgets-v2/pie.js.map +1 -1
  34. package/dist/widgets-v2/scatterplot.js +75 -81
  35. package/dist/widgets-v2/scatterplot.js.map +1 -1
  36. package/dist/widgets-v2/spread.js +36 -41
  37. package/dist/widgets-v2/spread.js.map +1 -1
  38. package/dist/widgets-v2/table.js +46 -55
  39. package/dist/widgets-v2/table.js.map +1 -1
  40. package/dist/widgets-v2/timeseries.js +81 -87
  41. package/dist/widgets-v2/timeseries.js.map +1 -1
  42. package/dist/widgets-v2.js +247 -243
  43. package/dist/widgets-v2.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/chat/bubbles/styles.ts +5 -1
  46. package/src/chat/containers/chat-content.tsx +4 -1
  47. package/src/chat/containers/chat-footer.test.tsx +59 -0
  48. package/src/chat/containers/chat-footer.tsx +124 -36
  49. package/src/chat/containers/styles.ts +107 -16
  50. package/src/chat/feedback/styles.ts +11 -4
  51. package/src/chat/index.ts +1 -0
  52. package/src/chat/types.ts +22 -0
  53. package/src/chat/use-typewriter.ts +32 -24
  54. package/src/widgets-v2/actions/download/constants.ts +14 -0
  55. package/src/widgets-v2/actions/download/csv-item.test.tsx +77 -0
  56. package/src/widgets-v2/actions/download/csv-item.tsx +71 -0
  57. package/src/widgets-v2/actions/download/icons.tsx +10 -1
  58. package/src/widgets-v2/actions/download/index.ts +3 -1
  59. package/src/widgets-v2/actions/download/png-item.tsx +2 -1
  60. package/src/widgets-v2/actions/index.ts +5 -0
  61. package/src/widgets-v2/bar/download.tsx +16 -22
  62. package/src/widgets-v2/category/download.test.ts +9 -0
  63. package/src/widgets-v2/category/download.ts +16 -20
  64. package/src/widgets-v2/formula/download.tsx +23 -29
  65. package/src/widgets-v2/histogram/download.ts +22 -26
  66. package/src/widgets-v2/markdown/{download.ts → download.tsx} +5 -2
  67. package/src/widgets-v2/pie/download.ts +16 -20
  68. package/src/widgets-v2/scatterplot/download.ts +16 -20
  69. package/src/widgets-v2/spread/download.ts +23 -27
  70. package/src/widgets-v2/table/download.test.ts +10 -0
  71. package/src/widgets-v2/table/download.ts +11 -15
  72. package/src/widgets-v2/table/helpers.test.ts +19 -0
  73. package/src/widgets-v2/table/helpers.ts +7 -12
  74. package/src/widgets-v2/timeseries/download.ts +36 -40
  75. package/src/widgets-v2/wrapper/style.ts +13 -18
  76. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +66 -0
  77. package/src/widgets-v2/wrapper/widget-wrapper.tsx +7 -4
  78. package/dist/png-item-BE9uEqlD.js +0 -45
  79. package/dist/png-item-BE9uEqlD.js.map +0 -1
  80. package/dist/table-C9IMbTr0.js +0 -385
  81. package/dist/table-C9IMbTr0.js.map +0 -1
  82. package/dist/types/chat/feedback/styles.d.ts +0 -211
@@ -1 +1 @@
1
- {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, series, labelFormatter, selection } = options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n // Closure shared between the yAxis min/max callbacks and the label\n // formatter, so only the rounded extents are labelled (matches v1 +\n // bar). Delegating the extent to ECharts (rather than precomputing\n // scalars from the raw counts) keeps stacked bins inside the plot:\n // when StackToggle marks the series, ECharts feeds the *post-stack*\n // extent to these callbacks, so `niceNum` rounds the stacked total.\n let niceMin = 0\n let niceMax = 1\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bins would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","series","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","overrideColor","resolveThemeColor","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","n","Number","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","getTicks","seriesCount","header","seriesNames","rows","bin","row","s","handle","downloadToCSV","Promise","url","revoke","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","v","abs","every","isFinite"],"mappings":"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"}
1
+ {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, series, labelFormatter, selection } = options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n // Closure shared between the yAxis min/max callbacks and the label\n // formatter, so only the rounded extents are labelled (matches v1 +\n // bar). Delegating the extent to ECharts (rather than precomputing\n // scalars from the raw counts) keeps stacked bins inside the plot:\n // when StackToggle marks the series, ECharts feeds the *post-stack*\n // extent to these callbacks, so `niceNum` rounds the stacked total.\n let niceMin = 0\n let niceMax = 1\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bins would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push(\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\n }\n return rows\n },\n }),\n )\n return items\n}\n","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","series","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","overrideColor","resolveThemeColor","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","n","Number","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","buildCsvDownloadItem","getRows","getData","getTicks","seriesCount","header","seriesNames","rows","bin","row","s","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","v","abs","every","isFinite"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CO,SAASA,EAAiB;AAAA,EAC/BC,OAAAA;AAAAA,EACAC,WAAAA;AACqB,GAA2B;AAGhD,MAAIC,IAAU,GACVC,IAAU;AAEd,SAAO;AAAA,IACLC,MAAM;AAAA,MACJC,MAAMC,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,MAC/BC,KAAKF,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,MAC9BE,OAAOH,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA;AAAA,MAEhC,GAAGG,EAAgB,IAAOV,CAAK;AAAA,MAC/BW,cAAc;AAAA,IAAA;AAAA,IAEhBC,SAAS;AAAA,MACPC,SAAS;AAAA,MACTC,iBAAiBd,EAAMe,QAAQC,KAAK,GAAG;AAAA,MACvCC,aAAa;AAAA,MACbC,SAAS,CAACZ,SAASN,EAAMO,QAAQ,CAAC,CAAC,GAAGD,SAASN,EAAMO,QAAQ,CAAC,CAAC,CAAC;AAAA,MAChEY,WAAW;AAAA,QACTC,OAAOpB,EAAMe,QAAQM,OAAOC;AAAAA,QAC5BC,UAAU;AAAA,QACVC,YAAYxB,EAAMyB,WAAWC,QAAQF;AAAAA,MAAAA;AAAAA,MAEvCG,aAAa;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MACrBC,UAAUC,EAAwB9B,CAAK;AAAA,MACvCC,WAAW8B,EAA+B9B,CAAS;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrD+B,QAAQ;AAAA,MACN,GAAGC,EAAkB;AAAA,QAAEC,WAAW;AAAA,MAAA,CAAO;AAAA,IAAA;AAAA,IAE3CP,aAAa;AAAA,MAAEQ,WAAW;AAAA,QAAEf,OAAOpB,EAAMe,QAAQC,KAAK,GAAG;AAAA,MAAA;AAAA,IAAE;AAAA,IAC3DI,OAAO,CACLpB,EAAMe,QAAQqB,UAAUC,MACxB,GAAGC,OAAOC,OACPvC,EAAMe,QACJyB,aAAaC,QAAQ,CAAA,CAC1B,CAAC;AAAA,IAEHC,OAAO;AAAA,MACLd,MAAM;AAAA,MACNe,UAAU;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MAClBC,UAAU;AAAA,QAAED,MAAM;AAAA,MAAA;AAAA,MAClBE,WAAW;AAAA,QACT5B,SAAS,CAACZ,SAASN,EAAMO,QAAQ,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAC/CwC,QAAQ;AAAA,QACRC,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEFC,OAAO;AAAA,MACLrB,MAAM;AAAA,MACNsB,KAAKA,CAACC,OACJjD,IAAUiD,EAAOD,MAAM,IAAIE,EAAQD,EAAOD,GAAG,IAAI,GAC1ChD;AAAAA,MAETmD,KAAKA,CAACF,OACJhD,IAAUgD,EAAOE,OAAO,IAAI,IAAID,EAAQD,EAAOE,GAAG,GAC3ClD;AAAAA,MAETwC,UAAU;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MAClBC,UAAU;AAAA,QAAED,MAAM;AAAA,MAAA;AAAA,MAClBU,WAAW;AAAA,QACTV,MAAM;AAAA,QACNT,WAAW;AAAA,UAAEf,OAAOpB,EAAMe,QAAQwC,QAAQ,CAAC,KAAKvD,EAAMe,QAAQyC;AAAAA,QAAAA;AAAAA,MAAQ;AAAA,MAExEV,WAAW;AAAA,QACTvB,UAAUvB,EAAMyB,WAAWgC,kBAAkBlC;AAAAA,QAC7CC,YAAYxB,EAAMyB,WAAWgC,kBAAkBjC;AAAAA,QAC/CuB,QAAQzC,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,QACjCqC,MAAM;AAAA,QACNc,cAAc;AAAA,QACdC,cAAc;AAAA,QACdC,eAAe;AAAA,QACfC,QAAQ;AAAA,QACR5D,WAAWA,CAAC6D,MACNA,MAAU3D,KAAW2D,MAAU5D,KAC/B4D,MAAU,IAAU,KACjB7D,IAAYA,EAAU6D,CAAK,IAAIC,OAAOD,CAAK;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEJ;AAmBO,SAASE,GACdC,GACe;AACf,QAAM;AAAA,IAAEjE,OAAAA;AAAAA,IAAOC,WAAAA;AAAAA,IAAWiE,OAAAA;AAAAA,IAAOC,QAAAA;AAAAA,IAAQC,gBAAAA;AAAAA,IAAgBC,WAAAA;AAAAA,EAAAA,IAAcJ,GACjEK,IAAkBL,EAAQK,iBAC1BC,IACJF,KAAaA,EAAUG,SAAS,IAAI,IAAIC,IAAYJ,CAAS,IAAI,MAE7DK,IAAsB,CAAA;AAC5B,WAASC,IAAI,GAAGA,IAAIT,EAAMM,SAAS,GAAGG,KAAK;AACzC,UAAMC,IAAKV,EAAMS,CAAC,GACZE,IAAKX,EAAMS,IAAI,CAAC,GAChBG,IAAM,GAAGC,EAAaH,CAAE,CAAC,IAAIG,EAAaF,CAAE,CAAC;AACnDH,IAAAA,EAAUM,KAAKZ,IAAiBA,EAAeU,CAAG,IAAIA,CAAG;AAAA,EAC3D;AAEA,SAAO,CAACG,GAAQC,GAAMC,MAAQ;AAC5B,QAAIF,KAAU,MAAM;AAClB,YAAMG,IAAarF,EAAiB;AAAA,QAAEC,OAAAA;AAAAA,QAAOC,WAAAA;AAAAA,MAAAA,CAAW;AACxD,aAAOqE,IACFe,EACCD,GACAd,CACF,IACAc;AAAAA,IACN;AAEA,UAAME,IAAiCC,MAAMC,QAAQN,CAAI,IACpDA,IACD,CAAA;AACJ,QAAII,EAAUd,WAAW,KAAKE,EAAUF,WAAW;AACjD,aAAO;AAAA,QAAE,GAAGS;AAAAA,QAAQQ,SAAS,CAAA;AAAA,QAAItB,QAAQ,CAAA;AAAA,MAAA;AAG3C,UAAMjC,IAAYoD,EAAUd,SAAS,GAC/BkB,IAAkBH,MAAMC,QAAQP,EAAOd,MAAM,IAAIc,EAAOd,SAAS,CAAA,GACjEwB,IAAoBD,EAAgB,CAAC,KAAK,CAAA,GAC1CE,IACJ,OAAOX,EAAOhC,SAAU,YAAY,CAACsC,MAAMC,QAAQP,EAAOhC,KAAK,IAC3DgC,EAAOhC,QACP,CAAA,GACA4C,IACJ,OAAOZ,EAAO7E,QAAS,YAAY,CAACmF,MAAMC,QAAQP,EAAO7E,IAAI,IACzD6E,EAAO7E,OACP,CAAA,GACA0F,IACJ,OAAOb,EAAOrE,WAAY,YAAY,CAAC2E,MAAMC,QAAQP,EAAOrE,OAAO,IAC/DqE,EAAOrE,UACP,CAAA,GACAmF,IACJ,OAAOd,EAAOjD,UAAW,YAAY,CAACuD,MAAMC,QAAQP,EAAOjD,MAAM,IAC7DiD,EAAOjD,SACP,CAAA,GAMAgE,IAAgBb,GAAKlF;AAQ3B,QAAIC,IAAU,GACVC,IAAU;AAId,UAAM8F,IAAiBC,EAA0BjB,EAAOkB,UAAUjE,CAAS,GACrEkE,IACJ,OAAOP,EAASQ,UAAW,WAAWR,EAASQ,SAAS,IACpDC,IAAapE,IAAY,KAAKkE,GAC9BG,IAAaN,IACfK,IAAaE,EAAYC,eAAeD,EAAYE,YACpDJ,GAYEK,IAAe;AAAA,MACnBvF,OAAOA,CAACwF,MAA+B;AACrC,cAAMC,IAAOD,EAAOxF;AACpB,eAAKmD,IACEA,EAAauC,IAAIF,EAAOG,SAAS,IACpCF,IACAG,EAAQ5F,MAAM6F,YAAYJ,GAAM,IAAI,IAHdA;AAAAA,MAI5B;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,GAAG5B;AAAAA,MACHQ,SAASH,EAAU4B,IAAKC,CAAAA,OAAY;AAAA,QAClCC,QAAQ1C,EAAUwC,IAChB,CAACG,GAAO1C,MAAM,CAAC0C,GAAOF,EAAOxC,CAAC,KAAK,CAAC,CACtC;AAAA,MAAA,EACA;AAAA,MACFR,QAAQmB,EAAU4B,IAAI,CAACI,GAAG3C,MAAM;AAC9B,cAAM4C,IACH7B,EAAgBf,CAAC,KACjBgB,GACG6B,IAAgBC,EAAkBzH,GAAOmE,IAASQ,CAAC,GAAGvD,KAAK;AACjE,eAAO;AAAA,UACL,GAAI,OAAOmG,KAAa,WAAWA,IAAW,CAAA;AAAA,UAC9C3F,MAAM;AAAA,UACN8F,cAAc/C;AAAAA,UACdgD,MAAMxD,IAASQ,CAAC,GAAGgD,QAAQ,UAAUhD,IAAI,CAAC;AAAA,UAC1CiD,QAAQ;AAAA,YAAEC,GAAG;AAAA,YAAGC,GAAG;AAAA,UAAA;AAAA,UACnBC,gBAAgB;AAAA,UAChBC,UAAU;AAAA,YAAEC,OAAO;AAAA,UAAA;AAAA,UACnBC,WAAWvB;AAAAA,UACX,GAAIa,IAAgB;AAAA,YAAEpG,OAAOoG;AAAAA,UAAAA,IAAkB,CAAA;AAAA,QAAC;AAAA,MAEpD,CAAC;AAAA,MACDxF,QAAQ;AAAA,QAAE,GAAG+D;AAAAA,QAAYnD,MAAMV;AAAAA,MAAAA;AAAAA,MAC/B9B,MAAM;AAAA,QAAE,GAAGyF;AAAAA,QAAUQ,QAAQE;AAAAA,MAAAA;AAAAA,MAC7B,GAAIN,IAAiB;AAAA,QAAEE,UAAUF;AAAAA,MAAAA,IAAmB,CAAA;AAAA,MACpDhD,OAAO;AAAA,QACL,GAAG2C;AAAAA,QACH1C,KAAKA,CAACC,OACJjD,IAAUiD,EAAOD,MAAM,IAAIE,EAAQD,EAAOD,GAAG,IAAI,GAC1ChD;AAAAA,QAETmD,KAAKA,CAACF,OACJhD,IAAUgD,EAAOE,OAAO,IAAI,IAAID,EAAQD,EAAOE,GAAG,GAC3ClD;AAAAA,QAET2C,WAAW;AAAA,UACT,GAAK8C,EAAqC9C,aAAa,CAAA;AAAA,UACvD7C,WAAWA,CAAC6D,MACNA,MAAU3D,KAAW2D,MAAU5D,KAC/B4D,MAAU,IAAU,KACjBkC,IAAgBA,EAAclC,CAAK,IAAIC,OAAOD,CAAK;AAAA,QAC5D;AAAA,MACF;AAAA,MAEFlD,SAAS;AAAA,QACP,GAAGkF;AAAAA,QACH7F,WAAW8B,EAA+BiE,CAAa;AAAA,MAAA;AAAA,IACzD;AAAA,EAEJ;AACF;AASA,SAASjE,EACP9B,GACA;AACA,SAAOkI,EAAwBC,CAAAA,MAAS;AAEtC,UAAMtD,IADMsD,EAAKtE,QACC,CAAC,GACbuE,IACJ,OAAOvD,KAAQ,YAAY7E,IAAYA,EAAU6E,CAAG,IAAKA,KAAO,IAC5DwD,IAAS,OAAOF,EAAKE,UAAW,WAAWF,EAAKE,SAAS,IACzDC,IAAaH,EAAKG,aAAa,GAAGH,EAAKG,UAAU,OAAO;AAC9D,WAAO;AAAA,MACLZ,MAAM5D,OAAOqE,EAAKT,QAAQ,EAAE;AAAA,MAC5BY,YAAAA;AAAAA,MACAD,QAAAA;AAAAA,MACAxE,OAAOuE;AAAAA,IAAAA;AAAAA,EAEX,CAAC;AACH;AAEA,SAAStD,EAAayD,GAAmB;AACvC,SAAIC,OAAOC,UAAUF,CAAC,IAAUzE,OAAOyE,CAAC,IACjCC,OAAOD,EAAEG,QAAQ,CAAC,CAAC,EAAEC,SAAAA;AAC9B;AC3UA,MAAMC,IAAS;AAAA,EACbC,WAAW;AAAA,IACTC,SAAS;AAAA,IACTC,YAAY;AAAA,IACZC,gBAAgB;AAAA,IAChBC,eAAe;AAAA,IACfC,KAAKA,CAAC;AAAA,MAAE5I,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,IAC/B6I,QAAQA,CAAC;AAAA,MAAE7I,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,EAAE;AAAA,EAAA;AAAA,EAErCH,MAAM;AAAA,IACJ2I,SAAS;AAAA,IACTC,YAAY;AAAA,IACZK,MAAM;AAAA,IACNF,KAAK;AAAA,IACLG,OAAO;AAAA,EAAA;AAAA,EAETtH,QAAQ;AAAA,IACN+G,SAAS;AAAA,IACTC,YAAY;AAAA,IACZG,KAAKA,CAAC;AAAA,MAAE5I,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,IAC/B6I,QAAQA,CAAC;AAAA,MAAE7I,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,EAAA;AAAA,EAEpCgJ,YAAY;AAAA,IACVR,SAAS;AAAA,IACTC,YAAY;AAAA,IACZG,KAAKA,CAAC;AAAA,MAAE5I,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,GAAG;AAAA,EAAA;AAErC,GAEMiJ,KAAQA,CAACJ,OAAoC;AAAA,EACjDC,MAAM;AAAA,EACND,QAAQ,GAAGA,CAAM;AAAA,EACjBK,UAAU;AACZ;AAWO,SAAAC,GAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA2B;AAAA,IAAAC,MAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,KAAAD;AAAS,MAAAE,GAAAC,GAAAC,GAAAC,GAAAC;AAAA,MAAAT,SAAAE,GAAA;AAE3C,UAAAQ,IAAgB/E,MAAKgF,KAAM;AAAA,MAAA/F,QAAUsF;AAAAA,IAAAA,GAAQ,CAAAxC,GAAA3C,MAAA;AAC3C,YAAA6F,IAAU7F,IAAI8F,KAAIpH,IAAK,GAAGyG,IAAO,CAAC;AAAC,aAC5BW,KAAIC,MAAO,KAAK,KAAKD,KAAIE,IAAK,GAAGH,IAAI,QAAQ,KAAK,CAAC,CAAC;AAAA,IAAC,CAC7D;AAEEN,IAAAA,IAAAU,GAAQP,IAAAxB,EAAMC,WACZmB,IAAAW,GAAQT,IAAAtB,EAAMzI,MACZgK,IAAAE,EAAOpD,IAAK2D,EAEZ,GAACjB,OAAAE,GAAAF,OAAAK,GAAAL,OAAAM,GAAAN,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAS;AAAAA,EAAA;AAAAJ,IAAAA,IAAAL,EAAA,CAAA,GAAAM,IAAAN,EAAA,CAAA,GAAAO,IAAAP,EAAA,CAAA,GAAAQ,IAAAR,EAAA,CAAA,GAAAS,IAAAT,EAAA,CAAA;AAAA,MAAAkB;AAAA,EAAAlB,EAAA,CAAA,MAAAK,KAAAL,SAAAO,KAAAP,EAAA,CAAA,MAAAQ,KAHJU,IAAA,gBAAAC,EAACd,GAAA,EAAQ,IAAAE,GACNC,UAAAA,GAGH,GAAMR,OAAAK,GAAAL,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAkB,KAAAA,IAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAA,EAAApB,EAAA,EAAA,MAAAqB,uBAAAC,IAAA,2BAAA,KACNF,IAAA,gBAAAD,EAACH,GAAA,EAAQ,IAAA/B,EAAM7G,mBACX,GAAG,CAAC,EAACkF,IAAKiE,EAKX,EAAA,CACH,GAAMvB,QAAAoB,KAAAA,IAAApB,EAAA,EAAA;AAAA,MAAAwB;AAAA,SAAAxB,EAAA,EAAA,MAAAM,KAAAN,UAAAS,KAAAT,EAAA,EAAA,MAAAkB,KAbRM,sBAAClB,GAAA,EAAQ,IAAAG,GACPS,UAAAA;AAAAA,IAAAA;AAAAA,IAKAE;AAAAA,EAAAA,GAQF,GAAMpB,QAAAM,GAAAN,QAAAS,GAAAT,QAAAkB,GAAAlB,QAAAwB,KAAAA,IAAAxB,EAAA,EAAA,GAdNwB;AAcM;AArBH,SAAAD,GAAAE,GAAA;AAAA,SAeG,gBAAAC,EAACV,GAAA,EAA4B,IAAA/B,EAAMU,YACjC,UAAA;AAAA,IAAA,gBAAAwB,EAACQ,KAAiB,SAAA,YAAkB,OAAA,GAAW,QAAA,GAAC;AAAA,IAChD,gBAAAR,EAACQ,GAAA,EAAgB,OAAA,IAAY,QAAA,EAAA,CAAC;AAAA,EAAA,EAAA,GAFtB,UAAU5G,CAAC,EAGrB;AAAM;AAlBT,SAAAkG,GAAAW,GAAAC,GAAA;AAAA,SAUG,gBAAAV,EAACQ,GAAA,EAAkC,SAAA,eAAkB,IAAA/B,GAAMgC,CAAC,EAAA,GAA7C,OAAO7G,CAAC,EAAsC;AAAI;AC3CpE,SAAS+G,GAA8BC,GAQ3B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAM5G,KACJ8G,EAAqB;AAAA,IACnBC,UAAUJ,EAAKI;AAAAA,IACfF,cAAcF,EAAKE;AAAAA,IACnBG,YAAYL,EAAKM;AAAAA,IACjBnL,iBAAiB6K,EAAKO;AAAAA,EAAAA,CACvB,CACH,GAEFN,EAAM5G,KACJmH,EAAqB;AAAA,IACnBJ,UAAUJ,EAAKI;AAAAA,IACfK,SAASA,MAAM;AACb,YAAMlH,IAAOyG,EAAKU,QAAAA,GACZnI,IAAQyH,EAAKW,SAAAA,GACbC,IAAcrH,EAAKV,QACnBgI,IAAoB,CAAC,WAAW,UAAU;AAChD,eAAS7H,IAAI,GAAGA,IAAI4H,GAAa5H;AAC/B6H,QAAAA,EAAOxH,KAAK2G,EAAKc,cAAc9H,CAAC,KAAK,UAAUA,IAAI,CAAC,EAAE;AAExD,YAAM+H,IAAoB,CAACF,CAAM;AACjC,eAASG,IAAM,GAAGA,IAAMlC,KAAKpH,IAAI,GAAGa,EAAMM,SAAS,CAAC,GAAGmI,KAAO;AAC5D,cAAMC,IAAiB,CAAC1I,EAAMyI,CAAG,GAAGzI,EAAMyI,IAAM,CAAC,CAAC;AAClD,iBAASE,IAAI,GAAGA,IAAIN,GAAaM,IAAKD,CAAAA,EAAI5H,KAAKE,EAAK2H,CAAC,IAAIF,CAAG,KAAK,CAAC;AAClED,QAAAA,EAAK1H,KAAK4H,CAAG;AAAA,MACf;AACA,aAAOF;AAAAA,IACT;AAAA,EAAA,CACD,CACH,GACOd;AACT;ACvCO,MAAMkB,KAA0BA,CAACC,MACjCxH,MAAMC,QAAQuH,CAAK,IACjBA,EAAM7F,IAAI,CAAC/C,MAA6B;AAC7C,MAAI,CAAC6I,GAAkB7I,CAAM,EAAG,QAAOA;AACvC,QAAM8I,IAAQ9I,EAAO+I,OAAO,CAACC,GAAKC,MAAMD,IAAM1C,KAAK4C,IAAID,CAAC,GAAG,CAAC;AAC5D,SAAIH,KAAS,IAAU9I,IAChBA,EAAO+C,IAAKkG,CAAAA,MAAOA,IAAIH,IAAS,GAAG;AAC5C,CAAC,IANiCF;AASpC,SAASC,GAAkBI,GAA2B;AACpD,SAAK7H,MAAMC,QAAQ4H,CAAC,IACbA,EAAEE,MAAOlF,CAAAA,MAAS,OAAOA,KAAS,YAAYK,OAAO8E,SAASnF,CAAI,CAAC,IAD5C;AAEhC;"}
@@ -1,14 +1,14 @@
1
- import { M as L, a as j, b as B } from "../markdown-BD1jcknS.js";
2
- import { jsx as a } from "react/jsx-runtime";
3
- import { c as p } from "react/compiler-runtime";
4
- import { Box as s, Skeleton as c } from "@mui/material";
1
+ import { M as E, a as O, b as S } from "../markdown-BD1jcknS.js";
2
+ import { jsx as i } from "react/jsx-runtime";
3
+ import { c as s } from "react/compiler-runtime";
4
+ import { Box as c, Skeleton as p } from "@mui/material";
5
5
  import "react";
6
6
  import "@mui/icons-material";
7
7
  import "../lasso-tool-CDFj4zKY.js";
8
8
  import "../cjs-D4KH3azB.js";
9
9
  import "@carto/ps-utils";
10
10
  import "html2canvas";
11
- import { b as d } from "../png-item-BE9uEqlD.js";
11
+ import { b as d, D as f, M as u } from "../png-item-9dNbB37T.js";
12
12
  const m = {
13
13
  root: {
14
14
  display: "flex",
@@ -21,21 +21,21 @@ const m = {
21
21
  height: 18
22
22
  })
23
23
  };
24
- function R(o) {
25
- const e = p(2), {
24
+ function y(o) {
25
+ const e = s(2), {
26
26
  lines: r
27
27
  } = o, n = r === void 0 ? 5 : r;
28
28
  let t;
29
29
  if (e[0] !== n) {
30
30
  const l = ["100%", "95%", "90%", "85%", "70%"];
31
- t = /* @__PURE__ */ a(s, { sx: m.root, children: Array.from({
31
+ t = /* @__PURE__ */ i(c, { sx: m.root, children: Array.from({
32
32
  length: n
33
- }).map((f, i) => /* @__PURE__ */ a(c, { variant: "rectangular", sx: m.line(l[i % l.length] ?? "85%") }, `line-${i}`)) }), e[0] = n, e[1] = t;
33
+ }).map((k, a) => /* @__PURE__ */ i(p, { variant: "rectangular", sx: m.line(l[a % l.length] ?? "85%") }, `line-${a}`)) }), e[0] = n, e[1] = t;
34
34
  } else
35
35
  t = e[1];
36
36
  return t;
37
37
  }
38
- function y(o) {
38
+ function I(o) {
39
39
  const e = [];
40
40
  return o.getCaptureEl && e.push(d({
41
41
  filename: o.filename,
@@ -43,8 +43,9 @@ function y(o) {
43
43
  pixelRatio: o.pngPixelRatio,
44
44
  backgroundColor: o.pngBackgroundColor
45
45
  })), e.push({
46
- id: "md",
47
- label: "Download as Markdown",
46
+ id: f.markdown,
47
+ label: "Markdown",
48
+ icon: /* @__PURE__ */ i(u, { fontSize: "small" }),
48
49
  resolve: () => {
49
50
  const r = o.getData(), n = new Blob([r.content ?? ""], {
50
51
  type: "text/markdown;charset=utf-8;"
@@ -58,10 +59,10 @@ function y(o) {
58
59
  }), e;
59
60
  }
60
61
  export {
61
- L as Markdown,
62
- j as MarkdownContent,
63
- R as MarkdownSkeleton,
64
- B as MarkdownUI,
65
- y as createMarkdownDownloadConfig
62
+ E as Markdown,
63
+ O as MarkdownContent,
64
+ y as MarkdownSkeleton,
65
+ S as MarkdownUI,
66
+ I as createMarkdownDownloadConfig
66
67
  };
67
68
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sources":["../../src/widgets-v2/markdown/skeleton.tsx","../../src/widgets-v2/markdown/download.ts"],"sourcesContent":["import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 1,\n },\n line: (width: string): SxProps<Theme> => ({ width, height: 18 }),\n} as const\n\nexport interface MarkdownSkeletonProps {\n lines?: number\n}\n\nexport function MarkdownSkeleton({ lines = 5 }: MarkdownSkeletonProps) {\n // Vary widths to mimic prose.\n const widths = ['100%', '95%', '90%', '85%', '70%']\n return (\n <Box sx={styles.root}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={`line-${i}`}\n variant='rectangular'\n sx={styles.line(widths[i % widths.length] ?? '85%')}\n />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n toCsvString,\n triggerLinkDownload,\n type DownloadItem,\n} from '../actions/download'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Download menu items for the Markdown widget. Always includes a `.md`\n * item that saves the markdown source verbatim. When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createMarkdownDownloadConfig(args: {\n filename: string\n getData: () => MarkdownWidgetData\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'md',\n label: 'Download as Markdown',\n resolve: () => {\n const data = args.getData()\n const blob = new Blob([data.content ?? ''], {\n type: 'text/markdown;charset=utf-8;',\n })\n const url = URL.createObjectURL(blob)\n return Promise.resolve({\n url,\n filename: `${args.filename}.md`,\n revoke: () => URL.revokeObjectURL(url),\n })\n },\n })\n return items\n}\n\n// Re-export pure helpers consumers may want when building a custom Download item.\nexport { toCsvString, triggerLinkDownload }\n"],"names":["styles","root","display","flexDirection","gap","py","line","width","height","MarkdownSkeleton","t0","$","_c","lines","t1","undefined","t2","widths","Box","Array","from","length","map","_","i","jsx","Skeleton","createMarkdownDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","label","resolve","data","getData","blob","Blob","content","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL"],"mappings":";;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,eAAe;AAAA,IACfC,KAAK;AAAA,IACLC,IAAI;AAAA,EAAA;AAAA,EAENC,MAAMA,CAACC,OAAmC;AAAA,IAAEA,OAAAA;AAAAA,IAAOC,QAAQ;AAAA,EAAA;AAC7D;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,MAAAL,SAAAE,GAAA;AAE1C,UAAAI,IAAe,CAAC,QAAQ,OAAO,OAAO,OAAO,KAAK;AAEhDD,IAAAA,sBAACE,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,MAAAC,QAAUR;AAAAA,IAAAA,CAAO,EAACS,IAAK,CAAAC,GAAAC,MACjC,gBAAAC,EAACC,GAAA,EAES,SAAA,eACJ,IAAA1B,EAAMM,KAAMW,EAAOO,IAAIP,EAAMI,MAAO,KAAxB,KAAkC,KAF7C,QAAQG,CAAC,EAEqC,CAEtD,EAAA,CACH,GAAMb,OAAAE,GAAAF,OAAAK;AAAAA,EAAA;AAAAA,IAAAA,IAAAL,EAAA,CAAA;AAAA,SARNK;AAQM;ACfH,SAASW,EAA6BC,GAM1B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAI;AAAA,IACJC,OAAO;AAAA,IACPC,SAASA,MAAM;AACb,YAAMC,IAAOb,EAAKc,QAAAA,GACZC,IAAO,IAAIC,KAAK,CAACH,EAAKI,WAAW,EAAE,GAAG;AAAA,QAC1CC,MAAM;AAAA,MAAA,CACP,GACKC,IAAMC,IAAIC,gBAAgBN,CAAI;AACpC,aAAOO,QAAQV,QAAQ;AAAA,QACrBO,KAAAA;AAAAA,QACAd,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1BkB,QAAQA,MAAMH,IAAII,gBAAgBL,CAAG;AAAA,MAAA,CACtC;AAAA,IACH;AAAA,EAAA,CACD,GACMlB;AACT;"}
1
+ {"version":3,"file":"markdown.js","sources":["../../src/widgets-v2/markdown/skeleton.tsx","../../src/widgets-v2/markdown/download.tsx"],"sourcesContent":["import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 1,\n },\n line: (width: string): SxProps<Theme> => ({ width, height: 18 }),\n} as const\n\nexport interface MarkdownSkeletonProps {\n lines?: number\n}\n\nexport function MarkdownSkeleton({ lines = 5 }: MarkdownSkeletonProps) {\n // Vary widths to mimic prose.\n const widths = ['100%', '95%', '90%', '85%', '70%']\n return (\n <Box sx={styles.root}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={`line-${i}`}\n variant='rectangular'\n sx={styles.line(widths[i % widths.length] ?? '85%')}\n />\n ))}\n </Box>\n )\n}\n","import {\n DOWNLOAD_ITEM_IDS,\n MarkdownIcon,\n buildPngDownloadItem,\n toCsvString,\n triggerLinkDownload,\n type DownloadItem,\n} from '../actions/download'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Download menu items for the Markdown widget. Always includes a `.md`\n * item that saves the markdown source verbatim. When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createMarkdownDownloadConfig(args: {\n filename: string\n getData: () => MarkdownWidgetData\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: DOWNLOAD_ITEM_IDS.markdown,\n label: 'Markdown',\n icon: <MarkdownIcon fontSize='small' />,\n resolve: () => {\n const data = args.getData()\n const blob = new Blob([data.content ?? ''], {\n type: 'text/markdown;charset=utf-8;',\n })\n const url = URL.createObjectURL(blob)\n return Promise.resolve({\n url,\n filename: `${args.filename}.md`,\n revoke: () => URL.revokeObjectURL(url),\n })\n },\n })\n return items\n}\n\n// Re-export pure helpers consumers may want when building a custom Download item.\nexport { toCsvString, triggerLinkDownload }\n"],"names":["styles","root","display","flexDirection","gap","py","line","width","height","MarkdownSkeleton","t0","$","_c","lines","t1","undefined","t2","widths","Box","Array","from","length","map","_","i","jsx","Skeleton","createMarkdownDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","DOWNLOAD_ITEM_IDS","markdown","label","icon","MarkdownIcon","resolve","data","getData","blob","Blob","content","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL"],"mappings":";;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,eAAe;AAAA,IACfC,KAAK;AAAA,IACLC,IAAI;AAAA,EAAA;AAAA,EAENC,MAAMA,CAACC,OAAmC;AAAA,IAAEA,OAAAA;AAAAA,IAAOC,QAAQ;AAAA,EAAA;AAC7D;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,MAAAL,SAAAE,GAAA;AAE1C,UAAAI,IAAe,CAAC,QAAQ,OAAO,OAAO,OAAO,KAAK;AAEhDD,IAAAA,sBAACE,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,MAAAC,QAAUR;AAAAA,IAAAA,CAAO,EAACS,IAAK,CAAAC,GAAAC,MACjC,gBAAAC,EAACC,GAAA,EAES,SAAA,eACJ,IAAA1B,EAAMM,KAAMW,EAAOO,IAAIP,EAAMI,MAAO,KAAxB,KAAkC,KAF7C,QAAQG,CAAC,EAEqC,CAEtD,EAAA,CACH,GAAMb,OAAAE,GAAAF,OAAAK;AAAAA,EAAA;AAAAA,IAAAA,IAAAL,EAAA,CAAA;AAAA,SARNK;AAQM;ACbH,SAASW,EAA6BC,GAM1B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAIC,EAAkBC;AAAAA,IACtBC,OAAO;AAAA,IACPC,MAAM,gBAAAjB,EAACkB,GAAA,EAAa,UAAS,QAAA,CAAO;AAAA,IACpCC,SAASA,MAAM;AACb,YAAMC,IAAOjB,EAAKkB,QAAAA,GACZC,IAAO,IAAIC,KAAK,CAACH,EAAKI,WAAW,EAAE,GAAG;AAAA,QAC1CC,MAAM;AAAA,MAAA,CACP,GACKC,IAAMC,IAAIC,gBAAgBN,CAAI;AACpC,aAAOO,QAAQV,QAAQ;AAAA,QACrBO,KAAAA;AAAAA,QACAlB,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1BsB,QAAQA,MAAMH,IAAII,gBAAgBL,CAAG;AAAA,MAAA,CACtC;AAAA,IACH;AAAA,EAAA,CACD,GACMtB;AACT;"}
@@ -1,6 +1,6 @@
1
1
  import * as w from "echarts";
2
- import { g as L, d as N, h as j, c as T, f as C, n as A } from "../option-builders-F-c9ELi1.js";
3
- import { jsx as I } from "react/jsx-runtime";
2
+ import { g as k, d as N, h as j, c as T, f as I, n as A } from "../option-builders-F-c9ELi1.js";
3
+ import { jsx as C } from "react/jsx-runtime";
4
4
  import { c as O } from "react/compiler-runtime";
5
5
  import { Box as P, Skeleton as $ } from "@mui/material";
6
6
  import "../widget-store-Bw5zRUGg.js";
@@ -15,14 +15,14 @@ import "@dnd-kit/core";
15
15
  import "@dnd-kit/sortable";
16
16
  import "@dnd-kit/utilities";
17
17
  import "react-dom";
18
- import { m as V, r as D } from "../resolve-theme-color-BdojIw0K.js";
18
+ import { m as D, r as M } from "../resolve-theme-color-BdojIw0K.js";
19
19
  import "../widget-context-DTGO0Yta.js";
20
20
  import "zustand";
21
21
  import "zustand/vanilla";
22
22
  import "zustand/middleware";
23
23
  import "zustand/react/shallow";
24
- import { a as M } from "../exports-Cx-f6m6U.js";
25
- import { b as z } from "../png-item-BE9uEqlD.js";
24
+ import { b as V } from "../png-item-9dNbB37T.js";
25
+ import { b as z } from "../csv-item-hH_Gt7ur.js";
26
26
  const B = ["58%", "74%"];
27
27
  function _({
28
28
  theme: e,
@@ -60,8 +60,8 @@ function _({
60
60
  fontSize: 11,
61
61
  fontFamily: e.typography.caption.fontFamily
62
62
  },
63
- position: L(e),
64
- formatter: k(r, t)
63
+ position: k(e),
64
+ formatter: F(r, t)
65
65
  },
66
66
  // V1 used `qualitative.bold` only (no `secondary.main` prefix) because
67
67
  // pie slices are categorical — each slice deserves a distinct palette
@@ -108,39 +108,39 @@ function ye(e) {
108
108
  labelFormatter: n,
109
109
  optionsOverride: o,
110
110
  series: s
111
- } = e, c = e.radius ?? B, d = e.selection, m = d && d.length > 0 ? new Set(d) : null;
112
- return (u, p, b) => {
113
- if (u == null) {
111
+ } = e, c = e.radius ?? B, u = e.selection, g = u && u.length > 0 ? new Set(u) : null;
112
+ return (d, f, b) => {
113
+ if (d == null) {
114
114
  const v = _({
115
115
  theme: r,
116
116
  formatter: t,
117
117
  labelFormatter: n
118
118
  });
119
- return o ? V(v, o) : v;
119
+ return o ? D(v, o) : v;
120
120
  }
121
- const g = Array.isArray(p) ? p : [];
122
- return g.length === 0 ? {
123
- ...u,
121
+ const p = Array.isArray(f) ? f : [];
122
+ return p.length === 0 ? {
123
+ ...d,
124
124
  dataset: [],
125
125
  series: []
126
- } : g.length > 1 ? E(u, g, r, s, b, m) : W(u, g, c, s, b, m);
126
+ } : p.length > 1 ? W(d, p, r, s, b, g) : R(d, p, c, s, b, g);
127
127
  };
128
128
  }
129
- function W(e, r, t, n, o, s) {
130
- const c = Array.isArray(e.series) ? e.series : [], d = c[0] ?? {}, m = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, u = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, p = o?.formatter, b = o?.labelFormatter, g = Array.isArray(e.color) ? e.color : [], v = (a) => (g.length > 0 ? g[a.dataIndex % g.length] : void 0) ?? a.color, S = (a) => {
129
+ function R(e, r, t, n, o, s) {
130
+ const c = Array.isArray(e.series) ? e.series : [], u = c[0] ?? {}, g = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, d = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, f = o?.formatter, b = o?.labelFormatter, p = Array.isArray(e.color) ? e.color : [], v = (a) => (p.length > 0 ? p[a.dataIndex % p.length] : void 0) ?? a.color, x = (a) => {
131
131
  const l = v(a);
132
132
  if (!s) return l;
133
- const f = a.value?.name ?? a.name;
134
- return f != null && s.has(f) ? l : w.color.modifyAlpha(l, 0.15);
133
+ const m = a.value?.name ?? a.name;
134
+ return m != null && s.has(m) ? l : w.color.modifyAlpha(l, 0.15);
135
135
  }, i = (a) => {
136
136
  const {
137
137
  name: l
138
138
  } = a, y = a.encode?.value?.[0];
139
139
  if (y === void 0) return "";
140
- const f = Object.values(a.data ?? {}).at(y), h = typeof f == "number" ? p ? p(f) : String(f) : typeof f == "string" ? f : "", x = String(b ? b(l ?? "") : l ?? "");
140
+ const m = Object.values(a.data ?? {}).at(y), h = typeof m == "number" ? f ? f(m) : String(m) : typeof m == "string" ? m : "", S = String(b ? b(l ?? "") : l ?? "");
141
141
  return `{c|${h}}
142
142
 
143
- {b|${x}}`;
143
+ {b|${S}}`;
144
144
  };
145
145
  return {
146
146
  ...e,
@@ -148,9 +148,9 @@ function W(e, r, t, n, o, s) {
148
148
  source: a
149
149
  })),
150
150
  series: r.map((a, l) => {
151
- const y = c[l] ?? d, f = typeof y == "object" ? y : {}, h = f.label ?? {}, x = f.itemStyle ?? {};
151
+ const y = c[l] ?? u, m = typeof y == "object" ? y : {}, h = m.label ?? {}, S = m.itemStyle ?? {};
152
152
  return {
153
- ...f,
153
+ ...m,
154
154
  type: "pie",
155
155
  datasetIndex: l,
156
156
  name: n?.[l]?.name ?? `Series ${l + 1}`,
@@ -170,28 +170,28 @@ function W(e, r, t, n, o, s) {
170
170
  formatter: i
171
171
  },
172
172
  itemStyle: {
173
- ...x,
174
- color: S
173
+ ...S,
174
+ color: x
175
175
  }
176
176
  };
177
177
  }),
178
178
  // Legend always shows for pie (mirrors v1) — slice names drive the
179
179
  // entries, so even a single donut benefits from a category list.
180
180
  legend: {
181
- ...u,
181
+ ...d,
182
182
  show: !0
183
183
  },
184
184
  tooltip: {
185
- ...m,
186
- formatter: k(p, b)
185
+ ...g,
186
+ formatter: F(f, b)
187
187
  }
188
188
  };
189
189
  }
190
- function E(e, r, t, n, o, s) {
191
- const c = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, d = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, m = typeof e.grid == "object" && !Array.isArray(e.grid) ? e.grid : {}, u = o?.formatter, p = o?.labelFormatter, {
190
+ function W(e, r, t, n, o, s) {
191
+ const c = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, u = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, g = typeof e.grid == "object" && !Array.isArray(e.grid) ? e.grid : {}, d = o?.formatter, f = o?.labelFormatter, {
192
192
  niceMinVal: b,
193
- niceMaxVal: g
194
- } = R(r), v = Array.isArray(e.color) ? e.color : [], S = (i) => {
193
+ niceMaxVal: p
194
+ } = H(r), v = Array.isArray(e.color) ? e.color : [], x = (i) => {
195
195
  const a = i.seriesIndex ?? 0, y = (v.length > 0 ? v[a % v.length] : void 0) ?? i.color;
196
196
  if (!s) return y;
197
197
  const h = i.value?.name ?? i.name;
@@ -203,7 +203,7 @@ function E(e, r, t, n, o, s) {
203
203
  source: i
204
204
  })),
205
205
  grid: {
206
- ...m,
206
+ ...g,
207
207
  ...T(!0, t),
208
208
  right: parseInt(t.spacing(4)),
209
209
  containLabel: !0
@@ -212,7 +212,7 @@ function E(e, r, t, n, o, s) {
212
212
  // bar fallback. ECharts ignores undefined keys, so this is a clean
213
213
  // override.
214
214
  series: r.map((i, a) => {
215
- const l = D(t, n?.[a]?.color);
215
+ const l = M(t, n?.[a]?.color);
216
216
  return {
217
217
  datasetIndex: a,
218
218
  type: "bar",
@@ -221,9 +221,9 @@ function E(e, r, t, n, o, s) {
221
221
  emphasis: {
222
222
  focus: "series"
223
223
  },
224
- ...j(u, "x"),
224
+ ...j(d, "x"),
225
225
  itemStyle: {
226
- color: S
226
+ color: x
227
227
  },
228
228
  ...l ? {
229
229
  color: l
@@ -235,7 +235,7 @@ function E(e, r, t, n, o, s) {
235
235
  // Closures over the pre-computed nice bounds — ECharts calls them
236
236
  // once per render to resolve the axis extents.
237
237
  min: () => b,
238
- max: () => g,
238
+ max: () => p,
239
239
  axisLine: {
240
240
  show: !1
241
241
  },
@@ -262,7 +262,7 @@ function E(e, r, t, n, o, s) {
262
262
  margin: parseInt(t.spacing(1)),
263
263
  showMaxLabel: !0,
264
264
  showMinLabel: !0,
265
- formatter: (i) => i !== g && i !== b || i === 0 ? "" : u ? u(i) : String(i)
265
+ formatter: (i) => i !== p && i !== b || i === 0 ? "" : d ? d(i) : String(i)
266
266
  }
267
267
  },
268
268
  yAxis: {
@@ -275,34 +275,34 @@ function E(e, r, t, n, o, s) {
275
275
  },
276
276
  axisLabel: {
277
277
  padding: [parseInt(t.spacing(0.5)), 0, 0, 0],
278
- ...p && {
279
- formatter: (i) => String(p(i))
278
+ ...f && {
279
+ formatter: (i) => String(f(i))
280
280
  }
281
281
  }
282
282
  },
283
283
  legend: {
284
- ...d,
284
+ ...u,
285
285
  show: !0
286
286
  },
287
287
  tooltip: {
288
288
  ...c,
289
289
  trigger: "axis",
290
- formatter: H(u, p)
290
+ formatter: E(d, f)
291
291
  }
292
292
  };
293
293
  }
294
- function H(e, r) {
295
- return C((t) => {
296
- const n = t.encode?.x?.at(0), o = n !== void 0 ? t.dimensionNames?.[n] : void 0, s = t.value && typeof t.value == "object" && !Array.isArray(t.value) ? t.value : void 0, c = o && s ? s[o] : void 0, d = typeof c == "number" && e ? e(c) : c ?? "", m = typeof t.marker == "string" ? t.marker : "", u = t.seriesName ? `${t.seriesName}: ` : "";
294
+ function E(e, r) {
295
+ return I((t) => {
296
+ const n = t.encode?.x?.at(0), o = n !== void 0 ? t.dimensionNames?.[n] : void 0, s = t.value && typeof t.value == "object" && !Array.isArray(t.value) ? t.value : void 0, c = o && s ? s[o] : void 0, u = typeof c == "number" && e ? e(c) : c ?? "", g = typeof t.marker == "string" ? t.marker : "", d = t.seriesName ? `${t.seriesName}: ` : "";
297
297
  return {
298
298
  name: String(r ? r(t.name ?? "") : t.name ?? ""),
299
- seriesName: u,
300
- marker: m,
301
- value: d
299
+ seriesName: d,
300
+ marker: g,
301
+ value: u
302
302
  };
303
303
  });
304
304
  }
305
- function R(e) {
305
+ function H(e) {
306
306
  let r = 0, t = -1 / 0;
307
307
  for (const n of e)
308
308
  for (const o of n)
@@ -312,18 +312,18 @@ function R(e) {
312
312
  niceMaxVal: t <= 0 ? 1 : A(t)
313
313
  };
314
314
  }
315
- function k(e, r) {
316
- return C((t) => {
317
- const n = t.encode?.value?.at(0) ?? 1, s = (t.value && typeof t.value == "object" && !Array.isArray(t.value) ? Object.values(t.value) : [])[n], c = typeof s == "number" && e ? e(s) : s ?? "", d = typeof t.marker == "string" ? t.marker : "", m = t.seriesName ? `${t.seriesName}: ` : "";
315
+ function F(e, r) {
316
+ return I((t) => {
317
+ const n = t.encode?.value?.at(0) ?? 1, s = (t.value && typeof t.value == "object" && !Array.isArray(t.value) ? Object.values(t.value) : [])[n], c = typeof s == "number" && e ? e(s) : s ?? "", u = typeof t.marker == "string" ? t.marker : "", g = t.seriesName ? `${t.seriesName}: ` : "";
318
318
  return {
319
319
  name: String(r ? r(t.name ?? "") : t.name ?? ""),
320
- seriesName: m,
321
- marker: d,
320
+ seriesName: g,
321
+ marker: u,
322
322
  value: c
323
323
  };
324
324
  });
325
325
  }
326
- const F = {
326
+ const L = {
327
327
  root: {
328
328
  display: "flex",
329
329
  alignItems: "center",
@@ -343,38 +343,32 @@ function be(e) {
343
343
  count: t
344
344
  } = e, n = t === void 0 ? 1 : t;
345
345
  let o;
346
- return r[0] !== n ? (o = /* @__PURE__ */ I(P, { sx: F.root, children: Array.from({
346
+ return r[0] !== n ? (o = /* @__PURE__ */ C(P, { sx: L.root, children: Array.from({
347
347
  length: n
348
348
  }).map(G) }), r[0] = n, r[1] = o) : o = r[1], o;
349
349
  }
350
350
  function G(e, r) {
351
- return /* @__PURE__ */ I($, { variant: "circular", sx: F.donut }, `donut-${r}`);
351
+ return /* @__PURE__ */ C($, { variant: "circular", sx: L.donut }, `donut-${r}`);
352
352
  }
353
353
  function ve(e) {
354
354
  const r = [];
355
- return e.getCaptureEl && r.push(z({
355
+ return e.getCaptureEl && r.push(V({
356
356
  filename: e.filename,
357
357
  getCaptureEl: e.getCaptureEl,
358
358
  pixelRatio: e.pngPixelRatio,
359
359
  backgroundColor: e.pngBackgroundColor
360
- })), r.push({
361
- id: "csv",
362
- label: "Download as CSV",
363
- resolve: () => {
360
+ })), r.push(z({
361
+ filename: e.filename,
362
+ getRows: () => {
364
363
  const t = e.getData(), n = [["series", "name", "value"]];
365
- for (const [s, c] of t.entries()) {
366
- const d = e.seriesNames?.[s] ?? `series_${s + 1}`;
367
- for (const m of c)
368
- n.push([d, m.name, m.value]);
364
+ for (const [o, s] of t.entries()) {
365
+ const c = e.seriesNames?.[o] ?? `series_${o + 1}`;
366
+ for (const u of s)
367
+ n.push([c, u.name, u.value]);
369
368
  }
370
- const o = M(n);
371
- return Promise.resolve({
372
- url: o.url,
373
- filename: `${e.filename}.csv`,
374
- revoke: o.revoke
375
- });
369
+ return n;
376
370
  }
377
- }), r;
371
+ })), r;
378
372
  }
379
373
  export {
380
374
  be as PieSkeleton,