@motionscript/charts 0.1.1-alpha.0 → 0.1.1-alpha.2

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 (207) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +109 -28
  3. package/dist/bar-chart/bar-chart.d.ts +265 -39
  4. package/dist/bar-chart/bar-chart.d.ts.map +1 -1
  5. package/dist/bar-chart/bar-chart.js +219 -171
  6. package/dist/bar-chart/bar-chart.js.map +1 -1
  7. package/dist/bar-chart/category-axis.d.ts +12 -7
  8. package/dist/bar-chart/category-axis.d.ts.map +1 -1
  9. package/dist/bar-chart/category-axis.js +56 -42
  10. package/dist/bar-chart/category-axis.js.map +1 -1
  11. package/dist/bar-chart/chart-bars.d.ts +76 -52
  12. package/dist/bar-chart/chart-bars.d.ts.map +1 -1
  13. package/dist/bar-chart/chart-bars.js +105 -89
  14. package/dist/bar-chart/chart-bars.js.map +1 -1
  15. package/dist/bar-chart/index.d.ts +4 -4
  16. package/dist/bar-chart/index.d.ts.map +1 -1
  17. package/dist/bar-chart/index.js +2 -2
  18. package/dist/bar-chart/index.js.map +1 -1
  19. package/dist/bar-chart/shared.d.ts +41 -65
  20. package/dist/bar-chart/shared.d.ts.map +1 -1
  21. package/dist/bar-chart/shared.js +73 -117
  22. package/dist/bar-chart/shared.js.map +1 -1
  23. package/dist/browser/chunks/chunk-7XCRX6GE.js +2 -0
  24. package/dist/browser/chunks/chunk-7XCRX6GE.js.map +7 -0
  25. package/dist/browser/index.js +1 -1
  26. package/dist/browser/index.js.map +4 -4
  27. package/dist/browser/kit.js +1 -1
  28. package/dist/browser/manifest.json +1 -1
  29. package/dist/engine.d.ts +5 -2
  30. package/dist/engine.d.ts.map +1 -1
  31. package/dist/engine.js +5 -2
  32. package/dist/engine.js.map +1 -1
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/kit/cartesian.d.ts +51 -15
  38. package/dist/kit/cartesian.d.ts.map +1 -1
  39. package/dist/kit/cartesian.js +81 -29
  40. package/dist/kit/cartesian.js.map +1 -1
  41. package/dist/kit/chart-canvas.d.ts +32 -24
  42. package/dist/kit/chart-canvas.d.ts.map +1 -1
  43. package/dist/kit/chart-canvas.js +52 -46
  44. package/dist/kit/chart-canvas.js.map +1 -1
  45. package/dist/kit/chart-legend.d.ts +8 -4
  46. package/dist/kit/chart-legend.d.ts.map +1 -1
  47. package/dist/kit/chart-legend.js +30 -20
  48. package/dist/kit/chart-legend.js.map +1 -1
  49. package/dist/{line-chart → kit}/horizontal-axis.d.ts +31 -6
  50. package/dist/kit/horizontal-axis.d.ts.map +1 -0
  51. package/dist/{line-chart → kit}/horizontal-axis.js +23 -24
  52. package/dist/kit/horizontal-axis.js.map +1 -0
  53. package/dist/kit/motion.d.ts +5 -0
  54. package/dist/kit/motion.d.ts.map +1 -1
  55. package/dist/kit/motion.js +8 -0
  56. package/dist/kit/motion.js.map +1 -1
  57. package/dist/{pie-chart → kit}/pie-legend.d.ts +3 -3
  58. package/dist/kit/pie-legend.d.ts.map +1 -0
  59. package/dist/{pie-chart → kit}/pie-legend.js +11 -10
  60. package/dist/kit/pie-legend.js.map +1 -0
  61. package/dist/kit/polar.d.ts +31 -0
  62. package/dist/kit/polar.d.ts.map +1 -0
  63. package/dist/kit/polar.js +33 -0
  64. package/dist/kit/polar.js.map +1 -0
  65. package/dist/kit/shared.d.ts +11 -50
  66. package/dist/kit/shared.d.ts.map +1 -1
  67. package/dist/kit/shared.js +58 -141
  68. package/dist/kit/shared.js.map +1 -1
  69. package/dist/kit/style.d.ts +517 -0
  70. package/dist/kit/style.d.ts.map +1 -0
  71. package/dist/kit/style.js +292 -0
  72. package/dist/kit/style.js.map +1 -0
  73. package/dist/kit/vertical-axis.d.ts +22 -2
  74. package/dist/kit/vertical-axis.d.ts.map +1 -1
  75. package/dist/kit/vertical-axis.js +56 -43
  76. package/dist/kit/vertical-axis.js.map +1 -1
  77. package/dist/line-chart/chart-line.d.ts +95 -3
  78. package/dist/line-chart/chart-line.d.ts.map +1 -1
  79. package/dist/line-chart/chart-line.js +165 -53
  80. package/dist/line-chart/chart-line.js.map +1 -1
  81. package/dist/line-chart/chart-region.d.ts +1 -1
  82. package/dist/line-chart/chart-region.d.ts.map +1 -1
  83. package/dist/line-chart/chart-region.js +7 -8
  84. package/dist/line-chart/chart-region.js.map +1 -1
  85. package/dist/line-chart/index.d.ts +5 -6
  86. package/dist/line-chart/index.d.ts.map +1 -1
  87. package/dist/line-chart/index.js +3 -4
  88. package/dist/line-chart/index.js.map +1 -1
  89. package/dist/line-chart/line-chart.d.ts +281 -18
  90. package/dist/line-chart/line-chart.d.ts.map +1 -1
  91. package/dist/line-chart/line-chart.js +284 -134
  92. package/dist/line-chart/line-chart.js.map +1 -1
  93. package/dist/line-chart/shared.d.ts +51 -34
  94. package/dist/line-chart/shared.d.ts.map +1 -1
  95. package/dist/line-chart/shared.js +175 -83
  96. package/dist/line-chart/shared.js.map +1 -1
  97. package/dist/line-chart/x-scale.d.ts +2 -0
  98. package/dist/line-chart/x-scale.d.ts.map +1 -1
  99. package/dist/line-chart/x-scale.js +15 -0
  100. package/dist/line-chart/x-scale.js.map +1 -1
  101. package/dist/nodes.d.ts +3 -1
  102. package/dist/nodes.d.ts.map +1 -1
  103. package/dist/nodes.js +9 -1
  104. package/dist/nodes.js.map +1 -1
  105. package/dist/pie-chart/index.d.ts +2 -3
  106. package/dist/pie-chart/index.d.ts.map +1 -1
  107. package/dist/pie-chart/index.js +1 -2
  108. package/dist/pie-chart/index.js.map +1 -1
  109. package/dist/pie-chart/pie-chart.d.ts +114 -18
  110. package/dist/pie-chart/pie-chart.d.ts.map +1 -1
  111. package/dist/pie-chart/pie-chart.js +38 -24
  112. package/dist/pie-chart/pie-chart.js.map +1 -1
  113. package/dist/pie-chart/pie-ring.d.ts +16 -5
  114. package/dist/pie-chart/pie-ring.d.ts.map +1 -1
  115. package/dist/pie-chart/pie-ring.js +89 -55
  116. package/dist/pie-chart/pie-ring.js.map +1 -1
  117. package/dist/pie-chart/shared.d.ts +61 -62
  118. package/dist/pie-chart/shared.d.ts.map +1 -1
  119. package/dist/pie-chart/shared.js +44 -123
  120. package/dist/pie-chart/shared.js.map +1 -1
  121. package/dist/radar-chart/index.d.ts +5 -0
  122. package/dist/radar-chart/index.d.ts.map +1 -0
  123. package/dist/radar-chart/index.js +5 -0
  124. package/dist/radar-chart/index.js.map +1 -0
  125. package/dist/radar-chart/radar-chart.d.ts +212 -0
  126. package/dist/radar-chart/radar-chart.d.ts.map +1 -0
  127. package/dist/radar-chart/radar-chart.js +224 -0
  128. package/dist/radar-chart/radar-chart.js.map +1 -0
  129. package/dist/radar-chart/radar-grid.d.ts +49 -0
  130. package/dist/radar-chart/radar-grid.d.ts.map +1 -0
  131. package/dist/radar-chart/radar-grid.js +63 -0
  132. package/dist/radar-chart/radar-grid.js.map +1 -0
  133. package/dist/radar-chart/radar-series.d.ts +59 -0
  134. package/dist/radar-chart/radar-series.d.ts.map +1 -0
  135. package/dist/radar-chart/radar-series.js +71 -0
  136. package/dist/radar-chart/radar-series.js.map +1 -0
  137. package/dist/radar-chart/shared.d.ts +78 -0
  138. package/dist/radar-chart/shared.d.ts.map +1 -0
  139. package/dist/radar-chart/shared.js +129 -0
  140. package/dist/radar-chart/shared.js.map +1 -0
  141. package/dist/radial-chart/index.d.ts +6 -0
  142. package/dist/radial-chart/index.d.ts.map +1 -0
  143. package/dist/radial-chart/index.js +4 -0
  144. package/dist/radial-chart/index.js.map +1 -0
  145. package/dist/radial-chart/radial-chart.d.ts +210 -0
  146. package/dist/radial-chart/radial-chart.d.ts.map +1 -0
  147. package/dist/radial-chart/radial-chart.js +175 -0
  148. package/dist/radial-chart/radial-chart.js.map +1 -0
  149. package/dist/radial-chart/radial-rings.d.ts +121 -0
  150. package/dist/radial-chart/radial-rings.d.ts.map +1 -0
  151. package/dist/radial-chart/radial-rings.js +273 -0
  152. package/dist/radial-chart/radial-rings.js.map +1 -0
  153. package/dist/radial-chart/shared.d.ts +77 -0
  154. package/dist/radial-chart/shared.d.ts.map +1 -0
  155. package/dist/radial-chart/shared.js +78 -0
  156. package/dist/radial-chart/shared.js.map +1 -0
  157. package/package.json +4 -4
  158. package/registry.json +21 -6
  159. package/src/bar-chart/bar-chart.ts +263 -179
  160. package/src/bar-chart/category-axis.ts +46 -40
  161. package/src/bar-chart/chart-bars.ts +136 -117
  162. package/src/bar-chart/index.ts +7 -10
  163. package/src/bar-chart/shared.ts +88 -233
  164. package/src/engine.ts +5 -2
  165. package/src/index.ts +2 -0
  166. package/src/kit/cartesian.ts +121 -40
  167. package/src/kit/chart-canvas.ts +49 -54
  168. package/src/kit/chart-legend.ts +28 -20
  169. package/src/kit/horizontal-axis.ts +114 -0
  170. package/src/kit/motion.ts +7 -0
  171. package/src/{pie-chart → kit}/pie-legend.ts +12 -11
  172. package/src/kit/polar.ts +54 -0
  173. package/src/kit/shared.ts +55 -277
  174. package/src/kit/style.ts +353 -0
  175. package/src/kit/vertical-axis.ts +67 -48
  176. package/src/line-chart/chart-line.ts +176 -54
  177. package/src/line-chart/chart-region.ts +6 -10
  178. package/src/line-chart/index.ts +14 -10
  179. package/src/line-chart/line-chart.ts +353 -151
  180. package/src/line-chart/shared.ts +193 -174
  181. package/src/line-chart/x-scale.ts +13 -0
  182. package/src/nodes.ts +9 -1
  183. package/src/pie-chart/index.ts +2 -23
  184. package/src/pie-chart/pie-chart.ts +54 -35
  185. package/src/pie-chart/pie-ring.ts +92 -71
  186. package/src/pie-chart/shared.ts +80 -270
  187. package/src/radar-chart/index.ts +4 -0
  188. package/src/radar-chart/radar-chart.ts +290 -0
  189. package/src/radar-chart/radar-grid.ts +83 -0
  190. package/src/radar-chart/radar-series.ts +88 -0
  191. package/src/radar-chart/shared.ts +153 -0
  192. package/src/radial-chart/index.ts +5 -0
  193. package/src/radial-chart/radial-chart.ts +212 -0
  194. package/src/radial-chart/radial-rings.ts +328 -0
  195. package/src/radial-chart/shared.ts +126 -0
  196. package/dist/browser/chunks/chunk-4SMRCU24.js +0 -2
  197. package/dist/browser/chunks/chunk-4SMRCU24.js.map +0 -7
  198. package/dist/kit/chart-border.d.ts +0 -18
  199. package/dist/kit/chart-border.d.ts.map +0 -1
  200. package/dist/kit/chart-border.js +0 -23
  201. package/dist/kit/chart-border.js.map +0 -1
  202. package/dist/line-chart/horizontal-axis.d.ts.map +0 -1
  203. package/dist/line-chart/horizontal-axis.js.map +0 -1
  204. package/dist/pie-chart/pie-legend.d.ts.map +0 -1
  205. package/dist/pie-chart/pie-legend.js.map +0 -1
  206. package/src/kit/chart-border.ts +0 -36
  207. package/src/line-chart/horizontal-axis.ts +0 -122
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart.js","sourceRoot":"","sources":["../../src/line-chart/line-chart.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Rect,\n Types,\n component2d,\n easeOut,\n type ChildView,\n type DataRecord,\n type NodeOf,\n // Named so this component's emitted type reaches `Node2D` and its props through the sdk, not core.\n type Node2D,\n type Node2DProps as _Node2DProps,\n type Size2D,\n type Vector2,\n} from \"@motionscript/sdk\"\nimport { formatNumber } from \"@motionscript/sdk/component\"\n\nimport { cartesianFrame, cartesianViews, laidOutSize } from \"../kit/cartesian\"\nimport { ChartBorder } from \"../kit/chart-border\"\nimport { ChartCanvas } from \"../kit/chart-canvas\"\nimport { ChartLegend } from \"../kit/chart-legend\"\nimport { SERIES_ARG, asParts, fresh } from \"../kit/entries\"\nimport { DEFAULT_MARKERS, ENTER_SHARE, LEGEND_SLIDE, beats, type AnyTimeline, type Beat } from \"../kit/motion\"\nimport { VerticalAxis } from \"../kit/vertical-axis\"\nimport {\n SPOTLIGHT_DIM,\n formatMarker,\n lerpAxisDomain,\n lerpAxisEntry,\n markerStep,\n markerValues,\n resolveAxisDomain,\n resolveSeriesFill,\n resolveSeriesStroke,\n settleAxisDomain,\n type AxisDomainConfig,\n type Range,\n type ResolvedAxisDomain,\n} from \"../kit/shared\"\nimport { ChartLine } from \"./chart-line\"\nimport { ChartRegion } from \"./chart-region\"\nimport { HorizontalAxis } from \"./horizontal-axis\"\nimport {\n DEFAULT_CHART_THEME,\n lerpChartTheme,\n resolveChartTheme,\n resolveRegionBox,\n resolveYScale,\n seriesPoints,\n type ChartConfig,\n type ChartTheme,\n type LineSeries,\n type PlotRegion,\n type RegionBox,\n} from \"./shared\"\nimport { resolveXScale, type XScale } from \"./x-scale\"\n\n/** Both axes' domains with their ranges and ticks resolved. */\nexport interface LineChartDomains {\n readonly x: ResolvedAxisDomain\n readonly y: ResolvedAxisDomain\n}\n\n/** What a line chart plots, as its entries hold it. */\nexport interface LineChartValues {\n readonly data: DataRecord[]\n readonly xField: string\n readonly series: LineSeries[]\n readonly xAxis: AxisDomainConfig\n readonly yAxis: AxisDomainConfig\n}\n\n/** One argument, two controls: the commands take a `PlotRegion`, so the x and y spans a host draws are declared inside it. */\nconst REGION_ARG = Types.custom<PlotRegion | undefined>(undefined, {\n kind: \"region\",\n properties: {\n x: { kind: \"range\", default: true, defaultMin: 0, defaultMax: 100 },\n y: { kind: \"range\", default: false, defaultMin: 0, defaultMax: 100 },\n },\n})\n\n/** What the chart's own commands read: its entries, and the private `home` a zoom remembers. */\ninterface LineState extends LineChartValues {\n readonly theme: ChartConfig\n readonly region: PlotRegion | null\n readonly regionReveal: number\n readonly home: LineChartDomains | null\n}\n\n/** What the x column is (a number, an instant, or a place in the file), and so how rows are positioned, ticked and captioned. */\nfunction columnOf(s: LineChartValues, format = s.xAxis.format): XScale {\n return resolveXScale(s.data, s.xField, format)\n}\n\n/** The explicit range and ticks, else the column's extent and ticks: only a numeric column has round numbers between its samples. */\nfunction drawnX(s: LineChartValues, domain: AxisDomainConfig): AxisDomainConfig {\n const column = columnOf(s, domain.format)\n const range = domain.range ?? column.extent\n return { ...domain, range, ticks: domain.ticks ?? column.ticks(range, DEFAULT_MARKERS - 1) }\n}\n\n/** Auto-ranging steps into one fewer segment than the marker count, so the tidy bounds frame the ticks drawn. */\nfunction drawnY(s: LineChartValues, domain: AxisDomainConfig): AxisDomainConfig {\n const divisions = (domain.ticks?.length ?? DEFAULT_MARKERS) - 1\n const range = resolveYScale(s.data, s.series, domain.range, divisions)\n return { ...domain, range, ticks: domain.ticks ?? markerValues(range, DEFAULT_MARKERS - 1) }\n}\n\n/** The last domains worked out from each data array, and what else they were read from. */\nconst domainsDrawn = new WeakMap<\n DataRecord[],\n Pick<LineChartValues, \"xField\" | \"xAxis\" | \"yAxis\" | \"series\"> & { readonly domains: LineChartDomains }\n>()\n\n/** Both axes as drawn now. */\nexport function lineChartDomains(s: LineChartValues): LineChartDomains {\n const { data, xField, xAxis, yAxis, series } = s\n const kept = domainsDrawn.get(data)\n if (kept && kept.xField === xField && kept.xAxis === xAxis && kept.yAxis === yAxis && kept.series === series) {\n return kept.domains\n }\n const domains = {\n x: settleAxisDomain(xAxis, (d) => drawnX(s, d)) as LineChartDomains[\"x\"],\n y: settleAxisDomain(yAxis, (d) => drawnY(s, d)) as LineChartDomains[\"y\"],\n }\n domainsDrawn.set(data, { xField, xAxis, yAxis, series, domains })\n return domains\n}\n\n/** One series' points in the plot's centred pixel space (origin at its centre, y-up). */\nfunction seriesPixels(s: LineChartValues, domains: LineChartDomains, index: number, plot: Size2D): Vector2[] {\n const series = s.series[index]\n if (!series) return []\n const points = seriesPoints(s.data, columnOf(s), series)\n if (points.length === 0) return []\n const { width: w, height: h } = plot\n const [xMin, xMax] = domains.x.range\n const [yMin, yMax] = domains.y.range\n const xToPx = (x: number) => (xMax <= xMin ? 0 : ((x - xMin) / (xMax - xMin) - 0.5) * w)\n const yToPx = (y: number) => (yMax <= yMin ? 0 : ((y - yMin) / (yMax - yMin) - 0.5) * h)\n return points.map(([x, y]) => ({ x: xToPx(x), y: yToPx(y) }))\n}\n\n/** `region` in centred pixel space against the live scales, so it travels with a zoom. */\nfunction regionBox(s: LineChartValues & { readonly region: PlotRegion | null }, domains: LineChartDomains, plot: Size2D): RegionBox {\n const { width: w, height: h } = plot\n return resolveRegionBox(s.region, { left: -w / 2, right: w / 2, bottom: -h / 2, top: h / 2 }, domains.x.range, domains.y.range)\n}\n\n/** Whether a call-out is authored, not whether it resolves to pixels: a command is built before the first layout. A region bounding neither axis is none. */\nfunction hasCallout(s: { readonly region: PlotRegion | null }): boolean {\n const region = s.region\n return region != null && (region.x !== undefined || region.y !== undefined)\n}\n\n/** The `region` argument, or `{}`: a command is added before its arguments are filled in. */\nfunction regionArg(region: PlotRegion | null | undefined): PlotRegion {\n return region != null && typeof region === \"object\" ? region : {}\n}\n\n/** A range ordered low to high. */\nfunction span([a, b]: Range): Range {\n return a <= b ? [a, b] : [b, a]\n}\n\n/** Rescale to `range` keeping the tick count, so each marker slides rather than the row popping. */\nfunction rescale(range: Range, ticks: readonly number[]): AxisDomainConfig {\n const to = span(range)\n return { range: to, ticks: markerValues(to, Math.max(2, ticks.length) - 1) }\n}\n\nfunction axesAt(from: LineChartDomains, to: Partial<Record<\"x\" | \"y\", AxisDomainConfig>>, t: number) {\n return {\n ...(to.x && { xAxis: lerpAxisDomain(from.x, to.x, t) }),\n ...(to.y && { yAxis: lerpAxisDomain(from.y, to.y, t) }),\n }\n}\n\n/** The parts a line chart's commands drive, found through its children. */\nfunction partsOf(children: readonly ChildView[]) {\n const frame = cartesianViews(children)\n if (!frame) return null\n const hAxis = frame.below.find(HorizontalAxis.is)\n if (!VerticalAxis.is(frame.axis) || !hAxis) return null\n return {\n vAxis: frame.axis,\n hAxis,\n lines: frame.plot.filter(ChartLine.is),\n legend: frame.below.find(ChartLegend.is) ?? null,\n }\n}\n\nfunction clearing(timeline: AnyTimeline, state: LineState) {\n const from = state.regionReveal\n const region = state.region\n // Nothing to retract, but the call still takes its slot.\n if (from === 0) return timeline.animate(() => ({ region: null, regionReveal: 0 }), { eased: false })\n // `region` is held until the retraction lands, or there would be nothing left to retract.\n return timeline.animate((t) => (t >= 1 ? { region: null, regionReveal: 0 } : { region, regionReveal: from * (1 - t) }))\n}\n\nfunction toggling(timeline: AnyTimeline, children: readonly ChildView[], index: number, show: boolean) {\n const parts = partsOf(children)\n const line = parts?.lines[index]\n if (!parts || !line) return timeline.wait(timeline.duration)\n return timeline.together([\n line.run(\"enter\", show ? { from: 0, to: 1 } : { from: 1, to: 0 }),\n ...(parts.legend ? [parts.legend.run(show ? \"showSeries\" : \"hideSeries\", { index })] : []),\n ])\n}\n\n/**\n * A multi-series line chart composed of {@link ChartCanvas}, {@link VerticalAxis} /\n * {@link HorizontalAxis}, {@link ChartRegion}, one {@link ChartLine} per series and\n * {@link ChartLegend}. Every part reads the chart's entries through bindings and\n * maps against the plot panel's own laid-out box.\n *\n * Resting state is the finished chart; `enter` arms every part on its first\n * frame. A `to` of an axis `range` or `ticks` tweens from the domain as drawn\n * (see {@link lerpAxisEntry}), so an auto axis rescales continuously.\n */\nexport const LineChart = component2d({\n key: \"lineChart\",\n state: {\n data: fresh<DataRecord[]>(() => [], { kind: \"dataset\" }),\n // Not `x`: every node already has an `x`, its position.\n xField: \"\",\n series: fresh<LineSeries[]>(() => [], { kind: \"series\" }),\n xAxis: Types.custom<AxisDomainConfig>({}, { resolve: resolveAxisDomain, lerp: lerpAxisEntry }),\n yAxis: Types.custom<AxisDomainConfig>({}, { resolve: resolveAxisDomain, lerp: lerpAxisEntry }),\n theme: Types.custom<ChartTheme, ChartConfig>(DEFAULT_CHART_THEME, { resolve: resolveChartTheme, lerp: lerpChartTheme }),\n /** The spotlit slice in data units, or `null`. The box snaps; {@link regionReveal} animates it. */\n region: Types.custom<PlotRegion | null>(null),\n /** How far the `region` call-out is drawn in, `[0, 1]`: rules grow, wash fades up, out-of-region stretches fade to `region.dimOpacity`. */\n regionReveal: 0,\n /** Read as the chart is built: the legend is a part the chart builds or doesn't. */\n showLegend: Types.boolean(true, { animatable: false }),\n /** The domain `zoomTo` first left, so `resetZoom` restores it, auto-derived ticks included. */\n home: Types.custom<LineChartDomains | null>(null, { private: true }),\n },\n // A node made of parts that fill would otherwise hug them.\n defaults: { width: \"fill\", height: \"fill\" },\n allowedChildren: [],\n children: (state) => {\n const theme = () => state.theme\n const domains = () => lineChartDomains(state)\n let plot: Node2D | undefined\n const plotSize = () => laidOutSize(plot)\n const enabled = state.series.map((s) => s.enabled ?? true)\n\n // Bound, not snapshotted, so a rescale re-labels and re-places the row as it\n // tweens. The marker *count* is read once, which is why `zoomTo` keeps it.\n const vAxis = new VerticalAxis({\n range: () => domains().y.range,\n markers: () => domains().y.ticks,\n captions: () => {\n const markers = domains().y.ticks\n const format = state.yAxis.format\n return markers.map((value) => (format === undefined ? formatMarker(value, markerStep(markers)) : formatNumber(value, format)))\n },\n axis: () => theme().yAxis,\n label: state.yAxis.label ?? \"\",\n width: \"hug\",\n height: \"fill\",\n })\n\n const hAxis = new HorizontalAxis({\n range: () => domains().x.range,\n markers: () => domains().x.ticks,\n // A month or category tick is captioned with its cell (`Jan`), not the instant it parsed to.\n captions: () => {\n const column = columnOf(state)\n return domains().x.ticks.map((value) => column.label(value))\n },\n axis: () => theme().xAxis,\n label: state.xAxis.label ?? \"\",\n width: \"fill\",\n height: \"hug\",\n })\n\n const lines = state.series.map(\n (s, i) =>\n new ChartLine({\n points: () => seriesPixels(state, domains(), i, plotSize()),\n stroke: () => resolveSeriesStroke(theme().seriesStyles, s, i),\n enabled: enabled[i],\n // The box the rules are drawn from, so the dim boundary cannot drift from the dashes.\n spotlight: () => regionBox(state, domains(), plotSize()),\n dimOpacity: () => 1 - (1 - theme().region.dimOpacity) * state.regionReveal,\n }) as unknown as Node2D\n )\n\n const below: Node2D[] = [hAxis as unknown as Node2D]\n if (state.showLegend !== false) {\n below.push(\n new ChartLegend({\n series: state.series,\n swatches: () => state.series.map((s, i) => resolveSeriesFill(theme().seriesStyles, s, i)),\n legend: () => theme().legend,\n // Spacing is fixed as built; a theme tween re-paints the swatches only.\n gap: state.theme.legend.itemGap,\n padding: state.theme.legend.padding,\n }) as unknown as Node2D\n )\n }\n\n plot = new Rect({\n clip: true,\n children: [\n new ChartCanvas({\n fill: () => theme().plotArea.fill,\n shadow: () => theme().plotArea.shadow,\n xGridStroke: () => theme().xAxis.lineStyle,\n yGridStroke: () => theme().yAxis.lineStyle,\n xMarkers: () => domains().x.ticks,\n yMarkers: () => domains().y.ticks,\n xExtent: () => domains().x.range,\n yExtent: () => domains().y.range,\n }),\n // Under the lines, so the highlight does not tint the stretch it picks out.\n new ChartRegion({\n box: () => regionBox(state, domains(), plotSize()),\n stroke: () => theme().region.stroke,\n fill: () => theme().region.fill,\n reveal: () => state.regionReveal,\n }),\n ...lines,\n new ChartBorder({ stroke: () => theme().plotArea.stroke }),\n ],\n }) as unknown as Node2D\n\n const gutter = new VerticalAxis({\n opacity: 0,\n range: () => domains().y.range,\n markers: () => domains().y.ticks,\n axis: () => theme().yAxis,\n label: state.yAxis.label ?? \"\",\n width: \"hug\",\n height: 0,\n }) as unknown as Node2D\n\n return asParts([cartesianFrame({ axis: vAxis as unknown as Node2D, plot, gutter, below })])\n },\n commands: {\n /**\n * Axes stagger in, lines trace left to right, the legend fades up last.\n * `duration` is the whole entrance; a chart with a `region` lands its\n * call-out in the final quarter.\n */\n enter: {\n args: {},\n // Held from arrival, so it never shows finished ahead of its draw.\n entrance: true,\n easing: easeOut(),\n run: (timeline, state, children) => {\n const parts = partsOf(children)\n if (!parts) return timeline.wait(timeline.duration)\n const duration = timeline.duration\n const revealing = hasCallout(state) && state.regionReveal === 0\n const body = revealing ? duration * 0.75 : duration\n const axes = body * ENTER_SHARE.axes\n const traced = body * ENTER_SHARE.marks\n const { legend } = parts\n const at0 = (piece: Beat[\"piece\"]): Beat => ({ at: 0, duration: 0, piece })\n // The first frame arms what every later beat moves: a beat ahead of the\n // playhead writes nothing. A beat with nothing to do still takes its share.\n return beats(timeline, [\n ...(revealing ? [at0(timeline.animate(() => ({ regionReveal: 0 })))] : []),\n ...parts.lines.map((line) => at0(line.to({ progress: 0 }))),\n ...(legend ? [at0(legend.to({ opacity: 0, y: -LEGEND_SLIDE }))] : []),\n { at: 0, duration: axes, piece: parts.vAxis.run(\"enter\", { slide: 24 }) },\n { at: 0, duration: axes, piece: parts.hAxis.run(\"enter\", { slide: 24 }) },\n ...parts.lines.map((line) => ({ at: axes, duration: traced, piece: line.run(\"enter\") })),\n ...(legend ? [{ at: axes + traced, duration: body * ENTER_SHARE.legend, piece: legend.to({ opacity: 1, y: 0 }) }] : []),\n ...(revealing ? [{ at: body, duration: duration * 0.25, piece: timeline.animate((t) => ({ regionReveal: t })) }] : []),\n ])\n },\n },\n /**\n * Spotlight a slice of the plot in data units; either axis alone is a band.\n * Over a region already up, the old one retracts in the first half and the\n * new one draws in over the second, each half eased on its own.\n */\n spotlightRegion: {\n args: { region: REGION_ARG },\n easing: easeOut(),\n run: (timeline, state) => {\n const region = regionArg(timeline.args.region)\n const from = state.regionReveal\n const previous = state.region\n // A region bounding neither axis is no call-out: spotlighting it is a clear.\n if (region.x === undefined && region.y === undefined) return clearing(timeline, state)\n // Nothing up yet: the region is set from the first frame and just draws on.\n if (from <= 0 || !hasCallout(state)) return timeline.animate((t) => ({ region, regionReveal: from + (1 - from) * t }))\n return timeline.animate(\n (t) => (t < 0.5\n ? { region: previous, regionReveal: from * (1 - timeline.ease(t * 2)) }\n : { region, regionReveal: timeline.ease(t * 2 - 1) }),\n { eased: false }\n )\n },\n },\n /** Drop the call-out. A no-op when nothing is spotlit, which still takes its slot. */\n clearRegion: {\n args: {},\n easing: easeOut(),\n run: (timeline, state) => clearing(timeline, state),\n },\n /** Rescale the named axes so a slice (data units) fills the plot; an omitted axis is left. The first zoom remembers the domain for `resetZoom`. */\n zoomTo: {\n args: { region: REGION_ARG },\n easing: easeOut(),\n run: (timeline, state) => {\n const region = regionArg(timeline.args.region)\n if (!region.x && !region.y) return timeline.wait(timeline.duration)\n const from = lineChartDomains(state)\n const home = state.home ?? from\n const to = {\n ...(region.x && { x: { ...from.x, ...rescale(region.x, from.x.ticks) } }),\n ...(region.y && { y: { ...from.y, ...rescale(region.y, from.y.ticks) } }),\n }\n return timeline.animate((t) => ({ home, ...axesAt(from, to, t) }))\n },\n },\n /** Back to the domain the first zoom left; a hold if it never zoomed. */\n resetZoom: {\n args: {},\n easing: easeOut(),\n run: (timeline, state) => {\n const home = state.home\n if (!home) return timeline.wait(timeline.duration)\n const from = lineChartDomains(state)\n return timeline.animate((t) => ({ home: null, ...axesAt(from, home, t) }))\n },\n },\n /** Trace series `index` in, with its legend entry growing in. */\n showSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, _state, children) => toggling(timeline, children, timeline.args.seriesIndex, true),\n },\n /** Retrace series `index` out as its legend entry shrinks away. */\n hideSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, _state, children) => toggling(timeline, children, timeline.args.seriesIndex, false),\n },\n /** Fade every other series, line and legend entry, to focus on `index`. The legend dims in place, so the row does not reflow. */\n spotlightSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, _state, children) => {\n const parts = partsOf(children)\n if (!parts) return timeline.wait(timeline.duration)\n const index = timeline.args.seriesIndex\n return timeline.together([\n ...parts.lines.map((line, i) => line.to({ opacity: i === index ? 1 : SPOTLIGHT_DIM })),\n ...(parts.legend ? [parts.legend.run(\"spotlightSeries\", { index })] : []),\n ])\n },\n },\n },\n})\n\nexport type LineChart = NodeOf<typeof LineChart>\n"]}
1
+ {"version":3,"file":"line-chart.js","sourceRoot":"","sources":["../../src/line-chart/line-chart.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Rect,\n Text,\n Types,\n clamp,\n component2d,\n easeOut,\n type ChildView,\n type DataRecord,\n type NodeOf,\n type OutOf,\n // Named so this component's emitted type reaches `Node2D` and its props through the sdk, not core.\n type Node2D,\n type Node2DProps as _Node2DProps,\n type TextStyle as _TextStyle,\n type Fill as _Fill,\n type FillResolved as _FillResolved,\n type Stroke as _Stroke,\n type StrokeResolved as _StrokeResolved,\n type Size2D,\n type StyleInput as _StyleInput,\n type StyleValues as _StyleValues,\n type Vector2,\n} from \"@motionscript/sdk\"\nimport { formatNumber } from \"@motionscript/sdk/component\"\n\nimport { boundText, cartesianFrame, chartViews, columnGhost, fade, frameGap, headroom, laidOutSize, overhang } from \"../kit/cartesian\"\nimport { ChartCanvas } from \"../kit/chart-canvas\"\nimport { ChartLegend } from \"../kit/chart-legend\"\nimport { SERIES_ARG, asParts, fresh } from \"../kit/entries\"\nimport { HorizontalAxis } from \"../kit/horizontal-axis\"\nimport { DEFAULT_MARKERS, ENTER_SHARE, beats, legendAway, type AnyTimeline, type Beat } from \"../kit/motion\"\nimport {\n SPOTLIGHT_DIM,\n formatMarker,\n lerpAxisDomain,\n lerpAxisEntry,\n markerStep,\n markerValues,\n niceRange,\n niceTicks,\n resolveAxisDomain,\n settleAxisDomain,\n type AxisDomainConfig,\n type Range,\n type ResolvedAxisDomain,\n} from \"../kit/shared\"\nimport {\n CARTESIAN_GRID,\n CARTESIAN_TEXT,\n CHART_LEGEND,\n CHART_SERIES,\n CHART_STYLE_FAMILY,\n CHART_STYLE_PRESETS,\n GRID_BACKGROUND,\n axisConfigOf,\n legendConfigOf,\n migrateChartStyle,\n seriesFill,\n sizeOf,\n valueText,\n} from \"../kit/style\"\nimport { VerticalAxis, axisPads } from \"../kit/vertical-axis\"\nimport { ChartArea, ChartLine, traceX } from \"./chart-line\"\nimport { ChartRegion } from \"./chart-region\"\nimport {\n LINE_LABELS,\n LINE_MARKS,\n resolveRegionBox,\n stackExtent,\n stackSeries,\n type LineSeries,\n type LineStack,\n type PlotRegion,\n type RegionBox,\n type StackedSeries,\n} from \"./shared\"\nimport { resolveXScale, type XScale } from \"./x-scale\"\n\nconst LINE_STYLE = Types.style(\n CHART_STYLE_FAMILY,\n { series: CHART_SERIES, background: GRID_BACKGROUND, text: CARTESIAN_TEXT, grid: CARTESIAN_GRID, marks: LINE_MARKS, labels: LINE_LABELS, legend: CHART_LEGEND },\n { presets: CHART_STYLE_PRESETS }\n)\n\n/** A line chart's resolved style. */\nexport type LineChartStyle = OutOf<typeof LINE_STYLE>\n\n/** Both axes' domains with their ranges and ticks resolved. */\nexport interface LineChartDomains {\n readonly x: ResolvedAxisDomain\n readonly y: ResolvedAxisDomain\n}\n\n/** What a line chart plots, as its entries hold it. */\nexport interface LineChartValues {\n readonly data: DataRecord[]\n readonly xField: string\n readonly series: LineSeries[]\n readonly stack: LineStack\n readonly xAxis: AxisDomainConfig\n readonly yAxis: AxisDomainConfig\n /** Each series' share of a stack, `1` when missing. */\n readonly weights?: readonly number[]\n /** An area must reach its baseline, so a chart with areas keeps zero on the scale. */\n readonly style?: { readonly area: string }\n}\n\n/** One argument, two controls: the commands take a `PlotRegion`, so the x and y spans a host draws are declared inside it. */\nconst REGION_ARG = Types.custom<PlotRegion | undefined>(undefined, {\n kind: \"region\",\n properties: {\n x: { kind: \"range\", default: true, defaultMin: 0, defaultMax: 100 },\n y: { kind: \"range\", default: false, defaultMin: 0, defaultMax: 100 },\n },\n})\n\n/** What the chart's own commands read: its entries, and the private state they write. */\ninterface LineState extends LineChartValues {\n readonly style: LineChartStyle\n readonly region: PlotRegion | null\n readonly regionReveal: number\n readonly home: LineChartDomains | null\n readonly weights: number[]\n}\n\n/** The share of the y axis a percent stack reads to. */\nconst PERCENT: Range = [0, 100]\n\n/** What the x column is (a number, an instant, or a place in the file), and so how rows are positioned, ticked and captioned. */\nfunction columnOf(s: LineChartValues, format = s.xAxis.format): XScale {\n return resolveXScale(s.data, s.xField, format)\n}\n\n/** Every series as drawn; `weighted` false reads each at full share, as the scale does so the ticks hold still while a series sinks out. */\nfunction stacksOf(s: LineChartValues, weighted = true): StackedSeries[] {\n return stackSeries(s.data, columnOf(s), s.series, s.stack, weighted ? s.weights : undefined)\n}\n\n/** The explicit range and ticks, else the column's extent and ticks: only a numeric column has round numbers between its samples. */\nfunction drawnX(s: LineChartValues, domain: AxisDomainConfig): AxisDomainConfig {\n const column = columnOf(s, domain.format)\n const range = domain.range ?? column.extent\n return { ...domain, range, ticks: domain.ticks ?? column.ticks(range, DEFAULT_MARKERS - 1) }\n}\n\n/** The y range the data asks for: a percent stack reads to 100; areas and stacks keep zero on the scale. */\nfunction autoY(s: LineChartValues, divisions: number): Range {\n const [lo, hi] = stackExtent(stacksOf(s, false))\n if (s.stack === \"percent\" && lo >= 0) return PERCENT\n const zero = s.stack !== \"none\" || (s.style?.area ?? \"none\") !== \"none\"\n return niceRange(zero ? [Math.min(0, lo), Math.max(0, hi)] : [lo, hi], divisions)\n}\n\n/** Auto-ranging steps into one fewer segment than the marker count, so the tidy bounds frame the ticks drawn. */\nfunction drawnY(s: LineChartValues, domain: AxisDomainConfig): AxisDomainConfig {\n const divisions = (domain.ticks?.length ?? DEFAULT_MARKERS) - 1\n const range = domain.range ?? autoY(s, divisions)\n const even = domain.range !== undefined || (s.stack === \"percent\" && range === PERCENT)\n return { ...domain, range, ticks: domain.ticks ?? (even ? markerValues(range, DEFAULT_MARKERS - 1) : niceTicks(range, DEFAULT_MARKERS - 1)) }\n}\n\n/** The last domains worked out from each data array, and what else they were read from. */\nconst domainsDrawn = new WeakMap<DataRecord[], { readonly key: readonly unknown[]; readonly domains: LineChartDomains }>()\n\n/** Both axes as drawn now. */\nexport function lineChartDomains(s: LineChartValues): LineChartDomains {\n const key = [s.xField, s.xAxis, s.yAxis, s.series, s.stack, s.style?.area]\n const kept = domainsDrawn.get(s.data)\n if (kept && kept.key.every((value, i) => value === key[i])) return kept.domains\n const domains = {\n x: settleAxisDomain(s.xAxis, (d) => drawnX(s, d)) as LineChartDomains[\"x\"],\n y: settleAxisDomain(s.yAxis, (d) => drawnY(s, d)) as LineChartDomains[\"y\"],\n }\n domainsDrawn.set(s.data, { key, domains })\n return domains\n}\n\n/** Data to the plot's centred pixel space (origin at its centre, y-up). */\nfunction mapper(domains: LineChartDomains, plot: Size2D) {\n const [xMin, xMax] = domains.x.range\n const [yMin, yMax] = domains.y.range\n return {\n x: (x: number) => (xMax <= xMin ? 0 : ((x - xMin) / (xMax - xMin) - 0.5) * plot.width),\n y: (y: number) => (yMax === yMin ? 0 : ((y - yMin) / (yMax - yMin) - 0.5) * plot.height),\n }\n}\n\ninterface SeriesPixels {\n readonly points: Vector2[]\n /** The line under the series in a stack; empty when it fills to the baseline. */\n readonly base: Vector2[]\n /** What each point reads: its own value, or its share in a percent stack. */\n readonly values: number[]\n}\n\nconst NO_PIXELS: SeriesPixels = { points: [], base: [], values: [] }\n\n/** Series `index` in the plot's centred pixel space. */\nfunction seriesPixels(s: LineChartValues, domains: LineChartDomains, index: number, plot: Size2D): SeriesPixels {\n const stack = stacksOf(s)[index]\n if (!stack) return NO_PIXELS\n const map = mapper(domains, plot)\n const toPx = ([x, y]: [number, number]): Vector2 => ({ x: map.x(x), y: map.y(y) })\n return {\n points: stack.points.map(toPx),\n base: stack.base ? stack.base.map(toPx) : [],\n values: stack.points.map(([, y], k) => y - (stack.base?.[k]?.[1] ?? 0)),\n }\n}\n\n/** Where the areas fill down to: zero, held inside the scale. */\nfunction baselineValue(domains: LineChartDomains): number {\n const [lo, hi] = domains.y.range\n return clamp(0, Math.min(lo, hi), Math.max(lo, hi))\n}\n\n/** Whether anything plotted runs past the scale, so the plot clips it: a zoom, or an author's range narrower than the data. */\nfunction overflows(s: LineChartValues, domains: LineChartDomains): boolean {\n const [ylo, yhi] = stackExtent(stacksOf(s, false))\n const [xlo, xhi] = columnOf(s).extent\n const within = (v: number, [a, b]: Range) => v >= Math.min(a, b) - 1e-9 && v <= Math.max(a, b) + 1e-9\n return !(within(ylo, domains.y.range) && within(yhi, domains.y.range) && within(xlo, domains.x.range) && within(xhi, domains.x.range))\n}\n\n/** `region` in centred pixel space against the live scales, so it travels with a zoom. */\nfunction regionBox(s: LineChartValues & { readonly region: PlotRegion | null }, domains: LineChartDomains, plot: Size2D): RegionBox {\n const { width: w, height: h } = plot\n return resolveRegionBox(s.region, { left: -w / 2, right: w / 2, bottom: -h / 2, top: h / 2 }, domains.x.range, domains.y.range)\n}\n\n/** Whether a call-out is authored, not whether it resolves to pixels: a command is built before the first layout. A region bounding neither axis is none. */\nfunction hasCallout(s: { readonly region: PlotRegion | null }): boolean {\n const region = s.region\n return region != null && (region.x !== undefined || region.y !== undefined)\n}\n\n/** The `region` argument, or `{}`: a command is added before its arguments are filled in. */\nfunction regionArg(region: PlotRegion | null | undefined): PlotRegion {\n return region != null && typeof region === \"object\" ? region : {}\n}\n\n/** A range ordered low to high. */\nfunction span([a, b]: Range): Range {\n return a <= b ? [a, b] : [b, a]\n}\n\n/** Rescale to `range` keeping the tick count, so each marker slides rather than the row popping. */\nfunction rescale(range: Range, ticks: readonly number[]): AxisDomainConfig {\n const to = span(range)\n return { range: to, ticks: markerValues(to, Math.max(2, ticks.length) - 1) }\n}\n\nfunction axesAt(from: LineChartDomains, to: Partial<Record<\"x\" | \"y\", AxisDomainConfig>>, t: number) {\n return {\n ...(to.x && { xAxis: lerpAxisDomain(from.x, to.x, t) }),\n ...(to.y && { yAxis: lerpAxisDomain(from.y, to.y, t) }),\n }\n}\n\n/** A value as the y axis writes it: the author's pattern, a share in a percent stack, else the bare reading at the ticks' precision. */\nfunction yLabel(s: LineChartValues, value: number, ticks: readonly number[]): string {\n const format = s.yAxis.format\n if (format !== undefined) return formatNumber(value, format)\n const text = formatMarker(value, markerStep(ticks))\n return s.stack === \"percent\" ? `${text}%` : text\n}\n\nfunction weightOf(s: { readonly weights: readonly number[] }, index: number): number {\n return Math.max(0, s.weights[index] ?? 1)\n}\n\n/** The parts a line chart's commands drive, found through its children. */\nfunction partsOf(children: readonly ChildView[]) {\n const views = chartViews(children)\n return {\n vAxis: views.find(VerticalAxis.is) ?? null,\n hAxis: views.find(HorizontalAxis.is) ?? null,\n lines: views.filter(ChartLine.is),\n legend: views.find(ChartLegend.is) ?? null,\n }\n}\n\nfunction clearing(timeline: AnyTimeline, state: LineState) {\n const from = state.regionReveal\n const region = state.region\n // Nothing to retract, but the call still takes its slot.\n if (from === 0) return timeline.animate(() => ({ region: null, regionReveal: 0 }), { eased: false })\n // `region` is held until the retraction lands, or there would be nothing left to retract.\n return timeline.animate((t) => (t >= 1 ? { region: null, regionReveal: 0 } : { region, regionReveal: from * (1 - t) }))\n}\n\n/**\n * Show or hide series `index` with its legend entry. Apart, the line retraces;\n * in a stack it sinks into the series below as its share falls to nothing, so\n * the ones above settle rather than leaving a gap.\n */\nfunction toggling(timeline: AnyTimeline, state: LineState, children: readonly ChildView[], index: number, show: boolean) {\n const parts = partsOf(children)\n const line = parts.lines[index]\n if (!line) return timeline.wait(timeline.duration)\n const legend = parts.legend ? [parts.legend.run(show ? \"showSeries\" : \"hideSeries\", { index })] : []\n if (state.stack === \"none\") {\n return timeline.together([line.run(\"enter\", show ? { from: 0, to: 1 } : { from: 1, to: 0 }), ...legend])\n }\n const from = state.series.map((_, i) => weightOf(state, i))\n const start = from[index] ?? 1\n const target = show ? 1 : 0\n return timeline.together([\n timeline.animate((t) => {\n const weights = [...from]\n weights[index] = start + (target - start) * timeline.ease(t)\n return { weights }\n }, { eased: false }),\n line.run(\"hold\", { shown: show }),\n ...legend,\n ])\n}\n\n/**\n * A multi-series line or area chart composed of {@link ChartCanvas}, the value\n * and x axes, {@link ChartRegion}, a {@link ChartArea} and a {@link ChartLine}\n * per series, and {@link ChartLegend}. Every part reads the chart's entries\n * through bindings and maps against the plot panel's own laid-out box.\n *\n * Resting state is the finished chart; `enter` arms every part on its first\n * frame. A `to` of an axis `range` or `ticks` tweens from the domain as drawn\n * (see {@link lerpAxisEntry}), so an auto axis rescales continuously.\n */\nexport const LineChart = component2d({\n key: \"lineChart\",\n state: {\n data: fresh<DataRecord[]>(() => [], { kind: \"dataset\" }),\n // Not `x`: every node already has an `x`, its position.\n xField: \"\",\n series: fresh<LineSeries[]>(() => [], { kind: \"series\" }),\n /** `stacked`: each series sits on the sum of those before it; `percent`: every row reads as shares of 100. */\n stack: Types.oneOf([\"none\", \"stacked\", \"percent\"] as const),\n xAxis: Types.custom<AxisDomainConfig>({}, { resolve: resolveAxisDomain, lerp: lerpAxisEntry }),\n yAxis: Types.custom<AxisDomainConfig>({}, { resolve: resolveAxisDomain, lerp: lerpAxisEntry }),\n style: LINE_STYLE,\n /** The spotlit slice in data units, or `null`. The box snaps; {@link regionReveal} animates it. */\n region: Types.custom<PlotRegion | null>(null),\n /** How far the `region` call-out is drawn in, `[0, 1]`: rules grow, wash fades up, out-of-region stretches fade. */\n regionReveal: 0,\n /** The domain `zoomTo` first left, so `resetZoom` restores it, auto-derived ticks included. */\n home: Types.custom<LineChartDomains | null>(null, { private: true }),\n /** Each series' share of a stack, seeded from `enabled`: a weight rather than a switch, so a hidden series sinks out. */\n weights: Types.custom<number[]>([], { private: true }),\n /** Whether the plot clips its marks, from a zoom's first frame until a reset lands. */\n clipped: Types.boolean(false, { private: true }),\n },\n // A node made of parts that fill would otherwise hug them.\n defaults: {\n width: \"fill\",\n height: \"fill\",\n weights: (state) => state.series.map((s) => ((s.enabled ?? true) ? 1 : 0)),\n },\n migrate: { style: migrateChartStyle(\"cartesian\") },\n allowedChildren: [],\n children: (state) => {\n const style = () => state.style\n const domains = () => lineChartDomains(state)\n let plot: Node2D | undefined\n const plotSize = () => laidOutSize(plot)\n const pixels = (i: number) => seriesPixels(state, domains(), i, plotSize())\n const enabled = state.series.map((s) => s.enabled ?? true)\n const built = state.style\n const yConfig = () => axisConfigOf(style(), \"y\")\n const xConfig = () => axisConfigOf(style(), \"x\")\n const yCaptions = () => {\n const ticks = domains().y.ticks\n return ticks.map((value) => yLabel(state, value, ticks))\n }\n\n // Bound, not snapshotted, so a rescale re-labels and re-places the row as it\n // tweens. The marker *count* is read once, which is why `zoomTo` keeps it.\n const vAxis = built.showYAxis\n ? (new VerticalAxis({\n range: () => domains().y.range,\n markers: () => domains().y.ticks,\n captions: yCaptions,\n axis: yConfig,\n label: state.yAxis.label ?? \"\",\n width: \"hug\",\n height: \"fill\",\n }) as unknown as Node2D)\n : undefined\n\n const hAxis = built.showXAxis\n ? (new HorizontalAxis({\n range: () => domains().x.range,\n markers: () => domains().x.ticks,\n // A month or category tick is captioned with its cell (`Jan`), not the instant it parsed to.\n captions: () => {\n const column = columnOf(state)\n return domains().x.ticks.map((value) => column.label(value))\n },\n axis: xConfig,\n label: state.xAxis.label ?? \"\",\n overhang: () => ({ left: overhang(style()), right: overhang(style()) }),\n width: \"fill\",\n height: \"hug\",\n }) as unknown as Node2D)\n : undefined\n\n const ghost = vAxis && hAxis\n ? columnGhost({\n captions: yCaptions,\n count: lineChartDomains(state).y.ticks.length,\n text: () => yConfig().labelStyle,\n title: state.yAxis.label ?? \"\",\n titleText: () => yConfig().titleStyle,\n tickPad: () => axisPads(yConfig(), \"right\").tick,\n titlePad: () => axisPads(yConfig(), \"right\").title,\n })\n : undefined\n\n const spotlight = () => regionBox(state, domains(), plotSize())\n const dimOpacity = () => 1 - (1 - SPOTLIGHT_DIM) * state.regionReveal\n const lines = state.series.map((s, i) =>\n new ChartLine({\n points: () => pixels(i).points,\n curve: () => style().curve,\n stroke: () => ({ weight: style().strokeWidth, fill: seriesFill(style(), s, i), align: \"center\", cap: \"round\", join: \"round\" }),\n dotSize: () => (style().dots ? style().dotSize : 0),\n dotFill: () => seriesFill(style(), s, i),\n enabled: enabled[i],\n spotlight,\n dimOpacity,\n })\n )\n const areas = state.series.map((s, i) =>\n new ChartArea({\n points: () => pixels(i).points,\n base: () => pixels(i).base,\n baseline: () => mapper(domains(), plotSize()).y(baselineValue(domains())),\n curve: () => style().curve,\n area: () => style().area,\n fill: () => seriesFill(style(), s, i),\n areaOpacity: () => style().areaOpacity,\n // The line's own trace, switch and fade, so the two arrive, leave and dim as one.\n progress: () => lines[i].progress,\n enabled: () => lines[i].enabled,\n opacity: () => lines[i].opacity,\n spotlight,\n dimOpacity,\n })\n )\n\n const labels: Node2D[] = []\n if (built.values !== \"none\") {\n const below = built.values === \"below\"\n state.series.forEach((_, i) => {\n state.data.forEach((_row, k) => {\n const line = lines[i]\n const label: Node2D = new Text({\n ...boundText(() => valueText(style())),\n text: () => {\n const value = pixels(i).values[k]\n return value === undefined ? \"\" : yLabel(state, value, domains().y.ticks)\n },\n // Held inside the plot, so a figure on an end point does not run into the axis beside it.\n x: () => {\n const half = (plotSize().width - label.layoutBounds.width) / 2\n return clamp(pixels(i).points[k]?.x ?? 0, -Math.max(0, half), Math.max(0, half))\n },\n y: () => {\n const point = pixels(i).points[k]\n const clear = label.layoutBounds.height / 2 + (style().dots ? style().dotSize / 2 : style().strokeWidth / 2) + Math.round(sizeOf(style().valueText) * 0.25)\n return (point?.y ?? 0) + (below ? -clear : clear)\n },\n // In once the trace has passed its point.\n opacity: () => {\n const point = pixels(i).points[k]\n if (!line.enabled || !point) return 0\n const reach = traceX(pixels(i).points, line.progress)\n return line.opacity * (reach === Infinity ? 1 : clamp((reach - point.x) / 24, 0, 1))\n },\n }) as unknown as Node2D\n labels.push(label)\n })\n })\n }\n\n const legendAt = built.legend\n const legend = legendAt !== \"none\"\n ? (new ChartLegend({\n series: state.series,\n swatches: () => state.series.map((s, i) => seriesFill(style(), s, i)),\n legend: () => legendConfigOf(style()),\n flow: legendAt === \"right\" ? \"vertical\" : \"horizontal\",\n }) as unknown as Node2D)\n : undefined\n\n plot = new Rect({\n clip: () => state.clipped || overflows(state, domains()),\n children: [\n new ChartCanvas({\n fill: () => style().gridBackground,\n xGridStroke: () => style().verticalGrid,\n yGridStroke: () => style().horizontalGrid,\n xMarkers: () => domains().x.ticks,\n yMarkers: () => domains().y.ticks,\n xExtent: () => domains().x.range,\n yExtent: () => domains().y.range,\n axisStroke: () => style().axisStroke,\n xAxisAt: () => baselineValue(domains()),\n yAxisAt: () => domains().x.range[0],\n }),\n // Under the marks, so the highlight does not tint the stretch it picks out.\n new ChartRegion({\n box: spotlight,\n stroke: () => ({ weight: 2, fill: fade(style().valueText.fill ?? \"white\", 0.7), dash: [14, 12], cap: \"butt\", align: \"center\" }),\n fill: () => fade(style().valueText.fill ?? \"white\", 0.06),\n reveal: () => state.regionReveal,\n }),\n ...areas,\n ...lines,\n ...labels,\n ],\n }) as unknown as Node2D\n\n return asParts([\n cartesianFrame({\n background: () => style().background,\n left: vAxis,\n ghost,\n plot,\n bottom: hAxis,\n legend,\n legendAt,\n gap: () => frameGap(style()),\n padding: () => ({\n top: headroom(style()),\n right: hAxis ? overhang(style()) : 0,\n left: hAxis && !vAxis ? overhang(style()) : 0,\n bottom: 0,\n }),\n }),\n ])\n },\n commands: {\n /**\n * Axes stagger in, lines (and their areas) trace left to right, the legend\n * fades up last. `duration` is the whole entrance; a chart with a `region`\n * lands its call-out in the final quarter.\n */\n enter: {\n args: {},\n // Held from arrival, so it never shows finished ahead of its draw.\n entrance: true,\n easing: easeOut(),\n run: (timeline, state, children) => {\n const parts = partsOf(children)\n const duration = timeline.duration\n const revealing = hasCallout(state) && state.regionReveal === 0\n const body = revealing ? duration * 0.75 : duration\n const axes = body * ENTER_SHARE.axes\n const traced = body * ENTER_SHARE.marks\n const { legend } = parts\n const at0 = (piece: Beat[\"piece\"]): Beat => ({ at: 0, duration: 0, piece })\n const away = legendAway(state.style.legend)\n // The first frame arms what every later beat moves: a beat ahead of the\n // playhead writes nothing. A beat with nothing to do still takes its share.\n return beats(timeline, [\n ...(revealing ? [at0(timeline.animate(() => ({ regionReveal: 0 })))] : []),\n ...parts.lines.map((line) => at0(line.to({ progress: 0 }))),\n ...(legend ? [at0(legend.to({ opacity: 0, ...away }))] : []),\n ...(parts.vAxis ? [{ at: 0, duration: axes, piece: parts.vAxis.run(\"enter\", { slide: 24 }) }] : []),\n ...(parts.hAxis ? [{ at: 0, duration: axes, piece: parts.hAxis.run(\"enter\", { slide: 24 }) }] : []),\n ...parts.lines.map((line) => ({ at: axes, duration: traced, piece: line.run(\"enter\") })),\n ...(legend ? [{ at: axes + traced, duration: body * ENTER_SHARE.legend, piece: legend.to({ opacity: 1, x: 0, y: 0 }) }] : []),\n ...(revealing ? [{ at: body, duration: duration * 0.25, piece: timeline.animate((t) => ({ regionReveal: t })) }] : []),\n // Takes the whole slot even with no parts to move.\n { at: 0, duration, piece: timeline.wait(duration) },\n ])\n },\n },\n /**\n * Spotlight a slice of the plot in data units; either axis alone is a band.\n * Over a region already up, the old one retracts in the first half and the\n * new one draws in over the second, each half eased on its own.\n */\n spotlightRegion: {\n args: { region: REGION_ARG },\n easing: easeOut(),\n run: (timeline, state) => {\n const region = regionArg(timeline.args.region)\n const from = state.regionReveal\n const previous = state.region\n // A region bounding neither axis is no call-out: spotlighting it is a clear.\n if (region.x === undefined && region.y === undefined) return clearing(timeline, state)\n // Nothing up yet: the region is set from the first frame and just draws on.\n if (from <= 0 || !hasCallout(state)) return timeline.animate((t) => ({ region, regionReveal: from + (1 - from) * t }))\n return timeline.animate(\n (t) => (t < 0.5\n ? { region: previous, regionReveal: from * (1 - timeline.ease(t * 2)) }\n : { region, regionReveal: timeline.ease(t * 2 - 1) }),\n { eased: false }\n )\n },\n },\n /** Drop the call-out. A no-op when nothing is spotlit, which still takes its slot. */\n clearRegion: {\n args: {},\n easing: easeOut(),\n run: (timeline, state) => clearing(timeline, state),\n },\n /** Rescale the named axes so a slice (data units) fills the plot; an omitted axis is left. The first zoom remembers the domain for `resetZoom`. */\n zoomTo: {\n args: { region: REGION_ARG },\n easing: easeOut(),\n run: (timeline, state) => {\n const region = regionArg(timeline.args.region)\n if (!region.x && !region.y) return timeline.wait(timeline.duration)\n const from = lineChartDomains(state)\n const home = state.home ?? from\n const to = {\n ...(region.x && { x: { ...from.x, ...rescale(region.x, from.x.ticks) } }),\n ...(region.y && { y: { ...from.y, ...rescale(region.y, from.y.ticks) } }),\n }\n return timeline.animate((t) => ({ home, clipped: true, ...axesAt(from, to, t) }))\n },\n },\n /** Back to the domain the first zoom left; a hold if it never zoomed. */\n resetZoom: {\n args: {},\n easing: easeOut(),\n run: (timeline, state) => {\n const home = state.home\n if (!home) return timeline.wait(timeline.duration)\n const from = lineChartDomains(state)\n return timeline.animate((t) => ({ home: null, clipped: t < 1, ...axesAt(from, home, t) }))\n },\n },\n /** Bring series `index` in, with its legend entry growing in: traced, or in a stack risen out of the series below. */\n showSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, state, children) => toggling(timeline, state, children, timeline.args.seriesIndex, true),\n },\n /** The mirror of `showSeries`. */\n hideSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, state, children) => toggling(timeline, state, children, timeline.args.seriesIndex, false),\n },\n /** Fade every other series, line, area and legend entry, to focus on `index`. The legend dims in place, so the row does not reflow. */\n spotlightSeries: {\n args: { seriesIndex: SERIES_ARG },\n easing: easeOut(),\n run: (timeline, _state, children) => {\n const parts = partsOf(children)\n const index = timeline.args.seriesIndex\n return timeline.together([\n ...parts.lines.map((line, i) => line.to({ opacity: i === index ? 1 : SPOTLIGHT_DIM })),\n ...(parts.legend ? [parts.legend.run(\"spotlightSeries\", { index })] : []),\n timeline.wait(timeline.duration),\n ])\n },\n },\n },\n})\n\nexport type LineChart = NodeOf<typeof LineChart>\n"]}
@@ -1,5 +1,5 @@
1
- import { type DataRecord, type Fill, type Stroke, type Vector2 } from "@motionscript/sdk";
2
- import { type AxisConfig, type ChartSeries, type LegendConfig, type LegendTheme, type PlotAreaConfig, type Range } from "../kit/shared.js";
1
+ import { type DataRecord, type Vector2 } from "@motionscript/sdk";
2
+ import { type ChartSeries, type Range } from "../kit/shared.js";
3
3
  import type { XScale } from "./x-scale.js";
4
4
  /** One polyline of a {@link LineChart}: {@link ChartSeries} under the name for what it draws here. */
5
5
  export type LineSeries = ChartSeries;
@@ -49,38 +49,6 @@ export declare function resolveRegionBox(region: PlotRegion | null | undefined,
49
49
  * exactly on the boundary.
50
50
  */
51
51
  export declare function clipPolylineToBox(points: Vector2[], box: RegionBox): Vector2[][];
52
- /** How a spotlit {@link PlotRegion} is drawn: rules on its bounded edges, a wash, and how far series fade outside it. */
53
- export interface RegionConfig {
54
- /** Marks each bounded edge. */
55
- stroke: Stroke;
56
- /** Drawn under the series lines. */
57
- fill: Fill;
58
- /** Opacity the stretch of every series outside the region fades to. */
59
- dimOpacity: number;
60
- }
61
- /** A {@link LineChart}'s full, resolved visual theme. */
62
- export interface ChartConfig {
63
- /** Cycled by series index; a series' own `fill` overrides just the colour. */
64
- seriesStyles: Stroke[];
65
- xAxis: AxisConfig;
66
- yAxis: AxisConfig;
67
- plotArea: PlotAreaConfig;
68
- legend: LegendConfig;
69
- region: RegionConfig;
70
- }
71
- /** The author's partial theme, deep-merged onto {@link DEFAULT_CHART_THEME}. */
72
- export type ChartTheme = {
73
- seriesStyles?: Stroke[];
74
- xAxis?: Partial<AxisConfig>;
75
- yAxis?: Partial<AxisConfig>;
76
- plotArea?: Partial<PlotAreaConfig>;
77
- legend?: LegendTheme;
78
- region?: Partial<RegionConfig>;
79
- };
80
- export declare const DEFAULT_CHART_THEME: ChartConfig;
81
- /** The `theme` entry's resolve: merges a partial {@link ChartTheme} onto `previous` (first resolution: the default). */
82
- export declare function resolveChartTheme(theme: ChartTheme | undefined, previous?: ChartConfig): ChartConfig;
83
- export declare function lerpChartTheme(from: ChartConfig, to: ChartConfig, t: number): ChartConfig;
84
52
  /**
85
53
  * One series' `[x, y]` points, sorted along x so the polyline traces left to
86
54
  * right. A row missing its y contributes 0 rather than a gap, since dropping it
@@ -94,4 +62,53 @@ export declare function yExtent(data: DataRecord[], series: LineSeries[]): Range
94
62
  * `range` is omitted.
95
63
  */
96
64
  export declare function resolveYScale(data: DataRecord[], series: LineSeries[], range: Range | undefined, divisions: number): Range;
65
+ /** How the series sit on one another: apart, each on the sum of those before it, or as shares of the row's total. */
66
+ export type LineStack = "none" | "stacked" | "percent";
67
+ /** One series as drawn: its `[x, y]` points along x, and the line its area fills down to (`null`: the baseline). */
68
+ export interface StackedSeries {
69
+ readonly points: [x: number, y: number][];
70
+ readonly base: [x: number, y: number][] | null;
71
+ }
72
+ /**
73
+ * Every series' points under `stack`, rows in x order. A series contributes its
74
+ * values times its weight (`1` when missing), so a series sinking out of a stack
75
+ * lowers the ones above it. `percent` reads each row as shares of its total
76
+ * magnitude, so the top of a full stack is 100.
77
+ */
78
+ export declare function stackSeries(data: DataRecord[], x: XScale, series: readonly LineSeries[], stack: LineStack, weights?: readonly number[]): StackedSeries[];
79
+ /** The lowest and highest y anything in `stacks` reaches, its bases included. */
80
+ export declare function stackExtent(stacks: readonly StackedSeries[]): Range;
81
+ /** How a series' line runs between its points. */
82
+ export type LineCurve = "smooth" | "linear" | "step";
83
+ /**
84
+ * The drawn path through `points` (ordered along x) as a polyline: the points
85
+ * themselves for `linear`; for `step`, level runs that change at the midpoint
86
+ * between neighbours; for `smooth`, a monotone cubic (Fritsch-Carlson, as d3's
87
+ * `curveMonotoneX`), which never overshoots the data between two points.
88
+ */
89
+ export declare function curvePoints(points: readonly Vector2[], curve: LineCurve): Vector2[];
90
+ /** The part of `points` (ordered along x) left of `x`, ending on the point where it crosses `x`. */
91
+ export declare function cutAt(points: readonly Vector2[], x: number): Vector2[];
92
+ /**
93
+ * `polygon` clipped to `box` (Sutherland-Hodgman against each edge in turn).
94
+ * The box is convex, so the result is the part inside, possibly with seams of
95
+ * no width where a concave outline leaves and re-enters, which fill as nothing.
96
+ */
97
+ export declare function clipPolygonToBox(polygon: readonly Vector2[], box: RegionBox): Vector2[];
98
+ /** A line chart's own look: how each series is stroked, dotted and filled. */
99
+ export declare const LINE_MARKS: {
100
+ strokeWidth: import("@motionscript/sdk").Type<number, number, false>;
101
+ curve: import("@motionscript/sdk").Type<"step" | "linear" | "smooth", "step" | "linear" | "smooth", false>;
102
+ dots: import("@motionscript/sdk").Type<boolean, boolean, false>;
103
+ /** Each dot's diameter. */
104
+ dotSize: import("@motionscript/sdk").Type<number, number, false>;
105
+ /** Fill under each line: none, the series colour, or the colour fading to nothing at the baseline. */
106
+ area: import("@motionscript/sdk").Type<"none" | "solid" | "gradient", "none" | "solid" | "gradient", false>;
107
+ /** The fill's opacity at the line. */
108
+ areaOpacity: import("@motionscript/sdk").Type<number, number, false>;
109
+ };
110
+ export declare const LINE_LABELS: {
111
+ /** Read as the chart is built: each point's value printed above or below it, or none. */
112
+ values: import("@motionscript/sdk").Type<"none" | "above" | "below", "none" | "above" | "below", false>;
113
+ };
97
114
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/line-chart/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/line-chart/shared.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { Fills, fillOps, lerpNumber, strokeOps, } from "@motionscript/sdk";
2
- import { niceStep } from "@motionscript/sdk/component";
3
- import { CHART_PALETTE, DEFAULT_LEGEND, DEFAULT_PLOT_AREA, DEFAULT_SERIES_STROKES, DEFAULT_X_AXIS, DEFAULT_Y_AXIS, SPOTLIGHT_DIM, lerpAxisConfig, lerpLegendConfig, lerpPlotArea, lerpSeriesStrokes, num, resolveAxisConfig, resolveLegendConfig, resolvePlotArea, resolveSeriesStrokes, } from "../kit/shared.js";
1
+ import { Types } from "@motionscript/sdk";
2
+ import { niceRange, num } from "../kit/shared.js";
4
3
  /** The "no region" resting value. */
5
4
  export const EMPTY_REGION_BOX = {
6
5
  left: 0,
@@ -116,70 +115,6 @@ function clipSegment(a, b, box) {
116
115
  { x: a.x + t1 * dx, y: a.y + t1 * dy },
117
116
  ];
118
117
  }
119
- /** The shared legend with a small square swatch: a line's swatch stands for a colour, where a bar's or wedge's stands for an area of paint. */
120
- const LINE_CHART_LEGEND = {
121
- ...DEFAULT_LEGEND,
122
- markerStyle: {
123
- ...DEFAULT_LEGEND.markerStyle,
124
- width: 20,
125
- height: 20,
126
- borderRadius: 6,
127
- },
128
- };
129
- export const DEFAULT_CHART_THEME = {
130
- seriesStyles: DEFAULT_SERIES_STROKES,
131
- xAxis: DEFAULT_X_AXIS,
132
- yAxis: DEFAULT_Y_AXIS,
133
- plotArea: DEFAULT_PLOT_AREA,
134
- legend: LINE_CHART_LEGEND,
135
- region: {
136
- // Brighter and dashed so it reads as a call-out, not an axis line; `butt` caps keep dash lengths exact.
137
- stroke: {
138
- weight: 3,
139
- fill: CHART_PALETTE.regionColor,
140
- dash: [14, 12],
141
- cap: "butt",
142
- },
143
- fill: Fills.color(CHART_PALETTE.regionColor, { opacity: 0.08 }),
144
- dimOpacity: SPOTLIGHT_DIM,
145
- },
146
- };
147
- function resolveRegionConfig(region, previous) {
148
- return {
149
- stroke: strokeOps.resolve(region?.stroke ?? previous.stroke),
150
- fill: fillOps.resolve(region?.fill ?? previous.fill),
151
- dimOpacity: region?.dimOpacity ?? previous.dimOpacity,
152
- };
153
- }
154
- function lerpRegionConfig(from, to, t) {
155
- return {
156
- stroke: strokeOps.lerp(from.stroke, to.stroke, t),
157
- fill: fillOps.lerp(from.fill, to.fill, t),
158
- dimOpacity: lerpNumber(from.dimOpacity, to.dimOpacity, t),
159
- };
160
- }
161
- /** The `theme` entry's resolve: merges a partial {@link ChartTheme} onto `previous` (first resolution: the default). */
162
- export function resolveChartTheme(theme, previous) {
163
- const base = previous ?? DEFAULT_CHART_THEME;
164
- return {
165
- seriesStyles: resolveSeriesStrokes(theme?.seriesStyles, base.seriesStyles),
166
- xAxis: resolveAxisConfig(theme?.xAxis, base.xAxis),
167
- yAxis: resolveAxisConfig(theme?.yAxis, base.yAxis),
168
- plotArea: resolvePlotArea(theme?.plotArea, base.plotArea),
169
- legend: resolveLegendConfig(theme?.legend, base.legend),
170
- region: resolveRegionConfig(theme?.region, base.region),
171
- };
172
- }
173
- export function lerpChartTheme(from, to, t) {
174
- return {
175
- seriesStyles: lerpSeriesStrokes(from.seriesStyles, to.seriesStyles, t),
176
- xAxis: lerpAxisConfig(from.xAxis, to.xAxis, t),
177
- yAxis: lerpAxisConfig(from.yAxis, to.yAxis, t),
178
- plotArea: lerpPlotArea(from.plotArea, to.plotArea, t),
179
- legend: lerpLegendConfig(from.legend, to.legend, t),
180
- region: lerpRegionConfig(from.region, to.region, t),
181
- };
182
- }
183
118
  /**
184
119
  * One series' `[x, y]` points, sorted along x so the polyline traces left to
185
120
  * right. A row missing its y contributes 0 rather than a gap, since dropping it
@@ -209,24 +144,181 @@ export function yExtent(data, series) {
209
144
  * `range` is omitted.
210
145
  */
211
146
  export function resolveYScale(data, series, range, divisions) {
212
- if (range)
213
- return range;
214
- const [lo, hi] = yExtent(data, series);
215
- const segments = Math.max(1, Math.round(divisions));
216
- if (hi === lo)
217
- return constantScale(lo, segments);
218
- const step = niceStep((hi - lo) / segments);
219
- return [Math.floor(lo / step) * step, Math.ceil(hi / step) * step];
147
+ return range ?? niceRange(yExtent(data, series), divisions);
148
+ }
149
+ /**
150
+ * Every series' points under `stack`, rows in x order. A series contributes its
151
+ * values times its weight (`1` when missing), so a series sinking out of a stack
152
+ * lowers the ones above it. `percent` reads each row as shares of its total
153
+ * magnitude, so the top of a full stack is 100.
154
+ */
155
+ export function stackSeries(data, x, series, stack, weights = []) {
156
+ const order = data.map((_, i) => i).sort((a, b) => x.at(a) - x.at(b));
157
+ if (stack !== "stacked" && stack !== "percent") {
158
+ return series.map((s) => ({ points: order.map((r) => [x.at(r), num(data[r], s.field)]), base: null }));
159
+ }
160
+ const weight = (i) => Math.max(0, weights[i] ?? 1);
161
+ const totals = order.map((r) => series.reduce((sum, s, i) => sum + Math.abs(num(data[r], s.field) * weight(i)), 0));
162
+ const running = order.map(() => 0);
163
+ return series.map((s, i) => {
164
+ const base = order.map((r, k) => [x.at(r), running[k]]);
165
+ const points = order.map((r, k) => {
166
+ const value = num(data[r], s.field) * weight(i);
167
+ running[k] += stack === "percent" ? (totals[k] > 0 ? (value / totals[k]) * 100 : 0) : value;
168
+ return [x.at(r), running[k]];
169
+ });
170
+ return { points, base };
171
+ });
172
+ }
173
+ /** The lowest and highest y anything in `stacks` reaches, its bases included. */
174
+ export function stackExtent(stacks) {
175
+ let lo = Infinity;
176
+ let hi = -Infinity;
177
+ for (const { points, base } of stacks)
178
+ for (const [, y] of [...points, ...(base ?? [])]) {
179
+ if (y < lo)
180
+ lo = y;
181
+ if (y > hi)
182
+ hi = y;
183
+ }
184
+ return lo <= hi ? [lo, hi] : [0, 1];
185
+ }
186
+ /** Points along a cubic Bezier segment, its start left out. */
187
+ const SAMPLES = 16;
188
+ /**
189
+ * The drawn path through `points` (ordered along x) as a polyline: the points
190
+ * themselves for `linear`; for `step`, level runs that change at the midpoint
191
+ * between neighbours; for `smooth`, a monotone cubic (Fritsch-Carlson, as d3's
192
+ * `curveMonotoneX`), which never overshoots the data between two points.
193
+ */
194
+ export function curvePoints(points, curve) {
195
+ if (curve === "step") {
196
+ const out = points.length > 0 ? [points[0]] : [];
197
+ for (let i = 1; i < points.length; i++) {
198
+ const mid = (points[i - 1].x + points[i].x) / 2;
199
+ out.push({ x: mid, y: points[i - 1].y }, { x: mid, y: points[i].y }, points[i]);
200
+ }
201
+ return out;
202
+ }
203
+ if (curve !== "smooth" || points.length < 3)
204
+ return [...points];
205
+ const tangents = monotoneTangents(points);
206
+ const out = [points[0]];
207
+ for (let i = 1; i < points.length; i++) {
208
+ const a = points[i - 1];
209
+ const b = points[i];
210
+ const dx = (b.x - a.x) / 3;
211
+ const c1 = { x: a.x + dx, y: a.y + dx * tangents[i - 1] };
212
+ const c2 = { x: b.x - dx, y: b.y - dx * tangents[i] };
213
+ for (let k = 1; k <= SAMPLES; k++) {
214
+ const t = k / SAMPLES;
215
+ const u = 1 - t;
216
+ out.push({
217
+ x: u * u * u * a.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * b.x,
218
+ y: u * u * u * a.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * b.y,
219
+ });
220
+ }
221
+ }
222
+ return out;
223
+ }
224
+ function monotoneTangents(points) {
225
+ const n = points.length;
226
+ const slope = (i) => {
227
+ const h = points[i + 1].x - points[i].x;
228
+ return h === 0 ? 0 : (points[i + 1].y - points[i].y) / h;
229
+ };
230
+ const m = new Array(n).fill(0);
231
+ for (let i = 1; i < n - 1; i++) {
232
+ const h0 = points[i].x - points[i - 1].x;
233
+ const h1 = points[i + 1].x - points[i].x;
234
+ const s0 = slope(i - 1);
235
+ const s1 = slope(i);
236
+ const p = h0 + h1 === 0 ? 0 : (s0 * h1 + s1 * h0) / (h0 + h1);
237
+ m[i] = (Math.sign(s0) + Math.sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
238
+ }
239
+ m[0] = endTangent(slope(0), m[1]);
240
+ m[n - 1] = endTangent(slope(n - 2), m[n - 2]);
241
+ return m;
242
+ }
243
+ /** d3's one-sided end tangent, held to the end segment's own direction and to three times its slope, past which it would overshoot. */
244
+ function endTangent(secant, inner) {
245
+ const t = (3 * secant - inner) / 2;
246
+ if (secant === 0 || Math.sign(t) !== Math.sign(secant))
247
+ return 0;
248
+ return Math.abs(t) > 3 * Math.abs(secant) ? 3 * secant : t;
249
+ }
250
+ /** The part of `points` (ordered along x) left of `x`, ending on the point where it crosses `x`. */
251
+ export function cutAt(points, x) {
252
+ if (points.length === 0 || x < points[0].x)
253
+ return [];
254
+ const out = [];
255
+ for (let i = 0; i < points.length; i++) {
256
+ const p = points[i];
257
+ if (p.x <= x) {
258
+ out.push(p);
259
+ continue;
260
+ }
261
+ const a = points[i - 1];
262
+ if (a && p.x > a.x)
263
+ out.push({ x, y: a.y + ((p.y - a.y) * (x - a.x)) / (p.x - a.x) });
264
+ break;
265
+ }
266
+ return out;
220
267
  }
221
268
  /**
222
- * The scale for constant data. A zero-width scale would put every tick on one
223
- * value and the line on the floor, so it widens by a step sized to the
224
- * magnitude (`5` gets `[3, 7]`), or `[0, 1]` for zero.
269
+ * `polygon` clipped to `box` (Sutherland-Hodgman against each edge in turn).
270
+ * The box is convex, so the result is the part inside, possibly with seams of
271
+ * no width where a concave outline leaves and re-enters, which fill as nothing.
225
272
  */
226
- function constantScale(value, segments) {
227
- if (value === 0)
228
- return [0, 1];
229
- const step = niceStep(Math.abs(value) / segments);
230
- return [value - step, value + step];
273
+ export function clipPolygonToBox(polygon, box) {
274
+ if (polygon.length < 3 || !hasRegion(box))
275
+ return [];
276
+ const edges = [
277
+ (p) => p.x - box.left,
278
+ (p) => box.right - p.x,
279
+ (p) => p.y - box.bottom,
280
+ (p) => box.top - p.y,
281
+ ];
282
+ let out = [...polygon];
283
+ for (const inside of edges) {
284
+ const input = out;
285
+ out = [];
286
+ for (let i = 0; i < input.length; i++) {
287
+ const cur = input[i];
288
+ const prev = input[(i + input.length - 1) % input.length];
289
+ const dc = inside(cur);
290
+ const dp = inside(prev);
291
+ if (dc >= 0) {
292
+ if (dp < 0)
293
+ out.push(crossing(prev, cur, dp, dc));
294
+ out.push(cur);
295
+ }
296
+ else if (dp >= 0)
297
+ out.push(crossing(prev, cur, dp, dc));
298
+ }
299
+ if (out.length === 0)
300
+ return [];
301
+ }
302
+ return out;
303
+ }
304
+ function crossing(a, b, da, db) {
305
+ const t = da / (da - db);
306
+ return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };
231
307
  }
308
+ /** A line chart's own look: how each series is stroked, dotted and filled. */
309
+ export const LINE_MARKS = {
310
+ strokeWidth: Types.number(4, { min: 0, max: 24, step: 0.5, unit: "px" }),
311
+ curve: Types.oneOf(["smooth", "linear", "step"]),
312
+ dots: Types.boolean(false),
313
+ /** Each dot's diameter. */
314
+ dotSize: Types.number(12, { min: 0, max: 48, step: 1, unit: "px" }),
315
+ /** Fill under each line: none, the series colour, or the colour fading to nothing at the baseline. */
316
+ area: Types.oneOf(["none", "solid", "gradient"]),
317
+ /** The fill's opacity at the line. */
318
+ areaOpacity: Types.number(0.4, { min: 0, max: 1, step: 0.05 }),
319
+ };
320
+ export const LINE_LABELS = {
321
+ /** Read as the chart is built: each point's value printed above or below it, or none. */
322
+ values: Types.oneOf(["none", "above", "below"], { animatable: false }),
323
+ };
232
324
  //# sourceMappingURL=shared.js.map