minerva-design 1.6.0 → 1.7.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 (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"model.cjs","names":["tickStep","ensureSpan","niceDomain","luminance","mixOklab","withLightness","resolveStaticColor","resolveLocale","chartLabels","collectCategories","xResolver","collectYCategories","normalizeData","oklabRamp","toCss","formatPercent","valueFormatter","GridIndex","require_data","require_color","require_locale","require_labels","require_scale","require_format","require_spatial","LOG_MAP","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","n","lo","hi","start","mapped","mapColumns","map","hit","src","mapper","column","a","raw","cols","range","add","c","decades","logColumns","rawBase","zero","toPlotY","model","fromPlotY","toPlotX","fromPlotX","viewToValues","view","viewFromValues","next","current","logXCache","logXColumns","gaps","xMin","xMax","floorBases","floor","heatPosition","mid","heatmapStops","dark","theme","scheme","neutral","end","side","negative","color","buildModel","resolve","resolver","fallback","input","locale","tooltipOptions","labels","xType","categories","categoryMap","resolveX","name","yOpts","heatmapData","yCategories","yType","yLog","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","type","paletteColor","pointColors","resolved","rgba","colorScale","valueRange","cellColors","colorMidpoint","colorLut","scale","lut","ramp","connector","id","hidden","visible","xLog","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","xBound","valuesOf","listBars","log","leftVisible","leftSeries","leftBars","yRange","yValues","filled","yBound","y2Opts","y2","y2Map","rightSeries","y2Log","rightVisible","domain","y2Bound","timeline","zoomOption","zoomAxes","yFormat","plottedY","grids","gridOf","grid"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n luminance,\n mixOklab,\n oklabRamp,\n resolveStaticColor,\n toCss,\n withLightness,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartColorScheme,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Heatmaps: value at the middle of the ramp (`null`: linear over the range) */\n colorMidpoint: number | null;\n /** Heatmaps: 256 packed colors along the ramp (OKLab) */\n colorLut: Uint32Array | null;\n /** Hit tests and tooltips include the series */\n tooltip: boolean;\n /** Box plots: outlier rings or dots, and their diameter */\n outlierShape: \"hollow\" | \"filled\";\n outlierSize: number;\n /** Bars: lines from the end of every bar to the next one */\n connector: { color: Rgba; dash: number[]; width: number } | null;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/**\n * Map of the values of a series onto the plotted (left axis) units:\n * `left = (log ? log10(value) : value) * scale + offset`\n */\nexport interface AxisMap {\n scale: number;\n offset: number;\n /** Logarithmic axis: the values are plotted as their base-10 logarithm */\n log?: boolean;\n}\n\n/** Plotted units of a log axis: the base-10 logarithm of the values */\nconst LOG_MAP: AxisMap = { scale: 1, offset: 0, log: true };\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\" | \"item\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (src: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset},${!!map.log}`;\n const hit = mapped.get(src);\n if (hit && hit.key === key) return hit.cols;\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const raw = src;\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n };\n if (map.log) {\n // zeros and negatives have no logarithm: the extent of the others\n const range: Range = [Infinity, -Infinity];\n const add = (a: ArrayLike<number> | null | undefined) => {\n if (!a) return;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n if (!Number.isFinite(v)) continue;\n if (v < range[0]) range[0] = v;\n if (v > range[1]) range[1] = v;\n }\n };\n for (const c of [cols.y, cols.y0, cols.high, cols.low, cols.q1, cols.q3])\n add(c);\n cols.outliers?.forEach((list) => add(list));\n cols.yMin = range[0] <= range[1] ? range[0] : NaN;\n cols.yMax = range[0] <= range[1] ? range[1] : NaN;\n } else {\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n cols.yMin = Math.min(lo, hi);\n cols.yMax = Math.max(lo, hi);\n }\n mapped.set(src, { key, cols });\n return cols;\n};\n\n/** A log range widened to whole decades (`[0.3, 2.4]` -> `[0, 3]`) */\nconst decades = (range: Range): Range => {\n const lo = Math.floor(range[0] + 1e-9);\n const hi = Math.ceil(range[1] - 1e-9);\n return [lo, hi > lo ? hi : lo + 1];\n};\n\n/**\n * Plots a series through a map: its columns, bars, stacks and lower\n * edges (bars / areas of the right axis start at `zero`)\n */\nconst logColumns = (s: SeriesModel, map: AxisMap, zero = -Infinity) => {\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.cols, map);\n s.barBase =\n s.barBase && !s.floating\n ? s.barBase.map((v) => (v === 0 ? (map.log ? -Infinity : f(0)) : f(v)))\n : column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n};\n\n/** Value -> plotted units of a map (`-Infinity` for 0 on log axes) */\nconst mapper =\n (map: AxisMap) =>\n (v: number): number =>\n (map.log ? Math.log10(v) : v) * map.scale + map.offset;\n\n/** Value of the y axis -> plotted y (the logarithm on log axes) */\nexport const toPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted y -> value of the y axis */\nexport const fromPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? 10 ** value : value;\n\n/** Value of the x axis -> plotted x (the logarithm on log axes) */\nexport const toPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted x -> value of the x axis */\nexport const fromPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? 10 ** value : value;\n\n/** A view in plotted units -> the values of the axes (zoom events, `getView`) */\nexport const viewToValues = (\n model: { x: AxisModel; y: AxisModel },\n view: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: [fromPlotX(model, view.x[0]), fromPlotX(model, view.x[1])],\n y: [fromPlotY(model, view.y[0]), fromPlotY(model, view.y[1])],\n});\n\n/** Values of the axes -> a view in plotted units (`setView`); missing axes keep `current` */\nexport const viewFromValues = (\n model: { x: AxisModel; y: AxisModel },\n next: { x?: Range; y?: Range },\n current: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: next.x\n ? [toPlotX(model, next.x[0]), toPlotX(model, next.x[1])]\n : current.x,\n y: next.y\n ? [toPlotY(model, next.y[0]), toPlotY(model, next.y[1])]\n : current.y,\n});\n\nconst logXCache = new WeakMap<SeriesColumns, SeriesColumns>();\n\n/**\n * Columns plotted on a log x axis: the logarithms of the x values; points\n * without one (x <= 0) become gaps (cached with the data)\n */\nconst logXColumns = (raw: SeriesColumns): SeriesColumns => {\n const hit = logXCache.get(raw);\n if (hit) return hit;\n const x = raw.x.map((v) => (v > 0 ? Math.log10(v) : NaN));\n let y = raw.y;\n let gaps = false;\n for (let i = 0; i < raw.count; i++) {\n if (Number.isFinite(x[i])) continue;\n if (!gaps) y = Float64Array.from(raw.y);\n gaps = true;\n y[i] = NaN;\n }\n const [xMin, xMax] = extent(x);\n const cols: SeriesColumns = {\n ...raw,\n x,\n y,\n xMin,\n xMax,\n sorted: raw.sorted && !gaps,\n };\n logXCache.set(raw, cols);\n return cols;\n};\n\n/** Replaces the bases of bars / areas on log axes (`-Infinity`) by the bottom of the axis */\nconst floorBases = (s: SeriesModel, floor: number) => {\n for (const a of [s.barBase, s.stackBase]) {\n if (!a) continue;\n for (let i = 0; i < a.length; i++) if (a[i] === -Infinity) a[i] = floor;\n }\n};\n\n/** Position (0-1) of a heatmap value on its color ramp */\nexport const heatPosition = (\n s: Pick<SeriesModel, \"valueRange\" | \"colorMidpoint\">,\n v: number,\n): number => {\n const [lo, hi] = s.valueRange;\n const mid = s.colorMidpoint;\n let t: number;\n if (mid !== null && mid > lo && mid < hi) {\n t =\n v < mid\n ? ((v - lo) / (mid - lo)) * 0.5\n : 0.5 + ((v - mid) / (hi - mid)) * 0.5;\n } else {\n t = (v - lo) / (hi - lo || 1);\n }\n return t < 0 ? 0 : t > 1 ? 1 : t;\n};\n\n/**\n * Built-in ramps of heatmaps, perceptual (OKLab) and theme-aware: light\n * themes go from a near-white tint to a deep hue, dark themes from a dark\n * tint of the surface to a bright saturated hue; diverging ramps meet in a\n * neutral middle\n */\nexport const heatmapStops = (\n scheme: ChartColorScheme,\n color: Rgba,\n theme: ChartTheme,\n negative: Rgba,\n): Rgba[] => {\n const dark = luminance(theme.background) < 0.4;\n if (scheme === \"diverging\") {\n const neutral = mixOklab(\n theme.surface,\n theme.textMuted,\n dark ? 0.12 : 0.08,\n );\n const end = (c: Rgba) =>\n dark ? withLightness(c, 0.7, 1.25) : withLightness(c, 0.5, 1.05);\n const side = (c: Rgba) => mixOklab(neutral, end(c), 0.5);\n return [end(negative), side(negative), neutral, side(color), end(color)];\n }\n return dark\n ? [\n mixOklab(theme.surface, color, 0.14),\n withLightness(color, 0.46, 0.95),\n withLightness(color, 0.64, 1.2),\n withLightness(color, 0.8, 1.15),\n ]\n : [\n mixOklab(theme.surface, color, 0.06),\n withLightness(color, 0.8, 0.6),\n withLightness(color, 0.58, 1),\n withLightness(color, 0.36, 0.9),\n ];\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : yOpts?.type === \"log\"\n ? \"log\"\n : \"linear\";\n const yLog = yType === \"log\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n let colorMidpoint: number | null = null;\n let colorLut: Uint32Array | null = null;\n if (type === \"heatmap\") {\n const scale = s.colorScale;\n const scheme: ChartColorScheme =\n scale === \"diverging\" ? \"diverging\" : \"sequential\";\n colorScale =\n typeof scale === \"object\" && scale.length\n ? scale.map((c) => resolve(c, color))\n : heatmapStops(\n scheme,\n color,\n theme,\n resolve(DEFAULT_DOWN, [0.86, 0.15, 0.15, 1]),\n );\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const [lo, hi] = valueRange;\n colorMidpoint =\n s.colorMidpoint ??\n (scheme === \"diverging\" && typeof scale !== \"object\"\n ? lo < 0 && hi > 0\n ? 0\n : (lo + hi) / 2\n : null);\n const lut = oklabRamp(colorScale);\n colorLut = lut;\n const values = cols.value ?? cols.y;\n const ramp = { valueRange, colorMidpoint };\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": the ramp never packs to 0\n cellColors[i] = lut[Math.round(heatPosition(ramp, v) * 255)];\n }\n }\n const connector = s.connector\n ? typeof s.connector === \"object\"\n ? s.connector\n : {}\n : null;\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n colorMidpoint,\n colorLut,\n tooltip: s.tooltip !== false,\n outlierShape: s.outlierShape ?? \"hollow\",\n outlierSize: s.outlierSize ?? s.pointSize ?? 7,\n connector:\n connector && type === \"bar\"\n ? {\n color: connector.color\n ? resolve(connector.color, theme.textMuted)\n : theme.textMuted,\n dash: [...(connector.dash ?? [3, 3])],\n width: connector.width ?? 1,\n }\n : null,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const xLog = xType === \"log\";\n // log x axis: every series is plotted on the logarithms of its x values\n if (xLog) for (const s of series) s.cols = logXColumns(s.raw);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n if (xLog && xOpts?.nice !== false) xRange = decades(xRange);\n }\n const xBound = (v: number) => (xLog ? Math.log10(v) : v);\n if (xOpts?.min !== undefined) xRange[0] = xBound(xOpts.min);\n if (xOpts?.max !== undefined) xRange[1] = xBound(xOpts.max);\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Log axis: the left series are plotted as logarithms (stacks are summed\n // first); bars and areas from zero start at the bottom of the axis\n if (yLog) {\n for (const s of series) {\n if (s.yAxis === \"right\" || s.type === \"heatmap\") continue;\n logColumns(s, LOG_MAP);\n }\n }\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (\n list: SeriesModel[],\n zero: boolean | undefined,\n log = false,\n ) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (!log && (listBars.some((s) => !s.floating) || zero)) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero, yLog);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (yLog && yOpts?.nice !== false) yRange = decades(yRange);\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero && !yLog) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n const yBound = (v: number) => (yLog ? Math.log10(v) : v);\n if (yOpts?.min !== undefined) yRange[0] = yBound(yOpts.min);\n if (yOpts?.max !== undefined) yRange[1] = yBound(yOpts.max);\n yRange = ensureSpan(yRange[0], yRange[1]);\n if (yLog) {\n for (const s of series) if (s.yAxis === \"left\") floorBases(s, yRange[0]);\n }\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const y2Log = y2Opts?.type === \"log\";\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n // log: the extent of the logarithms\n const values = y2Log\n ? rightVisible.flatMap((s) => {\n const c = mapColumns(s.raw, LOG_MAP);\n return [c.yMin, c.yMax];\n })\n : valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : y2Log\n ? decades([lo, hi])\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n const y2Bound = (v: number) => (y2Log ? Math.log10(v) : v);\n if (y2Opts?.min !== undefined) domain[0] = y2Bound(y2Opts.min);\n if (y2Opts?.max !== undefined) domain[1] = y2Bound(y2Opts.max);\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = {\n scale,\n offset: yRange[0] - domain[0] * scale,\n log: y2Log,\n };\n y2Map = map;\n const zero = y2Log\n ? yRange[0]\n : mapper(map)(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n logColumns(s, map, zero);\n floorBases(s, yRange[0]);\n }\n y2 = axisModel(y2Opts, y2Log ? \"log\" : \"linear\", [], false, locale);\n }\n\n // range bars on a time axis (Gantt charts): rows are unrelated, the\n // tooltip shows the task under the pointer\n const timeline =\n yType === \"time\" &&\n series.some((s) => s.type === \"bar\") &&\n series.every((s) => (s.type === \"bar\" ? s.floating : s.type === \"scatter\"));\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode:\n tooltipOptions?.mode ??\n (allScatter ? \"nearest\" : timeline ? \"item\" : \"axis\"),\n baseline: yLog ? yRange[0] : Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.cjs","names":["tickStep","ensureSpan","niceDomain","luminance","mixOklab","withLightness","resolveStaticColor","resolveLocale","chartLabels","collectCategories","xResolver","collectYCategories","normalizeData","oklabRamp","toCss","formatPercent","valueFormatter","GridIndex","require_data","require_color","require_locale","require_labels","require_scale","require_format","require_spatial","LOG_MAP","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","n","lo","hi","start","mapped","mapColumns","map","hit","src","mapper","column","a","raw","cols","range","add","c","decades","niceExponent","m","niceLogRange","below","best","above","logColumns","rawBase","zero","toPlotY","model","fromPlotY","toPlotX","fromPlotX","viewToValues","view","viewFromValues","next","current","logXCache","logXColumns","gaps","xMin","xMax","floorBases","floor","heatPosition","mid","heatmapStops","dark","theme","scheme","neutral","end","side","negative","color","buildModel","resolve","resolver","fallback","input","locale","tooltipOptions","labels","xType","categories","categoryMap","resolveX","name","yOpts","heatmapData","yCategories","yType","yLog","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","type","paletteColor","pointColors","resolved","rgba","colorScale","valueRange","cellColors","colorMidpoint","colorLut","scale","lut","ramp","connector","id","hidden","visible","xLog","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","xBound","valuesOf","listBars","log","leftVisible","leftSeries","leftBars","yRange","yValues","filled","yBound","y2Opts","y2","y2Map","rightSeries","y2Log","rightVisible","domain","y2Bound","timeline","zoomOption","zoomAxes","yFormat","plottedY","grids","gridOf","grid"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n luminance,\n mixOklab,\n oklabRamp,\n resolveStaticColor,\n toCss,\n withLightness,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartColorScheme,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Heatmaps: value at the middle of the ramp (`null`: linear over the range) */\n colorMidpoint: number | null;\n /** Heatmaps: 256 packed colors along the ramp (OKLab) */\n colorLut: Uint32Array | null;\n /** Hit tests and tooltips include the series */\n tooltip: boolean;\n /** Box plots: outlier rings or dots, and their diameter */\n outlierShape: \"hollow\" | \"filled\";\n outlierSize: number;\n /** Bars: lines from the end of every bar to the next one */\n connector: { color: Rgba; dash: number[]; width: number } | null;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/**\n * Map of the values of a series onto the plotted (left axis) units:\n * `left = (log ? log10(value) : value) * scale + offset`\n */\nexport interface AxisMap {\n scale: number;\n offset: number;\n /** Logarithmic axis: the values are plotted as their base-10 logarithm */\n log?: boolean;\n}\n\n/** Plotted units of a log axis: the base-10 logarithm of the values */\nconst LOG_MAP: AxisMap = { scale: 1, offset: 0, log: true };\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\" | \"item\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (src: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset},${!!map.log}`;\n const hit = mapped.get(src);\n if (hit && hit.key === key) return hit.cols;\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const raw = src;\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n };\n if (map.log) {\n // zeros and negatives have no logarithm: the extent of the others\n const range: Range = [Infinity, -Infinity];\n const add = (a: ArrayLike<number> | null | undefined) => {\n if (!a) return;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n if (!Number.isFinite(v)) continue;\n if (v < range[0]) range[0] = v;\n if (v > range[1]) range[1] = v;\n }\n };\n for (const c of [cols.y, cols.y0, cols.high, cols.low, cols.q1, cols.q3])\n add(c);\n cols.outliers?.forEach((list) => add(list));\n cols.yMin = range[0] <= range[1] ? range[0] : NaN;\n cols.yMax = range[0] <= range[1] ? range[1] : NaN;\n } else {\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n cols.yMin = Math.min(lo, hi);\n cols.yMax = Math.max(lo, hi);\n }\n mapped.set(src, { key, cols });\n return cols;\n};\n\n/** A log range widened to whole decades (`[0.3, 2.4]` -> `[0, 3]`) */\nconst decades = (range: Range): Range => {\n const lo = Math.floor(range[0] + 1e-9);\n const hi = Math.ceil(range[1] - 1e-9);\n return [lo, hi > lo ? hi : lo + 1];\n};\n\n/** Exponent of `m × 10^k`, exact for the values of the ticks */\nconst niceExponent = (m: number, k: number) =>\n Math.log10(Number((m * 10 ** k).toPrecision(12)));\n\n/**\n * A log range widened to the closest 1, 2 or 5 × 10^k bounds (the values\n * 900 - 140k -> 500 - 200k), tighter than whole decades\n */\nconst niceLogRange = (range: Range): Range => {\n const below = (e: number) => {\n const k = Math.floor(e + 1e-9);\n let best = k;\n for (const m of [2, 5]) {\n const v = niceExponent(m, k);\n if (v <= e + 1e-9) best = v;\n }\n return best;\n };\n const above = (e: number) => {\n const k = Math.floor(e - 1e-9);\n for (const m of [1, 2, 5]) {\n const v = niceExponent(m, k);\n if (v >= e - 1e-9) return v;\n }\n return k + 1;\n };\n const lo = below(range[0]);\n const hi = above(range[1]);\n return [lo, hi > lo + 1e-9 ? hi : above(lo + 1e-6)];\n};\n\n/**\n * Plots a series through a map: its columns, bars, stacks and lower\n * edges (bars / areas of the right axis start at `zero`)\n */\nconst logColumns = (s: SeriesModel, map: AxisMap, zero = -Infinity) => {\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.cols, map);\n s.barBase =\n s.barBase && !s.floating\n ? s.barBase.map((v) => (v === 0 ? (map.log ? -Infinity : f(0)) : f(v)))\n : column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n};\n\n/** Value -> plotted units of a map (`-Infinity` for 0 on log axes) */\nconst mapper =\n (map: AxisMap) =>\n (v: number): number =>\n (map.log ? Math.log10(v) : v) * map.scale + map.offset;\n\n/** Value of the y axis -> plotted y (the logarithm on log axes) */\nexport const toPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted y -> value of the y axis */\nexport const fromPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? 10 ** value : value;\n\n/** Value of the x axis -> plotted x (the logarithm on log axes) */\nexport const toPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted x -> value of the x axis */\nexport const fromPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? 10 ** value : value;\n\n/** A view in plotted units -> the values of the axes (zoom events, `getView`) */\nexport const viewToValues = (\n model: { x: AxisModel; y: AxisModel },\n view: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: [fromPlotX(model, view.x[0]), fromPlotX(model, view.x[1])],\n y: [fromPlotY(model, view.y[0]), fromPlotY(model, view.y[1])],\n});\n\n/** Values of the axes -> a view in plotted units (`setView`); missing axes keep `current` */\nexport const viewFromValues = (\n model: { x: AxisModel; y: AxisModel },\n next: { x?: Range; y?: Range },\n current: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: next.x\n ? [toPlotX(model, next.x[0]), toPlotX(model, next.x[1])]\n : current.x,\n y: next.y\n ? [toPlotY(model, next.y[0]), toPlotY(model, next.y[1])]\n : current.y,\n});\n\nconst logXCache = new WeakMap<SeriesColumns, SeriesColumns>();\n\n/**\n * Columns plotted on a log x axis: the logarithms of the x values; points\n * without one (x <= 0) become gaps (cached with the data)\n */\nconst logXColumns = (raw: SeriesColumns): SeriesColumns => {\n const hit = logXCache.get(raw);\n if (hit) return hit;\n const x = raw.x.map((v) => (v > 0 ? Math.log10(v) : NaN));\n let y = raw.y;\n let gaps = false;\n for (let i = 0; i < raw.count; i++) {\n if (Number.isFinite(x[i])) continue;\n if (!gaps) y = Float64Array.from(raw.y);\n gaps = true;\n y[i] = NaN;\n }\n const [xMin, xMax] = extent(x);\n const cols: SeriesColumns = {\n ...raw,\n x,\n y,\n xMin,\n xMax,\n sorted: raw.sorted && !gaps,\n };\n logXCache.set(raw, cols);\n return cols;\n};\n\n/** Replaces the bases of bars / areas on log axes (`-Infinity`) by the bottom of the axis */\nconst floorBases = (s: SeriesModel, floor: number) => {\n for (const a of [s.barBase, s.stackBase]) {\n if (!a) continue;\n for (let i = 0; i < a.length; i++) if (a[i] === -Infinity) a[i] = floor;\n }\n};\n\n/** Position (0-1) of a heatmap value on its color ramp */\nexport const heatPosition = (\n s: Pick<SeriesModel, \"valueRange\" | \"colorMidpoint\">,\n v: number,\n): number => {\n const [lo, hi] = s.valueRange;\n const mid = s.colorMidpoint;\n let t: number;\n if (mid !== null && mid > lo && mid < hi) {\n t =\n v < mid\n ? ((v - lo) / (mid - lo)) * 0.5\n : 0.5 + ((v - mid) / (hi - mid)) * 0.5;\n } else {\n t = (v - lo) / (hi - lo || 1);\n }\n return t < 0 ? 0 : t > 1 ? 1 : t;\n};\n\n/**\n * Built-in ramps of heatmaps, perceptual (OKLab) and theme-aware: light\n * themes go from a near-white tint to a deep hue, dark themes from a dark\n * tint of the surface to a bright saturated hue; diverging ramps meet in a\n * neutral middle\n */\nexport const heatmapStops = (\n scheme: ChartColorScheme,\n color: Rgba,\n theme: ChartTheme,\n negative: Rgba,\n): Rgba[] => {\n const dark = luminance(theme.background) < 0.4;\n if (scheme === \"diverging\") {\n const neutral = mixOklab(\n theme.surface,\n theme.textMuted,\n dark ? 0.12 : 0.08,\n );\n const end = (c: Rgba) =>\n dark ? withLightness(c, 0.7, 1.25) : withLightness(c, 0.5, 1.05);\n const side = (c: Rgba) => mixOklab(neutral, end(c), 0.5);\n return [end(negative), side(negative), neutral, side(color), end(color)];\n }\n return dark\n ? [\n mixOklab(theme.surface, color, 0.14),\n withLightness(color, 0.46, 0.95),\n withLightness(color, 0.64, 1.2),\n withLightness(color, 0.8, 1.15),\n ]\n : [\n mixOklab(theme.surface, color, 0.06),\n withLightness(color, 0.8, 0.6),\n withLightness(color, 0.58, 1),\n withLightness(color, 0.36, 0.9),\n ];\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : yOpts?.type === \"log\"\n ? \"log\"\n : \"linear\";\n const yLog = yType === \"log\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n let colorMidpoint: number | null = null;\n let colorLut: Uint32Array | null = null;\n if (type === \"heatmap\") {\n const scale = s.colorScale;\n const scheme: ChartColorScheme =\n scale === \"diverging\" ? \"diverging\" : \"sequential\";\n colorScale =\n typeof scale === \"object\" && scale.length\n ? scale.map((c) => resolve(c, color))\n : heatmapStops(\n scheme,\n color,\n theme,\n resolve(DEFAULT_DOWN, [0.86, 0.15, 0.15, 1]),\n );\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const [lo, hi] = valueRange;\n colorMidpoint =\n s.colorMidpoint ??\n (scheme === \"diverging\" && typeof scale !== \"object\"\n ? lo < 0 && hi > 0\n ? 0\n : (lo + hi) / 2\n : null);\n const lut = oklabRamp(colorScale);\n colorLut = lut;\n const values = cols.value ?? cols.y;\n const ramp = { valueRange, colorMidpoint };\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": the ramp never packs to 0\n cellColors[i] = lut[Math.round(heatPosition(ramp, v) * 255)];\n }\n }\n const connector = s.connector\n ? typeof s.connector === \"object\"\n ? s.connector\n : {}\n : null;\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n colorMidpoint,\n colorLut,\n tooltip: s.tooltip !== false,\n outlierShape: s.outlierShape ?? \"hollow\",\n outlierSize: s.outlierSize ?? s.pointSize ?? 7,\n connector:\n connector && type === \"bar\"\n ? {\n color: connector.color\n ? resolve(connector.color, theme.textMuted)\n : theme.textMuted,\n dash: [...(connector.dash ?? [3, 3])],\n width: connector.width ?? 1,\n }\n : null,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const xLog = xType === \"log\";\n // log x axis: every series is plotted on the logarithms of its x values\n if (xLog) for (const s of series) s.cols = logXColumns(s.raw);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n if (xLog && xOpts?.nice !== false) xRange = niceLogRange(xRange);\n }\n const xBound = (v: number) => (xLog ? Math.log10(v) : v);\n if (xOpts?.min !== undefined) xRange[0] = xBound(xOpts.min);\n if (xOpts?.max !== undefined) xRange[1] = xBound(xOpts.max);\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Log axis: the left series are plotted as logarithms (stacks are summed\n // first); bars and areas from zero start at the bottom of the axis\n if (yLog) {\n for (const s of series) {\n if (s.yAxis === \"right\" || s.type === \"heatmap\") continue;\n logColumns(s, LOG_MAP);\n }\n }\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (\n list: SeriesModel[],\n zero: boolean | undefined,\n log = false,\n ) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (!log && (listBars.some((s) => !s.floating) || zero)) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero, yLog);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (yLog && yOpts?.nice !== false) yRange = decades(yRange);\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero && !yLog) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n const yBound = (v: number) => (yLog ? Math.log10(v) : v);\n if (yOpts?.min !== undefined) yRange[0] = yBound(yOpts.min);\n if (yOpts?.max !== undefined) yRange[1] = yBound(yOpts.max);\n yRange = ensureSpan(yRange[0], yRange[1]);\n if (yLog) {\n for (const s of series) if (s.yAxis === \"left\") floorBases(s, yRange[0]);\n }\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const y2Log = y2Opts?.type === \"log\";\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n // log: the extent of the logarithms\n const values = y2Log\n ? rightVisible.flatMap((s) => {\n const c = mapColumns(s.raw, LOG_MAP);\n return [c.yMin, c.yMax];\n })\n : valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : y2Log\n ? decades([lo, hi])\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n const y2Bound = (v: number) => (y2Log ? Math.log10(v) : v);\n if (y2Opts?.min !== undefined) domain[0] = y2Bound(y2Opts.min);\n if (y2Opts?.max !== undefined) domain[1] = y2Bound(y2Opts.max);\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = {\n scale,\n offset: yRange[0] - domain[0] * scale,\n log: y2Log,\n };\n y2Map = map;\n const zero = y2Log\n ? yRange[0]\n : mapper(map)(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n logColumns(s, map, zero);\n floorBases(s, yRange[0]);\n }\n y2 = axisModel(y2Opts, y2Log ? \"log\" : \"linear\", [], false, locale);\n }\n\n // range bars on a time axis (Gantt charts): rows are unrelated, the\n // tooltip shows the task under the pointer\n const timeline =\n yType === \"time\" &&\n series.some((s) => s.type === \"bar\") &&\n series.every((s) => (s.type === \"bar\" ? s.floating : s.type === \"scatter\"));\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode:\n tooltipOptions?.mode ??\n (allScatter ? \"nearest\" : timeline ? \"item\" : \"axis\"),\n baseline: yLog ? yRange[0] : Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}