{"version":3,"sources":["../src/index.ts","../src/shared.ts","../src/line-chart.ts","../src/bar-chart.ts","../src/pie-chart.ts"],"sourcesContent":["export { NanoLineChart } from './line-chart';\nexport type { LineChartConfig } from './line-chart';\nexport { NanoBarChart } from './bar-chart';\nexport type { BarChartConfig } from './bar-chart';\nexport { NanoPieChart } from './pie-chart';\nexport type { PieChartConfig } from './pie-chart';\n\nimport { NanoLineChart } from './line-chart';\nimport { NanoBarChart } from './bar-chart';\nimport { NanoPieChart } from './pie-chart';\n\n// UMD-style globals for script-tag usage\nif (typeof window !== 'undefined') {\n  (window as any).NanoLineChart = NanoLineChart;\n  (window as any).NanoBarChart = NanoBarChart;\n  (window as any).NanoPieChart = NanoPieChart;\n}\n","export interface Padding {\n  top: number;\n  right: number;\n  bottom: number;\n  left: number;\n}\n\nexport var SVG_NS = 'http://www.w3.org/2000/svg';\n\n/**\n * Attaches RAF-throttled hover listeners (mouse + touch + resize).\n * Each chart provides its own onUpdate(mx, my) and onLeave() callbacks.\n */\nexport function attachHoverListeners(\n  container: HTMLElement,\n  svgEl: SVGSVGElement,\n  onUpdate: (mx: number, my: number) => void,\n  onLeave: () => void\n): void {\n  var rafPending = false;\n  var lastCX = 0, lastCY = 0;\n\n  function schedule() {\n    if (!rafPending) {\n      rafPending = true;\n      requestAnimationFrame(function () {\n        rafPending = false;\n        var r = svgEl.getBoundingClientRect();\n        onUpdate(lastCX - r.left, lastCY - r.top);\n      });\n    }\n  }\n\n  container.addEventListener('mousemove', function (e: MouseEvent) {\n    lastCX = e.clientX; lastCY = e.clientY;\n    schedule();\n  }, { passive: true });\n\n  container.addEventListener('mouseleave', onLeave, { passive: true });\n\n  container.addEventListener('touchmove', function (e: TouchEvent) {\n    var t = e.touches[0];\n    lastCX = t.clientX; lastCY = t.clientY;\n    schedule();\n  }, { passive: true });\n\n  container.addEventListener('touchend', onLeave, { passive: true });\n}\n\n/**\n * Watches the container's parent for width changes and re-renders the chart.\n * Disconnects before re-render to prevent loops (render sets fixed width).\n * The re-render will call observeResize again, keeping it alive.\n */\nexport function observeResize(\n  container: HTMLElement,\n  render: () => void\n): void {\n  if (typeof ResizeObserver === 'undefined') return;\n  var parent = container.parentElement || container;\n  var lastW = parent.clientWidth;\n  var ro = new ResizeObserver(function () {\n    var newW = parent.clientWidth;\n    if (newW && newW !== lastW) {\n      lastW = newW;\n      ro.disconnect();\n      container.style.width = '';\n      render();\n    }\n  });\n  ro.observe(parent);\n}\n","import { Padding, SVG_NS, attachHoverListeners, observeResize } from './shared';\n\n/**\n * Configuration for a chart instance.\n */\nexport interface LineChartConfig {\n  /** Array of data series. Each inner array is one series of numeric values. */\n  data: number[][];\n  /** X-axis labels. Must match the length of each data series. */\n  labels: string[];\n  /** X-axis title. */\n  xLabel?: string;\n  /** Y-axis title. */\n  yLabel?: string;\n  /** Colors for each series. Defaults to Thruscan brand palette. */\n  colors?: string[];\n  /** Chart width in pixels. Defaults to container's clientWidth or 600. */\n  width?: number;\n  /** Chart height in pixels. Defaults to 350. */\n  height?: number;\n  /** Catmull-Rom spline smoothing. Default false. */\n  smooth?: boolean;\n  /** Semi-transparent fill under each series. Default false. */\n  areaFill?: boolean;\n  /** Area fill opacity. Default 0.1. */\n  areaOpacity?: number;\n  /** Show X/Y tick labels. Default true. */\n  showTicks?: boolean;\n  /** Show grid lines. Default true. */\n  showGrid?: boolean;\n  /** Dashed grid lines. Default false. */\n  gridDashed?: boolean;\n  /** Series stroke width. Default 2.5. */\n  strokeWidth?: number;\n  /** Enable hover tooltip + indicator. Default true. */\n  hover?: boolean;\n  /** Chart padding {top, right, bottom, left}. Default {top:20, right:30, bottom:50, left:60}. */\n  padding?: Partial<Padding>;\n}\n\n\n/**\n * Creates a high-performance SVG+HTML hybrid line chart inside the specified container.\n */\nexport function NanoLineChart(containerId: string, config: LineChartConfig): void {\n  var data = config.data;\n  var labels = config.labels;\n  var xLabel = config.xLabel || '';\n  var yLabel = config.yLabel || '';\n  var colors = config.colors || ['#215CAF', '#007894', '#00C9A7', '#DE4437', '#F69C3D'];\n  var dp = config.padding || {};\n  var padding: Padding = { top: dp.top || 0, right: dp.right || 0, bottom: dp.bottom || 0, left: dp.left || 0 };\n\n  var smooth = config.smooth === true;\n  var areaFill = config.areaFill === true;\n  var areaOpacity = config.areaOpacity !== undefined ? config.areaOpacity : 0.1;\n  var showTicks = config.showTicks !== false;\n  var showGrid = config.showGrid !== false;\n  var gridDashed = config.gridDashed === true;\n  var strokeWidth = config.strokeWidth !== undefined ? config.strokeWidth : 2.5;\n  var hoverEnabled = config.hover !== false;\n\n  var container = document.getElementById(containerId)!;\n  if (!container || !data.length || !data[0].length) return;\n  var chartWidth = config.width || container.clientWidth || 600;\n  var chartHeight = config.height || 350;\n  var plotWidth = chartWidth - padding.left - padding.right;\n  var plotHeight = chartHeight - padding.top - padding.bottom;\n  var plotBottom = padding.top + plotHeight;\n\n  // ── Phase 1: Pure math (zero DOM) ──\n  var seriesIndex: number, pointIndex: number, minValue: number, maxValue: number;\n  minValue = maxValue = data[0][0];\n  for (seriesIndex = 0; seriesIndex < data.length; seriesIndex++)\n    for (pointIndex = 0; pointIndex < data[seriesIndex].length; pointIndex++) {\n      if (data[seriesIndex][pointIndex] < minValue) minValue = data[seriesIndex][pointIndex];\n      if (data[seriesIndex][pointIndex] > maxValue) maxValue = data[seriesIndex][pointIndex];\n    }\n  var range = maxValue - minValue || 1;\n  minValue -= range * 0.05;\n  maxValue += range * 0.05;\n  range = maxValue - minValue;\n\n  var pointCount = labels.length;\n  var stepX = pointCount > 1 ? plotWidth / (pointCount - 1) : 0;\n  var tickCount = 6;\n  var tickStep = range / (tickCount - 1);\n\n  // Int16Array — half memory of Float32Array, perfect for integer pixel coords\n  var totalCoords = data.length * pointCount;\n  var coordsX = new Int16Array(totalCoords);\n  var coordsY = new Int16Array(totalCoords);\n  for (seriesIndex = 0; seriesIndex < data.length; seriesIndex++)\n    for (pointIndex = 0; pointIndex < pointCount; pointIndex++) {\n      var coordIndex = seriesIndex * pointCount + pointIndex;\n      coordsX[coordIndex] = (padding.left + pointIndex * stepX) | 0;\n      coordsY[coordIndex] = (padding.top + plotHeight - ((data[seriesIndex][pointIndex] - minValue) / range) * plotHeight) | 0;\n    }\n\n  // Grid Y positions + labels\n  var gridYPositions = new Int16Array(tickCount);\n  var gridLabels = new Array(tickCount);\n  var tickIndex: number;\n  for (tickIndex = 0; tickIndex < tickCount; tickIndex++) {\n    var tickValue = minValue + tickIndex * tickStep;\n    gridYPositions[tickIndex] = (padding.top + plotHeight - ((tickValue - minValue) / range) * plotHeight) | 0;\n    gridLabels[tickIndex] = tickValue.toFixed(1);\n  }\n\n  // ── Phase 2: Build SVG string ──\n  var svgMarkup = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + chartWidth + '\" height=\"' + chartHeight + '\" viewBox=\"0 0 ' + chartWidth + ' ' + chartHeight + '\" class=\"chart\">';\n\n  // Grid path\n  if (showGrid) {\n    var gridPath = '';\n    for (tickIndex = 0; tickIndex < tickCount; tickIndex++)\n      gridPath += 'M' + padding.left + ',' + gridYPositions[tickIndex] + 'H' + (padding.left + plotWidth);\n    svgMarkup += '<path d=\"' + gridPath + '\" class=\"chart-grid\"' + (gridDashed ? ' stroke-dasharray=\"3 4\"' : '') + '/>';\n  }\n\n  // Series paths\n  for (seriesIndex = 0; seriesIndex < data.length; seriesIndex++) {\n    var ci = seriesIndex * pointCount;\n    var pathData = 'M' + coordsX[ci] + ',' + coordsY[ci];\n\n    if (smooth) {\n      // Catmull-Rom → Cubic Bezier, directly from Int16Array coords\n      for (pointIndex = 0; pointIndex < pointCount - 1; pointIndex++) {\n        var prevI = pointIndex ? pointIndex - 1 : 0;\n        var next2I = pointIndex + 2 < pointCount ? pointIndex + 2 : pointCount - 1;\n        var curX = coordsX[ci + pointIndex], curY = coordsY[ci + pointIndex];\n        var nextX = coordsX[ci + pointIndex + 1], nextY = coordsY[ci + pointIndex + 1];\n        var prevX = coordsX[ci + prevI], prevY = coordsY[ci + prevI];\n        var next2X = coordsX[ci + next2I], next2Y = coordsY[ci + next2I];\n        pathData += ' C' + ((curX + (nextX - prevX) / 6) | 0) + ',' + ((curY + (nextY - prevY) / 6) | 0)\n          + ' ' + ((nextX - (next2X - curX) / 6) | 0) + ',' + ((nextY - (next2Y - curY) / 6) | 0)\n          + ' ' + nextX + ',' + nextY;\n      }\n    } else {\n      for (pointIndex = 1; pointIndex < pointCount; pointIndex++)\n        pathData += 'L' + coordsX[ci + pointIndex] + ',' + coordsY[ci + pointIndex];\n    }\n\n    // Area fill path (before series line so line draws on top)\n    if (areaFill) {\n      var firstX = coordsX[ci], lastX = coordsX[ci + pointCount - 1];\n      svgMarkup += '<path d=\"' + pathData + ' L' + lastX + ',' + plotBottom + ' L' + firstX + ',' + plotBottom + ' Z\"'\n        + ' fill=\"' + colors[seriesIndex % colors.length] + '\" fill-opacity=\"' + areaOpacity + '\" stroke=\"none\" pointer-events=\"none\"/>';\n    }\n\n    svgMarkup += '<path d=\"' + pathData + '\" class=\"chart-series\" stroke=\"' + colors[seriesIndex % colors.length] + '\"'\n      + (strokeWidth !== 2.5 ? ' stroke-width=\"' + strokeWidth + '\"' : '') + '/>';\n  }\n\n  svgMarkup += '</svg>';\n\n  // ── Phase 3: Build HTML label overlay ──\n  var labelMarkup = '<div class=\"chart-labels\">';\n\n  if (showTicks) {\n    // Y tick labels\n    for (tickIndex = 0; tickIndex < tickCount; tickIndex++)\n      labelMarkup += '<span class=\"chart-tick-y\" style=\"left:' + (padding.left - 4) + 'px;top:' + (gridYPositions[tickIndex] - 1) + 'px\">' + gridLabels[tickIndex] + '</span>';\n\n    // X tick labels\n    for (pointIndex = 0; pointIndex < pointCount; pointIndex++)\n      labelMarkup += '<span class=\"chart-tick-x\" style=\"left:' + coordsX[pointIndex] + 'px;top:' + (padding.top + plotHeight + 6) + 'px\">' + labels[pointIndex] + '</span>';\n  }\n\n  // Axis titles\n  if (xLabel)\n    labelMarkup += '<span class=\"chart-title\" style=\"left:' + (padding.left + (plotWidth >> 1)) + 'px;top:' + (chartHeight - 10) + 'px\">' + xLabel + '</span>';\n  if (yLabel)\n    labelMarkup += '<span class=\"chart-title\" style=\"left:4px;top:' + (padding.top - 14) + 'px;transform:none;text-align:left\">' + yLabel + '</span>';\n\n  labelMarkup += '</div>';\n\n  // ── Phase 4: Single innerHTML write (SVG + HTML labels) ──\n  container.style.cssText = 'position:relative;width:' + chartWidth + 'px;height:' + chartHeight + 'px';\n  container.innerHTML = svgMarkup + labelMarkup;\n\n  // ── Phase 5: Auto-resize ──\n  if (!config.width) {\n    observeResize(container, function () { NanoLineChart(containerId, config); });\n  }\n\n  // ── Phase 6: Lazy hover ──\n  if (!hoverEnabled) return;\n\n  var svg = container.firstChild as SVGSVGElement;\n  var indicator: SVGCircleElement | null = null;\n  var tooltip: HTMLDivElement | null = null;\n\n  function ensureHoverElements() {\n    if (!indicator) {\n      indicator = document.createElementNS(SVG_NS, 'circle') as SVGCircleElement;\n      indicator.setAttribute('r', '5');\n      indicator.setAttribute('class', 'chart-indicator');\n      indicator.style.display = 'none';\n      svg.appendChild(indicator);\n    }\n    if (!tooltip) {\n      tooltip = document.createElement('div') as HTMLDivElement;\n      tooltip.className = 'chart-tooltip';\n      container.appendChild(tooltip);\n    }\n  }\n\n  attachHoverListeners(container, svg,\n    function (mouseX, mouseY) {\n      if (mouseX < padding.left || mouseX > padding.left + plotWidth || mouseY < padding.top || mouseY > padding.top + plotHeight) {\n        if (indicator) indicator.style.display = 'none';\n        if (tooltip) tooltip.style.opacity = '0';\n        return;\n      }\n\n      ensureHoverElements();\n\n      var relativeX = mouseX - padding.left;\n      if (relativeX < 0) relativeX = 0;\n      if (relativeX > plotWidth) relativeX = plotWidth;\n      var nearestIndex = (relativeX / stepX + 0.5) | 0;\n      if (nearestIndex >= pointCount) nearestIndex = pointCount - 1;\n\n      var bestSeriesIndex = 0;\n      var bestDistance = Math.abs(coordsY[nearestIndex] - mouseY);\n      for (var searchIndex = 1; searchIndex < data.length; searchIndex++) {\n        var distance = Math.abs(coordsY[searchIndex * pointCount + nearestIndex] - mouseY);\n        if (distance < bestDistance) { bestDistance = distance; bestSeriesIndex = searchIndex; }\n      }\n\n      var pointX = coordsX[bestSeriesIndex * pointCount + nearestIndex];\n      var pointY = coordsY[bestSeriesIndex * pointCount + nearestIndex];\n\n      indicator!.setAttribute('transform', 'translate(' + pointX + ',' + pointY + ')');\n      indicator!.setAttribute('fill', colors[bestSeriesIndex % colors.length]);\n      indicator!.style.display = '';\n\n      tooltip!.innerHTML = '<b>Series ' + (bestSeriesIndex + 1) + '</b><br>' +\n        xLabel + ': ' + labels[nearestIndex] + '<br>' + yLabel + ': ' + data[bestSeriesIndex][nearestIndex];\n      tooltip!.style.transform = 'translate(' + pointX + 'px,' + (pointY - 40) + 'px) translate(-50%,-100%)';\n      tooltip!.style.opacity = '1';\n    },\n    function () {\n      if (indicator) indicator.style.display = 'none';\n      if (tooltip) tooltip.style.opacity = '0';\n    }\n  );\n}\n\n","import { Padding, SVG_NS, attachHoverListeners, observeResize } from './shared';\n\n/**\n * Configuration for a bar chart instance.\n */\nexport interface BarChartConfig {\n  /** Array of data series. Each inner array is one series of numeric values. */\n  data: number[][];\n  /** Category labels. Must match the length of each data series. */\n  labels: string[];\n  /** X-axis title. */\n  xLabel?: string;\n  /** Y-axis title. */\n  yLabel?: string;\n  /** Colors for each series. Defaults to Thruscan brand palette. */\n  colors?: string[];\n  /** Chart width in pixels. Defaults to container's clientWidth or 600. */\n  width?: number;\n  /** Chart height in pixels. Defaults to 350. */\n  height?: number;\n  /** Stack series instead of grouping side-by-side. Default false. */\n  stacked?: boolean;\n  /** Horizontal bars (categories on Y-axis). Default false. */\n  horizontal?: boolean;\n  /** Gap between bar groups as fraction of group width (0–1). Default 0.2. */\n  barGap?: number;\n  /** Show tick labels. Default true. */\n  showTicks?: boolean;\n  /** Show grid lines. Default true. */\n  showGrid?: boolean;\n  /** Dashed grid lines. Default false. */\n  gridDashed?: boolean;\n  /** Enable hover tooltip + indicator. Default true. */\n  hover?: boolean;\n  /** Chart padding {top, right, bottom, left}. Default {top:20, right:30, bottom:50, left:60} (left:80 for horizontal). */\n  padding?: Partial<Padding>;\n}\n\n\n/**\n * Creates a high-performance SVG+HTML hybrid bar chart inside the specified container.\n */\nexport function NanoBarChart(containerId: string, config: BarChartConfig): void {\n  var data = config.data;\n  var labels = config.labels;\n  var xLabel = config.xLabel || '';\n  var yLabel = config.yLabel || '';\n  var colors = config.colors || ['#215CAF', '#007894', '#00C9A7', '#DE4437', '#F69C3D'];\n  var stacked = config.stacked === true;\n  var horizontal = config.horizontal === true;\n  var showTicks = config.showTicks !== false;\n  var showGrid = config.showGrid !== false;\n  var gridDashed = config.gridDashed === true;\n  var hoverEnabled = config.hover !== false;\n  var barGap = config.barGap !== undefined ? config.barGap : 0.2;\n  var dp = config.padding || {};\n  var padding: Padding = { top: dp.top || 0, right: dp.right || 0, bottom: dp.bottom || 0, left: dp.left || 0 };\n\n  var container = document.getElementById(containerId)!;\n  if (!container || !data.length || !data[0].length) return;\n  var chartWidth = config.width || container.clientWidth || 600;\n  var chartHeight = config.height || 350;\n  var plotWidth = chartWidth - padding.left - padding.right;\n  var plotHeight = chartHeight - padding.top - padding.bottom;\n  var plotBottom = padding.top + plotHeight;\n\n  var seriesCount = data.length;\n  var catCount = labels.length;\n  var si: number, ci: number, val: number, ti: number;\n\n  // ── Phase 1: Pure math (zero DOM) ──\n\n  // Find min/max\n  var minVal: number, maxVal: number;\n  if (stacked) {\n    minVal = 0;\n    maxVal = 0;\n    for (ci = 0; ci < catCount; ci++) {\n      var colSum = 0;\n      for (si = 0; si < seriesCount; si++) {\n        colSum += data[si][ci];\n        if (data[si][ci] < minVal) minVal = data[si][ci];\n      }\n      if (colSum > maxVal) maxVal = colSum;\n    }\n  } else {\n    minVal = maxVal = data[0][0];\n    for (si = 0; si < seriesCount; si++)\n      for (ci = 0; ci < catCount; ci++) {\n        val = data[si][ci];\n        if (val < minVal) minVal = val;\n        if (val > maxVal) maxVal = val;\n      }\n  }\n\n  if (minVal > 0) minVal = 0;\n  if (maxVal < 0) maxVal = 0;\n\n  var range = maxVal - minVal || 1;\n  maxVal += range * 0.05;\n  range = maxVal - minVal;\n\n  // Grid tick positions + labels\n  var tickCount = 6;\n  var tickStep = range / (tickCount - 1);\n  var gridPositions = new Int16Array(tickCount);\n  var gridLabels = new Array<string>(tickCount);\n\n  var totalBars = seriesCount * catCount;\n  var barX = new Int16Array(totalBars);\n  var barY = new Int16Array(totalBars);\n  var barW = new Int16Array(totalBars);\n  var barH = new Int16Array(totalBars);\n  var groupSize: number;\n  var zeroY = 0;\n\n  if (horizontal) {\n    // ── Horizontal: categories on Y, values on X ──\n    groupSize = plotHeight / catCount;\n    var zeroX = (padding.left + ((0 - minVal) / range) * plotWidth) | 0;\n\n    for (ti = 0; ti < tickCount; ti++) {\n      var tickVal = minVal + ti * tickStep;\n      gridPositions[ti] = (padding.left + ((tickVal - minVal) / range) * plotWidth) | 0;\n      gridLabels[ti] = tickVal % 1 === 0 ? tickVal.toString() : tickVal.toFixed(1);\n    }\n\n    var hBarHeight = ((groupSize * (1 - barGap)) / seriesCount) | 0;\n    var hGroupStart = ((groupSize - hBarHeight * seriesCount) / 2) | 0;\n\n    for (si = 0; si < seriesCount; si++)\n      for (ci = 0; ci < catCount; ci++) {\n        var idx = si * catCount + ci;\n        val = data[si][ci];\n        var valX = (padding.left + ((val - minVal) / range) * plotWidth) | 0;\n\n        barY[idx] = (padding.top + ci * groupSize + hGroupStart + si * hBarHeight) | 0;\n        barH[idx] = hBarHeight;\n\n        if (val >= 0) {\n          barX[idx] = zeroX;\n          barW[idx] = (valX - zeroX || 1) as number;\n        } else {\n          barX[idx] = valX;\n          barW[idx] = (zeroX - valX || 1) as number;\n        }\n      }\n  } else {\n    // ── Vertical: categories on X, values on Y ──\n    groupSize = plotWidth / catCount;\n\n    zeroY = (padding.top + plotHeight - ((0 - minVal) / range) * plotHeight) | 0;\n\n    for (ti = 0; ti < tickCount; ti++) {\n      var tickVal = minVal + ti * tickStep;\n      gridPositions[ti] = (padding.top + plotHeight - ((tickVal - minVal) / range) * plotHeight) | 0;\n      gridLabels[ti] = tickVal % 1 === 0 ? tickVal.toString() : tickVal.toFixed(1);\n    }\n\n    if (stacked) {\n      var stackBarWidth = (groupSize * (1 - barGap)) | 0;\n      var stackBarOffset = ((groupSize - stackBarWidth) / 2) | 0;\n\n      for (ci = 0; ci < catCount; ci++) {\n        var cumPos = 0;\n        for (si = 0; si < seriesCount; si++) {\n          var idx = si * catCount + ci;\n          val = data[si][ci];\n          var baseY = (padding.top + plotHeight - ((cumPos - minVal) / range) * plotHeight) | 0;\n          var topY = (padding.top + plotHeight - ((cumPos + val - minVal) / range) * plotHeight) | 0;\n          cumPos += val;\n\n          barX[idx] = (padding.left + ci * groupSize + stackBarOffset) | 0;\n          barY[idx] = Math.min(baseY, topY);\n          barW[idx] = stackBarWidth;\n          barH[idx] = (Math.abs(topY - baseY) || 1) as number;\n        }\n      }\n    } else {\n      var singleBarWidth = ((groupSize * (1 - barGap)) / seriesCount) | 0;\n      var groupBarStart = ((groupSize - singleBarWidth * seriesCount) / 2) | 0;\n\n      for (si = 0; si < seriesCount; si++)\n        for (ci = 0; ci < catCount; ci++) {\n          var idx = si * catCount + ci;\n          val = data[si][ci];\n          var topY = (padding.top + plotHeight - ((val - minVal) / range) * plotHeight) | 0;\n\n          barX[idx] = (padding.left + ci * groupSize + groupBarStart + si * singleBarWidth) | 0;\n          barW[idx] = singleBarWidth;\n\n          if (val >= 0) {\n            barY[idx] = topY;\n            barH[idx] = (zeroY - topY || 1) as number;\n          } else {\n            barY[idx] = zeroY;\n            barH[idx] = (topY - zeroY || 1) as number;\n          }\n        }\n    }\n  }\n\n  // ── Phase 2: Build SVG string ──\n  var svgMarkup = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + chartWidth + '\" height=\"' + chartHeight + '\" viewBox=\"0 0 ' + chartWidth + ' ' + chartHeight + '\" class=\"chart\">';\n\n  // Grid\n  if (showGrid) {\n    var gridPath = '';\n    if (horizontal) {\n      for (ti = 0; ti < tickCount; ti++)\n        gridPath += 'M' + gridPositions[ti] + ',' + padding.top + 'V' + plotBottom;\n    } else {\n      for (ti = 0; ti < tickCount; ti++)\n        gridPath += 'M' + padding.left + ',' + gridPositions[ti] + 'H' + (padding.left + plotWidth);\n    }\n    svgMarkup += '<path d=\"' + gridPath + '\" class=\"chart-grid\"' + (gridDashed ? ' stroke-dasharray=\"3 4\"' : '') + '/>';\n  }\n\n  // Zero line (if bi-polar)\n  if (minVal < 0) {\n    if (horizontal) {\n      var zx = (padding.left + ((0 - minVal) / range) * plotWidth) | 0;\n      svgMarkup += '<line x1=\"' + zx + '\" y1=\"' + padding.top + '\" x2=\"' + zx + '\" y2=\"' + plotBottom +\n        '\" stroke=\"#999\" stroke-width=\"1\" shape-rendering=\"crispEdges\"/>';\n    } else {\n      svgMarkup += '<line x1=\"' + padding.left + '\" y1=\"' + zeroY + '\" x2=\"' + (padding.left + plotWidth) + '\" y2=\"' + zeroY +\n        '\" stroke=\"#999\" stroke-width=\"1\" shape-rendering=\"crispEdges\"/>';\n    }\n  }\n\n  // Bars\n  for (si = 0; si < seriesCount; si++) {\n    var color = colors[si % colors.length];\n    for (ci = 0; ci < catCount; ci++) {\n      var idx = si * catCount + ci;\n      svgMarkup += '<rect x=\"' + barX[idx] + '\" y=\"' + barY[idx] + '\" width=\"' + barW[idx] + '\" height=\"' + barH[idx] +\n        '\" fill=\"' + color + '\" class=\"chart-bar\"/>';\n    }\n  }\n\n  svgMarkup += '</svg>';\n\n  // ── Phase 3: Build HTML label overlay ──\n  var labelMarkup = '<div class=\"chart-labels\">';\n\n  if (showTicks) {\n    if (horizontal) {\n      // Value tick labels on X-axis (bottom)\n      for (ti = 0; ti < tickCount; ti++)\n        labelMarkup += '<span class=\"chart-tick-x\" style=\"left:' + gridPositions[ti] + 'px;top:' + (plotBottom + 6) + 'px\">' + gridLabels[ti] + '</span>';\n\n      // Category labels on Y-axis (left, centered on each group)\n      for (ci = 0; ci < catCount; ci++) {\n        var centerY = (padding.top + ci * groupSize + groupSize / 2) | 0;\n        labelMarkup += '<span class=\"chart-tick-y\" style=\"left:' + (padding.left - 4) + 'px;top:' + (centerY - 1) + 'px\">' + labels[ci] + '</span>';\n      }\n    } else {\n      // Value tick labels on Y-axis\n      for (ti = 0; ti < tickCount; ti++)\n        labelMarkup += '<span class=\"chart-tick-y\" style=\"left:' + (padding.left - 4) + 'px;top:' + (gridPositions[ti] - 1) + 'px\">' + gridLabels[ti] + '</span>';\n\n      // Category labels on X-axis (bottom)\n      for (ci = 0; ci < catCount; ci++) {\n        var centerX = (padding.left + ci * groupSize + groupSize / 2) | 0;\n        labelMarkup += '<span class=\"chart-tick-x\" style=\"left:' + centerX + 'px;top:' + (plotBottom + 6) + 'px\">' + labels[ci] + '</span>';\n      }\n    }\n  }\n\n  // Axis titles\n  if (xLabel)\n    labelMarkup += '<span class=\"chart-title\" style=\"left:' + (padding.left + (plotWidth >> 1)) + 'px;top:' + (chartHeight - 10) + 'px\">' + xLabel + '</span>';\n  if (yLabel)\n    labelMarkup += '<span class=\"chart-title\" style=\"left:4px;top:' + (padding.top - 14) + 'px;transform:none;text-align:left\">' + yLabel + '</span>';\n\n  labelMarkup += '</div>';\n\n  // ── Phase 4: Single innerHTML write ──\n  container.style.cssText = 'position:relative;width:' + chartWidth + 'px;height:' + chartHeight + 'px';\n  container.innerHTML = svgMarkup + labelMarkup;\n\n  // ── Phase 5: Auto-resize ──\n  if (!config.width) {\n    observeResize(container, function () { NanoBarChart(containerId, config); });\n  }\n\n  // ── Phase 6: Lazy hover ──\n  if (!hoverEnabled) return;\n\n  var svgEl = container.firstChild as SVGSVGElement;\n  var highlight: SVGRectElement | null = null;\n  var tooltip: HTMLDivElement | null = null;\n\n  function ensureHover() {\n    if (!highlight) {\n      highlight = document.createElementNS(SVG_NS, 'rect') as SVGRectElement;\n      highlight.setAttribute('class', 'chart-indicator');\n      highlight.setAttribute('fill', 'rgba(255,255,255,0.3)');\n      highlight.setAttribute('stroke', '#333');\n      highlight.setAttribute('stroke-width', '1');\n      highlight.style.display = 'none';\n      svgEl.appendChild(highlight);\n    }\n    if (!tooltip) {\n      tooltip = document.createElement('div') as HTMLDivElement;\n      tooltip.className = 'chart-tooltip';\n      container.appendChild(tooltip);\n    }\n  }\n\n  attachHoverListeners(container, svgEl,\n    function (mx, my) {\n      if (mx < padding.left || mx > padding.left + plotWidth || my < padding.top || my > plotBottom) {\n        if (highlight) highlight.style.display = 'none';\n        if (tooltip) tooltip.style.opacity = '0';\n        return;\n      }\n\n      // Snap to category, then find nearest bar by distance to center\n      var nearCat: number;\n      if (horizontal) {\n        nearCat = ((my - padding.top) / groupSize) | 0;\n      } else {\n        nearCat = ((mx - padding.left) / groupSize) | 0;\n      }\n      if (nearCat >= catCount) nearCat = catCount - 1;\n      if (nearCat < 0) nearCat = 0;\n\n      var bestIdx = -1;\n      var bestDist = Infinity;\n      for (si = 0; si < seriesCount; si++) {\n        var idx = si * catCount + nearCat;\n        var cx = barX[idx] + (barW[idx] >> 1);\n        var cy = barY[idx] + (barH[idx] >> 1);\n        var dx = mx - cx, dy = my - cy;\n        var dist = dx * dx + dy * dy;\n        if (dist < bestDist) { bestDist = dist; bestIdx = idx; }\n      }\n\n      if (bestIdx === -1) return;\n\n      ensureHover();\n\n      var bsi = (bestIdx / catCount) | 0;\n      var bci = bestIdx % catCount;\n\n      highlight!.setAttribute('x', '' + barX[bestIdx]);\n      highlight!.setAttribute('y', '' + barY[bestIdx]);\n      highlight!.setAttribute('width', '' + barW[bestIdx]);\n      highlight!.setAttribute('height', '' + barH[bestIdx]);\n      highlight!.setAttribute('stroke', colors[bsi % colors.length]);\n      highlight!.style.display = '';\n\n      var tipX: number, tipY: number;\n      if (horizontal) {\n        tipX = barX[bestIdx] + barW[bestIdx];\n        tipY = barY[bestIdx] + (barH[bestIdx] >> 1);\n        tooltip!.style.transform = 'translate(' + (tipX + 8) + 'px,' + tipY + 'px) translate(0,-50%)';\n      } else {\n        tipX = barX[bestIdx] + (barW[bestIdx] >> 1);\n        tipY = barY[bestIdx];\n        tooltip!.style.transform = 'translate(' + tipX + 'px,' + (tipY - 10) + 'px) translate(-50%,-100%)';\n      }\n\n      tooltip!.innerHTML = (seriesCount > 1 ? '<b>Series ' + (bsi + 1) + '</b><br>' : '') +\n        labels[bci] + ': ' + data[bsi][bci];\n      tooltip!.style.opacity = '1';\n    },\n    function () {\n      if (highlight) highlight.style.display = 'none';\n      if (tooltip) tooltip.style.opacity = '0';\n    }\n  );\n}\n","import { SVG_NS, attachHoverListeners, observeResize } from './shared';\n\n/**\n * Configuration for a pie chart instance.\n */\nexport interface PieChartConfig {\n  /** One numeric value per slice. */\n  data: number[];\n  /** Label per slice. Must match data length. */\n  labels: string[];\n  /** Color per slice. Defaults to Thruscan brand palette. */\n  colors?: string[];\n  /** Chart width in pixels. Defaults to container's clientWidth or 350. */\n  width?: number;\n  /** Chart height in pixels. Defaults to width (square). */\n  height?: number;\n  /** Donut mode (hollow center). Default false. */\n  donut?: boolean;\n  /** Donut ring thickness in pixels. Default 60. */\n  donutWidth?: number;\n  /** Show labels outside slices. Default true. */\n  showLabels?: boolean;\n  /** Enable hover tooltip. Default true. */\n  hover?: boolean;\n}\n\nvar TWO_PI = Math.PI * 2;\n\n/**\n * Creates a high-performance SVG+HTML hybrid pie/donut chart inside the specified container.\n */\nexport function NanoPieChart(containerId: string, config: PieChartConfig): void {\n  var data = config.data;\n  var labels = config.labels;\n  var colors = config.colors || ['#215CAF', '#007894', '#00C9A7', '#DE4437', '#F69C3D', '#0d3a6e', '#003d4a', '#006651'];\n  var isDonut = config.donut === true;\n  var donutWidth = config.donutWidth !== undefined ? config.donutWidth : 60;\n  var showLabels = config.showLabels !== false;\n  var hoverEnabled = config.hover !== false;\n\n  var container = document.getElementById(containerId)!;\n  if (!container) return;\n  var chartWidth = config.width || container.clientWidth || 350;\n  var chartHeight = config.height || chartWidth;\n  var sliceCount = data.length;\n\n  var centerX = chartWidth / 2;\n  var centerY = chartHeight / 2;\n  var outerR = Math.min(centerX, centerY) - (showLabels ? 40 : 10);\n  var innerR = isDonut ? Math.max(outerR - donutWidth, 0) : 0;\n\n  // ── Phase 1: Pure math (zero DOM) ──\n  var i: number;\n  var total = 0;\n  for (i = 0; i < sliceCount; i++) total += data[i];\n\n  // Pre-compute per-slice: startAngle, endAngle, percentage\n  var startAngles = new Float64Array(sliceCount);\n  var endAngles = new Float64Array(sliceCount);\n  var percentages = new Float64Array(sliceCount);\n  var angle = -Math.PI / 2; // start at 12 o'clock\n\n  for (i = 0; i < sliceCount; i++) {\n    startAngles[i] = angle;\n    var sliceAngle = total > 0 ? (data[i] / total) * TWO_PI : 0;\n    percentages[i] = total > 0 ? (data[i] / total) * 100 : 0;\n    angle += sliceAngle;\n    endAngles[i] = angle;\n  }\n\n  // ── Phase 2: Build SVG string ──\n  var svgMarkup = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + chartWidth + '\" height=\"' + chartHeight + '\" viewBox=\"0 0 ' + chartWidth + ' ' + chartHeight + '\" class=\"chart\">';\n\n  for (i = 0; i < sliceCount; i++) {\n    // Skip tiny slices (<0.5°) to avoid rendering artifacts\n    if (endAngles[i] - startAngles[i] < 0.009) continue;\n\n    var color = colors[i % colors.length];\n    var cos1 = Math.cos(startAngles[i]), sin1 = Math.sin(startAngles[i]);\n    var cos2 = Math.cos(endAngles[i]), sin2 = Math.sin(endAngles[i]);\n    var largeArc = endAngles[i] - startAngles[i] > Math.PI ? 1 : 0;\n\n    var ox1 = centerX + outerR * cos1, oy1 = centerY + outerR * sin1;\n    var ox2 = centerX + outerR * cos2, oy2 = centerY + outerR * sin2;\n\n    var pathData: string;\n    if (isDonut) {\n      var ix1 = centerX + innerR * cos1, iy1 = centerY + innerR * sin1;\n      var ix2 = centerX + innerR * cos2, iy2 = centerY + innerR * sin2;\n      // Outer arc clockwise, line to inner, inner arc counter-clockwise, close\n      pathData = 'M' + ox1.toFixed(2) + ',' + oy1.toFixed(2)\n        + 'A' + outerR + ',' + outerR + ' 0 ' + largeArc + ' 1 ' + ox2.toFixed(2) + ',' + oy2.toFixed(2)\n        + 'L' + ix2.toFixed(2) + ',' + iy2.toFixed(2)\n        + 'A' + innerR + ',' + innerR + ' 0 ' + largeArc + ' 0 ' + ix1.toFixed(2) + ',' + iy1.toFixed(2)\n        + 'Z';\n    } else {\n      // Move to center, line to arc start, arc, close\n      pathData = 'M' + centerX.toFixed(2) + ',' + centerY.toFixed(2)\n        + 'L' + ox1.toFixed(2) + ',' + oy1.toFixed(2)\n        + 'A' + outerR + ',' + outerR + ' 0 ' + largeArc + ' 1 ' + ox2.toFixed(2) + ',' + oy2.toFixed(2)\n        + 'Z';\n    }\n\n    svgMarkup += '<path d=\"' + pathData + '\" fill=\"' + color + '\" class=\"chart-slice\"/>';\n  }\n\n  svgMarkup += '</svg>';\n\n  // ── Phase 3: Build HTML label overlay ──\n  var labelMarkup = '<div class=\"chart-labels\">';\n\n  if (showLabels) {\n    var labelR = outerR + 20;\n    for (i = 0; i < sliceCount; i++) {\n      // Skip labels for tiny slices (<5%)\n      if (percentages[i] < 5) continue;\n\n      var midAngle = (startAngles[i] + endAngles[i]) / 2;\n      var lx = centerX + labelR * Math.cos(midAngle);\n      var ly = centerY + labelR * Math.sin(midAngle);\n\n      labelMarkup += '<span style=\"left:' + lx.toFixed(1) + 'px;top:' + ly.toFixed(1)\n        + 'px;transform:translate(-50%,-50%);text-align:center\">'\n        + labels[i] + ' ' + percentages[i].toFixed(0) + '%</span>';\n    }\n  }\n\n  labelMarkup += '</div>';\n\n  // ── Phase 4: Single innerHTML write ──\n  container.style.cssText = 'position:relative;width:' + chartWidth + 'px;height:' + chartHeight + 'px';\n  container.innerHTML = svgMarkup + labelMarkup;\n\n  // ── Phase 5: Auto-resize ──\n  if (!config.width) {\n    observeResize(container, function () { NanoPieChart(containerId, config); });\n  }\n\n  // ── Phase 6: Lazy hover ──\n  if (!hoverEnabled) return;\n\n  var svgEl = container.firstChild as SVGSVGElement;\n  var highlight: SVGPathElement | null = null;\n  var tooltip: HTMLDivElement | null = null;\n  var lastSlice = -1;\n\n  function ensureHover() {\n    if (!highlight) {\n      highlight = document.createElementNS(SVG_NS, 'path') as SVGPathElement;\n      highlight.setAttribute('class', 'chart-indicator');\n      highlight.setAttribute('fill', 'none');\n      highlight.setAttribute('stroke', '#fff');\n      highlight.setAttribute('stroke-width', '3');\n      highlight.style.display = 'none';\n      svgEl.appendChild(highlight);\n    }\n    if (!tooltip) {\n      tooltip = document.createElement('div') as HTMLDivElement;\n      tooltip.className = 'chart-tooltip';\n      container.appendChild(tooltip);\n    }\n  }\n\n  attachHoverListeners(container, svgEl,\n    function (mx, my) {\n      var dx = mx - centerX, dy = my - centerY;\n      var dist = Math.sqrt(dx * dx + dy * dy);\n\n      // Outside pie or inside donut hole\n      if (dist > outerR || dist < innerR) {\n        if (highlight) highlight.style.display = 'none';\n        if (tooltip) tooltip.style.opacity = '0';\n        lastSlice = -1;\n        return;\n      }\n\n      // Find slice by angle\n      var hoverAngle = Math.atan2(dy, dx);\n      // Normalize to match our startAngles range [-π/2, 3π/2)\n      if (hoverAngle < -Math.PI / 2) hoverAngle += TWO_PI;\n\n      var hitSlice = -1;\n      for (var s = 0; s < sliceCount; s++) {\n        if (hoverAngle >= startAngles[s] && hoverAngle < endAngles[s]) {\n          hitSlice = s;\n          break;\n        }\n      }\n\n      if (hitSlice === -1) return;\n\n      ensureHover();\n\n      // Only rebuild highlight path if slice changed\n      if (hitSlice !== lastSlice) {\n        lastSlice = hitSlice;\n        // Reuse the same arc path as the slice for the highlight outline\n        var cos1 = Math.cos(startAngles[hitSlice]), sin1 = Math.sin(startAngles[hitSlice]);\n        var cos2 = Math.cos(endAngles[hitSlice]), sin2 = Math.sin(endAngles[hitSlice]);\n        var largeArc = endAngles[hitSlice] - startAngles[hitSlice] > Math.PI ? 1 : 0;\n        var ox1 = centerX + outerR * cos1, oy1 = centerY + outerR * sin1;\n        var ox2 = centerX + outerR * cos2, oy2 = centerY + outerR * sin2;\n\n        var hPath: string;\n        if (isDonut) {\n          var ix1 = centerX + innerR * cos1, iy1 = centerY + innerR * sin1;\n          var ix2 = centerX + innerR * cos2, iy2 = centerY + innerR * sin2;\n          hPath = 'M' + ox1.toFixed(2) + ',' + oy1.toFixed(2)\n            + 'A' + outerR + ',' + outerR + ' 0 ' + largeArc + ' 1 ' + ox2.toFixed(2) + ',' + oy2.toFixed(2)\n            + 'L' + ix2.toFixed(2) + ',' + iy2.toFixed(2)\n            + 'A' + innerR + ',' + innerR + ' 0 ' + largeArc + ' 0 ' + ix1.toFixed(2) + ',' + iy1.toFixed(2)\n            + 'Z';\n        } else {\n          hPath = 'M' + centerX.toFixed(2) + ',' + centerY.toFixed(2)\n            + 'L' + ox1.toFixed(2) + ',' + oy1.toFixed(2)\n            + 'A' + outerR + ',' + outerR + ' 0 ' + largeArc + ' 1 ' + ox2.toFixed(2) + ',' + oy2.toFixed(2)\n            + 'Z';\n        }\n        highlight!.setAttribute('d', hPath);\n      }\n\n      highlight!.style.display = '';\n\n      // Tooltip near cursor\n      tooltip!.innerHTML = '<b>' + labels[hitSlice] + '</b><br>'\n        + data[hitSlice] + ' (' + percentages[hitSlice].toFixed(1) + '%)';\n      tooltip!.style.transform = 'translate(' + mx + 'px,' + (my - 40) + 'px) translate(-50%,-100%)';\n      tooltip!.style.opacity = '1';\n    },\n    function () {\n      if (highlight) highlight.style.display = 'none';\n      if (tooltip) tooltip.style.opacity = '0';\n      lastSlice = -1;\n    }\n  );\n}\n"],"mappings":"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","names":["src_exports","__export","NanoBarChart","NanoLineChart","NanoPieChart","__toCommonJS","SVG_NS","attachHoverListeners","container","svgEl","onUpdate","onLeave","rafPending","lastCX","lastCY","schedule","r","e","t","observeResize","render","parent","lastW","ro","newW","NanoLineChart","containerId","config","data","labels","xLabel","yLabel","colors","dp","padding","smooth","areaFill","areaOpacity","showTicks","showGrid","gridDashed","strokeWidth","hoverEnabled","container","chartWidth","chartHeight","plotWidth","plotHeight","plotBottom","seriesIndex","pointIndex","minValue","maxValue","range","pointCount","stepX","tickCount","tickStep","totalCoords","coordsX","coordsY","coordIndex","gridYPositions","gridLabels","tickIndex","tickValue","svgMarkup","gridPath","ci","pathData","prevI","next2I","curX","curY","nextX","nextY","prevX","prevY","next2X","next2Y","firstX","lastX","labelMarkup","observeResize","svg","indicator","tooltip","ensureHoverElements","SVG_NS","attachHoverListeners","mouseX","mouseY","relativeX","nearestIndex","bestSeriesIndex","bestDistance","searchIndex","distance","pointX","pointY","NanoBarChart","containerId","config","data","labels","xLabel","yLabel","colors","stacked","horizontal","showTicks","showGrid","gridDashed","hoverEnabled","barGap","dp","padding","container","chartWidth","chartHeight","plotWidth","plotHeight","plotBottom","seriesCount","catCount","si","ci","val","ti","minVal","maxVal","colSum","range","tickCount","tickStep","gridPositions","gridLabels","totalBars","barX","barY","barW","barH","groupSize","zeroY","zeroX","tickVal","hBarHeight","hGroupStart","idx","valX","stackBarWidth","stackBarOffset","cumPos","baseY","topY","singleBarWidth","groupBarStart","svgMarkup","gridPath","zx","color","labelMarkup","centerY","centerX","observeResize","svgEl","highlight","tooltip","ensureHover","SVG_NS","attachHoverListeners","mx","my","nearCat","bestIdx","bestDist","cx","cy","dx","dy","dist","bsi","bci","tipX","tipY","TWO_PI","NanoPieChart","containerId","config","data","labels","colors","isDonut","donutWidth","showLabels","hoverEnabled","container","chartWidth","chartHeight","sliceCount","centerX","centerY","outerR","innerR","total","startAngles","endAngles","percentages","angle","sliceAngle","svgMarkup","color","cos1","sin1","cos2","sin2","largeArc","ox1","oy1","ox2","oy2","pathData","ix1","iy1","ix2","iy2","labelMarkup","labelR","midAngle","lx","ly","observeResize","svgEl","highlight","tooltip","lastSlice","ensureHover","SVG_NS","attachHoverListeners","mx","my","dx","dy","dist","hoverAngle","hitSlice","s","hPath","NanoLineChart","NanoBarChart","NanoPieChart"]}