kanto-ds 1.2.0 → 1.4.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 (116) hide show
  1. package/README.md +24 -6
  2. package/dist/chunks/{defaults-DKzFsNbv.js → defaults-BwgjMcww.js} +27 -26
  3. package/dist/chunks/{defaults-DKzFsNbv.js.map → defaults-BwgjMcww.js.map} +1 -1
  4. package/dist/chunks/index-DSSLJirw.js +79 -0
  5. package/dist/chunks/index-DSSLJirw.js.map +1 -0
  6. package/dist/chunks/kt-element-E-tfJpGQ.js +52 -0
  7. package/dist/chunks/kt-element-E-tfJpGQ.js.map +1 -0
  8. package/dist/components/core/kt-avatar/kt-avatar.js +8 -7
  9. package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -1
  10. package/dist/components/core/kt-badge/kt-badge.js +7 -6
  11. package/dist/components/core/kt-badge/kt-badge.js.map +1 -1
  12. package/dist/components/core/kt-button/kt-button.js +1 -1
  13. package/dist/components/core/kt-card/kt-card.js +1 -1
  14. package/dist/components/core/kt-code/kt-code.js +31 -30
  15. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  16. package/dist/components/core/kt-icon/kt-icon.js +2 -2
  17. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  18. package/dist/components/core/kt-split-button/kt-split-button.d.ts +2 -2
  19. package/dist/components/core/kt-split-button/kt-split-button.js +27 -26
  20. package/dist/components/core/kt-split-button/kt-split-button.js.map +1 -1
  21. package/dist/components/data/kt-chart/kt-chart.d.ts +2 -2
  22. package/dist/components/data/kt-chart/kt-chart.js +222 -221
  23. package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
  24. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  25. package/dist/components/data/kt-pagination/kt-pagination.d.ts +1 -1
  26. package/dist/components/data/kt-pagination/kt-pagination.js +29 -28
  27. package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -1
  28. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  29. package/dist/components/data/kt-table/kt-table.d.ts +2 -2
  30. package/dist/components/data/kt-table/kt-table.js +30 -29
  31. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  32. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  33. package/dist/components/feedback/kt-alert/kt-alert.js +17 -16
  34. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
  35. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  36. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  37. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  38. package/dist/components/feedback/kt-toast/kt-toast.js +25 -19
  39. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  40. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  41. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  42. package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +66 -0
  43. package/dist/components/forms/kt-checkbox/kt-checkbox.js +198 -0
  44. package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -0
  45. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +2 -2
  46. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +60 -57
  47. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  48. package/dist/components/forms/kt-form/kt-form.js +11 -10
  49. package/dist/components/forms/kt-form/kt-form.js.map +1 -1
  50. package/dist/components/forms/kt-input/kt-input.js +56 -55
  51. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  52. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +1 -1
  53. package/dist/components/forms/kt-input-menu/kt-input-menu.js +57 -56
  54. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
  55. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  56. package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +103 -0
  57. package/dist/components/forms/kt-radio-group/kt-radio-group.js +265 -0
  58. package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -0
  59. package/dist/components/forms/kt-select/kt-select.d.ts +2 -2
  60. package/dist/components/forms/kt-select/kt-select.js +62 -61
  61. package/dist/components/forms/kt-select/kt-select.js.map +1 -1
  62. package/dist/components/forms/kt-textarea/kt-textarea.js +9 -8
  63. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
  64. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  65. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +1 -1
  66. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +6 -5
  67. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -1
  68. package/dist/components/navigation/kt-header/kt-header.js +11 -10
  69. package/dist/components/navigation/kt-header/kt-header.js.map +1 -1
  70. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  71. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +44 -43
  72. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  73. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +1 -1
  74. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +6 -5
  75. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
  76. package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
  77. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  78. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +12 -6
  79. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -1
  80. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
  81. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +3 -3
  82. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +30 -27
  83. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -1
  84. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +1 -1
  85. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +8 -7
  86. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  87. package/dist/components/overlays/kt-modal/kt-modal.js +5 -4
  88. package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -1
  89. package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +1 -1
  90. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +24 -23
  91. package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -1
  92. package/dist/custom-elements.json +1870 -1071
  93. package/dist/icons/defaults.d.ts +1 -0
  94. package/dist/icons/index.js +1 -1
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.js +93 -83
  97. package/dist/index.js.map +1 -1
  98. package/dist/internal/kt-element.d.ts +6 -1
  99. package/dist/internal/strings.d.ts +103 -0
  100. package/dist/react/index.d.ts +13 -0
  101. package/dist/react/index.js +176 -157
  102. package/dist/react/index.js.map +1 -1
  103. package/dist/react/jsx.d.ts +12 -1
  104. package/dist/strings/index.d.ts +11 -0
  105. package/dist/strings/index.js +8 -0
  106. package/dist/strings/index.js.map +1 -0
  107. package/dist/tokens/base.css +56 -0
  108. package/dist/vscode.css-custom-data.json +12 -0
  109. package/dist/vscode.html-custom-data.json +85 -0
  110. package/dist/vue/index.d.ts +6 -0
  111. package/dist/vue/index.js +9 -7
  112. package/dist/vue/index.js.map +1 -1
  113. package/dist/web-types.json +263 -39
  114. package/package.json +19 -3
  115. package/dist/chunks/kt-element-B_jjQDhg.js +0 -38
  116. package/dist/chunks/kt-element-B_jjQDhg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"kt-chart.js","sources":["../../../../src/components/data/kt-chart/scale.ts","../../../../src/components/data/kt-chart/geometry.ts","../../../../src/components/data/kt-chart/cartesian.ts","../../../../src/components/data/kt-chart/point.ts","../../../../src/components/data/kt-chart/radial.ts","../../../../src/components/data/kt-chart/kt-chart.ts"],"sourcesContent":["/**\n * Value scales: how far the axis runs, and where its ticks fall.\n *\n * Ticks land on 1, 2 or 5 times a power of ten. A reader can interpolate\n * between 0, 20 and 40; between 0, 17.75 and 35.5 they cannot.\n */\n\nexport interface Ticks {\n readonly min: number;\n readonly max: number;\n readonly step: number;\n readonly values: readonly number[];\n}\n\n/** The nearest 1, 2, 5 or 10 × 10ⁿ. */\nfunction niceNumber(value: number): number {\n const exponent = Math.floor(Math.log10(value));\n const fraction = value / 10 ** exponent;\n const nice = fraction < 1.5 ? 1 : fraction < 3 ? 2 : fraction < 7 ? 5 : 10;\n return nice * 10 ** exponent;\n}\n\n/** Round steps covering `lo…hi`, aiming for about `count` ticks. */\nexport function niceTicks(lo: number, hi: number, count: number): Ticks {\n if (hi === lo) {\n // A flat series still needs an axis; open it around the value.\n const pad = Math.abs(lo) || 1;\n lo -= pad;\n hi += pad;\n }\n\n // The step is rounded from the real range. Rounding the range first as well\n // (Heckbert's original) compounds the two and can run the axis to nearly\n // twice the data: 610 became an axis to 1000.\n const step = niceNumber((hi - lo) / Math.max(1, count - 1));\n const decimals = Math.max(0, -Math.floor(Math.log10(step)));\n // toFixed strips the 0.30000000000000004; `|| 0` turns -0 into 0.\n const clean = (value: number) => Number(value.toFixed(decimals)) || 0;\n\n const min = clean(Math.floor(lo / step) * step);\n const max = clean(Math.ceil(hi / step) * step);\n const values: number[] = [];\n for (let index = 0; min + index * step <= max + step / 2; index += 1) {\n values.push(clean(min + index * step));\n }\n\n return { min, max, step, values };\n}\n\n/**\n * The extent of the data.\n *\n * `stacks` are drawn on top of each other: each is a list of series, each\n * series a list of values by index, and a stack is as tall as its positive\n * values added up and as deep as its negative ones. `loose` series stand alone.\n * `includeZero` is for bars and areas, whose length is only honest from zero.\n */\nexport function valueBounds(\n stacks: readonly (readonly (readonly number[])[])[],\n loose: readonly (readonly number[])[],\n { includeZero }: { includeZero: boolean },\n): { lo: number; hi: number } {\n const extremes: number[] = loose.flat();\n\n for (const stack of stacks) {\n const length = Math.max(0, ...stack.map((series) => series.length));\n for (let index = 0; index < length; index += 1) {\n let above = 0;\n let below = 0;\n for (const series of stack) {\n const value = series[index] ?? 0;\n if (value >= 0) above += value;\n else below += value;\n }\n extremes.push(above, below);\n }\n }\n\n const finite = extremes.filter(Number.isFinite);\n if (finite.length === 0) return { lo: 0, hi: 1 };\n\n let lo = Math.min(...finite);\n let hi = Math.max(...finite);\n if (includeZero) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n return { lo, hi };\n}\n\n/** Nice ticks, pinned to an author's `min` and `max` when they gave any. */\nexport function ticksFor(\n lo: number,\n hi: number,\n count: number,\n limits: { readonly min: number | null; readonly max: number | null },\n): Ticks {\n const ticks = niceTicks(limits.min ?? lo, limits.max ?? hi, count);\n const min = limits.min ?? ticks.min;\n const max = limits.max ?? ticks.max;\n if (max <= min) return ticks;\n\n return {\n min,\n max,\n step: ticks.step,\n values: ticks.values.filter((value) => value >= min && value <= max),\n };\n}\n\n/** Where `value` falls between `from` and `to`, in px. */\nexport function project(value: number, ticks: Ticks, from: number, to: number): number {\n return from + ((value - ticks.min) / (ticks.max - ticks.min)) * (to - from);\n}\n\n/** How many ticks fit along `length`, one every `spacing` px, between three and six. */\nexport function tickCount(length: number, spacing: number): number {\n return Math.min(6, Math.max(3, Math.round(length / spacing)));\n}\n","/**\n * SVG path geometry for the chart's marks. Every function is pure and writes\n * coordinates rounded to two decimals, so paths stay short and comparable.\n */\n\nexport type Point = readonly [number, number];\n\n/** One cubic Bézier piece of a curve. */\nexport interface Segment {\n readonly from: Point;\n readonly c1: Point;\n readonly c2: Point;\n readonly to: Point;\n}\n\nexport const TAU = Math.PI * 2;\n\nexport const round = (value: number): number => Math.round(value * 100) / 100 || 0;\n\nconst xy = ([x, y]: Point) => `${round(x)},${round(y)}`;\n\n/** Straight segments through `points`. `move` false continues an open path. */\nexport function linearPath(points: readonly Point[], move = true): string {\n return points.map((point, index) => `${index === 0 && move ? 'M' : 'L'}${xy(point)}`).join(' ');\n}\n\n/**\n * A monotone cubic through `points` (Fritsch–Carlson).\n *\n * Between two samples the curve stays within their range, so it never draws a\n * peak or a dip that is not in the data — the failure of the cardinal splines\n * most charts use. Needs at least three points; fewer have nothing to smooth.\n */\nexport function monotoneSegments(points: readonly Point[]): Segment[] {\n const count = points.length;\n if (count < 3) return [];\n\n const secants = points.slice(0, -1).map(([x0, y0], index) => {\n const [x1, y1] = points[index + 1]!;\n return x1 === x0 ? 0 : (y1 - y0) / (x1 - x0);\n });\n\n const tangents = points.map((_, index) => {\n if (index === 0) return secants[0]!;\n if (index === count - 1) return secants[count - 2]!;\n const before = secants[index - 1]!;\n const after = secants[index]!;\n // A turning point gets a flat tangent; otherwise the average slope.\n return before * after <= 0 ? 0 : (before + after) / 2;\n });\n\n secants.forEach((secant, index) => {\n if (secant === 0) {\n tangents[index] = 0;\n tangents[index + 1] = 0;\n return;\n }\n const a = tangents[index]! / secant;\n const b = tangents[index + 1]! / secant;\n const sum = a * a + b * b;\n // Past this circle the cubic overshoots; pull both tangents back onto it.\n if (sum > 9) {\n const tau = 3 / Math.sqrt(sum);\n tangents[index] = tau * a * secant;\n tangents[index + 1] = tau * b * secant;\n }\n });\n\n return secants.map((_, index) => {\n const from = points[index]!;\n const to = points[index + 1]!;\n const third = (to[0] - from[0]) / 3;\n return {\n from,\n c1: [from[0] + third, from[1] + tangents[index]! * third],\n c2: [to[0] - third, to[1] - tangents[index + 1]! * third],\n to,\n };\n });\n}\n\n/** A monotone curve as a path, or straight segments when there is nothing to smooth. */\nexport function monotonePath(points: readonly Point[], move = true): string {\n if (points.length < 3) return linearPath(points, move);\n\n const start = move ? `M${xy(points[0]!)}` : `L${xy(points[0]!)}`;\n return [\n start,\n ...monotoneSegments(points).map(({ c1, c2, to }) => `C${xy(c1)} ${xy(c2)} ${xy(to)}`),\n ].join(' ');\n}\n\n/** The point at `radius` and `angle` from a centre; 0 is twelve o'clock, clockwise. */\nexport function polar(cx: number, cy: number, radius: number, angle: number): Point {\n return [cx + radius * Math.sin(angle), cy - radius * Math.cos(angle)];\n}\n\n/**\n * A slice from `start` to `end`: a wedge to the centre when `inner` is 0, an\n * annular sector otherwise. A whole turn is drawn as circles (and a hole, with\n * `fill-rule=\"evenodd\"`) because a single SVG arc cannot close on itself.\n */\nexport function arcPath(\n cx: number,\n cy: number,\n inner: number,\n outer: number,\n start: number,\n end: number,\n): string {\n const span = end - start;\n if (span <= 0 || outer <= 0) return '';\n\n if (span >= TAU - 1e-6) {\n const circle = (radius: number, sweep: 0 | 1) => {\n const top = polar(cx, cy, radius, 0);\n const bottom = polar(cx, cy, radius, Math.PI);\n const arc = `A${round(radius)},${round(radius)} 0 1 ${sweep}`;\n return `M${xy(top)} ${arc} ${xy(bottom)} ${arc} ${xy(top)} Z`;\n };\n return inner > 0 ? `${circle(outer, 1)} ${circle(inner, 0)}` : circle(outer, 1);\n }\n\n const large = span > Math.PI ? 1 : 0;\n const outerArc = `A${round(outer)},${round(outer)} 0 ${large} 1 ${xy(polar(cx, cy, outer, end))}`;\n\n if (inner <= 0) {\n return `M${xy([cx, cy])} L${xy(polar(cx, cy, outer, start))} ${outerArc} Z`;\n }\n\n const innerArc = `A${round(inner)},${round(inner)} 0 ${large} 0 ${xy(polar(cx, cy, inner, start))}`;\n return `M${xy(polar(cx, cy, outer, start))} ${outerArc} L${xy(polar(cx, cy, inner, end))} ${innerArc} Z`;\n}\n\n/** Which end of a bar is rounded. The baseline end always stays square. */\nexport type Tip = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\n/**\n * A bar, rounded at its tip only. A bar rounded at the baseline too floats\n * above the axis instead of standing on it.\n */\nexport function barPath(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n tip: Tip,\n): string {\n const vertical = tip === 'top' || tip === 'bottom';\n const r = Math.max(\n 0,\n vertical ? Math.min(radius, width / 2, height) : Math.min(radius, height / 2, width),\n );\n const [x0, y0, x1, y1] = [x, y, x + width, y + height];\n const arc = (to: Point) => `A${round(r)},${round(r)} 0 0 1 ${xy(to)}`;\n const line = (to: Point) => `L${xy(to)}`;\n\n if (tip === 'none' || r === 0) {\n return `M${xy([x0, y0])} ${line([x1, y0])} ${line([x1, y1])} ${line([x0, y1])} Z`;\n }\n\n switch (tip) {\n case 'top':\n return `M${xy([x0, y1])} ${line([x0, y0 + r])} ${arc([x0 + r, y0])} ${line([x1 - r, y0])} ${arc([x1, y0 + r])} ${line([x1, y1])} Z`;\n case 'bottom':\n return `M${xy([x0, y0])} ${line([x1, y0])} ${line([x1, y1 - r])} ${arc([x1 - r, y1])} ${line([x0 + r, y1])} ${arc([x0, y1 - r])} Z`;\n case 'right':\n return `M${xy([x0, y0])} ${line([x1 - r, y0])} ${arc([x1, y0 + r])} ${line([x1, y1 - r])} ${arc([x1 - r, y1])} ${line([x0, y1])} Z`;\n case 'left':\n return `M${xy([x1, y0])} ${line([x1, y1])} ${line([x0 + r, y1])} ${arc([x0, y1 - r])} ${line([x0, y0 + r])} ${arc([x0 + r, y0])} Z`;\n }\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtMark, KtSeries, Measure, PlotBox } from './model.js';\nimport { project, tickCount, ticksFor, valueBounds, type Ticks } from './scale.js';\nimport { barPath, linearPath, monotonePath, type Point, type Tip } from './geometry.js';\n\n/**\n * Line, area and bar charts: one category axis, one value axis.\n *\n * The layout is computed once per render and every position is read from it,\n * so the marks, the labels, the tooltip and the hit test cannot disagree about\n * where a category is.\n */\n\nexport interface CartesianInput {\n readonly width: number;\n readonly height: number;\n readonly series: readonly KtSeries[];\n readonly hidden: ReadonlySet<number>;\n readonly labels: readonly string[];\n /** The chart's mark; a series can override it with its own `type`. */\n readonly type: KtMark;\n readonly stacked: boolean;\n readonly horizontal: boolean;\n readonly min: number | null;\n readonly max: number | null;\n readonly noAxis: boolean;\n readonly measure: Measure;\n readonly format: Format;\n}\n\nexport interface CartesianLayout {\n readonly box: PlotBox;\n readonly ticks: Ticks;\n /** How many categories there are. */\n readonly count: number;\n readonly horizontal: boolean;\n /** Categories are bands rather than points — true as soon as a bar is shown. */\n readonly banded: boolean;\n /** The mark each series is drawn as, by series index. */\n readonly marks: readonly KtMark[];\n /** Indices of the series that are not hidden. */\n readonly visible: readonly number[];\n}\n\n/** Room above the plot, to its right, and below it for the category labels. */\nconst PADDING = { top: 12, right: 8, bottom: 24 };\n/** Space between a label and the plot it labels. */\nconst LABEL_GAP = 12;\n/** Roughly one value tick per this many px of axis. */\nconst TICK_SPACING = { vertical: 48, horizontal: 96 };\n\nconst valuesOf = (series: KtSeries | undefined): readonly number[] => series?.values ?? [];\n\nexport function cartesianLayout(input: CartesianInput): CartesianLayout {\n const { series, hidden, labels, measure, format, noAxis, width, height } = input;\n\n const marks = series.map((entry) => entry.type ?? input.type);\n const visible = series.map((_, index) => index).filter((index) => !hidden.has(index));\n const shown = visible.map((index) => marks[index]!);\n const count = Math.max(labels.length, 0, ...series.map((entry) => valuesOf(entry).length));\n\n const banded = shown.length > 0 ? shown.includes('bar') : input.type === 'bar';\n const horizontal =\n input.horizontal && banded && (shown.length === 0 || shown.every((mark) => mark === 'bar'));\n\n // Bars stack with bars and areas with areas; lines always stand alone.\n const ofMark = (mark: KtMark) =>\n visible.filter((index) => marks[index] === mark).map((index) => valuesOf(series[index]));\n const stacks = input.stacked\n ? [ofMark('bar'), ofMark('area')].filter((stack) => stack.length)\n : [];\n const loose = input.stacked ? ofMark('line') : visible.map((index) => valuesOf(series[index]));\n // A bar's or an area's size is its distance from zero, so zero must be on the axis.\n const includeZero =\n shown.length > 0 ? shown.some((mark) => mark !== 'line') : input.type !== 'line';\n const { lo, hi } = valueBounds(stacks, loose, { includeZero });\n const limits = { min: input.min, max: input.max };\n\n if (!horizontal) {\n const plotHeight = Math.max(0, height - PADDING.top - PADDING.bottom);\n const ticks = ticksFor(lo, hi, tickCount(plotHeight, TICK_SPACING.vertical), limits);\n const widest = noAxis ? 0 : Math.max(0, ...ticks.values.map((value) => measure(format(value))));\n const left = noAxis ? 4 : Math.ceil(widest) + LABEL_GAP;\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - PADDING.right),\n height: plotHeight,\n },\n ticks,\n count,\n horizontal,\n banded,\n marks,\n visible,\n };\n }\n\n // Sideways: the categories take the left gutter, the values run along the bottom.\n const widestLabel = Math.max(0, ...labels.map(measure));\n const left = Math.ceil(Math.min(widestLabel, width * 0.4)) + LABEL_GAP;\n const plotWidth = Math.max(0, width - left - PADDING.right);\n const ticks = ticksFor(lo, hi, tickCount(plotWidth, TICK_SPACING.horizontal), limits);\n // The last value label is centred on the plot's right edge; keep half of it inside.\n const right = noAxis ? PADDING.right : Math.max(PADDING.right, measure(format(ticks.max)) / 2);\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - right),\n height: Math.max(0, height - PADDING.top - (noAxis ? 4 : PADDING.bottom)),\n },\n ticks,\n count,\n horizontal,\n banded,\n marks,\n visible,\n };\n}\n\n/** Where category `index` sits along its axis, in px. */\nexport function categoryCentre(layout: CartesianLayout, index: number): number {\n const { box, count, horizontal, banded } = layout;\n const start = horizontal ? box.y : box.x;\n const length = horizontal ? box.height : box.width;\n\n if (banded) return start + ((index + 0.5) * length) / Math.max(1, count);\n if (count <= 1) return start + length / 2;\n return start + (index / (count - 1)) * length;\n}\n\n/** Where `value` sits along the value axis, in px. */\nexport function valuePosition(layout: CartesianLayout, value: number): number {\n const { box, ticks, horizontal } = layout;\n return horizontal\n ? project(value, ticks, box.x, box.x + box.width)\n : project(value, ticks, box.y + box.height, box.y);\n}\n\n/** The category under a pointer at `x`, `y`: the band it is in, or the nearest sample. */\nexport function categoryAt(layout: CartesianLayout, x: number, y: number): number {\n const { box, count, horizontal, banded } = layout;\n if (count === 0) return -1;\n\n const position = horizontal ? y - box.y : x - box.x;\n const length = horizontal ? box.height : box.width;\n if (length <= 0) return -1;\n\n const index = banded\n ? Math.floor(position / (length / count))\n : Math.round((position / length) * (count - 1));\n return Math.min(Math.max(index, 0), count - 1);\n}\n\n/* ---------------------------------------------------------------- rendering */\n\nexport interface CartesianView extends CartesianInput {\n readonly layout: CartesianLayout;\n /** The active category, or -1. */\n readonly active: number;\n readonly smooth: boolean;\n readonly noGrid: boolean;\n readonly colorOf: (series: number) => string;\n /** Prefix for ids inside the shadow root, so two charts never share a gradient. */\n readonly idPrefix: string;\n}\n\n/** Bars fill this much of their band; the rest is the gap between categories. */\nconst GROUP_SHARE = 0.64;\nconst BAR_GAP = 2;\nconst BAR_RADIUS = 4;\nconst MAX_BAR = { grouped: 40, stacked: 48 };\n/** Below this many samples, and unsmoothed, every sample gets a dot. */\nconst DOTS_UP_TO = 12;\n\n/** `Array.prototype.findLastIndex`, which the ES2022 target does not have. */\nfunction lastIndexWhere<T>(items: readonly T[], test: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (test(items[index]!)) return index;\n }\n return -1;\n}\n\n/** A label cut to fit `width`, with an ellipsis. */\nfunction fit(text: string, width: number, measure: Measure): string {\n if (measure(text) <= width) return text;\n let cut = text;\n while (cut.length > 1 && measure(`${cut}…`) > width) cut = cut.slice(0, -1);\n return `${cut}…`;\n}\n\nfunction renderValueAxis(view: CartesianView): SVGTemplateResult {\n const { layout, noGrid, noAxis, format } = view;\n const { box, ticks, horizontal } = layout;\n\n const lines = noGrid\n ? nothing\n : ticks.values.map((value) => {\n const at = valuePosition(layout, value);\n return horizontal\n ? svg`<line class=\"grid\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`\n : svg`<line class=\"grid\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n });\n\n // Zero inside the range is the line a negative value hangs from; give it weight.\n const zero =\n ticks.min < 0 && ticks.max > 0\n ? (() => {\n const at = valuePosition(layout, 0);\n return horizontal\n ? svg`<line class=\"baseline\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`\n : svg`<line class=\"baseline\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n })()\n : nothing;\n\n const labels = noAxis\n ? nothing\n : ticks.values.map((value) => {\n const at = valuePosition(layout, value);\n return horizontal\n ? svg`<text class=\"tick-label\" x=${at} y=${box.y + box.height + 16} text-anchor=\"middle\">${format(value)}</text>`\n : svg`<text class=\"tick-label\" x=${box.x - 8} y=${at} text-anchor=\"end\" dominant-baseline=\"middle\">${format(value)}</text>`;\n });\n\n return svg`${lines}${zero}${labels}`;\n}\n\nfunction renderCategoryAxis(view: CartesianView): SVGTemplateResult {\n const { layout, labels, measure } = view;\n const { box, count, horizontal, banded } = layout;\n\n if (horizontal) {\n // One label per band while they fit, thinned when the bands get shorter than a line.\n const every = Math.max(1, Math.ceil(count / Math.max(1, Math.floor(box.height / 18))));\n return svg`${labels.map((text, index) =>\n index % every === 0\n ? svg`<text\n class=\"axis-label\"\n x=${box.x - 8}\n y=${categoryCentre(layout, index)}\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n >${fit(text, box.x - LABEL_GAP, measure)}</text>`\n : nothing,\n )}`;\n }\n\n // Thin the labels rather than letting them collide: each gets the widest one's room.\n const room = Math.max(0, ...labels.map(measure)) + LABEL_GAP;\n const every = Math.max(1, Math.ceil(count / Math.max(1, Math.floor(box.width / room))));\n\n return svg`${labels.map((text, index) => {\n if (index % every !== 0) return nothing;\n // On a line the first and last samples sit on the plot's edges; a centred\n // label there would hang out of the chart.\n const anchor =\n banded || count <= 1\n ? 'middle'\n : index === 0\n ? 'start'\n : index === count - 1\n ? 'end'\n : 'middle';\n return svg`<text\n class=\"axis-label\"\n x=${categoryCentre(layout, index)}\n y=${box.y + box.height + 16}\n text-anchor=${anchor}\n >${text}</text>`;\n })}`;\n}\n\n/** The screen points of one series' samples. */\nfunction pointsOf(\n view: CartesianView,\n values: readonly number[],\n offsets?: readonly number[],\n): Point[] {\n return values.map((value, index) => [\n categoryCentre(view.layout, index),\n valuePosition(view.layout, value + (offsets?.[index] ?? 0)),\n ]);\n}\n\nfunction pathThrough(view: CartesianView, points: readonly Point[], move = true): string {\n return view.smooth ? monotonePath(points, move) : linearPath(points, move);\n}\n\nfunction renderLinesAndAreas(view: CartesianView): SVGTemplateResult {\n const { layout, series, colorOf, active, idPrefix, stacked, smooth } = view;\n const { box, count, visible, marks } = layout;\n const floor = valuePosition(layout, Math.min(Math.max(0, layout.ticks.min), layout.ticks.max));\n\n // Running totals for stacked areas: each area sits on the ones before it.\n const stackBase = new Array<number>(count).fill(0);\n\n const fills: SVGTemplateResult[] = [];\n const strokes: SVGTemplateResult[] = [];\n\n for (const index of visible) {\n const mark = marks[index]!;\n if (mark === 'bar') continue;\n\n const values = valuesOf(series[index]);\n if (values.length === 0) continue;\n const color = colorOf(index);\n const onStack = mark === 'area' && stacked;\n const base = onStack ? [...stackBase] : undefined;\n const upper = pointsOf(view, values, base);\n\n if (mark === 'area') {\n const gradient = `${idPrefix}-fill-${index}`;\n const lower: Point[] = base\n ? values.map((_, i) => [categoryCentre(layout, i), valuePosition(layout, base[i]!)])\n : [\n [upper.at(-1)![0], floor],\n [upper[0]![0], floor],\n ];\n const closing = base\n ? pathThrough(view, [...lower].reverse(), false)\n : linearPath(lower, false);\n\n fills.push(svg`\n <defs>\n <linearGradient id=${gradient} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=${color} stop-opacity=\"0.28\" />\n <stop offset=\"100%\" stop-color=${color} stop-opacity=\"0.02\" />\n </linearGradient>\n </defs>\n <path class=\"area\" d=${`${pathThrough(view, upper)} ${closing} Z`} fill=${`url(#${gradient})`} />`);\n\n if (base) values.forEach((value, i) => (stackBase[i] = base[i]! + value));\n }\n\n strokes.push(\n svg`<path class=\"line\" d=${pathThrough(view, upper)} stroke=${color} pathLength=\"1\" />`,\n );\n\n if (count <= DOTS_UP_TO && !smooth) {\n strokes.push(\n svg`${upper.map(([x, y]) => svg`<circle class=\"point\" cx=${x} cy=${y} r=\"3\" fill=${color} />`)}`,\n );\n }\n if (active >= 0 && upper[active]) {\n const [x, y] = upper[active];\n strokes.push(svg`<circle class=\"marker\" cx=${x} cy=${y} r=\"5\" fill=${color} />`);\n }\n }\n\n const crosshair =\n active >= 0 && !layout.banded\n ? svg`<line class=\"crosshair\"\n x1=${categoryCentre(layout, active)} y1=${box.y}\n x2=${categoryCentre(layout, active)} y2=${box.y + box.height} />`\n : nothing;\n\n return svg`${fills}${crosshair}${strokes}`;\n}\n\n/** One bar or stack segment running from `from` to `to` on the value axis. */\nfunction barSegment(\n view: CartesianView,\n options: {\n readonly from: number;\n readonly to: number;\n /** Offset across the band, and thickness, in px. */\n readonly offset: number;\n readonly thickness: number;\n /** Round the tip: only the outermost segment of a bar has one. */\n readonly outer: boolean;\n readonly series: number;\n readonly index: number;\n },\n): SVGTemplateResult {\n const { layout, active, colorOf } = view;\n const { from, to, offset, thickness, outer, series, index } = options;\n const negative = to < from;\n\n let start = valuePosition(layout, from);\n let end = valuePosition(layout, to);\n // Stack segments meet with a hairline of surface between them, not fused.\n const inset = 0.5;\n const direction = Math.sign(end - start) || 1;\n if (from !== 0) start += inset * direction;\n if (!outer) end -= inset * direction;\n // A non-zero value never disappears into the baseline.\n if (Math.abs(end - start) < 1) end = start + direction;\n\n const low = Math.min(start, end);\n const length = Math.abs(end - start);\n const tip: Tip = !outer\n ? 'none'\n : layout.horizontal\n ? negative\n ? 'left'\n : 'right'\n : negative\n ? 'bottom'\n : 'top';\n\n const d = layout.horizontal\n ? barPath(low, offset, length, thickness, BAR_RADIUS, tip)\n : barPath(offset, low, thickness, length, BAR_RADIUS, tip);\n\n return svg`<path\n class=${`bar${negative ? ' negative' : ''}${layout.horizontal ? ' sideways' : ''}`}\n d=${d}\n fill=${colorOf(series)}\n data-series=${series}\n data-index=${index}\n opacity=${active === -1 || active === index ? 1 : 0.45}\n />`;\n}\n\nfunction renderBars(view: CartesianView): SVGTemplateResult | typeof nothing {\n const { layout, series } = view;\n const { box, count, horizontal, visible, marks } = layout;\n const bars = visible.filter((index) => marks[index] === 'bar');\n if (bars.length === 0 || count === 0) return nothing;\n\n const band = (horizontal ? box.height : box.width) / count;\n const group = band * GROUP_SHARE;\n const segments: SVGTemplateResult[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const centre = categoryCentre(layout, index);\n\n if (view.stacked) {\n // One bar per category. Positives pile up from zero and negatives down\n // from it, each pile rounded only at its far end.\n const thickness = Math.max(2, Math.min(MAX_BAR.stacked, group));\n const values = bars.map((seriesIndex) => valuesOf(series[seriesIndex])[index] ?? 0);\n const lastAbove = lastIndexWhere(values, (value) => value > 0);\n const lastBelow = lastIndexWhere(values, (value) => value < 0);\n let above = 0;\n let below = 0;\n\n values.forEach((value, position) => {\n if (value === 0) return;\n const from = value > 0 ? above : below;\n const to = from + value;\n if (value > 0) above = to;\n else below = to;\n segments.push(\n barSegment(view, {\n from,\n to,\n offset: centre - thickness / 2,\n thickness,\n outer: position === (value > 0 ? lastAbove : lastBelow),\n series: bars[position]!,\n index,\n }),\n );\n });\n continue;\n }\n\n const thickness = Math.max(\n 2,\n Math.min(MAX_BAR.grouped, (group - BAR_GAP * (bars.length - 1)) / bars.length),\n );\n const total = thickness * bars.length + BAR_GAP * (bars.length - 1);\n bars.forEach((seriesIndex, position) => {\n const value = valuesOf(series[seriesIndex])[index];\n if (value === undefined || value === 0) return;\n segments.push(\n barSegment(view, {\n from: 0,\n to: value,\n offset: centre - total / 2 + position * (thickness + BAR_GAP),\n thickness,\n outer: true,\n series: seriesIndex,\n index,\n }),\n );\n });\n }\n\n return svg`${segments}`;\n}\n\nexport function renderCartesian(view: CartesianView): SVGTemplateResult {\n return svg`\n ${renderValueAxis(view)}\n ${renderBars(view)}\n ${renderLinesAndAreas(view)}\n ${renderCategoryAxis(view)}`;\n}\n\n/** Where the tooltip for the active category points: at its tallest mark. */\nexport function tooltipAnchor(view: CartesianView): { x: number; y: number } {\n const { layout, series, active, stacked } = view;\n const at = (index: number) => valuesOf(series[index])[active] ?? 0;\n\n let peak = layout.ticks.min;\n for (const mark of ['bar', 'area', 'line'] as const) {\n const values = layout.visible.filter((index) => layout.marks[index] === mark).map(at);\n if (values.length === 0) continue;\n // A stack is as tall as its positive values together; anything else, its largest value.\n const top =\n stacked && mark !== 'line'\n ? values.filter((value) => value > 0).reduce((sum, value) => sum + value, 0)\n : Math.max(...values);\n peak = Math.max(peak, top);\n }\n\n const across = categoryCentre(layout, active);\n const along = valuePosition(layout, Math.min(peak, layout.ticks.max));\n return layout.horizontal ? { x: along, y: across } : { x: across, y: along };\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtPoint, KtSeries, Measure, PlotBox } from './model.js';\nimport { project, tickCount, ticksFor, type Ticks } from './scale.js';\nimport type { Point } from './geometry.js';\n\n/**\n * Scatter and bubble charts: two value axes, one dot per observation.\n *\n * Neither axis is forced through zero. A scatter plot is about how two\n * measures move together, and dragging the origin in would crush the cloud\n * into a corner.\n */\n\nexport interface PointInput {\n readonly width: number;\n readonly height: number;\n readonly series: readonly KtSeries[];\n readonly hidden: ReadonlySet<number>;\n readonly bubble: boolean;\n /** Pins the y axis. The x axis always follows the data. */\n readonly min: number | null;\n readonly max: number | null;\n readonly noAxis: boolean;\n readonly measure: Measure;\n readonly format: Format;\n readonly formatX: Format;\n}\n\nexport interface PointLayout {\n readonly box: PlotBox;\n readonly x: Ticks;\n readonly y: Ticks;\n /** The largest bubble size among visible points; 0 for a scatter. */\n readonly maxR: number;\n}\n\nconst PADDING = { top: 16, right: 16, bottom: 24 };\nconst LABEL_GAP = 12;\n/** The largest bubble's radius, in px. */\nconst MAX_BUBBLE = 24;\nconst MIN_BUBBLE = 3;\nconst DOT = 4;\n/** How close, in px, a pointer must be to pick a point up. */\nconst REACH = 24;\n\nconst pointsOf = (series: KtSeries | undefined): readonly KtPoint[] => series?.points ?? [];\n\nfunction visiblePoints(input: PointInput): KtPoint[] {\n return input.series.flatMap((series, index) => (input.hidden.has(index) ? [] : pointsOf(series)));\n}\n\nfunction extent(values: readonly number[]): [number, number] {\n return values.length === 0 ? [0, 1] : [Math.min(...values), Math.max(...values)];\n}\n\nexport function pointLayout(input: PointInput): PointLayout {\n const { width, height, measure, format, formatX, noAxis } = input;\n const points = visiblePoints(input);\n\n const plotHeight = Math.max(0, height - PADDING.top - PADDING.bottom);\n const [yLo, yHi] = extent(points.map((point) => point.y));\n const y = ticksFor(yLo, yHi, tickCount(plotHeight, 48), { min: input.min, max: input.max });\n const widest = noAxis ? 0 : Math.max(0, ...y.values.map((value) => measure(format(value))));\n const left = noAxis ? 4 : Math.ceil(widest) + LABEL_GAP;\n\n const [xLo, xHi] = extent(points.map((point) => point.x));\n const x = ticksFor(xLo, xHi, tickCount(Math.max(0, width - left - PADDING.right), 96), {\n min: null,\n max: null,\n });\n // The last x label is centred on the plot's right edge; keep half of it inside.\n const right = noAxis ? PADDING.right : Math.max(PADDING.right, measure(formatX(x.max)) / 2);\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - right),\n height: plotHeight,\n },\n x,\n y,\n maxR: input.bubble ? Math.max(0, ...points.map((point) => point.r ?? 0)) : 0,\n };\n}\n\n/** Where a point lands on screen. */\nexport function pointPosition(layout: PointLayout, point: Pick<KtPoint, 'x' | 'y'>): Point {\n const { box } = layout;\n return [\n project(point.x, layout.x, box.x, box.x + box.width),\n project(point.y, layout.y, box.y + box.height, box.y),\n ];\n}\n\n/**\n * A bubble's radius. The value is carried by the area, so the radius grows\n * with its square root: a bubble twice the value looks twice the size, not\n * four times.\n */\nexport function bubbleRadius(r: number | undefined, maxR: number): number {\n if (r === undefined || maxR <= 0 || r <= 0) return MIN_BUBBLE;\n return Math.max(MIN_BUBBLE, MAX_BUBBLE * Math.sqrt(r / maxR));\n}\n\nfunction radiusOf(input: PointInput, layout: PointLayout, point: KtPoint): number {\n return input.bubble ? bubbleRadius(point.r, layout.maxR) : DOT;\n}\n\n/** The visible point nearest a pointer, if it is close enough to mean it. */\nexport function nearestPoint(\n input: PointInput,\n layout: PointLayout,\n x: number,\n y: number,\n): { series: number; index: number } | null {\n let best: { series: number; index: number } | null = null;\n let bestDistance = Infinity;\n\n input.series.forEach((series, seriesIndex) => {\n if (input.hidden.has(seriesIndex)) return;\n pointsOf(series).forEach((point, index) => {\n const [px, py] = pointPosition(layout, point);\n const distance = Math.hypot(px - x, py - y);\n const reach = Math.max(REACH, radiusOf(input, layout, point) + 4);\n if (distance <= reach && distance < bestDistance) {\n best = { series: seriesIndex, index };\n bestDistance = distance;\n }\n });\n });\n\n return best;\n}\n\n/** A series' point indices in x order, the order the keyboard walks them in. */\nexport function walkOrder(series: KtSeries | undefined): number[] {\n const points = pointsOf(series);\n return points.map((_, index) => index).sort((a, b) => points[a]!.x - points[b]!.x);\n}\n\nexport interface PointView extends PointInput {\n readonly layout: PointLayout;\n readonly active: number;\n readonly activeSeries: number;\n readonly noGrid: boolean;\n readonly colorOf: (series: number) => string;\n}\n\nexport function renderPoints(view: PointView): SVGTemplateResult {\n const { layout, noGrid, noAxis, format, formatX, bubble, colorOf, active, activeSeries } = view;\n const { box } = layout;\n\n const grid = noGrid\n ? nothing\n : svg`\n ${layout.y.values.map((value) => {\n const at = project(value, layout.y, box.y + box.height, box.y);\n return svg`<line class=\"grid\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n })}\n ${layout.x.values.map((value) => {\n const at = project(value, layout.x, box.x, box.x + box.width);\n return svg`<line class=\"grid\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`;\n })}`;\n\n const axes = noAxis\n ? nothing\n : svg`\n ${layout.y.values.map(\n (value) =>\n svg`<text class=\"tick-label\" x=${box.x - 8} y=${project(value, layout.y, box.y + box.height, box.y)}\n text-anchor=\"end\" dominant-baseline=\"middle\">${format(value)}</text>`,\n )}\n ${layout.x.values.map(\n (value) =>\n svg`<text class=\"tick-label\" x=${project(value, layout.x, box.x, box.x + box.width)}\n y=${box.y + box.height + 16} text-anchor=\"middle\">${formatX(value)}</text>`,\n )}`;\n\n // Largest first, so a small bubble is never buried under a big one.\n const dots = view.series\n .flatMap((series, seriesIndex) =>\n view.hidden.has(seriesIndex)\n ? []\n : pointsOf(series).map((point, index) => ({\n point,\n index,\n seriesIndex,\n radius: radiusOf(view, layout, point),\n })),\n )\n .sort((a, b) => b.radius - a.radius);\n\n const marks = dots.map(({ point, index, seriesIndex, radius }) => {\n const [x, y] = pointPosition(layout, point);\n const color = colorOf(seriesIndex);\n return svg`<circle\n class=\"dot\"\n cx=${x}\n cy=${y}\n r=${radius}\n fill=${color}\n fill-opacity=${bubble ? 0.55 : 0.85}\n stroke=${bubble ? color : 'var(--surface-card)'}\n stroke-width=${bubble ? 1.5 : 2}\n data-series=${seriesIndex}\n data-index=${index}\n />`;\n });\n\n const focus = (() => {\n const point = pointsOf(view.series[activeSeries])[active];\n if (!point || view.hidden.has(activeSeries)) return nothing;\n const [x, y] = pointPosition(layout, point);\n return svg`<circle class=\"focus-ring\" cx=${x} cy=${y}\n r=${radiusOf(view, layout, point) + 4} fill=\"none\" stroke=${colorOf(activeSeries)} stroke-width=\"2\" />`;\n })();\n\n return svg`${grid}${axes}${marks}${focus}`;\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtSeries, Measure } from './model.js';\nimport { niceTicks, type Ticks } from './scale.js';\nimport { TAU, arcPath, linearPath, polar } from './geometry.js';\n\n/**\n * Pie, doughnut, polar area and radar: charts drawn around a centre.\n *\n * Pie, doughnut and polar area read the labels as slices and the first series\n * as their values — they show one distribution. Comparing two is a stacked\n * bar's job. A radar reads the labels as spokes and draws every series.\n */\n\nexport type RadialKind = 'pie' | 'doughnut' | 'polar-area' | 'radar';\n\nexport interface RadialInput {\n readonly width: number;\n readonly height: number;\n readonly kind: RadialKind;\n readonly series: readonly KtSeries[];\n /** Slice indices for pie, doughnut and polar area; series indices for radar. */\n readonly hidden: ReadonlySet<number>;\n readonly labels: readonly string[];\n readonly measure: Measure;\n}\n\n/** A slice, or for a radar a spoke (whose start and end are the same angle). */\nexport interface Slice {\n readonly index: number;\n /** The value drawn: never negative, and 0 when hidden. */\n readonly value: number;\n readonly start: number;\n readonly end: number;\n /** Outer radius; varies per slice only for polar area. */\n readonly outer: number;\n}\n\nexport interface RadialLayout {\n readonly cx: number;\n readonly cy: number;\n readonly outer: number;\n readonly inner: number;\n readonly slices: readonly Slice[];\n /** Rings for polar area and radar. */\n readonly ticks: Ticks;\n /** The sum of the visible slices. */\n readonly total: number;\n}\n\nconst PADDING = 8;\n/** A doughnut's hole, as a share of its radius. */\nconst HOLE = 0.62;\nconst RING_COUNT = 4;\nconst LABEL_GAP = 12;\n\nexport function radialLayout(input: RadialInput): RadialLayout {\n const { width, height, kind, series, hidden, labels, measure } = input;\n const cx = width / 2;\n const cy = height / 2;\n\n if (kind === 'radar') {\n const values = series.flatMap((entry, index) =>\n hidden.has(index) ? [] : (entry.values ?? []),\n );\n const lo = Math.min(0, ...values);\n const hi = Math.max(0, ...values);\n const ticks = niceTicks(lo, hi === lo ? lo + 1 : hi, RING_COUNT);\n // The labels sit outside the outermost ring; keep them on the canvas.\n const room = Math.min(Math.max(0, ...labels.map(measure)), width * 0.25) + LABEL_GAP;\n const outer = Math.max(0, Math.min(cx - room, cy - LABEL_GAP * 2));\n const count = Math.max(labels.length, ...series.map((entry) => entry.values?.length ?? 0));\n\n return {\n cx,\n cy,\n outer,\n inner: 0,\n slices: Array.from({ length: count }, (_, index) => {\n const angle = (index * TAU) / Math.max(1, count);\n return { index, value: 0, start: angle, end: angle, outer };\n }),\n ticks,\n total: 0,\n };\n }\n\n const values = series[0]?.values ?? [];\n const count = Math.max(labels.length, values.length);\n const shown = (index: number) => (hidden.has(index) ? 0 : Math.max(0, values[index] ?? 0));\n const total = Array.from({ length: count }, (_, index) => shown(index)).reduce(\n (a, b) => a + b,\n 0,\n );\n const outer = Math.max(0, Math.min(width, height) / 2 - PADDING);\n const peak = Math.max(0, ...Array.from({ length: count }, (_, index) => shown(index)));\n const ticks = niceTicks(0, peak || 1, RING_COUNT);\n const visibleCount = Array.from({ length: count }, (_, index) => index).filter(\n (index) => !hidden.has(index),\n ).length;\n\n let angle = 0;\n const slices = Array.from({ length: count }, (_, index): Slice => {\n const value = shown(index);\n const start = angle;\n\n if (kind === 'polar-area') {\n // Equal angles; the area carries the value, so the radius is its square root.\n if (!hidden.has(index)) angle += TAU / Math.max(1, visibleCount);\n return { index, value, start, end: angle, outer: outer * Math.sqrt(value / ticks.max) };\n }\n\n angle += total > 0 ? (value / total) * TAU : 0;\n return { index, value, start, end: angle, outer };\n });\n\n return { cx, cy, outer, inner: kind === 'doughnut' ? outer * HOLE : 0, slices, ticks, total };\n}\n\n/** The slice, or radar spoke, under a pointer; -1 for none. */\nexport function sliceAt(layout: RadialLayout, kind: RadialKind, x: number, y: number): number {\n const dx = x - layout.cx;\n const dy = y - layout.cy;\n const distance = Math.hypot(dx, dy);\n let angle = Math.atan2(dx, -dy);\n if (angle < 0) angle += TAU;\n\n if (kind === 'radar') {\n const count = layout.slices.length;\n if (count === 0 || distance > layout.outer + LABEL_GAP * 2) return -1;\n return Math.round(angle / (TAU / count)) % count;\n }\n\n if (distance > layout.outer || distance < layout.inner) return -1;\n const slice = layout.slices.find(\n ({ start, end }) => end > start && angle >= start && angle < end,\n );\n return slice?.index ?? -1;\n}\n\n/** Where a slice's tooltip points: the middle of the slice. */\nexport function sliceAnchor(layout: RadialLayout, index: number): readonly [number, number] {\n const slice = layout.slices[index];\n if (!slice) return [layout.cx, layout.cy];\n const middle = (slice.start + slice.end) / 2;\n const radius = layout.inner > 0 ? (layout.inner + slice.outer) / 2 : slice.outer * 0.6;\n return polar(layout.cx, layout.cy, radius, middle);\n}\n\n/** On a radar, the distance from the centre of `value`. */\nexport function radarRadius(layout: RadialLayout, value: number): number {\n const { ticks, outer } = layout;\n return ((value - ticks.min) / (ticks.max - ticks.min)) * outer;\n}\n\nexport interface RadialView extends RadialInput {\n readonly layout: RadialLayout;\n readonly active: number;\n readonly noGrid: boolean;\n readonly noAxis: boolean;\n readonly centerLabel: string;\n readonly format: Format;\n readonly colorOf: (series: number) => string;\n readonly sliceColor: (slice: number) => string;\n}\n\nfunction renderSlices(view: RadialView): SVGTemplateResult {\n // No values on a polar area's rings: its radius is a square root, which\n // nobody reads off a ring. The tooltip and the table carry the numbers.\n const { layout, active, sliceColor, kind, noGrid, format, centerLabel } = view;\n const { cx, cy, inner, ticks } = layout;\n\n const rings =\n kind === 'polar-area' && !noGrid\n ? ticks.values\n .filter((value) => value > 0)\n .map(\n (value) =>\n svg`<circle class=\"grid\" cx=${cx} cy=${cy} r=${layout.outer * Math.sqrt(value / ticks.max)} fill=\"none\" />`,\n )\n : nothing;\n\n const shown = layout.slices.filter((slice) => slice.end > slice.start && slice.outer > 0);\n const paths = shown.map(\n (slice) => svg`<path\n class=\"slice\"\n d=${arcPath(cx, cy, inner, slice.outer, slice.start, slice.end)}\n fill=${sliceColor(slice.index)}\n fill-rule=\"evenodd\"\n stroke=\"var(--surface-card)\"\n stroke-width=${shown.length > 1 ? 2 : 0}\n stroke-linejoin=\"round\"\n data-index=${slice.index}\n opacity=${active === -1 || active === slice.index ? 1 : 0.45}\n />`,\n );\n\n const centre =\n kind === 'doughnut'\n ? svg`\n <text class=\"center-value\" x=${cx} y=${cy} text-anchor=\"middle\" dominant-baseline=\"middle\">${format(layout.total)}</text>\n ${\n inner > 36\n ? svg`<text class=\"center-label\" x=${cx} y=${cy + 20} text-anchor=\"middle\" dominant-baseline=\"middle\">${centerLabel}</text>`\n : nothing\n }`\n : nothing;\n\n return svg`${rings}${paths}${centre}`;\n}\n\nfunction renderRadar(view: RadialView): SVGTemplateResult {\n const { layout, series, hidden, labels, colorOf, active, noGrid, noAxis, format } = view;\n const { cx, cy, outer, ticks, slices } = layout;\n const spokes = slices.map((slice) => slice.start);\n\n const grid = noGrid\n ? nothing\n : svg`\n ${ticks.values\n .filter((value) => value > ticks.min)\n .map((value) => {\n const radius = radarRadius(layout, value);\n return svg`<path class=\"grid\" fill=\"none\" d=${`${linearPath(spokes.map((angle) => polar(cx, cy, radius, angle)))} Z`} />`;\n })}\n ${spokes.map((angle) => {\n const [x, y] = polar(cx, cy, outer, angle);\n return svg`<line class=\"grid\" x1=${cx} y1=${cy} x2=${x} y2=${y} />`;\n })}`;\n\n const ringLabels = noAxis\n ? nothing\n : ticks.values\n .filter((value) => value > ticks.min)\n .map(\n (value) =>\n svg`<text class=\"tick-label ring-label\" x=${cx + 4} y=${cy - radarRadius(layout, value) + 3} dominant-baseline=\"hanging\">${format(value)}</text>`,\n );\n\n const axisLabels = spokes.map((angle, index) => {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n const anchor = sin > 0.1 ? 'start' : sin < -0.1 ? 'end' : 'middle';\n // Top and bottom labels sit clear of the ring, above or below it, so the\n // ring values running up the first spoke never collide with them.\n const [x, y] = polar(cx, cy, outer + (Math.abs(cos) > 0.5 ? 8 : LABEL_GAP), angle);\n const baseline = cos > 0.5 ? 'auto' : cos < -0.5 ? 'hanging' : 'middle';\n return svg`<text class=\"axis-label\" x=${x} y=${y} text-anchor=${anchor} dominant-baseline=${baseline}>${labels[index] ?? ''}</text>`;\n });\n\n const outlines = series.map((entry, seriesIndex) => {\n if (hidden.has(seriesIndex)) return nothing;\n const color = colorOf(seriesIndex);\n const points = spokes.map((angle, index) =>\n polar(cx, cy, radarRadius(layout, entry.values?.[index] ?? ticks.min), angle),\n );\n const markers =\n active >= 0 && points[active]\n ? svg`<circle class=\"marker\" cx=${points[active][0]} cy=${points[active][1]} r=\"5\" fill=${color} />`\n : nothing;\n return svg`\n <path class=\"radar\" d=${`${linearPath(points)} Z`} stroke=${color} fill=${color} />\n ${markers}`;\n });\n\n const spoke =\n active >= 0 && spokes[active] !== undefined\n ? (() => {\n const [x, y] = polar(cx, cy, outer, spokes[active]);\n return svg`<line class=\"crosshair\" x1=${cx} y1=${cy} x2=${x} y2=${y} />`;\n })()\n : nothing;\n\n return svg`${grid}${spoke}${outlines}${ringLabels}${axisLabels}`;\n}\n\nexport function renderRadial(view: RadialView): SVGTemplateResult {\n return view.kind === 'radar' ? renderRadar(view) : renderSlices(view);\n}\n","import { css, html, nothing, type SVGTemplateResult, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport type { Format, KtChartType, KtMark, KtSeries } from './model.js';\nimport {\n cartesianLayout,\n categoryAt,\n renderCartesian,\n tooltipAnchor,\n type CartesianView,\n} from './cartesian.js';\nimport {\n nearestPoint,\n pointLayout,\n pointPosition,\n renderPoints,\n walkOrder,\n type PointView,\n} from './point.js';\nimport {\n radarRadius,\n radialLayout,\n renderRadial,\n sliceAnchor,\n sliceAt,\n type RadialKind,\n type RadialView,\n} from './radial.js';\nimport { polar } from './geometry.js';\n\nexport type { KtChartType, KtMark, KtPoint, KtSeries } from './model.js';\n\ninterface Box {\n readonly width: number;\n readonly height: number;\n}\n\ntype Family = 'cartesian' | 'point' | 'radial';\n\nconst MAX_SLOTS = 8;\n\n/** One row of the tooltip. */\ninterface TooltipRow {\n readonly color: string;\n readonly name: string;\n readonly value: string;\n}\n\ninterface Tooltip {\n readonly title: string;\n readonly subtitle?: string;\n readonly rows: readonly TooltipRow[];\n readonly total?: string;\n readonly x: number;\n readonly y: number;\n /** Which side of the anchor the tooltip opens on. */\n readonly side: 'above' | 'left' | 'right';\n}\n\n/**\n * A chart, drawn from the token layer.\n *\n * Line, area and bar — stacked, sideways or mixed — plus scatter, bubble,\n * pie, doughnut, polar area and radar, all in Kanto's voice: the eight\n * categorical hues in fixed order, one value axis, recessive grid, and the\n * data always available as a table.\n *\n * **Colour.** One series takes the brand hue: with nothing to tell apart there\n * is no identity to encode, and the title names it. Two or more take the fixed\n * categorical order in `--chart-series-1…8`, assigned by position and never\n * cycled, so a series keeps its colour when a filter removes its neighbours.\n * Slices take the same order by slice.\n *\n * **The table is not optional.** Every chart also renders its data as a table,\n * visually hidden by default. It is what a screen reader reads, and it is the\n * relief that four of the light-theme series hues require, sitting as they do\n * below 3:1 on a light surface.\n *\n * @element kt-chart\n *\n * @csspart svg - The plot.\n * @csspart legend - The legend.\n * @csspart table - The data table.\n *\n * @fires kt-point-hover - The active point changed. `detail: { index, series }`;\n * `index` is -1 when nothing is active, `series` -1 when the index spans\n * every series.\n * @fires kt-series-toggle - A legend item was pressed. `detail: { series, hidden }`.\n * Cancelable.\n *\n * @example\n * ```js\n * chart.labels = ['Jan', 'Feb', 'Mar'];\n * chart.series = [{ name: 'Revenue', values: [42, 58, 36] }];\n * ```\n */\nexport class KtChart extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n position: relative;\n }\n\n .plot {\n position: relative;\n width: 100%;\n }\n\n svg {\n display: block;\n width: 100%;\n overflow: visible;\n border-radius: var(--border-radius);\n }\n\n svg:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 4px;\n }\n\n /* Recessive: the data is the loud part. */\n .grid {\n stroke: var(--chart-grid);\n stroke-width: 1;\n opacity: 0.6;\n }\n\n .baseline {\n stroke: var(--chart-axis);\n stroke-width: 1;\n opacity: 0.5;\n }\n\n .axis-label,\n .tick-label {\n fill: var(--chart-axis);\n font: var(--font-normal-small);\n font-family: var(--font-family-body);\n font-variant-numeric: tabular-nums;\n }\n\n /* Ring values sit on top of the marks; a halo of the surface keeps them\n readable without boxing them in. */\n .ring-label {\n paint-order: stroke;\n stroke: var(--surface-card);\n stroke-width: 2px;\n stroke-linejoin: round;\n }\n\n .line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n .point,\n .marker {\n stroke: var(--surface-card);\n stroke-width: 2;\n }\n\n .bar,\n .slice {\n transition: opacity var(--duration-fast) var(--easing-standard);\n }\n\n /* One entrance, when a mark first appears: bars grow from the baseline,\n lines draw along their length, everything else fades in. Nothing\n moves on hover, and the reduced-motion block in the token layer\n zeroes the duration. Backwards fill, so the animation never holds a\n value past its end — the dimming on hover stays in charge. */\n .bar {\n transform-box: fill-box;\n transform-origin: 50% 100%;\n animation: kt-chart-grow-y var(--duration-normal) var(--easing-standard) backwards;\n }\n .bar.negative {\n transform-origin: 50% 0;\n }\n .bar.sideways {\n transform-origin: 0 50%;\n animation-name: kt-chart-grow-x;\n }\n .bar.sideways.negative {\n transform-origin: 100% 50%;\n }\n\n .line {\n stroke-dasharray: 1;\n animation: kt-chart-draw var(--duration-normal) var(--easing-standard) backwards;\n }\n\n .area,\n .point,\n .dot,\n .slice,\n .radar {\n animation: kt-chart-fade var(--duration-normal) var(--easing-standard) backwards;\n }\n\n @keyframes kt-chart-grow-y {\n from {\n transform: scaleY(0);\n }\n }\n @keyframes kt-chart-grow-x {\n from {\n transform: scaleX(0);\n }\n }\n @keyframes kt-chart-draw {\n from {\n stroke-dashoffset: 1;\n }\n }\n @keyframes kt-chart-fade {\n from {\n opacity: 0;\n }\n }\n\n .radar {\n stroke-width: 2;\n stroke-linejoin: round;\n fill-opacity: 0.16;\n }\n\n .center-value {\n fill: var(--text-body);\n font: var(--font-title-h6);\n font-variant-numeric: tabular-nums;\n }\n\n .center-label {\n fill: var(--text-muted);\n font: var(--font-normal-small);\n }\n\n .crosshair {\n stroke: var(--chart-axis);\n stroke-width: 1;\n stroke-dasharray: 3 3;\n }\n\n .tooltip {\n position: absolute;\n z-index: var(--z-tooltip);\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n padding: 8px 10px;\n color: var(--text-inverted);\n font: var(--font-normal-small);\n background: var(--surface-inverted);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow-toast);\n pointer-events: none;\n }\n\n .tooltip.above {\n transform: translate(-50%, calc(-100% - 12px));\n }\n .tooltip.right {\n transform: translate(12px, -50%);\n }\n .tooltip.left {\n transform: translate(calc(-100% - 12px), -50%);\n }\n\n .tooltip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n white-space: nowrap;\n }\n\n .swatch {\n flex: none;\n width: 8px;\n height: 8px;\n background: var(--swatch);\n border-radius: 2px;\n }\n\n .swatch.hollow {\n background: none;\n box-shadow: inset 0 0 0 var(--border-width) var(--swatch);\n }\n\n .tooltip-name {\n flex: 1;\n opacity: 0.75;\n }\n\n .tooltip-subtitle {\n margin-top: -2px;\n opacity: 0.75;\n }\n\n .tooltip-value {\n font-variant-numeric: tabular-nums;\n }\n\n .tooltip-total {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n margin-top: 2px;\n padding-top: 4px;\n border-top: var(--border-width) solid color-mix(in srgb, currentColor 20%, transparent);\n font-variant-numeric: tabular-nums;\n }\n\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n margin-top: 10px;\n }\n\n .legend-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n color: var(--text-muted);\n font: var(--font-normal-small);\n background: none;\n border: none;\n border-radius: var(--border-radius);\n cursor: pointer;\n }\n\n .legend-item:hover {\n color: var(--text-body);\n }\n\n .legend-item[aria-pressed='false'] {\n text-decoration: line-through;\n opacity: 0.6;\n }\n\n .legend-item:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n /* Present for assistive technology and for anyone who needs the\n numbers; show-table puts it on screen. */\n .table {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n :host([show-table]) .table {\n position: static;\n width: auto;\n height: auto;\n margin-top: 16px;\n overflow: visible;\n clip-path: none;\n white-space: normal;\n }\n\n :host([show-table]) table {\n width: 100%;\n border-collapse: collapse;\n font: var(--font-normal-small);\n }\n\n :host([show-table]) th,\n :host([show-table]) td {\n padding: 6px 10px;\n color: var(--text-muted);\n text-align: right;\n border-bottom: var(--border-width) solid var(--border-subtle);\n }\n\n :host([show-table]) th:first-child,\n :host([show-table]) td:first-child {\n color: var(--text-body);\n text-align: left;\n }\n `,\n ];\n\n @query('.plot')\n private plot!: HTMLElement;\n\n private observer?: ResizeObserver;\n private readonly tableId = uniqueId('kt-chart-table');\n\n @state()\n private box: Box = { width: 0, height: 0 };\n\n /** The active category, point or slice, or -1. */\n @state()\n private active = -1;\n\n /** The series the active point belongs to, for scatter and bubble; -1 otherwise. */\n @state()\n private activeSeries = -1;\n\n /**\n * Series hidden from the legend — or slices, for pie, doughnut and polar\n * area. Not `hidden`: that is HTMLElement's, and shadowing it would stop\n * `chart.hidden = true` from hiding the chart.\n */\n @state()\n private hiddenSeries: ReadonlySet<number> = new Set();\n\n @property({ type: String, reflect: true })\n type: KtChartType = 'area';\n\n @property({ attribute: false })\n series: readonly KtSeries[] = [];\n\n /** One label per index along the category axis, or per slice or spoke. */\n @property({ attribute: false })\n labels: readonly string[] = [];\n\n @property({ type: Number })\n height = 200;\n\n /** Formats a value for the value axis, the tooltip and the table. */\n @property({ attribute: false })\n format: Format = (value) => String(value);\n\n /** Formats the x value of a scatter or bubble point. */\n @property({ attribute: false })\n formatX: Format = (value) => String(value);\n\n /** Grid lines. */\n @property({ type: Boolean, attribute: 'no-grid' })\n noGrid = false;\n\n /** Hides the value axis labels, for a chart too small to carry them. */\n @property({ type: Boolean, attribute: 'no-axis' })\n noAxis = false;\n\n /** Puts the data table on screen instead of only in the accessibility tree. */\n @property({ type: Boolean, reflect: true, attribute: 'show-table' })\n showTable = false;\n\n /**\n * Smooths lines and areas through a monotone spline.\n *\n * Off by default on purpose: a curve between two samples draws values that\n * were never measured. Turn it on when the underlying quantity really is\n * continuous and the reader knows it.\n */\n @property({ type: Boolean })\n smooth = false;\n\n /** Bars, and areas, on top of one another instead of side by side. */\n @property({ type: Boolean })\n stacked = false;\n\n /** Bars along the horizontal axis, with the categories down the left. */\n @property({ type: Boolean })\n horizontal = false;\n\n /** Pins the bottom of the value axis. */\n @property({ type: Number })\n min: number | null = null;\n\n /** Pins the top of the value axis. */\n @property({ type: Number })\n max: number | null = null;\n\n /** Names the total in the middle of a doughnut. */\n @property({ type: String, attribute: 'center-label' })\n centerLabel = 'Total';\n\n /** Names the sum in a stacked chart's tooltip and table. */\n @property({ type: String, attribute: 'total-label' })\n totalLabel = 'Total';\n\n /** Accessible name. Say what the chart shows. */\n @property({ type: String })\n label = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Real pixel geometry rather than a scaled viewBox: a stretched viewBox\n // would scale the 2px strokes along with it.\n this.observer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n this.box = { width: entry.contentRect.width, height: this.height };\n });\n }\n\n override firstUpdated(): void {\n if (this.plot) this.observer?.observe(this.plot);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.observer?.disconnect();\n }\n\n override willUpdate(changed: Map<PropertyKey, unknown>): void {\n // New data is a new picture: a series hidden from the old one has no\n // reason to stay hidden in this one, and an index may no longer exist.\n if (changed.has('series') || changed.has('type') || changed.has('labels')) {\n if (this.hiddenSeries.size > 0) this.hiddenSeries = new Set();\n if (this.active >= this.pointCount) {\n this.active = -1;\n this.activeSeries = -1;\n }\n }\n }\n\n /* ------------------------------------------------------------- helpers */\n\n private get family(): Family {\n if (this.type === 'scatter' || this.type === 'bubble') return 'point';\n if (\n this.type === 'pie' ||\n this.type === 'doughnut' ||\n this.type === 'polar-area' ||\n this.type === 'radar'\n ) {\n return 'radial';\n }\n return 'cartesian';\n }\n\n private get pointCount(): number {\n return Math.max(this.labels.length, 0, ...this.series.map((s) => s.values?.length ?? 0));\n }\n\n private colorOf = (index: number): string => {\n const series = this.series[index];\n if (series?.color) return series.color;\n // One series has no identity to encode; the brand hue reads as \"the data\".\n if (this.series.length === 1) return 'var(--color-primary-base)';\n return `var(--chart-series-${(index % MAX_SLOTS) + 1})`;\n };\n\n private measureContext: CanvasRenderingContext2D | null | undefined;\n\n /** Text width in the axis font. Estimated where there is no canvas to ask. */\n private measure = (text: string): number => {\n if (this.measureContext === undefined) {\n try {\n const context = document.createElement('canvas').getContext('2d');\n const family = getComputedStyle(this).getPropertyValue('--font-family-body').trim();\n if (context) context.font = `12px ${family || 'sans-serif'}`;\n this.measureContext = context;\n } catch {\n this.measureContext = null;\n }\n }\n return this.measureContext ? this.measureContext.measureText(text).width : text.length * 6.5;\n };\n\n private get cartesianView(): CartesianView {\n const input = {\n width: this.box.width,\n height: this.height,\n series: this.series,\n hidden: this.hiddenSeries,\n labels: this.labels,\n type: (this.family === 'cartesian' ? this.type : 'line') as KtMark,\n stacked: this.stacked,\n horizontal: this.horizontal,\n min: this.min,\n max: this.max,\n noAxis: this.noAxis,\n measure: this.measure,\n format: this.format,\n };\n return {\n ...input,\n layout: cartesianLayout(input),\n active: this.active,\n smooth: this.smooth,\n noGrid: this.noGrid,\n colorOf: this.colorOf,\n idPrefix: this.tableId,\n };\n }\n\n private get pointView(): PointView {\n const input = {\n width: this.box.width,\n height: this.height,\n series: this.series,\n hidden: this.hiddenSeries,\n bubble: this.type === 'bubble',\n min: this.min,\n max: this.max,\n noAxis: this.noAxis,\n measure: this.measure,\n format: this.format,\n formatX: this.formatX,\n };\n return {\n ...input,\n layout: pointLayout(input),\n active: this.active,\n activeSeries: this.activeSeries,\n noGrid: this.noGrid,\n colorOf: this.colorOf,\n };\n }\n\n /** Pie, doughnut and polar area: one series, whose slices are the labels. */\n private get sliced(): boolean {\n return this.type === 'pie' || this.type === 'doughnut' || this.type === 'polar-area';\n }\n\n private sliceColor = (index: number): string => `var(--chart-series-${(index % MAX_SLOTS) + 1})`;\n\n private get radialView(): RadialView {\n const input = {\n width: this.box.width,\n height: this.height,\n kind: this.type as RadialKind,\n series: this.series,\n hidden: this.hiddenSeries,\n labels: this.labels,\n measure: this.measure,\n };\n return {\n ...input,\n layout: radialLayout(input),\n active: this.active,\n noGrid: this.noGrid,\n noAxis: this.noAxis,\n centerLabel: this.centerLabel,\n format: this.format,\n colorOf: this.colorOf,\n sliceColor: this.sliceColor,\n };\n }\n\n /** Whether there is anything to draw. */\n private get hasData(): boolean {\n return this.family === 'point'\n ? this.series.some((series) => (series.points?.length ?? 0) > 0)\n : this.pointCount > 0;\n }\n\n private setActive(index: number, series = -1): void {\n if (index === this.active && series === this.activeSeries) return;\n this.active = index;\n this.activeSeries = series;\n emit(this, 'kt-point-hover', { index, series });\n }\n\n /* --------------------------------------------------------- interaction */\n\n private onPointerMove(event: PointerEvent): void {\n if (this.box.width === 0) return;\n if (this.family === 'cartesian') {\n const index = categoryAt(this.cartesianView.layout, event.offsetX, event.offsetY);\n this.setActive(index);\n } else if (this.family === 'radial') {\n const view = this.radialView;\n this.setActive(sliceAt(view.layout, view.kind, event.offsetX, event.offsetY));\n } else if (this.family === 'point') {\n const view = this.pointView;\n const hit = nearestPoint(view, view.layout, event.offsetX, event.offsetY);\n this.setActive(hit?.index ?? -1, hit?.series ?? -1);\n }\n }\n\n private onPointerLeave(): void {\n this.setActive(-1);\n }\n\n /** How many positions the keyboard walks through, in order. */\n private get stops(): readonly number[] {\n const all = Array.from({ length: this.pointCount }, (_, index) => index);\n // A hidden slice is not there to land on.\n return this.sliced ? all.filter((index) => !this.hiddenSeries.has(index)) : all;\n }\n\n /**\n * Arrows walk the points, Home and End jump to the ends, Escape lets go.\n * Every move emits `kt-point-hover` and opens the tooltip, which is a live\n * region, so a keyboard user hears what a pointer user sees.\n */\n private onKeyDown(event: KeyboardEvent): void {\n if (this.family === 'point') {\n this.onPointKeyDown(event);\n return;\n }\n const stops = this.stops;\n if (stops.length === 0) return;\n\n const at = stops.indexOf(this.active);\n const last = stops.length - 1;\n const next: Record<string, number> = {\n ArrowRight: at < 0 ? 0 : Math.min(at + 1, last),\n ArrowDown: at < 0 ? 0 : Math.min(at + 1, last),\n ArrowLeft: at < 0 ? 0 : Math.max(at - 1, 0),\n ArrowUp: at < 0 ? 0 : Math.max(at - 1, 0),\n Home: 0,\n End: last,\n };\n\n if (event.key === 'Escape') {\n this.setActive(-1);\n return;\n }\n const target = next[event.key];\n if (target === undefined) return;\n\n event.preventDefault();\n this.setActive(stops[target]!);\n }\n\n /**\n * Scatter and bubble: left and right walk the current series in x order,\n * up and down move to the neighbouring visible series.\n */\n private onPointKeyDown(event: KeyboardEvent): void {\n const visible = this.series\n .map((series, index) => ({ index, count: series.points?.length ?? 0 }))\n .filter(({ index, count }) => count > 0 && !this.hiddenSeries.has(index))\n .map(({ index }) => index);\n if (visible.length === 0) return;\n\n if (event.key === 'Escape') {\n this.setActive(-1);\n return;\n }\n\n const seriesAt = visible.indexOf(this.activeSeries);\n const current = seriesAt < 0 ? visible[0]! : this.activeSeries;\n const order = walkOrder(this.series[current]);\n const at = seriesAt < 0 ? -1 : order.indexOf(this.active);\n const last = order.length - 1;\n\n const moveSeries = (step: number) => {\n const target =\n visible[Math.min(Math.max((seriesAt < 0 ? 0 : seriesAt) + step, 0), visible.length - 1)]!;\n this.setActive(walkOrder(this.series[target])[0]!, target);\n };\n\n switch (event.key) {\n case 'ArrowRight':\n this.setActive(order[at < 0 ? 0 : Math.min(at + 1, last)]!, current);\n break;\n case 'ArrowLeft':\n this.setActive(order[at < 0 ? 0 : Math.max(at - 1, 0)]!, current);\n break;\n case 'ArrowDown':\n moveSeries(seriesAt < 0 ? 0 : 1);\n break;\n case 'ArrowUp':\n moveSeries(seriesAt < 0 ? 0 : -1);\n break;\n case 'Home':\n this.setActive(order[0]!, current);\n break;\n case 'End':\n this.setActive(order[last]!, current);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n private toggle(index: number): void {\n const hidden = !this.hiddenSeries.has(index);\n if (emit(this, 'kt-series-toggle', { series: index, hidden }).defaultPrevented) return;\n\n const next = new Set(this.hiddenSeries);\n if (hidden) next.add(index);\n else next.delete(index);\n this.hiddenSeries = next;\n this.setActive(-1);\n }\n\n /* ----------------------------------------------------------- rendering */\n\n private renderMarks(): SVGTemplateResult | typeof nothing {\n if (this.family === 'cartesian') return renderCartesian(this.cartesianView);\n if (this.family === 'point') return renderPoints(this.pointView);\n return renderRadial(this.radialView);\n }\n\n private get tooltip(): Tooltip | null {\n if (this.active < 0 || this.box.width === 0) return null;\n\n if (this.family === 'cartesian') {\n const view = this.cartesianView;\n const rows = view.layout.visible.map((index) => ({\n color: this.colorOf(index),\n name: this.series[index]!.name,\n value: this.format(this.series[index]!.values?.[this.active] ?? 0),\n }));\n const { x, y } = tooltipAnchor(view);\n // A stack is read as parts of a whole, so the whole is worth stating.\n const stackedParts = view.layout.visible.filter(\n (index) => this.stacked && view.layout.marks[index] !== 'line',\n );\n const total =\n stackedParts.length > 1\n ? this.format(\n stackedParts.reduce(\n (sum, index) => sum + (this.series[index]!.values?.[this.active] ?? 0),\n 0,\n ),\n )\n : undefined;\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows,\n ...(total === undefined ? {} : { total }),\n x,\n y,\n side: view.layout.horizontal ? 'right' : 'above',\n };\n }\n\n if (this.sliced) {\n const layout = this.radialView.layout;\n const value = this.series[0]?.values?.[this.active] ?? 0;\n const share = layout.total > 0 ? Math.round((Math.max(0, value) / layout.total) * 100) : 0;\n const [x, y] = sliceAnchor(layout, this.active);\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows: [\n {\n color: this.sliceColor(this.active),\n name: this.series[0]?.name ?? '',\n value: `${this.format(value)} (${share}%)`,\n },\n ],\n x,\n y,\n side: 'above',\n };\n }\n\n if (this.type === 'radar') {\n const layout = this.radialView.layout;\n const visible = this.series\n .map((_, index) => index)\n .filter((index) => !this.hiddenSeries.has(index));\n const peak = Math.max(\n layout.ticks.min,\n ...visible.map((index) => this.series[index]!.values?.[this.active] ?? layout.ticks.min),\n );\n const angle = layout.slices[this.active]?.start ?? 0;\n const [x, y] = polar(layout.cx, layout.cy, radarRadius(layout, peak), angle);\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows: visible.map((index) => ({\n color: this.colorOf(index),\n name: this.series[index]!.name,\n value: this.format(this.series[index]!.values?.[this.active] ?? 0),\n })),\n x,\n y,\n side: 'above',\n };\n }\n\n if (this.family === 'point') {\n const series = this.series[this.activeSeries];\n const point = series?.points?.[this.active];\n if (!series || !point) return null;\n\n const [x, y] = pointPosition(this.pointView.layout, point);\n const color = this.colorOf(this.activeSeries);\n const rows: TooltipRow[] = [\n { color, name: 'x', value: this.formatX(point.x) },\n { color, name: 'y', value: this.format(point.y) },\n ];\n if (this.type === 'bubble' && point.r !== undefined) {\n rows.push({ color, name: 'r', value: String(point.r) });\n }\n // A named point is titled by its name; the series then goes underneath.\n return {\n title: point.label ?? series.name,\n ...(point.label ? { subtitle: series.name } : {}),\n rows,\n x,\n y,\n side: 'above',\n };\n }\n\n return null;\n }\n\n private renderTooltip(): TemplateResult | typeof nothing {\n const tooltip = this.tooltip;\n if (!tooltip) return nothing;\n\n // Keep it inside the chart and off the mark it describes. With no room\n // above, it opens beside the mark rather than below it — below would sit\n // right on top of a tall bar. Beside means to the right, or to the left\n // near the right edge, and never past the top or bottom.\n const estimatedHeight = 36 + tooltip.rows.length * 20 + (tooltip.total ? 24 : 0);\n const clearance = 20;\n let side = tooltip.side;\n let x = tooltip.x;\n let y = tooltip.y;\n\n if (side === 'above' && tooltip.y - estimatedHeight < 0) {\n side = 'right';\n x = tooltip.x + clearance;\n }\n if (side === 'right' && x + 180 > this.box.width) {\n side = 'left';\n x = tooltip.x - (tooltip.side === 'above' ? clearance : 0);\n }\n if (side === 'above') {\n x = Math.min(Math.max(x, 72), Math.max(72, this.box.width - 72));\n } else {\n y = Math.min(\n Math.max(y, estimatedHeight / 2),\n Math.max(estimatedHeight / 2, this.height - estimatedHeight / 2),\n );\n }\n\n return html`<div class=${`tooltip ${side}`} style=${`left:${x}px;top:${y}px`} role=\"status\">\n <strong>${tooltip.title}</strong>\n ${tooltip.subtitle ? html`<span class=\"tooltip-subtitle\">${tooltip.subtitle}</span>` : nothing}\n ${tooltip.rows.map(\n (row) =>\n html`<span class=\"tooltip-row\">\n <span class=\"swatch\" style=${`--swatch:${row.color}`}></span>\n <span class=\"tooltip-name\">${row.name}</span>\n <span class=\"tooltip-value\">${row.value}</span>\n </span>`,\n )}\n ${\n tooltip.total\n ? html`<span class=\"tooltip-total\"\n ><span>${this.totalLabel}</span><span>${tooltip.total}</span></span\n >`\n : nothing\n }\n </div>`;\n }\n\n private renderLegend(): TemplateResult | typeof nothing {\n // Slices always need naming; series only once there are two to tell apart.\n const entries = this.sliced\n ? Array.from({ length: this.pointCount }, (_, index) => ({\n name: this.labels[index] ?? `#${index + 1}`,\n color: this.sliceColor(index),\n }))\n : this.series.map((series, index) => ({ name: series.name, color: this.colorOf(index) }));\n if (entries.length === 0 || (!this.sliced && entries.length < 2)) return nothing;\n\n return html`<div part=\"legend\" class=\"legend\">\n ${entries.map((entry, index) => {\n const hidden = this.hiddenSeries.has(index);\n return html`<button\n type=\"button\"\n class=\"legend-item\"\n aria-pressed=${hidden ? 'false' : 'true'}\n @click=${() => this.toggle(index)}\n >\n <span\n class=${classMap({ swatch: true, hollow: hidden })}\n style=${`--swatch:${entry.color}`}\n ></span>\n ${entry.name}\n </button>`;\n })}\n </div>`;\n }\n\n private renderPointTable(): TemplateResult {\n const bubble = this.type === 'bubble';\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || 'Chart data'}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">Series</th>\n <th scope=\"col\">Point</th>\n <th scope=\"col\">x</th>\n <th scope=\"col\">y</th>\n ${bubble ? html`<th scope=\"col\">r</th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${this.series.flatMap((series) =>\n (series.points ?? []).map(\n (point, index) =>\n html`<tr>\n <th scope=\"row\">${series.name}</th>\n <td>${point.label ?? `#${index + 1}`}</td>\n <td>${this.formatX(point.x)}</td>\n <td>${this.format(point.y)}</td>\n ${bubble ? html`<td>${point.r ?? ''}</td>` : nothing}\n </tr>`,\n ),\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n private renderSliceTable(): TemplateResult {\n const values = this.series[0]?.values ?? [];\n const total = values.reduce((sum, value) => sum + Math.max(0, value), 0);\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || 'Chart data'}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">Slice</th>\n <th scope=\"col\">${this.series[0]?.name ?? 'Value'}</th>\n <th scope=\"col\">Share</th>\n </tr>\n </thead>\n <tbody>\n ${Array.from({ length: this.pointCount }, (_, index) => {\n const value = values[index] ?? 0;\n const share = total > 0 ? Math.round((Math.max(0, value) / total) * 100) : 0;\n return html`<tr>\n <th scope=\"row\">${this.labels[index] ?? `#${index + 1}`}</th>\n <td>${this.format(value)}</td>\n <td>${share}%</td>\n </tr>`;\n })}\n </tbody>\n </table>\n </div>`;\n }\n\n private renderTable(): TemplateResult {\n if (this.family === 'point') return this.renderPointTable();\n if (this.sliced) return this.renderSliceTable();\n\n const withTotal = this.family === 'cartesian' && this.stacked && this.series.length > 1;\n const totalAt = (index: number) =>\n this.series.reduce(\n (sum, series) => sum + (series.type === 'line' ? 0 : (series.values?.[index] ?? 0)),\n 0,\n );\n\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || 'Chart data'}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">Point</th>\n ${this.series.map((series) => html`<th scope=\"col\">${series.name}</th>`)}\n ${withTotal ? html`<th scope=\"col\">${this.totalLabel}</th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${Array.from(\n { length: this.pointCount },\n (_, index) =>\n html`<tr>\n <th scope=\"row\">${this.labels[index] ?? `#${index + 1}`}</th>\n ${this.series.map(\n (series) => html`<td>${this.format(series.values?.[index] ?? 0)}</td>`,\n )}\n ${withTotal ? html`<td>${this.format(totalAt(index))}</td>` : nothing}\n </tr>`,\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n override render(): TemplateResult {\n const ready = this.box.width > 0 && this.hasData;\n\n return html`<div class=\"plot\" style=${`height:${this.height}px`}>\n <svg\n part=\"svg\"\n width=${this.box.width}\n height=${this.height}\n role=\"img\"\n aria-label=${this.label || nothing}\n aria-describedby=${this.tableId}\n tabindex=\"0\"\n @pointermove=${this.onPointerMove}\n @pointerleave=${this.onPointerLeave}\n @keydown=${this.onKeyDown}\n @blur=${this.onPointerLeave}\n >\n ${ready ? this.renderMarks() : nothing}\n </svg>\n ${this.renderTooltip()}\n </div>\n ${this.renderLegend()} ${this.renderTable()}`;\n }\n}\n\ndefineElement('kt-chart', KtChart);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-chart': KtChart;\n }\n}\n"],"names":["niceNumber","value","exponent","fraction","niceTicks","lo","hi","count","pad","step","decimals","clean","min","max","values","index","valueBounds","stacks","loose","includeZero","extremes","stack","length","series","above","below","finite","ticksFor","limits","ticks","project","from","to","tickCount","spacing","TAU","round","xy","x","y","linearPath","points","move","point","monotoneSegments","secants","x0","y0","x1","y1","tangents","_","before","after","secant","a","b","sum","tau","third","monotonePath","c1","c2","polar","cx","cy","radius","angle","arcPath","inner","outer","start","end","span","circle","sweep","top","bottom","arc","large","outerArc","innerArc","barPath","width","height","tip","line","PADDING","LABEL_GAP","TICK_SPACING","valuesOf","cartesianLayout","input","hidden","labels","measure","format","noAxis","marks","entry","visible","shown","banded","horizontal","mark","ofMark","plotHeight","widest","left","widestLabel","plotWidth","right","categoryCentre","layout","box","valuePosition","categoryAt","position","GROUP_SHARE","BAR_GAP","BAR_RADIUS","MAX_BAR","DOTS_UP_TO","lastIndexWhere","items","test","fit","text","cut","renderValueAxis","view","noGrid","lines","nothing","at","svg","zero","renderCategoryAxis","every","room","anchor","pointsOf","offsets","pathThrough","renderLinesAndAreas","colorOf","active","idPrefix","stacked","smooth","floor","stackBase","fills","strokes","color","base","upper","gradient","lower","i","closing","crosshair","barSegment","options","offset","thickness","negative","inset","direction","low","d","renderBars","bars","group","segments","centre","seriesIndex","lastAbove","lastBelow","total","renderCartesian","tooltipAnchor","peak","across","along","MAX_BUBBLE","MIN_BUBBLE","DOT","REACH","visiblePoints","extent","pointLayout","formatX","yLo","yHi","xLo","xHi","pointPosition","bubbleRadius","r","maxR","radiusOf","nearestPoint","best","bestDistance","px","py","distance","reach","walkOrder","renderPoints","bubble","activeSeries","grid","axes","focus","HOLE","RING_COUNT","radialLayout","kind","visibleCount","slices","sliceAt","dx","dy","sliceAnchor","slice","middle","radarRadius","renderSlices","sliceColor","centerLabel","rings","paths","renderRadar","spokes","ringLabels","axisLabels","sin","cos","baseline","outlines","markers","spoke","renderRadial","MAX_SLOTS","KtChart","KtElement","uniqueId","context","family","css","changed","s","emit","event","hit","all","stops","last","next","target","seriesAt","current","order","moveSeries","rows","stackedParts","share","tooltip","estimatedHeight","clearance","side","html","row","entries","classMap","withTotal","totalAt","ready","__decorateClass","query","state","property","defineElement"],"mappings":"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AA,MACvBE,GAAU;AAAA,MACVI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
1
+ {"version":3,"file":"kt-chart.js","sources":["../../../../src/components/data/kt-chart/scale.ts","../../../../src/components/data/kt-chart/geometry.ts","../../../../src/components/data/kt-chart/cartesian.ts","../../../../src/components/data/kt-chart/point.ts","../../../../src/components/data/kt-chart/radial.ts","../../../../src/components/data/kt-chart/kt-chart.ts"],"sourcesContent":["/**\n * Value scales: how far the axis runs, and where its ticks fall.\n *\n * Ticks land on 1, 2 or 5 times a power of ten. A reader can interpolate\n * between 0, 20 and 40; between 0, 17.75 and 35.5 they cannot.\n */\n\nexport interface Ticks {\n readonly min: number;\n readonly max: number;\n readonly step: number;\n readonly values: readonly number[];\n}\n\n/** The nearest 1, 2, 5 or 10 × 10ⁿ. */\nfunction niceNumber(value: number): number {\n const exponent = Math.floor(Math.log10(value));\n const fraction = value / 10 ** exponent;\n const nice = fraction < 1.5 ? 1 : fraction < 3 ? 2 : fraction < 7 ? 5 : 10;\n return nice * 10 ** exponent;\n}\n\n/** Round steps covering `lo…hi`, aiming for about `count` ticks. */\nexport function niceTicks(lo: number, hi: number, count: number): Ticks {\n if (hi === lo) {\n // A flat series still needs an axis; open it around the value.\n const pad = Math.abs(lo) || 1;\n lo -= pad;\n hi += pad;\n }\n\n // The step is rounded from the real range. Rounding the range first as well\n // (Heckbert's original) compounds the two and can run the axis to nearly\n // twice the data: 610 became an axis to 1000.\n const step = niceNumber((hi - lo) / Math.max(1, count - 1));\n const decimals = Math.max(0, -Math.floor(Math.log10(step)));\n // toFixed strips the 0.30000000000000004; `|| 0` turns -0 into 0.\n const clean = (value: number) => Number(value.toFixed(decimals)) || 0;\n\n const min = clean(Math.floor(lo / step) * step);\n const max = clean(Math.ceil(hi / step) * step);\n const values: number[] = [];\n for (let index = 0; min + index * step <= max + step / 2; index += 1) {\n values.push(clean(min + index * step));\n }\n\n return { min, max, step, values };\n}\n\n/**\n * The extent of the data.\n *\n * `stacks` are drawn on top of each other: each is a list of series, each\n * series a list of values by index, and a stack is as tall as its positive\n * values added up and as deep as its negative ones. `loose` series stand alone.\n * `includeZero` is for bars and areas, whose length is only honest from zero.\n */\nexport function valueBounds(\n stacks: readonly (readonly (readonly number[])[])[],\n loose: readonly (readonly number[])[],\n { includeZero }: { includeZero: boolean },\n): { lo: number; hi: number } {\n const extremes: number[] = loose.flat();\n\n for (const stack of stacks) {\n const length = Math.max(0, ...stack.map((series) => series.length));\n for (let index = 0; index < length; index += 1) {\n let above = 0;\n let below = 0;\n for (const series of stack) {\n const value = series[index] ?? 0;\n if (value >= 0) above += value;\n else below += value;\n }\n extremes.push(above, below);\n }\n }\n\n const finite = extremes.filter(Number.isFinite);\n if (finite.length === 0) return { lo: 0, hi: 1 };\n\n let lo = Math.min(...finite);\n let hi = Math.max(...finite);\n if (includeZero) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n return { lo, hi };\n}\n\n/** Nice ticks, pinned to an author's `min` and `max` when they gave any. */\nexport function ticksFor(\n lo: number,\n hi: number,\n count: number,\n limits: { readonly min: number | null; readonly max: number | null },\n): Ticks {\n const ticks = niceTicks(limits.min ?? lo, limits.max ?? hi, count);\n const min = limits.min ?? ticks.min;\n const max = limits.max ?? ticks.max;\n if (max <= min) return ticks;\n\n return {\n min,\n max,\n step: ticks.step,\n values: ticks.values.filter((value) => value >= min && value <= max),\n };\n}\n\n/** Where `value` falls between `from` and `to`, in px. */\nexport function project(value: number, ticks: Ticks, from: number, to: number): number {\n return from + ((value - ticks.min) / (ticks.max - ticks.min)) * (to - from);\n}\n\n/** How many ticks fit along `length`, one every `spacing` px, between three and six. */\nexport function tickCount(length: number, spacing: number): number {\n return Math.min(6, Math.max(3, Math.round(length / spacing)));\n}\n","/**\n * SVG path geometry for the chart's marks. Every function is pure and writes\n * coordinates rounded to two decimals, so paths stay short and comparable.\n */\n\nexport type Point = readonly [number, number];\n\n/** One cubic Bézier piece of a curve. */\nexport interface Segment {\n readonly from: Point;\n readonly c1: Point;\n readonly c2: Point;\n readonly to: Point;\n}\n\nexport const TAU = Math.PI * 2;\n\nexport const round = (value: number): number => Math.round(value * 100) / 100 || 0;\n\nconst xy = ([x, y]: Point) => `${round(x)},${round(y)}`;\n\n/** Straight segments through `points`. `move` false continues an open path. */\nexport function linearPath(points: readonly Point[], move = true): string {\n return points.map((point, index) => `${index === 0 && move ? 'M' : 'L'}${xy(point)}`).join(' ');\n}\n\n/**\n * A monotone cubic through `points` (Fritsch–Carlson).\n *\n * Between two samples the curve stays within their range, so it never draws a\n * peak or a dip that is not in the data — the failure of the cardinal splines\n * most charts use. Needs at least three points; fewer have nothing to smooth.\n */\nexport function monotoneSegments(points: readonly Point[]): Segment[] {\n const count = points.length;\n if (count < 3) return [];\n\n const secants = points.slice(0, -1).map(([x0, y0], index) => {\n const [x1, y1] = points[index + 1]!;\n return x1 === x0 ? 0 : (y1 - y0) / (x1 - x0);\n });\n\n const tangents = points.map((_, index) => {\n if (index === 0) return secants[0]!;\n if (index === count - 1) return secants[count - 2]!;\n const before = secants[index - 1]!;\n const after = secants[index]!;\n // A turning point gets a flat tangent; otherwise the average slope.\n return before * after <= 0 ? 0 : (before + after) / 2;\n });\n\n secants.forEach((secant, index) => {\n if (secant === 0) {\n tangents[index] = 0;\n tangents[index + 1] = 0;\n return;\n }\n const a = tangents[index]! / secant;\n const b = tangents[index + 1]! / secant;\n const sum = a * a + b * b;\n // Past this circle the cubic overshoots; pull both tangents back onto it.\n if (sum > 9) {\n const tau = 3 / Math.sqrt(sum);\n tangents[index] = tau * a * secant;\n tangents[index + 1] = tau * b * secant;\n }\n });\n\n return secants.map((_, index) => {\n const from = points[index]!;\n const to = points[index + 1]!;\n const third = (to[0] - from[0]) / 3;\n return {\n from,\n c1: [from[0] + third, from[1] + tangents[index]! * third],\n c2: [to[0] - third, to[1] - tangents[index + 1]! * third],\n to,\n };\n });\n}\n\n/** A monotone curve as a path, or straight segments when there is nothing to smooth. */\nexport function monotonePath(points: readonly Point[], move = true): string {\n if (points.length < 3) return linearPath(points, move);\n\n const start = move ? `M${xy(points[0]!)}` : `L${xy(points[0]!)}`;\n return [\n start,\n ...monotoneSegments(points).map(({ c1, c2, to }) => `C${xy(c1)} ${xy(c2)} ${xy(to)}`),\n ].join(' ');\n}\n\n/** The point at `radius` and `angle` from a centre; 0 is twelve o'clock, clockwise. */\nexport function polar(cx: number, cy: number, radius: number, angle: number): Point {\n return [cx + radius * Math.sin(angle), cy - radius * Math.cos(angle)];\n}\n\n/**\n * A slice from `start` to `end`: a wedge to the centre when `inner` is 0, an\n * annular sector otherwise. A whole turn is drawn as circles (and a hole, with\n * `fill-rule=\"evenodd\"`) because a single SVG arc cannot close on itself.\n */\nexport function arcPath(\n cx: number,\n cy: number,\n inner: number,\n outer: number,\n start: number,\n end: number,\n): string {\n const span = end - start;\n if (span <= 0 || outer <= 0) return '';\n\n if (span >= TAU - 1e-6) {\n const circle = (radius: number, sweep: 0 | 1) => {\n const top = polar(cx, cy, radius, 0);\n const bottom = polar(cx, cy, radius, Math.PI);\n const arc = `A${round(radius)},${round(radius)} 0 1 ${sweep}`;\n return `M${xy(top)} ${arc} ${xy(bottom)} ${arc} ${xy(top)} Z`;\n };\n return inner > 0 ? `${circle(outer, 1)} ${circle(inner, 0)}` : circle(outer, 1);\n }\n\n const large = span > Math.PI ? 1 : 0;\n const outerArc = `A${round(outer)},${round(outer)} 0 ${large} 1 ${xy(polar(cx, cy, outer, end))}`;\n\n if (inner <= 0) {\n return `M${xy([cx, cy])} L${xy(polar(cx, cy, outer, start))} ${outerArc} Z`;\n }\n\n const innerArc = `A${round(inner)},${round(inner)} 0 ${large} 0 ${xy(polar(cx, cy, inner, start))}`;\n return `M${xy(polar(cx, cy, outer, start))} ${outerArc} L${xy(polar(cx, cy, inner, end))} ${innerArc} Z`;\n}\n\n/** Which end of a bar is rounded. The baseline end always stays square. */\nexport type Tip = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\n/**\n * A bar, rounded at its tip only. A bar rounded at the baseline too floats\n * above the axis instead of standing on it.\n */\nexport function barPath(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n tip: Tip,\n): string {\n const vertical = tip === 'top' || tip === 'bottom';\n const r = Math.max(\n 0,\n vertical ? Math.min(radius, width / 2, height) : Math.min(radius, height / 2, width),\n );\n const [x0, y0, x1, y1] = [x, y, x + width, y + height];\n const arc = (to: Point) => `A${round(r)},${round(r)} 0 0 1 ${xy(to)}`;\n const line = (to: Point) => `L${xy(to)}`;\n\n if (tip === 'none' || r === 0) {\n return `M${xy([x0, y0])} ${line([x1, y0])} ${line([x1, y1])} ${line([x0, y1])} Z`;\n }\n\n switch (tip) {\n case 'top':\n return `M${xy([x0, y1])} ${line([x0, y0 + r])} ${arc([x0 + r, y0])} ${line([x1 - r, y0])} ${arc([x1, y0 + r])} ${line([x1, y1])} Z`;\n case 'bottom':\n return `M${xy([x0, y0])} ${line([x1, y0])} ${line([x1, y1 - r])} ${arc([x1 - r, y1])} ${line([x0 + r, y1])} ${arc([x0, y1 - r])} Z`;\n case 'right':\n return `M${xy([x0, y0])} ${line([x1 - r, y0])} ${arc([x1, y0 + r])} ${line([x1, y1 - r])} ${arc([x1 - r, y1])} ${line([x0, y1])} Z`;\n case 'left':\n return `M${xy([x1, y0])} ${line([x1, y1])} ${line([x0 + r, y1])} ${arc([x0, y1 - r])} ${line([x0, y0 + r])} ${arc([x0 + r, y0])} Z`;\n }\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtMark, KtSeries, Measure, PlotBox } from './model.js';\nimport { project, tickCount, ticksFor, valueBounds, type Ticks } from './scale.js';\nimport { barPath, linearPath, monotonePath, type Point, type Tip } from './geometry.js';\n\n/**\n * Line, area and bar charts: one category axis, one value axis.\n *\n * The layout is computed once per render and every position is read from it,\n * so the marks, the labels, the tooltip and the hit test cannot disagree about\n * where a category is.\n */\n\nexport interface CartesianInput {\n readonly width: number;\n readonly height: number;\n readonly series: readonly KtSeries[];\n readonly hidden: ReadonlySet<number>;\n readonly labels: readonly string[];\n /** The chart's mark; a series can override it with its own `type`. */\n readonly type: KtMark;\n readonly stacked: boolean;\n readonly horizontal: boolean;\n readonly min: number | null;\n readonly max: number | null;\n readonly noAxis: boolean;\n readonly measure: Measure;\n readonly format: Format;\n}\n\nexport interface CartesianLayout {\n readonly box: PlotBox;\n readonly ticks: Ticks;\n /** How many categories there are. */\n readonly count: number;\n readonly horizontal: boolean;\n /** Categories are bands rather than points — true as soon as a bar is shown. */\n readonly banded: boolean;\n /** The mark each series is drawn as, by series index. */\n readonly marks: readonly KtMark[];\n /** Indices of the series that are not hidden. */\n readonly visible: readonly number[];\n}\n\n/** Room above the plot, to its right, and below it for the category labels. */\nconst PADDING = { top: 12, right: 8, bottom: 24 };\n/** Space between a label and the plot it labels. */\nconst LABEL_GAP = 12;\n/** Roughly one value tick per this many px of axis. */\nconst TICK_SPACING = { vertical: 48, horizontal: 96 };\n\nconst valuesOf = (series: KtSeries | undefined): readonly number[] => series?.values ?? [];\n\nexport function cartesianLayout(input: CartesianInput): CartesianLayout {\n const { series, hidden, labels, measure, format, noAxis, width, height } = input;\n\n const marks = series.map((entry) => entry.type ?? input.type);\n const visible = series.map((_, index) => index).filter((index) => !hidden.has(index));\n const shown = visible.map((index) => marks[index]!);\n const count = Math.max(labels.length, 0, ...series.map((entry) => valuesOf(entry).length));\n\n const banded = shown.length > 0 ? shown.includes('bar') : input.type === 'bar';\n const horizontal =\n input.horizontal && banded && (shown.length === 0 || shown.every((mark) => mark === 'bar'));\n\n // Bars stack with bars and areas with areas; lines always stand alone.\n const ofMark = (mark: KtMark) =>\n visible.filter((index) => marks[index] === mark).map((index) => valuesOf(series[index]));\n const stacks = input.stacked\n ? [ofMark('bar'), ofMark('area')].filter((stack) => stack.length)\n : [];\n const loose = input.stacked ? ofMark('line') : visible.map((index) => valuesOf(series[index]));\n // A bar's or an area's size is its distance from zero, so zero must be on the axis.\n const includeZero =\n shown.length > 0 ? shown.some((mark) => mark !== 'line') : input.type !== 'line';\n const { lo, hi } = valueBounds(stacks, loose, { includeZero });\n const limits = { min: input.min, max: input.max };\n\n if (!horizontal) {\n const plotHeight = Math.max(0, height - PADDING.top - PADDING.bottom);\n const ticks = ticksFor(lo, hi, tickCount(plotHeight, TICK_SPACING.vertical), limits);\n const widest = noAxis ? 0 : Math.max(0, ...ticks.values.map((value) => measure(format(value))));\n const left = noAxis ? 4 : Math.ceil(widest) + LABEL_GAP;\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - PADDING.right),\n height: plotHeight,\n },\n ticks,\n count,\n horizontal,\n banded,\n marks,\n visible,\n };\n }\n\n // Sideways: the categories take the left gutter, the values run along the bottom.\n const widestLabel = Math.max(0, ...labels.map(measure));\n const left = Math.ceil(Math.min(widestLabel, width * 0.4)) + LABEL_GAP;\n const plotWidth = Math.max(0, width - left - PADDING.right);\n const ticks = ticksFor(lo, hi, tickCount(plotWidth, TICK_SPACING.horizontal), limits);\n // The last value label is centred on the plot's right edge; keep half of it inside.\n const right = noAxis ? PADDING.right : Math.max(PADDING.right, measure(format(ticks.max)) / 2);\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - right),\n height: Math.max(0, height - PADDING.top - (noAxis ? 4 : PADDING.bottom)),\n },\n ticks,\n count,\n horizontal,\n banded,\n marks,\n visible,\n };\n}\n\n/** Where category `index` sits along its axis, in px. */\nexport function categoryCentre(layout: CartesianLayout, index: number): number {\n const { box, count, horizontal, banded } = layout;\n const start = horizontal ? box.y : box.x;\n const length = horizontal ? box.height : box.width;\n\n if (banded) return start + ((index + 0.5) * length) / Math.max(1, count);\n if (count <= 1) return start + length / 2;\n return start + (index / (count - 1)) * length;\n}\n\n/** Where `value` sits along the value axis, in px. */\nexport function valuePosition(layout: CartesianLayout, value: number): number {\n const { box, ticks, horizontal } = layout;\n return horizontal\n ? project(value, ticks, box.x, box.x + box.width)\n : project(value, ticks, box.y + box.height, box.y);\n}\n\n/** The category under a pointer at `x`, `y`: the band it is in, or the nearest sample. */\nexport function categoryAt(layout: CartesianLayout, x: number, y: number): number {\n const { box, count, horizontal, banded } = layout;\n if (count === 0) return -1;\n\n const position = horizontal ? y - box.y : x - box.x;\n const length = horizontal ? box.height : box.width;\n if (length <= 0) return -1;\n\n const index = banded\n ? Math.floor(position / (length / count))\n : Math.round((position / length) * (count - 1));\n return Math.min(Math.max(index, 0), count - 1);\n}\n\n/* ---------------------------------------------------------------- rendering */\n\nexport interface CartesianView extends CartesianInput {\n readonly layout: CartesianLayout;\n /** The active category, or -1. */\n readonly active: number;\n readonly smooth: boolean;\n readonly noGrid: boolean;\n readonly colorOf: (series: number) => string;\n /** Prefix for ids inside the shadow root, so two charts never share a gradient. */\n readonly idPrefix: string;\n}\n\n/** Bars fill this much of their band; the rest is the gap between categories. */\nconst GROUP_SHARE = 0.64;\nconst BAR_GAP = 2;\nconst BAR_RADIUS = 4;\nconst MAX_BAR = { grouped: 40, stacked: 48 };\n/** Below this many samples, and unsmoothed, every sample gets a dot. */\nconst DOTS_UP_TO = 12;\n\n/** `Array.prototype.findLastIndex`, which the ES2022 target does not have. */\nfunction lastIndexWhere<T>(items: readonly T[], test: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (test(items[index]!)) return index;\n }\n return -1;\n}\n\n/** A label cut to fit `width`, with an ellipsis. */\nfunction fit(text: string, width: number, measure: Measure): string {\n if (measure(text) <= width) return text;\n let cut = text;\n while (cut.length > 1 && measure(`${cut}…`) > width) cut = cut.slice(0, -1);\n return `${cut}…`;\n}\n\nfunction renderValueAxis(view: CartesianView): SVGTemplateResult {\n const { layout, noGrid, noAxis, format } = view;\n const { box, ticks, horizontal } = layout;\n\n const lines = noGrid\n ? nothing\n : ticks.values.map((value) => {\n const at = valuePosition(layout, value);\n return horizontal\n ? svg`<line class=\"grid\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`\n : svg`<line class=\"grid\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n });\n\n // Zero inside the range is the line a negative value hangs from; give it weight.\n const zero =\n ticks.min < 0 && ticks.max > 0\n ? (() => {\n const at = valuePosition(layout, 0);\n return horizontal\n ? svg`<line class=\"baseline\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`\n : svg`<line class=\"baseline\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n })()\n : nothing;\n\n const labels = noAxis\n ? nothing\n : ticks.values.map((value) => {\n const at = valuePosition(layout, value);\n return horizontal\n ? svg`<text class=\"tick-label\" x=${at} y=${box.y + box.height + 16} text-anchor=\"middle\">${format(value)}</text>`\n : svg`<text class=\"tick-label\" x=${box.x - 8} y=${at} text-anchor=\"end\" dominant-baseline=\"middle\">${format(value)}</text>`;\n });\n\n return svg`${lines}${zero}${labels}`;\n}\n\nfunction renderCategoryAxis(view: CartesianView): SVGTemplateResult {\n const { layout, labels, measure } = view;\n const { box, count, horizontal, banded } = layout;\n\n if (horizontal) {\n // One label per band while they fit, thinned when the bands get shorter than a line.\n const every = Math.max(1, Math.ceil(count / Math.max(1, Math.floor(box.height / 18))));\n return svg`${labels.map((text, index) =>\n index % every === 0\n ? svg`<text\n class=\"axis-label\"\n x=${box.x - 8}\n y=${categoryCentre(layout, index)}\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n >${fit(text, box.x - LABEL_GAP, measure)}</text>`\n : nothing,\n )}`;\n }\n\n // Thin the labels rather than letting them collide: each gets the widest one's room.\n const room = Math.max(0, ...labels.map(measure)) + LABEL_GAP;\n const every = Math.max(1, Math.ceil(count / Math.max(1, Math.floor(box.width / room))));\n\n return svg`${labels.map((text, index) => {\n if (index % every !== 0) return nothing;\n // On a line the first and last samples sit on the plot's edges; a centred\n // label there would hang out of the chart.\n const anchor =\n banded || count <= 1\n ? 'middle'\n : index === 0\n ? 'start'\n : index === count - 1\n ? 'end'\n : 'middle';\n return svg`<text\n class=\"axis-label\"\n x=${categoryCentre(layout, index)}\n y=${box.y + box.height + 16}\n text-anchor=${anchor}\n >${text}</text>`;\n })}`;\n}\n\n/** The screen points of one series' samples. */\nfunction pointsOf(\n view: CartesianView,\n values: readonly number[],\n offsets?: readonly number[],\n): Point[] {\n return values.map((value, index) => [\n categoryCentre(view.layout, index),\n valuePosition(view.layout, value + (offsets?.[index] ?? 0)),\n ]);\n}\n\nfunction pathThrough(view: CartesianView, points: readonly Point[], move = true): string {\n return view.smooth ? monotonePath(points, move) : linearPath(points, move);\n}\n\nfunction renderLinesAndAreas(view: CartesianView): SVGTemplateResult {\n const { layout, series, colorOf, active, idPrefix, stacked, smooth } = view;\n const { box, count, visible, marks } = layout;\n const floor = valuePosition(layout, Math.min(Math.max(0, layout.ticks.min), layout.ticks.max));\n\n // Running totals for stacked areas: each area sits on the ones before it.\n const stackBase = new Array<number>(count).fill(0);\n\n const fills: SVGTemplateResult[] = [];\n const strokes: SVGTemplateResult[] = [];\n\n for (const index of visible) {\n const mark = marks[index]!;\n if (mark === 'bar') continue;\n\n const values = valuesOf(series[index]);\n if (values.length === 0) continue;\n const color = colorOf(index);\n const onStack = mark === 'area' && stacked;\n const base = onStack ? [...stackBase] : undefined;\n const upper = pointsOf(view, values, base);\n\n if (mark === 'area') {\n const gradient = `${idPrefix}-fill-${index}`;\n const lower: Point[] = base\n ? values.map((_, i) => [categoryCentre(layout, i), valuePosition(layout, base[i]!)])\n : [\n [upper.at(-1)![0], floor],\n [upper[0]![0], floor],\n ];\n const closing = base\n ? pathThrough(view, [...lower].reverse(), false)\n : linearPath(lower, false);\n\n fills.push(svg`\n <defs>\n <linearGradient id=${gradient} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=${color} stop-opacity=\"0.28\" />\n <stop offset=\"100%\" stop-color=${color} stop-opacity=\"0.02\" />\n </linearGradient>\n </defs>\n <path class=\"area\" d=${`${pathThrough(view, upper)} ${closing} Z`} fill=${`url(#${gradient})`} />`);\n\n if (base) values.forEach((value, i) => (stackBase[i] = base[i]! + value));\n }\n\n strokes.push(\n svg`<path class=\"line\" d=${pathThrough(view, upper)} stroke=${color} pathLength=\"1\" />`,\n );\n\n if (count <= DOTS_UP_TO && !smooth) {\n strokes.push(\n svg`${upper.map(([x, y]) => svg`<circle class=\"point\" cx=${x} cy=${y} r=\"3\" fill=${color} />`)}`,\n );\n }\n if (active >= 0 && upper[active]) {\n const [x, y] = upper[active];\n strokes.push(svg`<circle class=\"marker\" cx=${x} cy=${y} r=\"5\" fill=${color} />`);\n }\n }\n\n const crosshair =\n active >= 0 && !layout.banded\n ? svg`<line class=\"crosshair\"\n x1=${categoryCentre(layout, active)} y1=${box.y}\n x2=${categoryCentre(layout, active)} y2=${box.y + box.height} />`\n : nothing;\n\n return svg`${fills}${crosshair}${strokes}`;\n}\n\n/** One bar or stack segment running from `from` to `to` on the value axis. */\nfunction barSegment(\n view: CartesianView,\n options: {\n readonly from: number;\n readonly to: number;\n /** Offset across the band, and thickness, in px. */\n readonly offset: number;\n readonly thickness: number;\n /** Round the tip: only the outermost segment of a bar has one. */\n readonly outer: boolean;\n readonly series: number;\n readonly index: number;\n },\n): SVGTemplateResult {\n const { layout, active, colorOf } = view;\n const { from, to, offset, thickness, outer, series, index } = options;\n const negative = to < from;\n\n let start = valuePosition(layout, from);\n let end = valuePosition(layout, to);\n // Stack segments meet with a hairline of surface between them, not fused.\n const inset = 0.5;\n const direction = Math.sign(end - start) || 1;\n if (from !== 0) start += inset * direction;\n if (!outer) end -= inset * direction;\n // A non-zero value never disappears into the baseline.\n if (Math.abs(end - start) < 1) end = start + direction;\n\n const low = Math.min(start, end);\n const length = Math.abs(end - start);\n const tip: Tip = !outer\n ? 'none'\n : layout.horizontal\n ? negative\n ? 'left'\n : 'right'\n : negative\n ? 'bottom'\n : 'top';\n\n const d = layout.horizontal\n ? barPath(low, offset, length, thickness, BAR_RADIUS, tip)\n : barPath(offset, low, thickness, length, BAR_RADIUS, tip);\n\n return svg`<path\n class=${`bar${negative ? ' negative' : ''}${layout.horizontal ? ' sideways' : ''}`}\n d=${d}\n fill=${colorOf(series)}\n data-series=${series}\n data-index=${index}\n opacity=${active === -1 || active === index ? 1 : 0.45}\n />`;\n}\n\nfunction renderBars(view: CartesianView): SVGTemplateResult | typeof nothing {\n const { layout, series } = view;\n const { box, count, horizontal, visible, marks } = layout;\n const bars = visible.filter((index) => marks[index] === 'bar');\n if (bars.length === 0 || count === 0) return nothing;\n\n const band = (horizontal ? box.height : box.width) / count;\n const group = band * GROUP_SHARE;\n const segments: SVGTemplateResult[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const centre = categoryCentre(layout, index);\n\n if (view.stacked) {\n // One bar per category. Positives pile up from zero and negatives down\n // from it, each pile rounded only at its far end.\n const thickness = Math.max(2, Math.min(MAX_BAR.stacked, group));\n const values = bars.map((seriesIndex) => valuesOf(series[seriesIndex])[index] ?? 0);\n const lastAbove = lastIndexWhere(values, (value) => value > 0);\n const lastBelow = lastIndexWhere(values, (value) => value < 0);\n let above = 0;\n let below = 0;\n\n values.forEach((value, position) => {\n if (value === 0) return;\n const from = value > 0 ? above : below;\n const to = from + value;\n if (value > 0) above = to;\n else below = to;\n segments.push(\n barSegment(view, {\n from,\n to,\n offset: centre - thickness / 2,\n thickness,\n outer: position === (value > 0 ? lastAbove : lastBelow),\n series: bars[position]!,\n index,\n }),\n );\n });\n continue;\n }\n\n const thickness = Math.max(\n 2,\n Math.min(MAX_BAR.grouped, (group - BAR_GAP * (bars.length - 1)) / bars.length),\n );\n const total = thickness * bars.length + BAR_GAP * (bars.length - 1);\n bars.forEach((seriesIndex, position) => {\n const value = valuesOf(series[seriesIndex])[index];\n if (value === undefined || value === 0) return;\n segments.push(\n barSegment(view, {\n from: 0,\n to: value,\n offset: centre - total / 2 + position * (thickness + BAR_GAP),\n thickness,\n outer: true,\n series: seriesIndex,\n index,\n }),\n );\n });\n }\n\n return svg`${segments}`;\n}\n\nexport function renderCartesian(view: CartesianView): SVGTemplateResult {\n return svg`\n ${renderValueAxis(view)}\n ${renderBars(view)}\n ${renderLinesAndAreas(view)}\n ${renderCategoryAxis(view)}`;\n}\n\n/** Where the tooltip for the active category points: at its tallest mark. */\nexport function tooltipAnchor(view: CartesianView): { x: number; y: number } {\n const { layout, series, active, stacked } = view;\n const at = (index: number) => valuesOf(series[index])[active] ?? 0;\n\n let peak = layout.ticks.min;\n for (const mark of ['bar', 'area', 'line'] as const) {\n const values = layout.visible.filter((index) => layout.marks[index] === mark).map(at);\n if (values.length === 0) continue;\n // A stack is as tall as its positive values together; anything else, its largest value.\n const top =\n stacked && mark !== 'line'\n ? values.filter((value) => value > 0).reduce((sum, value) => sum + value, 0)\n : Math.max(...values);\n peak = Math.max(peak, top);\n }\n\n const across = categoryCentre(layout, active);\n const along = valuePosition(layout, Math.min(peak, layout.ticks.max));\n return layout.horizontal ? { x: along, y: across } : { x: across, y: along };\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtPoint, KtSeries, Measure, PlotBox } from './model.js';\nimport { project, tickCount, ticksFor, type Ticks } from './scale.js';\nimport type { Point } from './geometry.js';\n\n/**\n * Scatter and bubble charts: two value axes, one dot per observation.\n *\n * Neither axis is forced through zero. A scatter plot is about how two\n * measures move together, and dragging the origin in would crush the cloud\n * into a corner.\n */\n\nexport interface PointInput {\n readonly width: number;\n readonly height: number;\n readonly series: readonly KtSeries[];\n readonly hidden: ReadonlySet<number>;\n readonly bubble: boolean;\n /** Pins the y axis. The x axis always follows the data. */\n readonly min: number | null;\n readonly max: number | null;\n readonly noAxis: boolean;\n readonly measure: Measure;\n readonly format: Format;\n readonly formatX: Format;\n}\n\nexport interface PointLayout {\n readonly box: PlotBox;\n readonly x: Ticks;\n readonly y: Ticks;\n /** The largest bubble size among visible points; 0 for a scatter. */\n readonly maxR: number;\n}\n\nconst PADDING = { top: 16, right: 16, bottom: 24 };\nconst LABEL_GAP = 12;\n/** The largest bubble's radius, in px. */\nconst MAX_BUBBLE = 24;\nconst MIN_BUBBLE = 3;\nconst DOT = 4;\n/** How close, in px, a pointer must be to pick a point up. */\nconst REACH = 24;\n\nconst pointsOf = (series: KtSeries | undefined): readonly KtPoint[] => series?.points ?? [];\n\nfunction visiblePoints(input: PointInput): KtPoint[] {\n return input.series.flatMap((series, index) => (input.hidden.has(index) ? [] : pointsOf(series)));\n}\n\nfunction extent(values: readonly number[]): [number, number] {\n return values.length === 0 ? [0, 1] : [Math.min(...values), Math.max(...values)];\n}\n\nexport function pointLayout(input: PointInput): PointLayout {\n const { width, height, measure, format, formatX, noAxis } = input;\n const points = visiblePoints(input);\n\n const plotHeight = Math.max(0, height - PADDING.top - PADDING.bottom);\n const [yLo, yHi] = extent(points.map((point) => point.y));\n const y = ticksFor(yLo, yHi, tickCount(plotHeight, 48), { min: input.min, max: input.max });\n const widest = noAxis ? 0 : Math.max(0, ...y.values.map((value) => measure(format(value))));\n const left = noAxis ? 4 : Math.ceil(widest) + LABEL_GAP;\n\n const [xLo, xHi] = extent(points.map((point) => point.x));\n const x = ticksFor(xLo, xHi, tickCount(Math.max(0, width - left - PADDING.right), 96), {\n min: null,\n max: null,\n });\n // The last x label is centred on the plot's right edge; keep half of it inside.\n const right = noAxis ? PADDING.right : Math.max(PADDING.right, measure(formatX(x.max)) / 2);\n\n return {\n box: {\n x: left,\n y: PADDING.top,\n width: Math.max(0, width - left - right),\n height: plotHeight,\n },\n x,\n y,\n maxR: input.bubble ? Math.max(0, ...points.map((point) => point.r ?? 0)) : 0,\n };\n}\n\n/** Where a point lands on screen. */\nexport function pointPosition(layout: PointLayout, point: Pick<KtPoint, 'x' | 'y'>): Point {\n const { box } = layout;\n return [\n project(point.x, layout.x, box.x, box.x + box.width),\n project(point.y, layout.y, box.y + box.height, box.y),\n ];\n}\n\n/**\n * A bubble's radius. The value is carried by the area, so the radius grows\n * with its square root: a bubble twice the value looks twice the size, not\n * four times.\n */\nexport function bubbleRadius(r: number | undefined, maxR: number): number {\n if (r === undefined || maxR <= 0 || r <= 0) return MIN_BUBBLE;\n return Math.max(MIN_BUBBLE, MAX_BUBBLE * Math.sqrt(r / maxR));\n}\n\nfunction radiusOf(input: PointInput, layout: PointLayout, point: KtPoint): number {\n return input.bubble ? bubbleRadius(point.r, layout.maxR) : DOT;\n}\n\n/** The visible point nearest a pointer, if it is close enough to mean it. */\nexport function nearestPoint(\n input: PointInput,\n layout: PointLayout,\n x: number,\n y: number,\n): { series: number; index: number } | null {\n let best: { series: number; index: number } | null = null;\n let bestDistance = Infinity;\n\n input.series.forEach((series, seriesIndex) => {\n if (input.hidden.has(seriesIndex)) return;\n pointsOf(series).forEach((point, index) => {\n const [px, py] = pointPosition(layout, point);\n const distance = Math.hypot(px - x, py - y);\n const reach = Math.max(REACH, radiusOf(input, layout, point) + 4);\n if (distance <= reach && distance < bestDistance) {\n best = { series: seriesIndex, index };\n bestDistance = distance;\n }\n });\n });\n\n return best;\n}\n\n/** A series' point indices in x order, the order the keyboard walks them in. */\nexport function walkOrder(series: KtSeries | undefined): number[] {\n const points = pointsOf(series);\n return points.map((_, index) => index).sort((a, b) => points[a]!.x - points[b]!.x);\n}\n\nexport interface PointView extends PointInput {\n readonly layout: PointLayout;\n readonly active: number;\n readonly activeSeries: number;\n readonly noGrid: boolean;\n readonly colorOf: (series: number) => string;\n}\n\nexport function renderPoints(view: PointView): SVGTemplateResult {\n const { layout, noGrid, noAxis, format, formatX, bubble, colorOf, active, activeSeries } = view;\n const { box } = layout;\n\n const grid = noGrid\n ? nothing\n : svg`\n ${layout.y.values.map((value) => {\n const at = project(value, layout.y, box.y + box.height, box.y);\n return svg`<line class=\"grid\" x1=${box.x} y1=${at} x2=${box.x + box.width} y2=${at} />`;\n })}\n ${layout.x.values.map((value) => {\n const at = project(value, layout.x, box.x, box.x + box.width);\n return svg`<line class=\"grid\" x1=${at} y1=${box.y} x2=${at} y2=${box.y + box.height} />`;\n })}`;\n\n const axes = noAxis\n ? nothing\n : svg`\n ${layout.y.values.map(\n (value) =>\n svg`<text class=\"tick-label\" x=${box.x - 8} y=${project(value, layout.y, box.y + box.height, box.y)}\n text-anchor=\"end\" dominant-baseline=\"middle\">${format(value)}</text>`,\n )}\n ${layout.x.values.map(\n (value) =>\n svg`<text class=\"tick-label\" x=${project(value, layout.x, box.x, box.x + box.width)}\n y=${box.y + box.height + 16} text-anchor=\"middle\">${formatX(value)}</text>`,\n )}`;\n\n // Largest first, so a small bubble is never buried under a big one.\n const dots = view.series\n .flatMap((series, seriesIndex) =>\n view.hidden.has(seriesIndex)\n ? []\n : pointsOf(series).map((point, index) => ({\n point,\n index,\n seriesIndex,\n radius: radiusOf(view, layout, point),\n })),\n )\n .sort((a, b) => b.radius - a.radius);\n\n const marks = dots.map(({ point, index, seriesIndex, radius }) => {\n const [x, y] = pointPosition(layout, point);\n const color = colorOf(seriesIndex);\n return svg`<circle\n class=\"dot\"\n cx=${x}\n cy=${y}\n r=${radius}\n fill=${color}\n fill-opacity=${bubble ? 0.55 : 0.85}\n stroke=${bubble ? color : 'var(--surface-card)'}\n stroke-width=${bubble ? 1.5 : 2}\n data-series=${seriesIndex}\n data-index=${index}\n />`;\n });\n\n const focus = (() => {\n const point = pointsOf(view.series[activeSeries])[active];\n if (!point || view.hidden.has(activeSeries)) return nothing;\n const [x, y] = pointPosition(layout, point);\n return svg`<circle class=\"focus-ring\" cx=${x} cy=${y}\n r=${radiusOf(view, layout, point) + 4} fill=\"none\" stroke=${colorOf(activeSeries)} stroke-width=\"2\" />`;\n })();\n\n return svg`${grid}${axes}${marks}${focus}`;\n}\n","import { nothing, svg, type SVGTemplateResult } from 'lit';\nimport type { Format, KtSeries, Measure } from './model.js';\nimport { niceTicks, type Ticks } from './scale.js';\nimport { TAU, arcPath, linearPath, polar } from './geometry.js';\n\n/**\n * Pie, doughnut, polar area and radar: charts drawn around a centre.\n *\n * Pie, doughnut and polar area read the labels as slices and the first series\n * as their values — they show one distribution. Comparing two is a stacked\n * bar's job. A radar reads the labels as spokes and draws every series.\n */\n\nexport type RadialKind = 'pie' | 'doughnut' | 'polar-area' | 'radar';\n\nexport interface RadialInput {\n readonly width: number;\n readonly height: number;\n readonly kind: RadialKind;\n readonly series: readonly KtSeries[];\n /** Slice indices for pie, doughnut and polar area; series indices for radar. */\n readonly hidden: ReadonlySet<number>;\n readonly labels: readonly string[];\n readonly measure: Measure;\n}\n\n/** A slice, or for a radar a spoke (whose start and end are the same angle). */\nexport interface Slice {\n readonly index: number;\n /** The value drawn: never negative, and 0 when hidden. */\n readonly value: number;\n readonly start: number;\n readonly end: number;\n /** Outer radius; varies per slice only for polar area. */\n readonly outer: number;\n}\n\nexport interface RadialLayout {\n readonly cx: number;\n readonly cy: number;\n readonly outer: number;\n readonly inner: number;\n readonly slices: readonly Slice[];\n /** Rings for polar area and radar. */\n readonly ticks: Ticks;\n /** The sum of the visible slices. */\n readonly total: number;\n}\n\nconst PADDING = 8;\n/** A doughnut's hole, as a share of its radius. */\nconst HOLE = 0.62;\nconst RING_COUNT = 4;\nconst LABEL_GAP = 12;\n\nexport function radialLayout(input: RadialInput): RadialLayout {\n const { width, height, kind, series, hidden, labels, measure } = input;\n const cx = width / 2;\n const cy = height / 2;\n\n if (kind === 'radar') {\n const values = series.flatMap((entry, index) =>\n hidden.has(index) ? [] : (entry.values ?? []),\n );\n const lo = Math.min(0, ...values);\n const hi = Math.max(0, ...values);\n const ticks = niceTicks(lo, hi === lo ? lo + 1 : hi, RING_COUNT);\n // The labels sit outside the outermost ring; keep them on the canvas.\n const room = Math.min(Math.max(0, ...labels.map(measure)), width * 0.25) + LABEL_GAP;\n const outer = Math.max(0, Math.min(cx - room, cy - LABEL_GAP * 2));\n const count = Math.max(labels.length, ...series.map((entry) => entry.values?.length ?? 0));\n\n return {\n cx,\n cy,\n outer,\n inner: 0,\n slices: Array.from({ length: count }, (_, index) => {\n const angle = (index * TAU) / Math.max(1, count);\n return { index, value: 0, start: angle, end: angle, outer };\n }),\n ticks,\n total: 0,\n };\n }\n\n const values = series[0]?.values ?? [];\n const count = Math.max(labels.length, values.length);\n const shown = (index: number) => (hidden.has(index) ? 0 : Math.max(0, values[index] ?? 0));\n const total = Array.from({ length: count }, (_, index) => shown(index)).reduce(\n (a, b) => a + b,\n 0,\n );\n const outer = Math.max(0, Math.min(width, height) / 2 - PADDING);\n const peak = Math.max(0, ...Array.from({ length: count }, (_, index) => shown(index)));\n const ticks = niceTicks(0, peak || 1, RING_COUNT);\n const visibleCount = Array.from({ length: count }, (_, index) => index).filter(\n (index) => !hidden.has(index),\n ).length;\n\n let angle = 0;\n const slices = Array.from({ length: count }, (_, index): Slice => {\n const value = shown(index);\n const start = angle;\n\n if (kind === 'polar-area') {\n // Equal angles; the area carries the value, so the radius is its square root.\n if (!hidden.has(index)) angle += TAU / Math.max(1, visibleCount);\n return { index, value, start, end: angle, outer: outer * Math.sqrt(value / ticks.max) };\n }\n\n angle += total > 0 ? (value / total) * TAU : 0;\n return { index, value, start, end: angle, outer };\n });\n\n return { cx, cy, outer, inner: kind === 'doughnut' ? outer * HOLE : 0, slices, ticks, total };\n}\n\n/** The slice, or radar spoke, under a pointer; -1 for none. */\nexport function sliceAt(layout: RadialLayout, kind: RadialKind, x: number, y: number): number {\n const dx = x - layout.cx;\n const dy = y - layout.cy;\n const distance = Math.hypot(dx, dy);\n let angle = Math.atan2(dx, -dy);\n if (angle < 0) angle += TAU;\n\n if (kind === 'radar') {\n const count = layout.slices.length;\n if (count === 0 || distance > layout.outer + LABEL_GAP * 2) return -1;\n return Math.round(angle / (TAU / count)) % count;\n }\n\n if (distance > layout.outer || distance < layout.inner) return -1;\n const slice = layout.slices.find(\n ({ start, end }) => end > start && angle >= start && angle < end,\n );\n return slice?.index ?? -1;\n}\n\n/** Where a slice's tooltip points: the middle of the slice. */\nexport function sliceAnchor(layout: RadialLayout, index: number): readonly [number, number] {\n const slice = layout.slices[index];\n if (!slice) return [layout.cx, layout.cy];\n const middle = (slice.start + slice.end) / 2;\n const radius = layout.inner > 0 ? (layout.inner + slice.outer) / 2 : slice.outer * 0.6;\n return polar(layout.cx, layout.cy, radius, middle);\n}\n\n/** On a radar, the distance from the centre of `value`. */\nexport function radarRadius(layout: RadialLayout, value: number): number {\n const { ticks, outer } = layout;\n return ((value - ticks.min) / (ticks.max - ticks.min)) * outer;\n}\n\nexport interface RadialView extends RadialInput {\n readonly layout: RadialLayout;\n readonly active: number;\n readonly noGrid: boolean;\n readonly noAxis: boolean;\n readonly centerLabel: string;\n readonly format: Format;\n readonly colorOf: (series: number) => string;\n readonly sliceColor: (slice: number) => string;\n}\n\nfunction renderSlices(view: RadialView): SVGTemplateResult {\n // No values on a polar area's rings: its radius is a square root, which\n // nobody reads off a ring. The tooltip and the table carry the numbers.\n const { layout, active, sliceColor, kind, noGrid, format, centerLabel } = view;\n const { cx, cy, inner, ticks } = layout;\n\n const rings =\n kind === 'polar-area' && !noGrid\n ? ticks.values\n .filter((value) => value > 0)\n .map(\n (value) =>\n svg`<circle class=\"grid\" cx=${cx} cy=${cy} r=${layout.outer * Math.sqrt(value / ticks.max)} fill=\"none\" />`,\n )\n : nothing;\n\n const shown = layout.slices.filter((slice) => slice.end > slice.start && slice.outer > 0);\n const paths = shown.map(\n (slice) => svg`<path\n class=\"slice\"\n d=${arcPath(cx, cy, inner, slice.outer, slice.start, slice.end)}\n fill=${sliceColor(slice.index)}\n fill-rule=\"evenodd\"\n stroke=\"var(--surface-card)\"\n stroke-width=${shown.length > 1 ? 2 : 0}\n stroke-linejoin=\"round\"\n data-index=${slice.index}\n opacity=${active === -1 || active === slice.index ? 1 : 0.45}\n />`,\n );\n\n const centre =\n kind === 'doughnut'\n ? svg`\n <text class=\"center-value\" x=${cx} y=${cy} text-anchor=\"middle\" dominant-baseline=\"middle\">${format(layout.total)}</text>\n ${\n inner > 36\n ? svg`<text class=\"center-label\" x=${cx} y=${cy + 20} text-anchor=\"middle\" dominant-baseline=\"middle\">${centerLabel}</text>`\n : nothing\n }`\n : nothing;\n\n return svg`${rings}${paths}${centre}`;\n}\n\nfunction renderRadar(view: RadialView): SVGTemplateResult {\n const { layout, series, hidden, labels, colorOf, active, noGrid, noAxis, format } = view;\n const { cx, cy, outer, ticks, slices } = layout;\n const spokes = slices.map((slice) => slice.start);\n\n const grid = noGrid\n ? nothing\n : svg`\n ${ticks.values\n .filter((value) => value > ticks.min)\n .map((value) => {\n const radius = radarRadius(layout, value);\n return svg`<path class=\"grid\" fill=\"none\" d=${`${linearPath(spokes.map((angle) => polar(cx, cy, radius, angle)))} Z`} />`;\n })}\n ${spokes.map((angle) => {\n const [x, y] = polar(cx, cy, outer, angle);\n return svg`<line class=\"grid\" x1=${cx} y1=${cy} x2=${x} y2=${y} />`;\n })}`;\n\n const ringLabels = noAxis\n ? nothing\n : ticks.values\n .filter((value) => value > ticks.min)\n .map(\n (value) =>\n svg`<text class=\"tick-label ring-label\" x=${cx + 4} y=${cy - radarRadius(layout, value) + 3} dominant-baseline=\"hanging\">${format(value)}</text>`,\n );\n\n const axisLabels = spokes.map((angle, index) => {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n const anchor = sin > 0.1 ? 'start' : sin < -0.1 ? 'end' : 'middle';\n // Top and bottom labels sit clear of the ring, above or below it, so the\n // ring values running up the first spoke never collide with them.\n const [x, y] = polar(cx, cy, outer + (Math.abs(cos) > 0.5 ? 8 : LABEL_GAP), angle);\n const baseline = cos > 0.5 ? 'auto' : cos < -0.5 ? 'hanging' : 'middle';\n return svg`<text class=\"axis-label\" x=${x} y=${y} text-anchor=${anchor} dominant-baseline=${baseline}>${labels[index] ?? ''}</text>`;\n });\n\n const outlines = series.map((entry, seriesIndex) => {\n if (hidden.has(seriesIndex)) return nothing;\n const color = colorOf(seriesIndex);\n const points = spokes.map((angle, index) =>\n polar(cx, cy, radarRadius(layout, entry.values?.[index] ?? ticks.min), angle),\n );\n const markers =\n active >= 0 && points[active]\n ? svg`<circle class=\"marker\" cx=${points[active][0]} cy=${points[active][1]} r=\"5\" fill=${color} />`\n : nothing;\n return svg`\n <path class=\"radar\" d=${`${linearPath(points)} Z`} stroke=${color} fill=${color} />\n ${markers}`;\n });\n\n const spoke =\n active >= 0 && spokes[active] !== undefined\n ? (() => {\n const [x, y] = polar(cx, cy, outer, spokes[active]);\n return svg`<line class=\"crosshair\" x1=${cx} y1=${cy} x2=${x} y2=${y} />`;\n })()\n : nothing;\n\n return svg`${grid}${spoke}${outlines}${ringLabels}${axisLabels}`;\n}\n\nexport function renderRadial(view: RadialView): SVGTemplateResult {\n return view.kind === 'radar' ? renderRadar(view) : renderSlices(view);\n}\n","import { css, html, nothing, type SVGTemplateResult, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport { strings } from '#internal/strings';\nimport type { Format, KtChartType, KtMark, KtSeries } from './model.js';\nimport {\n cartesianLayout,\n categoryAt,\n renderCartesian,\n tooltipAnchor,\n type CartesianView,\n} from './cartesian.js';\nimport {\n nearestPoint,\n pointLayout,\n pointPosition,\n renderPoints,\n walkOrder,\n type PointView,\n} from './point.js';\nimport {\n radarRadius,\n radialLayout,\n renderRadial,\n sliceAnchor,\n sliceAt,\n type RadialKind,\n type RadialView,\n} from './radial.js';\nimport { polar } from './geometry.js';\n\nexport type { KtChartType, KtMark, KtPoint, KtSeries } from './model.js';\n\ninterface Box {\n readonly width: number;\n readonly height: number;\n}\n\ntype Family = 'cartesian' | 'point' | 'radial';\n\nconst MAX_SLOTS = 8;\n\n/** One row of the tooltip. */\ninterface TooltipRow {\n readonly color: string;\n readonly name: string;\n readonly value: string;\n}\n\ninterface Tooltip {\n readonly title: string;\n readonly subtitle?: string;\n readonly rows: readonly TooltipRow[];\n readonly total?: string;\n readonly x: number;\n readonly y: number;\n /** Which side of the anchor the tooltip opens on. */\n readonly side: 'above' | 'left' | 'right';\n}\n\n/**\n * A chart, drawn from the token layer.\n *\n * Line, area and bar — stacked, sideways or mixed — plus scatter, bubble,\n * pie, doughnut, polar area and radar, all in Kanto's voice: the eight\n * categorical hues in fixed order, one value axis, recessive grid, and the\n * data always available as a table.\n *\n * **Colour.** One series takes the brand hue: with nothing to tell apart there\n * is no identity to encode, and the title names it. Two or more take the fixed\n * categorical order in `--chart-series-1…8`, assigned by position and never\n * cycled, so a series keeps its colour when a filter removes its neighbours.\n * Slices take the same order by slice.\n *\n * **The table is not optional.** Every chart also renders its data as a table,\n * visually hidden by default. It is what a screen reader reads, and it is the\n * relief that four of the light-theme series hues require, sitting as they do\n * below 3:1 on a light surface.\n *\n * @element kt-chart\n *\n * @csspart svg - The plot.\n * @csspart legend - The legend.\n * @csspart table - The data table.\n *\n * @fires kt-point-hover - The active point changed. `detail: { index, series }`;\n * `index` is -1 when nothing is active, `series` -1 when the index spans\n * every series.\n * @fires kt-series-toggle - A legend item was pressed. `detail: { series, hidden }`.\n * Cancelable.\n *\n * @example\n * ```js\n * chart.labels = ['Jan', 'Feb', 'Mar'];\n * chart.series = [{ name: 'Revenue', values: [42, 58, 36] }];\n * ```\n */\nexport class KtChart extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n position: relative;\n }\n\n .plot {\n position: relative;\n width: 100%;\n }\n\n svg {\n display: block;\n width: 100%;\n overflow: visible;\n border-radius: var(--border-radius);\n }\n\n svg:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 4px;\n }\n\n /* Recessive: the data is the loud part. */\n .grid {\n stroke: var(--chart-grid);\n stroke-width: 1;\n opacity: 0.6;\n }\n\n .baseline {\n stroke: var(--chart-axis);\n stroke-width: 1;\n opacity: 0.5;\n }\n\n .axis-label,\n .tick-label {\n fill: var(--chart-axis);\n font: var(--font-normal-small);\n font-family: var(--font-family-body);\n font-variant-numeric: tabular-nums;\n }\n\n /* Ring values sit on top of the marks; a halo of the surface keeps them\n readable without boxing them in. */\n .ring-label {\n paint-order: stroke;\n stroke: var(--surface-card);\n stroke-width: 2px;\n stroke-linejoin: round;\n }\n\n .line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n .point,\n .marker {\n stroke: var(--surface-card);\n stroke-width: 2;\n }\n\n .bar,\n .slice {\n transition: opacity var(--duration-fast) var(--easing-standard);\n }\n\n /* One entrance, when a mark first appears: bars grow from the baseline,\n lines draw along their length, everything else fades in. Nothing\n moves on hover, and the reduced-motion block in the token layer\n zeroes the duration. Backwards fill, so the animation never holds a\n value past its end — the dimming on hover stays in charge. */\n .bar {\n transform-box: fill-box;\n transform-origin: 50% 100%;\n animation: kt-chart-grow-y var(--duration-normal) var(--easing-standard) backwards;\n }\n .bar.negative {\n transform-origin: 50% 0;\n }\n .bar.sideways {\n transform-origin: 0 50%;\n animation-name: kt-chart-grow-x;\n }\n .bar.sideways.negative {\n transform-origin: 100% 50%;\n }\n\n .line {\n stroke-dasharray: 1;\n animation: kt-chart-draw var(--duration-normal) var(--easing-standard) backwards;\n }\n\n .area,\n .point,\n .dot,\n .slice,\n .radar {\n animation: kt-chart-fade var(--duration-normal) var(--easing-standard) backwards;\n }\n\n @keyframes kt-chart-grow-y {\n from {\n transform: scaleY(0);\n }\n }\n @keyframes kt-chart-grow-x {\n from {\n transform: scaleX(0);\n }\n }\n @keyframes kt-chart-draw {\n from {\n stroke-dashoffset: 1;\n }\n }\n @keyframes kt-chart-fade {\n from {\n opacity: 0;\n }\n }\n\n .radar {\n stroke-width: 2;\n stroke-linejoin: round;\n fill-opacity: 0.16;\n }\n\n .center-value {\n fill: var(--text-body);\n font: var(--font-title-h6);\n font-variant-numeric: tabular-nums;\n }\n\n .center-label {\n fill: var(--text-muted);\n font: var(--font-normal-small);\n }\n\n .crosshair {\n stroke: var(--chart-axis);\n stroke-width: 1;\n stroke-dasharray: 3 3;\n }\n\n .tooltip {\n position: absolute;\n z-index: var(--z-tooltip);\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n padding: 8px 10px;\n color: var(--text-inverted);\n font: var(--font-normal-small);\n background: var(--surface-inverted);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow-toast);\n pointer-events: none;\n }\n\n .tooltip.above {\n transform: translate(-50%, calc(-100% - 12px));\n }\n .tooltip.right {\n transform: translate(12px, -50%);\n }\n .tooltip.left {\n transform: translate(calc(-100% - 12px), -50%);\n }\n\n .tooltip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n white-space: nowrap;\n }\n\n .swatch {\n flex: none;\n width: 8px;\n height: 8px;\n background: var(--swatch);\n border-radius: 2px;\n }\n\n .swatch.hollow {\n background: none;\n box-shadow: inset 0 0 0 var(--border-width) var(--swatch);\n }\n\n .tooltip-name {\n flex: 1;\n opacity: 0.75;\n }\n\n .tooltip-subtitle {\n margin-top: -2px;\n opacity: 0.75;\n }\n\n .tooltip-value {\n font-variant-numeric: tabular-nums;\n }\n\n .tooltip-total {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n margin-top: 2px;\n padding-top: 4px;\n border-top: var(--border-width) solid color-mix(in srgb, currentColor 20%, transparent);\n font-variant-numeric: tabular-nums;\n }\n\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n margin-top: 10px;\n }\n\n .legend-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n color: var(--text-muted);\n font: var(--font-normal-small);\n background: none;\n border: none;\n border-radius: var(--border-radius);\n cursor: pointer;\n }\n\n .legend-item:hover {\n color: var(--text-body);\n }\n\n .legend-item[aria-pressed='false'] {\n text-decoration: line-through;\n opacity: 0.6;\n }\n\n .legend-item:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n /* Present for assistive technology and for anyone who needs the\n numbers; show-table puts it on screen. */\n .table {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n :host([show-table]) .table {\n position: static;\n width: auto;\n height: auto;\n margin-top: 16px;\n overflow: visible;\n clip-path: none;\n white-space: normal;\n }\n\n :host([show-table]) table {\n width: 100%;\n border-collapse: collapse;\n font: var(--font-normal-small);\n }\n\n :host([show-table]) th,\n :host([show-table]) td {\n padding: 6px 10px;\n color: var(--text-muted);\n text-align: right;\n border-bottom: var(--border-width) solid var(--border-subtle);\n }\n\n :host([show-table]) th:first-child,\n :host([show-table]) td:first-child {\n color: var(--text-body);\n text-align: left;\n }\n `,\n ];\n\n @query('.plot')\n private plot!: HTMLElement;\n\n private observer?: ResizeObserver;\n private readonly tableId = uniqueId('kt-chart-table');\n\n @state()\n private box: Box = { width: 0, height: 0 };\n\n /** The active category, point or slice, or -1. */\n @state()\n private active = -1;\n\n /** The series the active point belongs to, for scatter and bubble; -1 otherwise. */\n @state()\n private activeSeries = -1;\n\n /**\n * Series hidden from the legend — or slices, for pie, doughnut and polar\n * area. Not `hidden`: that is HTMLElement's, and shadowing it would stop\n * `chart.hidden = true` from hiding the chart.\n */\n @state()\n private hiddenSeries: ReadonlySet<number> = new Set();\n\n @property({ type: String, reflect: true })\n type: KtChartType = 'area';\n\n @property({ attribute: false })\n series: readonly KtSeries[] = [];\n\n /** One label per index along the category axis, or per slice or spoke. */\n @property({ attribute: false })\n labels: readonly string[] = [];\n\n @property({ type: Number })\n height = 200;\n\n /** Formats a value for the value axis, the tooltip and the table. */\n @property({ attribute: false })\n format: Format = (value) => String(value);\n\n /** Formats the x value of a scatter or bubble point. */\n @property({ attribute: false })\n formatX: Format = (value) => String(value);\n\n /** Grid lines. */\n @property({ type: Boolean, attribute: 'no-grid' })\n noGrid = false;\n\n /** Hides the value axis labels, for a chart too small to carry them. */\n @property({ type: Boolean, attribute: 'no-axis' })\n noAxis = false;\n\n /** Puts the data table on screen instead of only in the accessibility tree. */\n @property({ type: Boolean, reflect: true, attribute: 'show-table' })\n showTable = false;\n\n /**\n * Smooths lines and areas through a monotone spline.\n *\n * Off by default on purpose: a curve between two samples draws values that\n * were never measured. Turn it on when the underlying quantity really is\n * continuous and the reader knows it.\n */\n @property({ type: Boolean })\n smooth = false;\n\n /** Bars, and areas, on top of one another instead of side by side. */\n @property({ type: Boolean })\n stacked = false;\n\n /** Bars along the horizontal axis, with the categories down the left. */\n @property({ type: Boolean })\n horizontal = false;\n\n /** Pins the bottom of the value axis. */\n @property({ type: Number })\n min: number | null = null;\n\n /** Pins the top of the value axis. */\n @property({ type: Number })\n max: number | null = null;\n\n /** Names the total in the middle of a doughnut. */\n @property({ type: String, attribute: 'center-label' })\n centerLabel: string | undefined = undefined;\n\n /** Names the sum in a stacked chart's tooltip and table. */\n @property({ type: String, attribute: 'total-label' })\n totalLabel: string | undefined = undefined;\n\n /** Accessible name. Say what the chart shows. */\n @property({ type: String })\n label = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Real pixel geometry rather than a scaled viewBox: a stretched viewBox\n // would scale the 2px strokes along with it.\n this.observer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n this.box = { width: entry.contentRect.width, height: this.height };\n });\n }\n\n override firstUpdated(): void {\n if (this.plot) this.observer?.observe(this.plot);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.observer?.disconnect();\n }\n\n override willUpdate(changed: Map<PropertyKey, unknown>): void {\n // New data is a new picture: a series hidden from the old one has no\n // reason to stay hidden in this one, and an index may no longer exist.\n if (changed.has('series') || changed.has('type') || changed.has('labels')) {\n if (this.hiddenSeries.size > 0) this.hiddenSeries = new Set();\n if (this.active >= this.pointCount) {\n this.active = -1;\n this.activeSeries = -1;\n }\n }\n }\n\n /* ------------------------------------------------------------- helpers */\n\n private get family(): Family {\n if (this.type === 'scatter' || this.type === 'bubble') return 'point';\n if (\n this.type === 'pie' ||\n this.type === 'doughnut' ||\n this.type === 'polar-area' ||\n this.type === 'radar'\n ) {\n return 'radial';\n }\n return 'cartesian';\n }\n\n private get pointCount(): number {\n return Math.max(this.labels.length, 0, ...this.series.map((s) => s.values?.length ?? 0));\n }\n\n private colorOf = (index: number): string => {\n const series = this.series[index];\n if (series?.color) return series.color;\n // One series has no identity to encode; the brand hue reads as \"the data\".\n if (this.series.length === 1) return 'var(--color-primary-base)';\n return `var(--chart-series-${(index % MAX_SLOTS) + 1})`;\n };\n\n private measureContext: CanvasRenderingContext2D | null | undefined;\n\n /** Text width in the axis font. Estimated where there is no canvas to ask. */\n private measure = (text: string): number => {\n if (this.measureContext === undefined) {\n try {\n const context = document.createElement('canvas').getContext('2d');\n const family = getComputedStyle(this).getPropertyValue('--font-family-body').trim();\n if (context) context.font = `12px ${family || 'sans-serif'}`;\n this.measureContext = context;\n } catch {\n this.measureContext = null;\n }\n }\n return this.measureContext ? this.measureContext.measureText(text).width : text.length * 6.5;\n };\n\n private get cartesianView(): CartesianView {\n const input = {\n width: this.box.width,\n height: this.height,\n series: this.series,\n hidden: this.hiddenSeries,\n labels: this.labels,\n type: (this.family === 'cartesian' ? this.type : 'line') as KtMark,\n stacked: this.stacked,\n horizontal: this.horizontal,\n min: this.min,\n max: this.max,\n noAxis: this.noAxis,\n measure: this.measure,\n format: this.format,\n };\n return {\n ...input,\n layout: cartesianLayout(input),\n active: this.active,\n smooth: this.smooth,\n noGrid: this.noGrid,\n colorOf: this.colorOf,\n idPrefix: this.tableId,\n };\n }\n\n private get pointView(): PointView {\n const input = {\n width: this.box.width,\n height: this.height,\n series: this.series,\n hidden: this.hiddenSeries,\n bubble: this.type === 'bubble',\n min: this.min,\n max: this.max,\n noAxis: this.noAxis,\n measure: this.measure,\n format: this.format,\n formatX: this.formatX,\n };\n return {\n ...input,\n layout: pointLayout(input),\n active: this.active,\n activeSeries: this.activeSeries,\n noGrid: this.noGrid,\n colorOf: this.colorOf,\n };\n }\n\n /** Pie, doughnut and polar area: one series, whose slices are the labels. */\n private get sliced(): boolean {\n return this.type === 'pie' || this.type === 'doughnut' || this.type === 'polar-area';\n }\n\n private sliceColor = (index: number): string => `var(--chart-series-${(index % MAX_SLOTS) + 1})`;\n\n private get radialView(): RadialView {\n const input = {\n width: this.box.width,\n height: this.height,\n kind: this.type as RadialKind,\n series: this.series,\n hidden: this.hiddenSeries,\n labels: this.labels,\n measure: this.measure,\n };\n return {\n ...input,\n layout: radialLayout(input),\n active: this.active,\n noGrid: this.noGrid,\n noAxis: this.noAxis,\n centerLabel: this.centerLabel ?? strings().total,\n format: this.format,\n colorOf: this.colorOf,\n sliceColor: this.sliceColor,\n };\n }\n\n /** Whether there is anything to draw. */\n private get hasData(): boolean {\n return this.family === 'point'\n ? this.series.some((series) => (series.points?.length ?? 0) > 0)\n : this.pointCount > 0;\n }\n\n private setActive(index: number, series = -1): void {\n if (index === this.active && series === this.activeSeries) return;\n this.active = index;\n this.activeSeries = series;\n emit(this, 'kt-point-hover', { index, series });\n }\n\n /* --------------------------------------------------------- interaction */\n\n private onPointerMove(event: PointerEvent): void {\n if (this.box.width === 0) return;\n if (this.family === 'cartesian') {\n const index = categoryAt(this.cartesianView.layout, event.offsetX, event.offsetY);\n this.setActive(index);\n } else if (this.family === 'radial') {\n const view = this.radialView;\n this.setActive(sliceAt(view.layout, view.kind, event.offsetX, event.offsetY));\n } else if (this.family === 'point') {\n const view = this.pointView;\n const hit = nearestPoint(view, view.layout, event.offsetX, event.offsetY);\n this.setActive(hit?.index ?? -1, hit?.series ?? -1);\n }\n }\n\n private onPointerLeave(): void {\n this.setActive(-1);\n }\n\n /** How many positions the keyboard walks through, in order. */\n private get stops(): readonly number[] {\n const all = Array.from({ length: this.pointCount }, (_, index) => index);\n // A hidden slice is not there to land on.\n return this.sliced ? all.filter((index) => !this.hiddenSeries.has(index)) : all;\n }\n\n /**\n * Arrows walk the points, Home and End jump to the ends, Escape lets go.\n * Every move emits `kt-point-hover` and opens the tooltip, which is a live\n * region, so a keyboard user hears what a pointer user sees.\n */\n private onKeyDown(event: KeyboardEvent): void {\n if (this.family === 'point') {\n this.onPointKeyDown(event);\n return;\n }\n const stops = this.stops;\n if (stops.length === 0) return;\n\n const at = stops.indexOf(this.active);\n const last = stops.length - 1;\n const next: Record<string, number> = {\n ArrowRight: at < 0 ? 0 : Math.min(at + 1, last),\n ArrowDown: at < 0 ? 0 : Math.min(at + 1, last),\n ArrowLeft: at < 0 ? 0 : Math.max(at - 1, 0),\n ArrowUp: at < 0 ? 0 : Math.max(at - 1, 0),\n Home: 0,\n End: last,\n };\n\n if (event.key === 'Escape') {\n this.setActive(-1);\n return;\n }\n const target = next[event.key];\n if (target === undefined) return;\n\n event.preventDefault();\n this.setActive(stops[target]!);\n }\n\n /**\n * Scatter and bubble: left and right walk the current series in x order,\n * up and down move to the neighbouring visible series.\n */\n private onPointKeyDown(event: KeyboardEvent): void {\n const visible = this.series\n .map((series, index) => ({ index, count: series.points?.length ?? 0 }))\n .filter(({ index, count }) => count > 0 && !this.hiddenSeries.has(index))\n .map(({ index }) => index);\n if (visible.length === 0) return;\n\n if (event.key === 'Escape') {\n this.setActive(-1);\n return;\n }\n\n const seriesAt = visible.indexOf(this.activeSeries);\n const current = seriesAt < 0 ? visible[0]! : this.activeSeries;\n const order = walkOrder(this.series[current]);\n const at = seriesAt < 0 ? -1 : order.indexOf(this.active);\n const last = order.length - 1;\n\n const moveSeries = (step: number) => {\n const target =\n visible[Math.min(Math.max((seriesAt < 0 ? 0 : seriesAt) + step, 0), visible.length - 1)]!;\n this.setActive(walkOrder(this.series[target])[0]!, target);\n };\n\n switch (event.key) {\n case 'ArrowRight':\n this.setActive(order[at < 0 ? 0 : Math.min(at + 1, last)]!, current);\n break;\n case 'ArrowLeft':\n this.setActive(order[at < 0 ? 0 : Math.max(at - 1, 0)]!, current);\n break;\n case 'ArrowDown':\n moveSeries(seriesAt < 0 ? 0 : 1);\n break;\n case 'ArrowUp':\n moveSeries(seriesAt < 0 ? 0 : -1);\n break;\n case 'Home':\n this.setActive(order[0]!, current);\n break;\n case 'End':\n this.setActive(order[last]!, current);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n private toggle(index: number): void {\n const hidden = !this.hiddenSeries.has(index);\n if (emit(this, 'kt-series-toggle', { series: index, hidden }).defaultPrevented) return;\n\n const next = new Set(this.hiddenSeries);\n if (hidden) next.add(index);\n else next.delete(index);\n this.hiddenSeries = next;\n this.setActive(-1);\n }\n\n /* ----------------------------------------------------------- rendering */\n\n private renderMarks(): SVGTemplateResult | typeof nothing {\n if (this.family === 'cartesian') return renderCartesian(this.cartesianView);\n if (this.family === 'point') return renderPoints(this.pointView);\n return renderRadial(this.radialView);\n }\n\n private get tooltip(): Tooltip | null {\n if (this.active < 0 || this.box.width === 0) return null;\n\n if (this.family === 'cartesian') {\n const view = this.cartesianView;\n const rows = view.layout.visible.map((index) => ({\n color: this.colorOf(index),\n name: this.series[index]!.name,\n value: this.format(this.series[index]!.values?.[this.active] ?? 0),\n }));\n const { x, y } = tooltipAnchor(view);\n // A stack is read as parts of a whole, so the whole is worth stating.\n const stackedParts = view.layout.visible.filter(\n (index) => this.stacked && view.layout.marks[index] !== 'line',\n );\n const total =\n stackedParts.length > 1\n ? this.format(\n stackedParts.reduce(\n (sum, index) => sum + (this.series[index]!.values?.[this.active] ?? 0),\n 0,\n ),\n )\n : undefined;\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows,\n ...(total === undefined ? {} : { total }),\n x,\n y,\n side: view.layout.horizontal ? 'right' : 'above',\n };\n }\n\n if (this.sliced) {\n const layout = this.radialView.layout;\n const value = this.series[0]?.values?.[this.active] ?? 0;\n const share = layout.total > 0 ? Math.round((Math.max(0, value) / layout.total) * 100) : 0;\n const [x, y] = sliceAnchor(layout, this.active);\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows: [\n {\n color: this.sliceColor(this.active),\n name: this.series[0]?.name ?? '',\n value: `${this.format(value)} (${share}%)`,\n },\n ],\n x,\n y,\n side: 'above',\n };\n }\n\n if (this.type === 'radar') {\n const layout = this.radialView.layout;\n const visible = this.series\n .map((_, index) => index)\n .filter((index) => !this.hiddenSeries.has(index));\n const peak = Math.max(\n layout.ticks.min,\n ...visible.map((index) => this.series[index]!.values?.[this.active] ?? layout.ticks.min),\n );\n const angle = layout.slices[this.active]?.start ?? 0;\n const [x, y] = polar(layout.cx, layout.cy, radarRadius(layout, peak), angle);\n return {\n title: this.labels[this.active] ?? `#${this.active + 1}`,\n rows: visible.map((index) => ({\n color: this.colorOf(index),\n name: this.series[index]!.name,\n value: this.format(this.series[index]!.values?.[this.active] ?? 0),\n })),\n x,\n y,\n side: 'above',\n };\n }\n\n if (this.family === 'point') {\n const series = this.series[this.activeSeries];\n const point = series?.points?.[this.active];\n if (!series || !point) return null;\n\n const [x, y] = pointPosition(this.pointView.layout, point);\n const color = this.colorOf(this.activeSeries);\n const rows: TooltipRow[] = [\n { color, name: 'x', value: this.formatX(point.x) },\n { color, name: 'y', value: this.format(point.y) },\n ];\n if (this.type === 'bubble' && point.r !== undefined) {\n rows.push({ color, name: 'r', value: String(point.r) });\n }\n // A named point is titled by its name; the series then goes underneath.\n return {\n title: point.label ?? series.name,\n ...(point.label ? { subtitle: series.name } : {}),\n rows,\n x,\n y,\n side: 'above',\n };\n }\n\n return null;\n }\n\n private renderTooltip(): TemplateResult | typeof nothing {\n const tooltip = this.tooltip;\n if (!tooltip) return nothing;\n\n // Keep it inside the chart and off the mark it describes. With no room\n // above, it opens beside the mark rather than below it — below would sit\n // right on top of a tall bar. Beside means to the right, or to the left\n // near the right edge, and never past the top or bottom.\n const estimatedHeight = 36 + tooltip.rows.length * 20 + (tooltip.total ? 24 : 0);\n const clearance = 20;\n let side = tooltip.side;\n let x = tooltip.x;\n let y = tooltip.y;\n\n if (side === 'above' && tooltip.y - estimatedHeight < 0) {\n side = 'right';\n x = tooltip.x + clearance;\n }\n if (side === 'right' && x + 180 > this.box.width) {\n side = 'left';\n x = tooltip.x - (tooltip.side === 'above' ? clearance : 0);\n }\n if (side === 'above') {\n x = Math.min(Math.max(x, 72), Math.max(72, this.box.width - 72));\n } else {\n y = Math.min(\n Math.max(y, estimatedHeight / 2),\n Math.max(estimatedHeight / 2, this.height - estimatedHeight / 2),\n );\n }\n\n return html`<div class=${`tooltip ${side}`} style=${`left:${x}px;top:${y}px`} role=\"status\">\n <strong>${tooltip.title}</strong>\n ${tooltip.subtitle ? html`<span class=\"tooltip-subtitle\">${tooltip.subtitle}</span>` : nothing}\n ${tooltip.rows.map(\n (row) =>\n html`<span class=\"tooltip-row\">\n <span class=\"swatch\" style=${`--swatch:${row.color}`}></span>\n <span class=\"tooltip-name\">${row.name}</span>\n <span class=\"tooltip-value\">${row.value}</span>\n </span>`,\n )}\n ${\n tooltip.total\n ? html`<span class=\"tooltip-total\"\n ><span>${this.totalLabel ?? strings().total}</span><span>${tooltip.total}</span></span\n >`\n : nothing\n }\n </div>`;\n }\n\n private renderLegend(): TemplateResult | typeof nothing {\n // Slices always need naming; series only once there are two to tell apart.\n const entries = this.sliced\n ? Array.from({ length: this.pointCount }, (_, index) => ({\n name: this.labels[index] ?? `#${index + 1}`,\n color: this.sliceColor(index),\n }))\n : this.series.map((series, index) => ({ name: series.name, color: this.colorOf(index) }));\n if (entries.length === 0 || (!this.sliced && entries.length < 2)) return nothing;\n\n return html`<div part=\"legend\" class=\"legend\">\n ${entries.map((entry, index) => {\n const hidden = this.hiddenSeries.has(index);\n return html`<button\n type=\"button\"\n class=\"legend-item\"\n aria-pressed=${hidden ? 'false' : 'true'}\n @click=${() => this.toggle(index)}\n >\n <span\n class=${classMap({ swatch: true, hollow: hidden })}\n style=${`--swatch:${entry.color}`}\n ></span>\n ${entry.name}\n </button>`;\n })}\n </div>`;\n }\n\n private renderPointTable(): TemplateResult {\n const bubble = this.type === 'bubble';\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || strings().chartData}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">${strings().chartSeries}</th>\n <th scope=\"col\">${strings().chartPoint}</th>\n <th scope=\"col\">x</th>\n <th scope=\"col\">y</th>\n ${bubble ? html`<th scope=\"col\">r</th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${this.series.flatMap((series) =>\n (series.points ?? []).map(\n (point, index) =>\n html`<tr>\n <th scope=\"row\">${series.name}</th>\n <td>${point.label ?? `#${index + 1}`}</td>\n <td>${this.formatX(point.x)}</td>\n <td>${this.format(point.y)}</td>\n ${bubble ? html`<td>${point.r ?? ''}</td>` : nothing}\n </tr>`,\n ),\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n private renderSliceTable(): TemplateResult {\n const values = this.series[0]?.values ?? [];\n const total = values.reduce((sum, value) => sum + Math.max(0, value), 0);\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || strings().chartData}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">${strings().chartSlice}</th>\n <th scope=\"col\">${this.series[0]?.name ?? strings().chartValue}</th>\n <th scope=\"col\">${strings().chartShare}</th>\n </tr>\n </thead>\n <tbody>\n ${Array.from({ length: this.pointCount }, (_, index) => {\n const value = values[index] ?? 0;\n const share = total > 0 ? Math.round((Math.max(0, value) / total) * 100) : 0;\n return html`<tr>\n <th scope=\"row\">${this.labels[index] ?? `#${index + 1}`}</th>\n <td>${this.format(value)}</td>\n <td>${share}%</td>\n </tr>`;\n })}\n </tbody>\n </table>\n </div>`;\n }\n\n private renderTable(): TemplateResult {\n if (this.family === 'point') return this.renderPointTable();\n if (this.sliced) return this.renderSliceTable();\n\n const withTotal = this.family === 'cartesian' && this.stacked && this.series.length > 1;\n const totalAt = (index: number) =>\n this.series.reduce(\n (sum, series) => sum + (series.type === 'line' ? 0 : (series.values?.[index] ?? 0)),\n 0,\n );\n\n return html`<div part=\"table\" class=\"table\" id=${this.tableId}>\n <table>\n <caption>\n ${this.label || strings().chartData}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">${strings().chartPoint}</th>\n ${this.series.map((series) => html`<th scope=\"col\">${series.name}</th>`)}\n ${withTotal ? html`<th scope=\"col\">${this.totalLabel ?? strings().total}</th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${Array.from(\n { length: this.pointCount },\n (_, index) =>\n html`<tr>\n <th scope=\"row\">${this.labels[index] ?? `#${index + 1}`}</th>\n ${this.series.map(\n (series) => html`<td>${this.format(series.values?.[index] ?? 0)}</td>`,\n )}\n ${withTotal ? html`<td>${this.format(totalAt(index))}</td>` : nothing}\n </tr>`,\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n override render(): TemplateResult {\n const ready = this.box.width > 0 && this.hasData;\n\n return html`<div class=\"plot\" style=${`height:${this.height}px`}>\n <svg\n part=\"svg\"\n width=${this.box.width}\n height=${this.height}\n role=\"img\"\n aria-label=${this.label || nothing}\n aria-describedby=${this.tableId}\n tabindex=\"0\"\n @pointermove=${this.onPointerMove}\n @pointerleave=${this.onPointerLeave}\n @keydown=${this.onKeyDown}\n @blur=${this.onPointerLeave}\n >\n ${ready ? this.renderMarks() : nothing}\n </svg>\n ${this.renderTooltip()}\n </div>\n ${this.renderLegend()} ${this.renderTable()}`;\n }\n}\n\ndefineElement('kt-chart', KtChart);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-chart': KtChart;\n }\n}\n"],"names":["niceNumber","value","exponent","fraction","niceTicks","lo","hi","count","pad","step","decimals","clean","min","max","values","index","valueBounds","stacks","loose","includeZero","extremes","stack","length","series","above","below","finite","ticksFor","limits","ticks","project","from","to","tickCount","spacing","TAU","round","xy","x","y","linearPath","points","move","point","monotoneSegments","secants","x0","y0","x1","y1","tangents","_","before","after","secant","a","b","sum","tau","third","monotonePath","c1","c2","polar","cx","cy","radius","angle","arcPath","inner","outer","start","end","span","circle","sweep","top","bottom","arc","large","outerArc","innerArc","barPath","width","height","tip","line","PADDING","LABEL_GAP","TICK_SPACING","valuesOf","cartesianLayout","input","hidden","labels","measure","format","noAxis","marks","entry","visible","shown","banded","horizontal","mark","ofMark","plotHeight","widest","left","widestLabel","plotWidth","right","categoryCentre","layout","box","valuePosition","categoryAt","position","GROUP_SHARE","BAR_GAP","BAR_RADIUS","MAX_BAR","DOTS_UP_TO","lastIndexWhere","items","test","fit","text","cut","renderValueAxis","view","noGrid","lines","nothing","at","svg","zero","renderCategoryAxis","every","room","anchor","pointsOf","offsets","pathThrough","renderLinesAndAreas","colorOf","active","idPrefix","stacked","smooth","floor","stackBase","fills","strokes","color","base","upper","gradient","lower","i","closing","crosshair","barSegment","options","offset","thickness","negative","inset","direction","low","d","renderBars","bars","group","segments","centre","seriesIndex","lastAbove","lastBelow","total","renderCartesian","tooltipAnchor","peak","across","along","MAX_BUBBLE","MIN_BUBBLE","DOT","REACH","visiblePoints","extent","pointLayout","formatX","yLo","yHi","xLo","xHi","pointPosition","bubbleRadius","r","maxR","radiusOf","nearestPoint","best","bestDistance","px","py","distance","reach","walkOrder","renderPoints","bubble","activeSeries","grid","axes","focus","HOLE","RING_COUNT","radialLayout","kind","visibleCount","slices","sliceAt","dx","dy","sliceAnchor","slice","middle","radarRadius","renderSlices","sliceColor","centerLabel","rings","paths","renderRadar","spokes","ringLabels","axisLabels","sin","cos","baseline","outlines","markers","spoke","renderRadial","MAX_SLOTS","KtChart","KtElement","uniqueId","context","family","css","changed","s","strings","emit","event","hit","all","stops","last","next","target","seriesAt","current","order","moveSeries","rows","stackedParts","share","tooltip","estimatedHeight","clearance","side","html","row","entries","classMap","withTotal","totalAt","ready","__decorateClass","query","state","property","defineElement"],"mappings":"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SAAS;AAAA,MACvBE,GAAU;AAAA,MACVI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}