{"version":3,"file":"sparkline.cjs","names":["createElement","DEFAULT_WIDTH","DEFAULT_HEIGHT","PAD","BAR_GAP","finiteSparklineValues","values","filter","value","Number","isFinite","sparklineSummary","series","length","first","min","max","last","at","sparklineExportValue","join","scaleY","height","inner","extent","sparklineBars","width","barWidth","Math","baseline","map","index","x","top","y","sparklinePoints","sparklineLinePath","points","undefined","point","sparklineAreaPath","line","Sparkline","t0","$","_c","kind","t1","t2","t3","color","t4","label","mark","summary","t5","bars","area","fill","_temp","key","d","fillOpacity","stroke","strokeWidth","t6","Symbol","for","display","direction","t7","t8","bar","sparklineColumn","spec","column","header","accessor","row","sortValue","exportValue"],"sources":["../src/columns/sparkline.tsx"],"sourcesContent":["/**\n * Inline sparkline charts — `@adapttable/core/sparkline`.\n *\n * Bar, line and area, drawn as SVG so a cell never downloads a chart\n * library. The entry is a separate package path: a table that does not\n * import this file never pays for it.\n */\nimport { createElement, type ReactElement, type ReactNode } from \"react\";\n\nimport type { ColumnDef } from \"../types\";\n\n/** The three marks this entry draws. */\nexport type SparklineKind = \"bar\" | \"line\" | \"area\";\n\n/** One bar in the bar mark. */\ninterface SparklineBar {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/** Props for {@link Sparkline}. */\nexport interface SparklineProps {\n  /** The series, oldest first. Non-finite values are dropped. */\n  values: readonly number[];\n  /** Default `\"line\"`. */\n  kind?: SparklineKind;\n  /** SVG width in CSS pixels. Default 80. */\n  width?: number;\n  /** SVG height in CSS pixels. Default 28. */\n  height?: number;\n  /** Stroke / bar fill. Default `currentColor` so the kit theme wins. */\n  color?: string;\n  /** Accessible summary. Defaults to {@link sparklineSummary}. */\n  label?: string;\n}\n\n/** How {@link sparklineColumn} is declared. */\nexport interface SparklineColumnSpec<TRow> {\n  key: string;\n  header?: ReactNode;\n  /** The series on this row. */\n  values: (row: TRow) => readonly number[];\n  kind?: SparklineKind;\n  width?: number;\n  height?: number;\n  color?: string;\n  /** Override the default numeric summary. */\n  label?: (values: readonly number[], row: TRow) => string;\n  /** Extra ColumnDef fields. Accessor / sort / export from this helper win. */\n  column?: Partial<ColumnDef<TRow>>;\n}\n\nconst DEFAULT_WIDTH = 80;\nconst DEFAULT_HEIGHT = 28;\nconst PAD = 2;\nconst BAR_GAP = 1;\n\n/** Drop NaN / Infinity so a bad point cannot collapse the scale. */\nexport function finiteSparklineValues(values: readonly number[]): number[] {\n  return values.filter((value) => Number.isFinite(value));\n}\n\n/** Default accessible summary — numbers only, so it is locale-neutral. */\nexport function sparklineSummary(values: readonly number[]): string {\n  const series = finiteSparklineValues(values);\n  if (series.length === 0) return \"no values\";\n  const first = series[0];\n  if (series.length === 1) {\n    return `1 value, ${first}`;\n  }\n  let min = first ?? 0;\n  let max = first ?? 0;\n  for (const value of series) {\n    if (value < min) min = value;\n    if (value > max) max = value;\n  }\n  const last = series.at(-1);\n  return `${series.length} values, min ${min}, max ${max}, last ${last}`;\n}\n\n/** CSV / xlsx fallback — the numbers, not the SVG. */\nexport function sparklineExportValue(values: readonly number[]): string {\n  return finiteSparklineValues(values).join(\", \");\n}\n\nfunction scaleY(\n  value: number,\n  min: number,\n  max: number,\n  height: number\n): number {\n  const inner = height - PAD * 2;\n  if (min === max) return PAD + inner / 2;\n  return PAD + inner * (1 - (value - min) / (max - min));\n}\n\nfunction extent(series: readonly number[]): { min: number; max: number } {\n  const first = series[0] ?? 0;\n  let min = first;\n  let max = first;\n  for (const value of series) {\n    if (value < min) min = value;\n    if (value > max) max = value;\n  }\n  return { min, max };\n}\n\nfunction sparklineBars(\n  series: readonly number[],\n  width: number,\n  height: number\n): SparklineBar[] {\n  if (series.length === 0) return [];\n  const { min, max } = extent(series);\n  const inner = width - PAD * 2;\n  const barWidth = Math.max(\n    1,\n    (inner - BAR_GAP * (series.length - 1)) / series.length\n  );\n  const baseline = height - PAD;\n  return series.map((value, index) => {\n    const x = PAD + index * (barWidth + BAR_GAP);\n    const top = scaleY(value, min, max, height);\n    return { x, y: top, width: barWidth, height: Math.max(1, baseline - top) };\n  });\n}\n\nfunction sparklinePoints(\n  series: readonly number[],\n  width: number,\n  height: number\n): { x: number; y: number }[] {\n  if (series.length === 0) return [];\n  const { min, max } = extent(series);\n  const inner = width - PAD * 2;\n  if (series.length === 1) {\n    return [{ x: width / 2, y: scaleY(series[0] ?? 0, min, max, height) }];\n  }\n  return series.map((value, index) => ({\n    x: PAD + (inner * index) / (series.length - 1),\n    y: scaleY(value, min, max, height),\n  }));\n}\n\nfunction sparklineLinePath(\n  series: readonly number[],\n  width: number,\n  height: number\n): string {\n  const points = sparklinePoints(series, width, height);\n  if (points.length === 0) return \"\";\n  const first = points[0];\n  if (first === undefined) return \"\";\n  if (points.length === 1) {\n    return `M${first.x} ${first.y} h0.01`;\n  }\n  return points\n    .map((point, index) =>\n      index === 0 ? `M${point.x} ${point.y}` : `L${point.x} ${point.y}`\n    )\n    .join(\" \");\n}\n\nfunction sparklineAreaPath(\n  series: readonly number[],\n  width: number,\n  height: number\n): string {\n  const line = sparklineLinePath(series, width, height);\n  if (line === \"\") return \"\";\n  const points = sparklinePoints(series, width, height);\n  const last = points.at(-1);\n  const first = points[0];\n  if (last === undefined || first === undefined) return \"\";\n  const baseline = height - PAD;\n  return `${line} L${last.x} ${baseline} L${first.x} ${baseline} Z`;\n}\n\n/**\n * A mini chart sized to a cell. Fixed width/height — no observers — so a\n * virtualized row can mount and unmount it without measuring.\n */\nexport function Sparkline({\n  values,\n  kind = \"line\",\n  width = DEFAULT_WIDTH,\n  height = DEFAULT_HEIGHT,\n  color = \"currentColor\",\n  label,\n}: Readonly<SparklineProps>): ReactElement {\n  const series = finiteSparklineValues(values);\n  const summary = label ?? sparklineSummary(values);\n  const bars = sparklineBars(series, width, height);\n  const line = sparklineLinePath(series, width, height);\n  const area = sparklineAreaPath(series, width, height);\n  let mark: ReactElement;\n  if (kind === \"bar\") {\n    mark = createElement(\n      \"g\",\n      { fill: color },\n      bars.map((bar) =>\n        createElement(\"rect\", {\n          key: `${bar.x}:${bar.y}`,\n          x: bar.x,\n          y: bar.y,\n          width: bar.width,\n          height: bar.height,\n        })\n      )\n    );\n  } else if (kind === \"area\") {\n    mark = createElement(\"g\", null, [\n      createElement(\"path\", {\n        key: \"fill\",\n        d: area,\n        fill: color,\n        fillOpacity: 0.25,\n      }),\n      createElement(\"path\", {\n        key: \"line\",\n        d: line,\n        fill: \"none\",\n        stroke: color,\n        strokeWidth: 1.25,\n      }),\n    ]);\n  } else {\n    mark = createElement(\"path\", {\n      d: line,\n      fill: \"none\",\n      stroke: color,\n      strokeWidth: 1.25,\n    });\n  }\n  return (\n    <svg\n      role=\"img\"\n      aria-label={summary}\n      width={width}\n      height={height}\n      viewBox={`0 0 ${width} ${height}`}\n      data-adapttable-part=\"sparkline\"\n      data-kind={kind}\n      style={{ display: \"block\", direction: \"ltr\" }}\n    >\n      <title>{summary}</title>\n      {mark}\n    </svg>\n  );\n}\n\n/**\n * A column whose cell is a sparkline.\n *\n * Sort and export read the numbers, never the SVG.\n */\nexport function sparklineColumn<TRow>(\n  spec: SparklineColumnSpec<TRow>\n): ColumnDef<TRow> {\n  return {\n    ...spec.column,\n    key: spec.key,\n    header: spec.header,\n    accessor: (row) => {\n      const values = spec.values(row);\n      return (\n        <Sparkline\n          values={values}\n          kind={spec.kind}\n          width={spec.width}\n          height={spec.height}\n          color={spec.color}\n          label={spec.label?.(values, row)}\n        />\n      );\n    },\n    sortValue: (row) => {\n      const series = finiteSparklineValues(spec.values(row));\n      if (series.length === 0) return undefined;\n      return series.at(-1);\n    },\n    exportValue: (row) => sparklineExportValue(spec.values(row)),\n  };\n}\n"],"mappings":"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"}