@opendata-ai/openchart-engine 2.6.0 → 2.8.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.
package/dist/index.js CHANGED
@@ -26,9 +26,9 @@ function resolvePosition(value, scale) {
26
26
  const s = scale.scale;
27
27
  const type = scale.type;
28
28
  if (type === "time") {
29
- const date = new Date(String(value));
30
- if (Number.isNaN(date.getTime())) return null;
31
- return s(date);
29
+ const date2 = new Date(String(value));
30
+ if (Number.isNaN(date2.getTime())) return null;
31
+ return s(date2);
32
32
  }
33
33
  if (type === "linear" || type === "log") {
34
34
  const num = typeof value === "number" ? value : Number(value);
@@ -61,11 +61,11 @@ function makeAnnotationLabelStyle(fontSize, fontWeight, fill, isDark) {
61
61
  function computeTextBounds(labelX, labelY, text, fontSize, fontWeight) {
62
62
  const lines = text.split("\n");
63
63
  const isMultiLine = lines.length > 1;
64
- const maxWidth = Math.max(...lines.map((line3) => estimateTextWidth(line3, fontSize, fontWeight)));
64
+ const maxWidth = Math.max(...lines.map((line) => estimateTextWidth(line, fontSize, fontWeight)));
65
65
  const totalHeight = lines.length * fontSize * DEFAULT_LINE_HEIGHT;
66
- const x = isMultiLine ? labelX - maxWidth / 2 : labelX;
66
+ const x2 = isMultiLine ? labelX - maxWidth / 2 : labelX;
67
67
  return {
68
- x,
68
+ x: x2,
69
69
  y: labelY - fontSize,
70
70
  width: maxWidth,
71
71
  height: totalHeight
@@ -181,25 +181,25 @@ function resolveTextAnnotation(annotation, scales, chartArea, isDark) {
181
181
  };
182
182
  }
183
183
  function resolveRangeAnnotation(annotation, scales, chartArea, isDark) {
184
- let x = chartArea.x;
185
- let y = chartArea.y;
184
+ let x2 = chartArea.x;
185
+ let y2 = chartArea.y;
186
186
  let width = chartArea.width;
187
187
  let height = chartArea.height;
188
188
  if (annotation.x1 !== void 0 && annotation.x2 !== void 0) {
189
189
  const x1px = resolvePosition(annotation.x1, scales.x);
190
190
  const x2px = resolvePosition(annotation.x2, scales.x);
191
191
  if (x1px === null || x2px === null) return null;
192
- x = Math.min(x1px, x2px);
192
+ x2 = Math.min(x1px, x2px);
193
193
  width = Math.abs(x2px - x1px);
194
194
  }
195
195
  if (annotation.y1 !== void 0 && annotation.y2 !== void 0) {
196
196
  const y1px = resolvePosition(annotation.y1, scales.y);
197
197
  const y2px = resolvePosition(annotation.y2, scales.y);
198
198
  if (y1px === null || y2px === null) return null;
199
- y = Math.min(y1px, y2px);
199
+ y2 = Math.min(y1px, y2px);
200
200
  height = Math.abs(y2px - y1px);
201
201
  }
202
- const rect = { x, y, width, height };
202
+ const rect = { x: x2, y: y2, width, height };
203
203
  let label;
204
204
  if (annotation.label) {
205
205
  const anchor = annotation.labelAnchor ?? "left";
@@ -213,11 +213,11 @@ function resolveRangeAnnotation(annotation, scales, chartArea, isDark) {
213
213
  } else if (anchor === "right") {
214
214
  style.textAnchor = "end";
215
215
  }
216
- const baseX = centered ? x + width / 2 : anchor === "right" ? x + width : x;
216
+ const baseX = centered ? x2 + width / 2 : anchor === "right" ? x2 + width : x2;
217
217
  label = {
218
218
  text: annotation.label,
219
219
  x: baseX + labelDelta.dx,
220
- y: y + labelDelta.dy,
220
+ y: y2 + labelDelta.dy,
221
221
  style,
222
222
  visible: true
223
223
  };
@@ -410,9 +410,9 @@ var DEFAULT_COLOR = "#1b7fa3";
410
410
  function scaleValue(scale, scaleType, value) {
411
411
  if (value == null) return null;
412
412
  if (scaleType === "time") {
413
- const date = value instanceof Date ? value : new Date(String(value));
414
- if (Number.isNaN(date.getTime())) return null;
415
- return scale(date);
413
+ const date2 = value instanceof Date ? value : new Date(String(value));
414
+ if (Number.isNaN(date2.getTime())) return null;
415
+ return scale(date2);
416
416
  }
417
417
  if (scaleType === "point" || scaleType === "band" || scaleType === "ordinal") {
418
418
  const result = scale(String(value));
@@ -536,7 +536,7 @@ function computeStackedBars(data, valueField, categoryField, colorField, xScale,
536
536
  const groupKey = String(row[colorField] ?? "");
537
537
  const value = Number(row[valueField] ?? 0);
538
538
  if (!Number.isFinite(value) || value <= 0) continue;
539
- const color = getColor(scales, groupKey);
539
+ const color2 = getColor(scales, groupKey);
540
540
  const xLeft = xScale(cumulativeValue);
541
541
  const xRight = xScale(cumulativeValue + value);
542
542
  const barWidth = Math.max(Math.abs(xRight - xLeft), MIN_BAR_WIDTH);
@@ -549,7 +549,7 @@ function computeStackedBars(data, valueField, categoryField, colorField, xScale,
549
549
  y: bandY,
550
550
  width: barWidth,
551
551
  height: bandwidth,
552
- fill: color,
552
+ fill: color2,
553
553
  cornerRadius: 0,
554
554
  data: row,
555
555
  aria
@@ -567,7 +567,7 @@ function computeSimpleBars(data, valueField, categoryField, xScale, yScale, band
567
567
  if (!Number.isFinite(value)) continue;
568
568
  const bandY = yScale(category);
569
569
  if (bandY === void 0) continue;
570
- const color = sequentialColor ? getSequentialColor(scales, value) : getColor(scales, "__default__");
570
+ const color2 = sequentialColor ? getSequentialColor(scales, value) : getColor(scales, "__default__");
571
571
  const xPos = value >= 0 ? baseline : xScale(value);
572
572
  const barWidth = Math.max(Math.abs(xScale(value) - baseline), MIN_BAR_WIDTH);
573
573
  const aria = {
@@ -579,7 +579,7 @@ function computeSimpleBars(data, valueField, categoryField, xScale, yScale, band
579
579
  y: bandY,
580
580
  width: barWidth,
581
581
  height: bandwidth,
582
- fill: color,
582
+ fill: color2,
583
583
  cornerRadius: 2,
584
584
  data: row,
585
585
  aria
@@ -589,8 +589,11 @@ function computeSimpleBars(data, valueField, categoryField, xScale, yScale, band
589
589
  }
590
590
 
591
591
  // src/charts/bar/labels.ts
592
- import { estimateTextWidth as estimateTextWidth2, resolveCollisions } from "@opendata-ai/openchart-core";
593
- import { format as d3Format } from "d3-format";
592
+ import {
593
+ buildD3Formatter,
594
+ estimateTextWidth as estimateTextWidth2,
595
+ resolveCollisions
596
+ } from "@opendata-ai/openchart-core";
594
597
  var LABEL_FONT_SIZE = 11;
595
598
  var LABEL_FONT_WEIGHT = 600;
596
599
  var LABEL_PADDING = 6;
@@ -599,22 +602,7 @@ function computeBarLabels(marks, _chartArea, density = "auto", labelFormat) {
599
602
  if (density === "none") return [];
600
603
  const targetMarks = density === "endpoints" && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;
601
604
  const candidates = [];
602
- let formatter = null;
603
- if (labelFormat) {
604
- try {
605
- formatter = d3Format(labelFormat);
606
- } catch {
607
- const suffixMatch = labelFormat.match(/^(.+[a-z])([^a-z]+)$/i);
608
- if (suffixMatch) {
609
- try {
610
- const d3Fmt = d3Format(suffixMatch[1]);
611
- const suffix = suffixMatch[2];
612
- formatter = (v) => d3Fmt(v) + suffix;
613
- } catch {
614
- }
615
- }
616
- }
617
- }
605
+ const formatter = buildD3Formatter(labelFormat);
618
606
  for (const mark of targetMarks) {
619
607
  const ariaLabel = mark.aria.label;
620
608
  const lastColon = ariaLabel.lastIndexOf(":");
@@ -758,20 +746,20 @@ function computeSimpleColumns(data, categoryField, valueField, xScale, yScale, b
758
746
  if (!Number.isFinite(value)) continue;
759
747
  const bandX = xScale(category);
760
748
  if (bandX === void 0) continue;
761
- const color = sequentialColor ? getSequentialColor(scales, value) : getColor(scales, "__default__");
749
+ const color2 = sequentialColor ? getSequentialColor(scales, value) : getColor(scales, "__default__");
762
750
  const yPos = yScale(value);
763
751
  const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);
764
- const y = value >= 0 ? yPos : baseline;
752
+ const y2 = value >= 0 ? yPos : baseline;
765
753
  const aria = {
766
754
  label: `${category}: ${formatColumnValue(value)}`
767
755
  };
768
756
  marks.push({
769
757
  type: "rect",
770
758
  x: bandX,
771
- y,
759
+ y: y2,
772
760
  width: bandwidth,
773
761
  height: columnHeight,
774
- fill: color,
762
+ fill: color2,
775
763
  cornerRadius: 2,
776
764
  data: row,
777
765
  aria
@@ -788,20 +776,20 @@ function computeColoredColumns(data, categoryField, valueField, colorField, xSca
788
776
  const bandX = xScale(category);
789
777
  if (bandX === void 0) continue;
790
778
  const groupKey = String(row[colorField] ?? "");
791
- const color = getColor(scales, groupKey);
779
+ const color2 = getColor(scales, groupKey);
792
780
  const yPos = yScale(value);
793
781
  const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);
794
- const y = value >= 0 ? yPos : baseline;
782
+ const y2 = value >= 0 ? yPos : baseline;
795
783
  const aria = {
796
784
  label: `${category}, ${groupKey}: ${formatColumnValue(value)}`
797
785
  };
798
786
  marks.push({
799
787
  type: "rect",
800
788
  x: bandX,
801
- y,
789
+ y: y2,
802
790
  width: bandwidth,
803
791
  height: columnHeight,
804
- fill: color,
792
+ fill: color2,
805
793
  cornerRadius: 2,
806
794
  data: row,
807
795
  aria
@@ -820,7 +808,7 @@ function computeStackedColumns(data, categoryField, valueField, colorField, xSca
820
808
  const groupKey = String(row[colorField] ?? "");
821
809
  const value = Number(row[valueField] ?? 0);
822
810
  if (!Number.isFinite(value) || value <= 0) continue;
823
- const color = getColor(scales, groupKey);
811
+ const color2 = getColor(scales, groupKey);
824
812
  const yTop = yScale(cumulativeValue + value);
825
813
  const yBottom = yScale(cumulativeValue);
826
814
  const columnHeight = Math.max(Math.abs(yBottom - yTop), MIN_COLUMN_HEIGHT);
@@ -833,7 +821,7 @@ function computeStackedColumns(data, categoryField, valueField, colorField, xSca
833
821
  y: yTop,
834
822
  width: bandwidth,
835
823
  height: columnHeight,
836
- fill: color,
824
+ fill: color2,
837
825
  cornerRadius: 0,
838
826
  data: row,
839
827
  aria
@@ -845,24 +833,34 @@ function computeStackedColumns(data, categoryField, valueField, colorField, xSca
845
833
  }
846
834
 
847
835
  // src/charts/column/labels.ts
848
- import { estimateTextWidth as estimateTextWidth3, resolveCollisions as resolveCollisions2 } from "@opendata-ai/openchart-core";
836
+ import {
837
+ buildD3Formatter as buildD3Formatter2,
838
+ estimateTextWidth as estimateTextWidth3,
839
+ resolveCollisions as resolveCollisions2
840
+ } from "@opendata-ai/openchart-core";
849
841
  var LABEL_FONT_SIZE2 = 10;
850
842
  var LABEL_FONT_WEIGHT2 = 600;
851
843
  var LABEL_OFFSET_Y = 6;
852
- function computeColumnLabels(marks, _chartArea, density = "auto") {
844
+ function computeColumnLabels(marks, _chartArea, density = "auto", labelFormat) {
853
845
  if (density === "none") return [];
854
846
  const targetMarks = density === "endpoints" && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;
847
+ const formatter = buildD3Formatter2(labelFormat);
855
848
  const candidates = [];
856
849
  for (const mark of targetMarks) {
857
850
  const ariaLabel = mark.aria.label;
858
851
  const lastColon = ariaLabel.lastIndexOf(":");
859
- const valuePart = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : "";
860
- if (!valuePart) continue;
852
+ const rawValue = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : "";
853
+ if (!rawValue) continue;
854
+ let valuePart = rawValue;
855
+ if (formatter) {
856
+ const num = Number(rawValue.replace(/[^0-9.-]/g, ""));
857
+ if (!Number.isNaN(num)) valuePart = formatter(num);
858
+ }
861
859
  const numericValue = parseFloat(valuePart);
862
860
  const isNegative = Number.isFinite(numericValue) && numericValue < 0;
863
861
  const textWidth = estimateTextWidth3(valuePart, LABEL_FONT_SIZE2, LABEL_FONT_WEIGHT2);
864
862
  const textHeight = LABEL_FONT_SIZE2 * 1.2;
865
- const anchorX = mark.x + mark.width / 2 - textWidth / 2;
863
+ const anchorX = mark.x + mark.width / 2;
866
864
  const anchorY = isNegative ? mark.y + mark.height + LABEL_OFFSET_Y : mark.y - LABEL_OFFSET_Y - textHeight;
867
865
  candidates.push({
868
866
  text: valuePart,
@@ -898,7 +896,7 @@ function computeColumnLabels(marks, _chartArea, density = "auto") {
898
896
  // src/charts/column/index.ts
899
897
  var columnRenderer = (spec, scales, chartArea, strategy, _theme) => {
900
898
  const marks = computeColumnMarks(spec, scales, chartArea, strategy);
901
- const labels = computeColumnLabels(marks, chartArea, spec.labels.density);
899
+ const labels = computeColumnLabels(marks, chartArea, spec.labels.density, spec.labels.format);
902
900
  for (let i = 0; i < marks.length && i < labels.length; i++) {
903
901
  marks[i].label = labels[i];
904
902
  }
@@ -985,7 +983,7 @@ function computeDumbbellMarks(data, valueField, categoryField, colorField, xScal
985
983
  if (!Number.isFinite(value)) continue;
986
984
  const cx = xScale(value);
987
985
  const colorCategory = String(row[colorField] ?? "");
988
- const color = getColor(scales, colorCategory);
986
+ const color2 = getColor(scales, colorCategory);
989
987
  const dotAria = {
990
988
  label: `${category}, ${colorCategory}: ${value}`
991
989
  };
@@ -994,7 +992,7 @@ function computeDumbbellMarks(data, valueField, categoryField, colorField, xScal
994
992
  cx,
995
993
  cy,
996
994
  r: DOT_RADIUS,
997
- fill: color,
995
+ fill: color2,
998
996
  stroke: "#ffffff",
999
997
  strokeWidth: 2,
1000
998
  data: row,
@@ -1014,7 +1012,7 @@ function computeLollipopMarks(data, valueField, categoryField, xScale, yScale, b
1014
1012
  if (bandY === void 0) continue;
1015
1013
  const cx = xScale(value);
1016
1014
  const cy = bandY + bandwidth / 2;
1017
- const color = getColor(scales, "__default__");
1015
+ const color2 = getColor(scales, "__default__");
1018
1016
  const stemX = Math.min(baseline, cx);
1019
1017
  const stemWidth = Math.abs(cx - baseline);
1020
1018
  if (stemWidth > 0) {
@@ -1040,7 +1038,7 @@ function computeLollipopMarks(data, valueField, categoryField, xScale, yScale, b
1040
1038
  cx,
1041
1039
  cy,
1042
1040
  r: DOT_RADIUS,
1043
- fill: color,
1041
+ fill: color2,
1044
1042
  stroke: "#ffffff",
1045
1043
  strokeWidth: 2,
1046
1044
  data: row,
@@ -1112,8 +1110,644 @@ var dotRenderer = (spec, scales, chartArea, strategy, _theme) => {
1112
1110
  return marks;
1113
1111
  };
1114
1112
 
1113
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/constant.js
1114
+ function constant_default(x2) {
1115
+ return function constant() {
1116
+ return x2;
1117
+ };
1118
+ }
1119
+
1120
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/math.js
1121
+ var abs = Math.abs;
1122
+ var atan2 = Math.atan2;
1123
+ var cos = Math.cos;
1124
+ var max = Math.max;
1125
+ var min = Math.min;
1126
+ var sin = Math.sin;
1127
+ var sqrt = Math.sqrt;
1128
+ var epsilon = 1e-12;
1129
+ var pi = Math.PI;
1130
+ var halfPi = pi / 2;
1131
+ var tau = 2 * pi;
1132
+ function acos(x2) {
1133
+ return x2 > 1 ? 0 : x2 < -1 ? pi : Math.acos(x2);
1134
+ }
1135
+ function asin(x2) {
1136
+ return x2 >= 1 ? halfPi : x2 <= -1 ? -halfPi : Math.asin(x2);
1137
+ }
1138
+
1139
+ // ../../node_modules/.bun/d3-path@3.1.0/node_modules/d3-path/src/path.js
1140
+ var pi2 = Math.PI;
1141
+ var tau2 = 2 * pi2;
1142
+ var epsilon2 = 1e-6;
1143
+ var tauEpsilon = tau2 - epsilon2;
1144
+ function append(strings) {
1145
+ this._ += strings[0];
1146
+ for (let i = 1, n = strings.length; i < n; ++i) {
1147
+ this._ += arguments[i] + strings[i];
1148
+ }
1149
+ }
1150
+ function appendRound(digits) {
1151
+ let d = Math.floor(digits);
1152
+ if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);
1153
+ if (d > 15) return append;
1154
+ const k = 10 ** d;
1155
+ return function(strings) {
1156
+ this._ += strings[0];
1157
+ for (let i = 1, n = strings.length; i < n; ++i) {
1158
+ this._ += Math.round(arguments[i] * k) / k + strings[i];
1159
+ }
1160
+ };
1161
+ }
1162
+ var Path = class {
1163
+ constructor(digits) {
1164
+ this._x0 = this._y0 = // start of current subpath
1165
+ this._x1 = this._y1 = null;
1166
+ this._ = "";
1167
+ this._append = digits == null ? append : appendRound(digits);
1168
+ }
1169
+ moveTo(x2, y2) {
1170
+ this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;
1171
+ }
1172
+ closePath() {
1173
+ if (this._x1 !== null) {
1174
+ this._x1 = this._x0, this._y1 = this._y0;
1175
+ this._append`Z`;
1176
+ }
1177
+ }
1178
+ lineTo(x2, y2) {
1179
+ this._append`L${this._x1 = +x2},${this._y1 = +y2}`;
1180
+ }
1181
+ quadraticCurveTo(x1, y1, x2, y2) {
1182
+ this._append`Q${+x1},${+y1},${this._x1 = +x2},${this._y1 = +y2}`;
1183
+ }
1184
+ bezierCurveTo(x1, y1, x2, y2, x3, y3) {
1185
+ this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x3},${this._y1 = +y3}`;
1186
+ }
1187
+ arcTo(x1, y1, x2, y2, r) {
1188
+ x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
1189
+ if (r < 0) throw new Error(`negative radius: ${r}`);
1190
+ let x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
1191
+ if (this._x1 === null) {
1192
+ this._append`M${this._x1 = x1},${this._y1 = y1}`;
1193
+ } else if (!(l01_2 > epsilon2)) ;
1194
+ else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon2) || !r) {
1195
+ this._append`L${this._x1 = x1},${this._y1 = y1}`;
1196
+ } else {
1197
+ let x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
1198
+ if (Math.abs(t01 - 1) > epsilon2) {
1199
+ this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;
1200
+ }
1201
+ this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;
1202
+ }
1203
+ }
1204
+ arc(x2, y2, r, a0, a1, ccw) {
1205
+ x2 = +x2, y2 = +y2, r = +r, ccw = !!ccw;
1206
+ if (r < 0) throw new Error(`negative radius: ${r}`);
1207
+ let dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x2 + dx, y0 = y2 + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
1208
+ if (this._x1 === null) {
1209
+ this._append`M${x0},${y0}`;
1210
+ } else if (Math.abs(this._x1 - x0) > epsilon2 || Math.abs(this._y1 - y0) > epsilon2) {
1211
+ this._append`L${x0},${y0}`;
1212
+ }
1213
+ if (!r) return;
1214
+ if (da < 0) da = da % tau2 + tau2;
1215
+ if (da > tauEpsilon) {
1216
+ this._append`A${r},${r},0,1,${cw},${x2 - dx},${y2 - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;
1217
+ } else if (da > epsilon2) {
1218
+ this._append`A${r},${r},0,${+(da >= pi2)},${cw},${this._x1 = x2 + r * Math.cos(a1)},${this._y1 = y2 + r * Math.sin(a1)}`;
1219
+ }
1220
+ }
1221
+ rect(x2, y2, w, h) {
1222
+ this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${w = +w}v${+h}h${-w}Z`;
1223
+ }
1224
+ toString() {
1225
+ return this._;
1226
+ }
1227
+ };
1228
+ function path() {
1229
+ return new Path();
1230
+ }
1231
+ path.prototype = Path.prototype;
1232
+
1233
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/path.js
1234
+ function withPath(shape) {
1235
+ let digits = 3;
1236
+ shape.digits = function(_) {
1237
+ if (!arguments.length) return digits;
1238
+ if (_ == null) {
1239
+ digits = null;
1240
+ } else {
1241
+ const d = Math.floor(_);
1242
+ if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);
1243
+ digits = d;
1244
+ }
1245
+ return shape;
1246
+ };
1247
+ return () => new Path(digits);
1248
+ }
1249
+
1250
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/arc.js
1251
+ function arcInnerRadius(d) {
1252
+ return d.innerRadius;
1253
+ }
1254
+ function arcOuterRadius(d) {
1255
+ return d.outerRadius;
1256
+ }
1257
+ function arcStartAngle(d) {
1258
+ return d.startAngle;
1259
+ }
1260
+ function arcEndAngle(d) {
1261
+ return d.endAngle;
1262
+ }
1263
+ function arcPadAngle(d) {
1264
+ return d && d.padAngle;
1265
+ }
1266
+ function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
1267
+ var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;
1268
+ if (t * t < epsilon) return;
1269
+ t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
1270
+ return [x0 + t * x10, y0 + t * y10];
1271
+ }
1272
+ function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
1273
+ var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00;
1274
+ if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
1275
+ return {
1276
+ cx: cx0,
1277
+ cy: cy0,
1278
+ x01: -ox,
1279
+ y01: -oy,
1280
+ x11: cx0 * (r1 / r - 1),
1281
+ y11: cy0 * (r1 / r - 1)
1282
+ };
1283
+ }
1284
+ function arc_default() {
1285
+ var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant_default(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null, path2 = withPath(arc);
1286
+ function arc() {
1287
+ var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi, a1 = endAngle.apply(this, arguments) - halfPi, da = abs(a1 - a0), cw = a1 > a0;
1288
+ if (!context) context = buffer = path2();
1289
+ if (r1 < r0) r = r1, r1 = r0, r0 = r;
1290
+ if (!(r1 > epsilon)) context.moveTo(0, 0);
1291
+ else if (da > tau - epsilon) {
1292
+ context.moveTo(r1 * cos(a0), r1 * sin(a0));
1293
+ context.arc(0, 0, r1, a0, a1, !cw);
1294
+ if (r0 > epsilon) {
1295
+ context.moveTo(r0 * cos(a1), r0 * sin(a1));
1296
+ context.arc(0, 0, r0, a1, a0, cw);
1297
+ }
1298
+ } else {
1299
+ var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t02, t12;
1300
+ if (rp > epsilon) {
1301
+ var p0 = asin(rp / r0 * sin(ap)), p1 = asin(rp / r1 * sin(ap));
1302
+ if ((da0 -= p0 * 2) > epsilon) p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0;
1303
+ else da0 = 0, a00 = a10 = (a0 + a1) / 2;
1304
+ if ((da1 -= p1 * 2) > epsilon) p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1;
1305
+ else da1 = 0, a01 = a11 = (a0 + a1) / 2;
1306
+ }
1307
+ var x01 = r1 * cos(a01), y01 = r1 * sin(a01), x10 = r0 * cos(a10), y10 = r0 * sin(a10);
1308
+ if (rc > epsilon) {
1309
+ var x11 = r1 * cos(a11), y11 = r1 * sin(a11), x00 = r0 * cos(a00), y00 = r0 * sin(a00), oc;
1310
+ if (da < pi) {
1311
+ if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {
1312
+ var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
1313
+ rc0 = min(rc, (r0 - lc) / (kc - 1));
1314
+ rc1 = min(rc, (r1 - lc) / (kc + 1));
1315
+ } else {
1316
+ rc0 = rc1 = 0;
1317
+ }
1318
+ }
1319
+ }
1320
+ if (!(da1 > epsilon)) context.moveTo(x01, y01);
1321
+ else if (rc1 > epsilon) {
1322
+ t02 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
1323
+ t12 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
1324
+ context.moveTo(t02.cx + t02.x01, t02.cy + t02.y01);
1325
+ if (rc1 < rc) context.arc(t02.cx, t02.cy, rc1, atan2(t02.y01, t02.x01), atan2(t12.y01, t12.x01), !cw);
1326
+ else {
1327
+ context.arc(t02.cx, t02.cy, rc1, atan2(t02.y01, t02.x01), atan2(t02.y11, t02.x11), !cw);
1328
+ context.arc(0, 0, r1, atan2(t02.cy + t02.y11, t02.cx + t02.x11), atan2(t12.cy + t12.y11, t12.cx + t12.x11), !cw);
1329
+ context.arc(t12.cx, t12.cy, rc1, atan2(t12.y11, t12.x11), atan2(t12.y01, t12.x01), !cw);
1330
+ }
1331
+ } else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
1332
+ if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);
1333
+ else if (rc0 > epsilon) {
1334
+ t02 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
1335
+ t12 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
1336
+ context.lineTo(t02.cx + t02.x01, t02.cy + t02.y01);
1337
+ if (rc0 < rc) context.arc(t02.cx, t02.cy, rc0, atan2(t02.y01, t02.x01), atan2(t12.y01, t12.x01), !cw);
1338
+ else {
1339
+ context.arc(t02.cx, t02.cy, rc0, atan2(t02.y01, t02.x01), atan2(t02.y11, t02.x11), !cw);
1340
+ context.arc(0, 0, r0, atan2(t02.cy + t02.y11, t02.cx + t02.x11), atan2(t12.cy + t12.y11, t12.cx + t12.x11), cw);
1341
+ context.arc(t12.cx, t12.cy, rc0, atan2(t12.y11, t12.x11), atan2(t12.y01, t12.x01), !cw);
1342
+ }
1343
+ } else context.arc(0, 0, r0, a10, a00, cw);
1344
+ }
1345
+ context.closePath();
1346
+ if (buffer) return context = null, buffer + "" || null;
1347
+ }
1348
+ arc.centroid = function() {
1349
+ var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;
1350
+ return [cos(a) * r, sin(a) * r];
1351
+ };
1352
+ arc.innerRadius = function(_) {
1353
+ return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant_default(+_), arc) : innerRadius;
1354
+ };
1355
+ arc.outerRadius = function(_) {
1356
+ return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant_default(+_), arc) : outerRadius;
1357
+ };
1358
+ arc.cornerRadius = function(_) {
1359
+ return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant_default(+_), arc) : cornerRadius;
1360
+ };
1361
+ arc.padRadius = function(_) {
1362
+ return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant_default(+_), arc) : padRadius;
1363
+ };
1364
+ arc.startAngle = function(_) {
1365
+ return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant_default(+_), arc) : startAngle;
1366
+ };
1367
+ arc.endAngle = function(_) {
1368
+ return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant_default(+_), arc) : endAngle;
1369
+ };
1370
+ arc.padAngle = function(_) {
1371
+ return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant_default(+_), arc) : padAngle;
1372
+ };
1373
+ arc.context = function(_) {
1374
+ return arguments.length ? (context = _ == null ? null : _, arc) : context;
1375
+ };
1376
+ return arc;
1377
+ }
1378
+
1379
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/array.js
1380
+ var slice = Array.prototype.slice;
1381
+ function array_default(x2) {
1382
+ return typeof x2 === "object" && "length" in x2 ? x2 : Array.from(x2);
1383
+ }
1384
+
1385
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js
1386
+ function Linear(context) {
1387
+ this._context = context;
1388
+ }
1389
+ Linear.prototype = {
1390
+ areaStart: function() {
1391
+ this._line = 0;
1392
+ },
1393
+ areaEnd: function() {
1394
+ this._line = NaN;
1395
+ },
1396
+ lineStart: function() {
1397
+ this._point = 0;
1398
+ },
1399
+ lineEnd: function() {
1400
+ if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();
1401
+ this._line = 1 - this._line;
1402
+ },
1403
+ point: function(x2, y2) {
1404
+ x2 = +x2, y2 = +y2;
1405
+ switch (this._point) {
1406
+ case 0:
1407
+ this._point = 1;
1408
+ this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);
1409
+ break;
1410
+ case 1:
1411
+ this._point = 2;
1412
+ // falls through
1413
+ default:
1414
+ this._context.lineTo(x2, y2);
1415
+ break;
1416
+ }
1417
+ }
1418
+ };
1419
+ function linear_default(context) {
1420
+ return new Linear(context);
1421
+ }
1422
+
1423
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/point.js
1424
+ function x(p) {
1425
+ return p[0];
1426
+ }
1427
+ function y(p) {
1428
+ return p[1];
1429
+ }
1430
+
1431
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/line.js
1432
+ function line_default(x2, y2) {
1433
+ var defined = constant_default(true), context = null, curve = linear_default, output = null, path2 = withPath(line);
1434
+ x2 = typeof x2 === "function" ? x2 : x2 === void 0 ? x : constant_default(x2);
1435
+ y2 = typeof y2 === "function" ? y2 : y2 === void 0 ? y : constant_default(y2);
1436
+ function line(data) {
1437
+ var i, n = (data = array_default(data)).length, d, defined0 = false, buffer;
1438
+ if (context == null) output = curve(buffer = path2());
1439
+ for (i = 0; i <= n; ++i) {
1440
+ if (!(i < n && defined(d = data[i], i, data)) === defined0) {
1441
+ if (defined0 = !defined0) output.lineStart();
1442
+ else output.lineEnd();
1443
+ }
1444
+ if (defined0) output.point(+x2(d, i, data), +y2(d, i, data));
1445
+ }
1446
+ if (buffer) return output = null, buffer + "" || null;
1447
+ }
1448
+ line.x = function(_) {
1449
+ return arguments.length ? (x2 = typeof _ === "function" ? _ : constant_default(+_), line) : x2;
1450
+ };
1451
+ line.y = function(_) {
1452
+ return arguments.length ? (y2 = typeof _ === "function" ? _ : constant_default(+_), line) : y2;
1453
+ };
1454
+ line.defined = function(_) {
1455
+ return arguments.length ? (defined = typeof _ === "function" ? _ : constant_default(!!_), line) : defined;
1456
+ };
1457
+ line.curve = function(_) {
1458
+ return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
1459
+ };
1460
+ line.context = function(_) {
1461
+ return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
1462
+ };
1463
+ return line;
1464
+ }
1465
+
1466
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/area.js
1467
+ function area_default(x0, y0, y1) {
1468
+ var x1 = null, defined = constant_default(true), context = null, curve = linear_default, output = null, path2 = withPath(area);
1469
+ x0 = typeof x0 === "function" ? x0 : x0 === void 0 ? x : constant_default(+x0);
1470
+ y0 = typeof y0 === "function" ? y0 : y0 === void 0 ? constant_default(0) : constant_default(+y0);
1471
+ y1 = typeof y1 === "function" ? y1 : y1 === void 0 ? y : constant_default(+y1);
1472
+ function area(data) {
1473
+ var i, j, k, n = (data = array_default(data)).length, d, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);
1474
+ if (context == null) output = curve(buffer = path2());
1475
+ for (i = 0; i <= n; ++i) {
1476
+ if (!(i < n && defined(d = data[i], i, data)) === defined0) {
1477
+ if (defined0 = !defined0) {
1478
+ j = i;
1479
+ output.areaStart();
1480
+ output.lineStart();
1481
+ } else {
1482
+ output.lineEnd();
1483
+ output.lineStart();
1484
+ for (k = i - 1; k >= j; --k) {
1485
+ output.point(x0z[k], y0z[k]);
1486
+ }
1487
+ output.lineEnd();
1488
+ output.areaEnd();
1489
+ }
1490
+ }
1491
+ if (defined0) {
1492
+ x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
1493
+ output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
1494
+ }
1495
+ }
1496
+ if (buffer) return output = null, buffer + "" || null;
1497
+ }
1498
+ function arealine() {
1499
+ return line_default().defined(defined).curve(curve).context(context);
1500
+ }
1501
+ area.x = function(_) {
1502
+ return arguments.length ? (x0 = typeof _ === "function" ? _ : constant_default(+_), x1 = null, area) : x0;
1503
+ };
1504
+ area.x0 = function(_) {
1505
+ return arguments.length ? (x0 = typeof _ === "function" ? _ : constant_default(+_), area) : x0;
1506
+ };
1507
+ area.x1 = function(_) {
1508
+ return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant_default(+_), area) : x1;
1509
+ };
1510
+ area.y = function(_) {
1511
+ return arguments.length ? (y0 = typeof _ === "function" ? _ : constant_default(+_), y1 = null, area) : y0;
1512
+ };
1513
+ area.y0 = function(_) {
1514
+ return arguments.length ? (y0 = typeof _ === "function" ? _ : constant_default(+_), area) : y0;
1515
+ };
1516
+ area.y1 = function(_) {
1517
+ return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant_default(+_), area) : y1;
1518
+ };
1519
+ area.lineX0 = area.lineY0 = function() {
1520
+ return arealine().x(x0).y(y0);
1521
+ };
1522
+ area.lineY1 = function() {
1523
+ return arealine().x(x0).y(y1);
1524
+ };
1525
+ area.lineX1 = function() {
1526
+ return arealine().x(x1).y(y0);
1527
+ };
1528
+ area.defined = function(_) {
1529
+ return arguments.length ? (defined = typeof _ === "function" ? _ : constant_default(!!_), area) : defined;
1530
+ };
1531
+ area.curve = function(_) {
1532
+ return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
1533
+ };
1534
+ area.context = function(_) {
1535
+ return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
1536
+ };
1537
+ return area;
1538
+ }
1539
+
1540
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/descending.js
1541
+ function descending_default(a, b) {
1542
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
1543
+ }
1544
+
1545
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/identity.js
1546
+ function identity_default(d) {
1547
+ return d;
1548
+ }
1549
+
1550
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/pie.js
1551
+ function pie_default() {
1552
+ var value = identity_default, sortValues = descending_default, sort = null, startAngle = constant_default(0), endAngle = constant_default(tau), padAngle = constant_default(0);
1553
+ function pie(data) {
1554
+ var i, n = (data = array_default(data)).length, j, k, sum = 0, index = new Array(n), arcs = new Array(n), a0 = +startAngle.apply(this, arguments), da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), a1, p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), pa = p * (da < 0 ? -1 : 1), v;
1555
+ for (i = 0; i < n; ++i) {
1556
+ if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
1557
+ sum += v;
1558
+ }
1559
+ }
1560
+ if (sortValues != null) index.sort(function(i2, j2) {
1561
+ return sortValues(arcs[i2], arcs[j2]);
1562
+ });
1563
+ else if (sort != null) index.sort(function(i2, j2) {
1564
+ return sort(data[i2], data[j2]);
1565
+ });
1566
+ for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
1567
+ j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
1568
+ data: data[j],
1569
+ index: i,
1570
+ value: v,
1571
+ startAngle: a0,
1572
+ endAngle: a1,
1573
+ padAngle: p
1574
+ };
1575
+ }
1576
+ return arcs;
1577
+ }
1578
+ pie.value = function(_) {
1579
+ return arguments.length ? (value = typeof _ === "function" ? _ : constant_default(+_), pie) : value;
1580
+ };
1581
+ pie.sortValues = function(_) {
1582
+ return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
1583
+ };
1584
+ pie.sort = function(_) {
1585
+ return arguments.length ? (sort = _, sortValues = null, pie) : sort;
1586
+ };
1587
+ pie.startAngle = function(_) {
1588
+ return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant_default(+_), pie) : startAngle;
1589
+ };
1590
+ pie.endAngle = function(_) {
1591
+ return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant_default(+_), pie) : endAngle;
1592
+ };
1593
+ pie.padAngle = function(_) {
1594
+ return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant_default(+_), pie) : padAngle;
1595
+ };
1596
+ return pie;
1597
+ }
1598
+
1599
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js
1600
+ function sign(x2) {
1601
+ return x2 < 0 ? -1 : 1;
1602
+ }
1603
+ function slope3(that, x2, y2) {
1604
+ var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);
1605
+ return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
1606
+ }
1607
+ function slope2(that, t) {
1608
+ var h = that._x1 - that._x0;
1609
+ return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
1610
+ }
1611
+ function point(that, t02, t12) {
1612
+ var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;
1613
+ that._context.bezierCurveTo(x0 + dx, y0 + dx * t02, x1 - dx, y1 - dx * t12, x1, y1);
1614
+ }
1615
+ function MonotoneX(context) {
1616
+ this._context = context;
1617
+ }
1618
+ MonotoneX.prototype = {
1619
+ areaStart: function() {
1620
+ this._line = 0;
1621
+ },
1622
+ areaEnd: function() {
1623
+ this._line = NaN;
1624
+ },
1625
+ lineStart: function() {
1626
+ this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;
1627
+ this._point = 0;
1628
+ },
1629
+ lineEnd: function() {
1630
+ switch (this._point) {
1631
+ case 2:
1632
+ this._context.lineTo(this._x1, this._y1);
1633
+ break;
1634
+ case 3:
1635
+ point(this, this._t0, slope2(this, this._t0));
1636
+ break;
1637
+ }
1638
+ if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();
1639
+ this._line = 1 - this._line;
1640
+ },
1641
+ point: function(x2, y2) {
1642
+ var t12 = NaN;
1643
+ x2 = +x2, y2 = +y2;
1644
+ if (x2 === this._x1 && y2 === this._y1) return;
1645
+ switch (this._point) {
1646
+ case 0:
1647
+ this._point = 1;
1648
+ this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);
1649
+ break;
1650
+ case 1:
1651
+ this._point = 2;
1652
+ break;
1653
+ case 2:
1654
+ this._point = 3;
1655
+ point(this, slope2(this, t12 = slope3(this, x2, y2)), t12);
1656
+ break;
1657
+ default:
1658
+ point(this, this._t0, t12 = slope3(this, x2, y2));
1659
+ break;
1660
+ }
1661
+ this._x0 = this._x1, this._x1 = x2;
1662
+ this._y0 = this._y1, this._y1 = y2;
1663
+ this._t0 = t12;
1664
+ }
1665
+ };
1666
+ function MonotoneY(context) {
1667
+ this._context = new ReflectContext(context);
1668
+ }
1669
+ (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x2, y2) {
1670
+ MonotoneX.prototype.point.call(this, y2, x2);
1671
+ };
1672
+ function ReflectContext(context) {
1673
+ this._context = context;
1674
+ }
1675
+ ReflectContext.prototype = {
1676
+ moveTo: function(x2, y2) {
1677
+ this._context.moveTo(y2, x2);
1678
+ },
1679
+ closePath: function() {
1680
+ this._context.closePath();
1681
+ },
1682
+ lineTo: function(x2, y2) {
1683
+ this._context.lineTo(y2, x2);
1684
+ },
1685
+ bezierCurveTo: function(x1, y1, x2, y2, x3, y3) {
1686
+ this._context.bezierCurveTo(y1, x1, y2, x2, y3, x3);
1687
+ }
1688
+ };
1689
+ function monotoneX(context) {
1690
+ return new MonotoneX(context);
1691
+ }
1692
+
1693
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/offset/none.js
1694
+ function none_default(series, order) {
1695
+ if (!((n = series.length) > 1)) return;
1696
+ for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
1697
+ s0 = s1, s1 = series[order[i]];
1698
+ for (j = 0; j < m; ++j) {
1699
+ s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
1700
+ }
1701
+ }
1702
+ }
1703
+
1704
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/order/none.js
1705
+ function none_default2(series) {
1706
+ var n = series.length, o = new Array(n);
1707
+ while (--n >= 0) o[n] = n;
1708
+ return o;
1709
+ }
1710
+
1711
+ // ../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/stack.js
1712
+ function stackValue(d, key) {
1713
+ return d[key];
1714
+ }
1715
+ function stackSeries(key) {
1716
+ const series = [];
1717
+ series.key = key;
1718
+ return series;
1719
+ }
1720
+ function stack_default() {
1721
+ var keys = constant_default([]), order = none_default2, offset = none_default, value = stackValue;
1722
+ function stack(data) {
1723
+ var sz = Array.from(keys.apply(this, arguments), stackSeries), i, n = sz.length, j = -1, oz;
1724
+ for (const d of data) {
1725
+ for (i = 0, ++j; i < n; ++i) {
1726
+ (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;
1727
+ }
1728
+ }
1729
+ for (i = 0, oz = array_default(order(sz)); i < n; ++i) {
1730
+ sz[oz[i]].index = i;
1731
+ }
1732
+ offset(sz, oz);
1733
+ return sz;
1734
+ }
1735
+ stack.keys = function(_) {
1736
+ return arguments.length ? (keys = typeof _ === "function" ? _ : constant_default(Array.from(_)), stack) : keys;
1737
+ };
1738
+ stack.value = function(_) {
1739
+ return arguments.length ? (value = typeof _ === "function" ? _ : constant_default(+_), stack) : value;
1740
+ };
1741
+ stack.order = function(_) {
1742
+ return arguments.length ? (order = _ == null ? none_default2 : typeof _ === "function" ? _ : constant_default(Array.from(_)), stack) : order;
1743
+ };
1744
+ stack.offset = function(_) {
1745
+ return arguments.length ? (offset = _ == null ? none_default : _, stack) : offset;
1746
+ };
1747
+ return stack;
1748
+ }
1749
+
1115
1750
  // src/charts/line/area.ts
1116
- import { area, curveMonotoneX, line, stack, stackOffsetNone, stackOrderNone } from "d3-shape";
1117
1751
  var DEFAULT_FILL_OPACITY = 0.15;
1118
1752
  function computeSingleArea(spec, scales, _chartArea) {
1119
1753
  const encoding = spec.encoding;
@@ -1140,7 +1774,7 @@ function computeSingleArea(spec, scales, _chartArea) {
1140
1774
  }
1141
1775
  const marks = [];
1142
1776
  for (const [seriesKey, rows] of groups) {
1143
- const color = getColor(scales, seriesKey);
1777
+ const color2 = getColor(scales, seriesKey);
1144
1778
  const sortedRows = sortByField(rows, xChannel.field);
1145
1779
  const validPoints = [];
1146
1780
  for (const row of sortedRows) {
@@ -1155,9 +1789,9 @@ function computeSingleArea(spec, scales, _chartArea) {
1155
1789
  });
1156
1790
  }
1157
1791
  if (validPoints.length === 0) continue;
1158
- const areaGenerator = area().x((d) => d.x).y0((d) => d.yBottom).y1((d) => d.yTop).curve(curveMonotoneX);
1792
+ const areaGenerator = area_default().x((d) => d.x).y0((d) => d.yBottom).y1((d) => d.yTop).curve(monotoneX);
1159
1793
  const pathStr = areaGenerator(validPoints) ?? "";
1160
- const topLineGenerator = line().x((d) => d.x).y((d) => d.yTop).curve(curveMonotoneX);
1794
+ const topLineGenerator = line_default().x((d) => d.x).y((d) => d.yTop).curve(monotoneX);
1161
1795
  const topPathStr = topLineGenerator(validPoints) ?? "";
1162
1796
  const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));
1163
1797
  const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));
@@ -1169,9 +1803,9 @@ function computeSingleArea(spec, scales, _chartArea) {
1169
1803
  bottomPoints,
1170
1804
  path: pathStr,
1171
1805
  topPath: topPathStr,
1172
- fill: color,
1806
+ fill: color2,
1173
1807
  fillOpacity: DEFAULT_FILL_OPACITY,
1174
- stroke: color,
1808
+ stroke: color2,
1175
1809
  strokeWidth: 2,
1176
1810
  seriesKey: seriesKey === "__default__" ? void 0 : seriesKey,
1177
1811
  data: validPoints.map((p) => p.row),
@@ -1222,13 +1856,13 @@ function computeStackedArea(spec, scales, chartArea) {
1222
1856
  }
1223
1857
  return pivot;
1224
1858
  });
1225
- const stackGenerator = stack().keys(keys).order(stackOrderNone).offset(stackOffsetNone);
1859
+ const stackGenerator = stack_default().keys(keys).order(none_default2).offset(none_default);
1226
1860
  const stackedData = stackGenerator(pivotData);
1227
1861
  const yScale = scales.y.scale;
1228
1862
  const marks = [];
1229
1863
  for (const layer of stackedData) {
1230
1864
  const seriesKey = layer.key;
1231
- const color = getColor(scales, seriesKey);
1865
+ const color2 = getColor(scales, seriesKey);
1232
1866
  const validPoints = [];
1233
1867
  for (const d of layer) {
1234
1868
  const xVal = scaleValue(scales.x.scale, scales.x.type, d.data.__x__);
@@ -1238,9 +1872,9 @@ function computeStackedArea(spec, scales, chartArea) {
1238
1872
  validPoints.push({ x: xVal, yTop, yBottom });
1239
1873
  }
1240
1874
  if (validPoints.length === 0) continue;
1241
- const areaGenerator = area().x((p) => p.x).y0((p) => p.yBottom).y1((p) => p.yTop).curve(curveMonotoneX);
1875
+ const areaGenerator = area_default().x((p) => p.x).y0((p) => p.yBottom).y1((p) => p.yTop).curve(monotoneX);
1242
1876
  const pathStr = areaGenerator(validPoints) ?? "";
1243
- const topLineGenerator = line().x((p) => p.x).y((p) => p.yTop).curve(curveMonotoneX);
1877
+ const topLineGenerator = line_default().x((p) => p.x).y((p) => p.yTop).curve(monotoneX);
1244
1878
  const topPathStr = topLineGenerator(validPoints) ?? "";
1245
1879
  const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));
1246
1880
  const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));
@@ -1253,10 +1887,10 @@ function computeStackedArea(spec, scales, chartArea) {
1253
1887
  bottomPoints,
1254
1888
  path: pathStr,
1255
1889
  topPath: topPathStr,
1256
- fill: color,
1890
+ fill: color2,
1257
1891
  fillOpacity: 0.7,
1258
1892
  // Higher opacity for stacked so layers are visible
1259
- stroke: color,
1893
+ stroke: color2,
1260
1894
  strokeWidth: 1,
1261
1895
  seriesKey,
1262
1896
  data: layer.map((d) => {
@@ -1278,7 +1912,6 @@ function computeAreaMarks(spec, scales, chartArea) {
1278
1912
  }
1279
1913
 
1280
1914
  // src/charts/line/compute.ts
1281
- import { curveMonotoneX as curveMonotoneX2, line as line2 } from "d3-shape";
1282
1915
  var DEFAULT_STROKE_WIDTH = 2.5;
1283
1916
  var DEFAULT_POINT_RADIUS = 3;
1284
1917
  function computeLineMarks(spec, scales, _chartArea, _strategy) {
@@ -1292,7 +1925,7 @@ function computeLineMarks(spec, scales, _chartArea, _strategy) {
1292
1925
  const groups = groupByField(spec.data, colorField);
1293
1926
  const marks = [];
1294
1927
  for (const [seriesKey, rows] of groups) {
1295
- const color = getColor(scales, seriesKey);
1928
+ const color2 = getColor(scales, seriesKey);
1296
1929
  const sortedRows = sortByField(rows, xChannel.field);
1297
1930
  const pointsWithData = [];
1298
1931
  const segments = [];
@@ -1307,14 +1940,14 @@ function computeLineMarks(spec, scales, _chartArea, _strategy) {
1307
1940
  }
1308
1941
  continue;
1309
1942
  }
1310
- const point = { x: xVal, y: yVal };
1311
- currentSegment.push(point);
1312
- pointsWithData.push({ ...point, row });
1943
+ const point3 = { x: xVal, y: yVal };
1944
+ currentSegment.push(point3);
1945
+ pointsWithData.push({ ...point3, row });
1313
1946
  }
1314
1947
  if (currentSegment.length > 0) {
1315
1948
  segments.push(currentSegment);
1316
1949
  }
1317
- const lineGenerator = line2().x((d) => d.x).y((d) => d.y).curve(curveMonotoneX2);
1950
+ const lineGenerator = line_default().x((d) => d.x).y((d) => d.y).curve(monotoneX);
1318
1951
  const allPoints = [];
1319
1952
  const pathParts = [];
1320
1953
  for (const segment of segments) {
@@ -1340,7 +1973,7 @@ function computeLineMarks(spec, scales, _chartArea, _strategy) {
1340
1973
  type: "line",
1341
1974
  points: allPoints,
1342
1975
  path: combinedPath,
1343
- stroke: color,
1976
+ stroke: color2,
1344
1977
  strokeWidth: styleOverride?.strokeWidth ?? DEFAULT_STROKE_WIDTH,
1345
1978
  strokeDasharray,
1346
1979
  opacity: styleOverride?.opacity,
@@ -1357,7 +1990,7 @@ function computeLineMarks(spec, scales, _chartArea, _strategy) {
1357
1990
  cx: p.x,
1358
1991
  cy: p.y,
1359
1992
  r: showPoints ? DEFAULT_POINT_RADIUS : 0,
1360
- fill: color,
1993
+ fill: color2,
1361
1994
  stroke: showPoints ? "#ffffff" : "transparent",
1362
1995
  strokeWidth: showPoints ? 1.5 : 0,
1363
1996
  fillOpacity: 0,
@@ -1463,7 +2096,6 @@ var areaRenderer = (spec, scales, chartArea, strategy, _theme) => {
1463
2096
  };
1464
2097
 
1465
2098
  // src/charts/pie/compute.ts
1466
- import { arc as d3Arc, pie as d3Pie } from "d3-shape";
1467
2099
  var SMALL_SLICE_THRESHOLD = 0.03;
1468
2100
  var DEFAULT_PALETTE = [
1469
2101
  "#1b7fa3",
@@ -1482,11 +2114,11 @@ function groupSmallSlices(slices, threshold) {
1482
2114
  if (total === 0) return slices;
1483
2115
  const big = [];
1484
2116
  let otherValue = 0;
1485
- for (const slice of slices) {
1486
- if (slice.value / total < threshold) {
1487
- otherValue += slice.value;
2117
+ for (const slice2 of slices) {
2118
+ if (slice2.value / total < threshold) {
2119
+ otherValue += slice2.value;
1488
2120
  } else {
1489
- big.push(slice);
2121
+ big.push(slice2);
1490
2122
  }
1491
2123
  }
1492
2124
  if (otherValue > 0) {
@@ -1538,160 +2170,2637 @@ function computePieMarks(spec, scales, chartArea, _strategy, isDonut = false) {
1538
2170
  if (slices.length === 0) return [];
1539
2171
  slices.sort((a, b) => b.value - a.value);
1540
2172
  slices = groupSmallSlices(slices, SMALL_SLICE_THRESHOLD);
1541
- const pieGenerator = d3Pie().value((d) => d.value).sort(null).padAngle(0.01);
2173
+ const pieGenerator = pie_default().value((d) => d.value).sort(null).padAngle(0.01);
1542
2174
  const arcs = pieGenerator(slices);
1543
2175
  const centerX = chartArea.x + chartArea.width / 2;
1544
2176
  const centerY = chartArea.y + chartArea.height / 2;
1545
2177
  const outerRadius = Math.min(chartArea.width, chartArea.height) / 2 * 0.85;
1546
2178
  const innerRadius = isDonut ? outerRadius * 0.6 : 0;
1547
- const arcGenerator = d3Arc().innerRadius(innerRadius).outerRadius(outerRadius);
2179
+ const arcGenerator = arc_default().innerRadius(innerRadius).outerRadius(outerRadius);
1548
2180
  const marks = [];
1549
2181
  const center = { x: centerX, y: centerY };
1550
2182
  const total = slices.reduce((sum, s) => sum + s.value, 0);
1551
2183
  for (let i = 0; i < arcs.length; i++) {
1552
2184
  const arcDatum = arcs[i];
1553
- const slice = arcDatum.data;
1554
- let color;
2185
+ const slice2 = arcDatum.data;
2186
+ let color2;
1555
2187
  if (scales.color && categoryField) {
1556
2188
  const colorScale = scales.color.scale;
1557
- color = colorScale(slice.label);
2189
+ color2 = colorScale(slice2.label);
1558
2190
  } else {
1559
- color = DEFAULT_PALETTE[i % DEFAULT_PALETTE.length];
2191
+ color2 = DEFAULT_PALETTE[i % DEFAULT_PALETTE.length];
1560
2192
  }
1561
- const path = arcGenerator(arcDatum) ?? "";
2193
+ const path2 = arcGenerator(arcDatum) ?? "";
1562
2194
  const centroidResult = arcGenerator.centroid(arcDatum);
1563
- const percentage = total > 0 ? (slice.value / total * 100).toFixed(1) : "0";
2195
+ const percentage = total > 0 ? (slice2.value / total * 100).toFixed(1) : "0";
1564
2196
  const aria = {
1565
- label: `${slice.label}: ${slice.value} (${percentage}%)`
2197
+ label: `${slice2.label}: ${slice2.value} (${percentage}%)`
2198
+ };
2199
+ marks.push({
2200
+ type: "arc",
2201
+ path: path2,
2202
+ centroid: {
2203
+ x: centroidResult[0] + centerX,
2204
+ y: centroidResult[1] + centerY
2205
+ },
2206
+ center,
2207
+ innerRadius,
2208
+ outerRadius,
2209
+ startAngle: arcDatum.startAngle,
2210
+ endAngle: arcDatum.endAngle,
2211
+ fill: color2,
2212
+ stroke: "#ffffff",
2213
+ strokeWidth: 2,
2214
+ data: slice2.originalRow,
2215
+ aria
2216
+ });
2217
+ }
2218
+ return marks;
2219
+ }
2220
+
2221
+ // src/charts/pie/labels.ts
2222
+ import { estimateTextWidth as estimateTextWidth6, resolveCollisions as resolveCollisions5 } from "@opendata-ai/openchart-core";
2223
+ var LABEL_FONT_SIZE5 = 10;
2224
+ var LABEL_FONT_WEIGHT5 = 500;
2225
+ var LEADER_LINE_OFFSET = 12;
2226
+ function computePieLabels(marks, _chartArea, density = "auto", _textFill = "#333333") {
2227
+ if (marks.length === 0) return [];
2228
+ if (density === "none") return [];
2229
+ const centerX = marks[0].center.x;
2230
+ const centerY = marks[0].center.y;
2231
+ const targetMarks = density === "endpoints" && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;
2232
+ const candidates = [];
2233
+ const targetMarkIndices = [];
2234
+ for (let mi = 0; mi < targetMarks.length; mi++) {
2235
+ const mark = targetMarks[mi];
2236
+ const ariaLabel = mark.aria.label;
2237
+ const firstColon = ariaLabel.indexOf(":");
2238
+ const labelText = firstColon >= 0 ? ariaLabel.slice(0, firstColon).trim() : "";
2239
+ if (!labelText) continue;
2240
+ const textWidth = estimateTextWidth6(labelText, LABEL_FONT_SIZE5, LABEL_FONT_WEIGHT5);
2241
+ const textHeight = LABEL_FONT_SIZE5 * 1.2;
2242
+ const midAngle = (mark.startAngle + mark.endAngle) / 2;
2243
+ const labelRadius = mark.outerRadius + LEADER_LINE_OFFSET;
2244
+ const labelX = centerX + Math.sin(midAngle) * labelRadius;
2245
+ const labelY = centerY - Math.cos(midAngle) * labelRadius;
2246
+ const isRight = Math.sin(midAngle) > 0;
2247
+ candidates.push({
2248
+ text: labelText,
2249
+ anchorX: isRight ? labelX : labelX - textWidth,
2250
+ anchorY: labelY - textHeight / 2,
2251
+ width: textWidth,
2252
+ height: textHeight,
2253
+ priority: "data",
2254
+ style: {
2255
+ fontFamily: "system-ui, -apple-system, sans-serif",
2256
+ fontSize: LABEL_FONT_SIZE5,
2257
+ fontWeight: LABEL_FONT_WEIGHT5,
2258
+ fill: _textFill,
2259
+ lineHeight: 1.2,
2260
+ textAnchor: isRight ? "start" : "end",
2261
+ dominantBaseline: "central"
2262
+ }
2263
+ });
2264
+ targetMarkIndices.push(mi);
2265
+ }
2266
+ if (candidates.length === 0) return [];
2267
+ let resolved;
2268
+ if (density === "all") {
2269
+ resolved = candidates.map((c) => ({
2270
+ text: c.text,
2271
+ x: c.anchorX,
2272
+ y: c.anchorY,
2273
+ style: c.style,
2274
+ visible: true
2275
+ }));
2276
+ } else {
2277
+ resolved = resolveCollisions5(candidates);
2278
+ }
2279
+ for (let i = 0; i < resolved.length && i < targetMarks.length; i++) {
2280
+ const label = resolved[i];
2281
+ const mark = targetMarks[i];
2282
+ if (label.visible) {
2283
+ label.connector = {
2284
+ from: { x: label.x, y: label.y },
2285
+ to: { x: mark.centroid.x, y: mark.centroid.y },
2286
+ stroke: _textFill,
2287
+ style: "straight"
2288
+ };
2289
+ }
2290
+ }
2291
+ return resolved;
2292
+ }
2293
+
2294
+ // src/charts/pie/index.ts
2295
+ var pieRenderer = (spec, scales, chartArea, strategy, theme) => {
2296
+ const marks = computePieMarks(spec, scales, chartArea, strategy, false);
2297
+ const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);
2298
+ for (let i = 0; i < marks.length && i < labels.length; i++) {
2299
+ marks[i].label = labels[i];
2300
+ }
2301
+ return marks;
2302
+ };
2303
+ var donutRenderer = (spec, scales, chartArea, strategy, theme) => {
2304
+ const marks = computePieMarks(spec, scales, chartArea, strategy, true);
2305
+ const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);
2306
+ for (let i = 0; i < marks.length && i < labels.length; i++) {
2307
+ marks[i].label = labels[i];
2308
+ }
2309
+ return marks;
2310
+ };
2311
+
2312
+ // src/charts/registry.ts
2313
+ var renderers = /* @__PURE__ */ new Map();
2314
+ function registerChartRenderer(type, renderer) {
2315
+ renderers.set(type, renderer);
2316
+ }
2317
+ function getChartRenderer(type) {
2318
+ return renderers.get(type);
2319
+ }
2320
+ function clearRenderers() {
2321
+ renderers.clear();
2322
+ }
2323
+
2324
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ascending.js
2325
+ function ascending(a, b) {
2326
+ return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
2327
+ }
2328
+
2329
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/descending.js
2330
+ function descending(a, b) {
2331
+ return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
2332
+ }
2333
+
2334
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisector.js
2335
+ function bisector(f) {
2336
+ let compare1, compare2, delta;
2337
+ if (f.length !== 2) {
2338
+ compare1 = ascending;
2339
+ compare2 = (d, x2) => ascending(f(d), x2);
2340
+ delta = (d, x2) => f(d) - x2;
2341
+ } else {
2342
+ compare1 = f === ascending || f === descending ? f : zero;
2343
+ compare2 = f;
2344
+ delta = f;
2345
+ }
2346
+ function left(a, x2, lo = 0, hi = a.length) {
2347
+ if (lo < hi) {
2348
+ if (compare1(x2, x2) !== 0) return hi;
2349
+ do {
2350
+ const mid = lo + hi >>> 1;
2351
+ if (compare2(a[mid], x2) < 0) lo = mid + 1;
2352
+ else hi = mid;
2353
+ } while (lo < hi);
2354
+ }
2355
+ return lo;
2356
+ }
2357
+ function right(a, x2, lo = 0, hi = a.length) {
2358
+ if (lo < hi) {
2359
+ if (compare1(x2, x2) !== 0) return hi;
2360
+ do {
2361
+ const mid = lo + hi >>> 1;
2362
+ if (compare2(a[mid], x2) <= 0) lo = mid + 1;
2363
+ else hi = mid;
2364
+ } while (lo < hi);
2365
+ }
2366
+ return lo;
2367
+ }
2368
+ function center(a, x2, lo = 0, hi = a.length) {
2369
+ const i = left(a, x2, lo, hi - 1);
2370
+ return i > lo && delta(a[i - 1], x2) > -delta(a[i], x2) ? i - 1 : i;
2371
+ }
2372
+ return { left, center, right };
2373
+ }
2374
+ function zero() {
2375
+ return 0;
2376
+ }
2377
+
2378
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/number.js
2379
+ function number(x2) {
2380
+ return x2 === null ? NaN : +x2;
2381
+ }
2382
+
2383
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisect.js
2384
+ var ascendingBisect = bisector(ascending);
2385
+ var bisectRight = ascendingBisect.right;
2386
+ var bisectLeft = ascendingBisect.left;
2387
+ var bisectCenter = bisector(number).center;
2388
+ var bisect_default = bisectRight;
2389
+
2390
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/extent.js
2391
+ function extent(values, valueof) {
2392
+ let min3;
2393
+ let max3;
2394
+ if (valueof === void 0) {
2395
+ for (const value of values) {
2396
+ if (value != null) {
2397
+ if (min3 === void 0) {
2398
+ if (value >= value) min3 = max3 = value;
2399
+ } else {
2400
+ if (min3 > value) min3 = value;
2401
+ if (max3 < value) max3 = value;
2402
+ }
2403
+ }
2404
+ }
2405
+ } else {
2406
+ let index = -1;
2407
+ for (let value of values) {
2408
+ if ((value = valueof(value, ++index, values)) != null) {
2409
+ if (min3 === void 0) {
2410
+ if (value >= value) min3 = max3 = value;
2411
+ } else {
2412
+ if (min3 > value) min3 = value;
2413
+ if (max3 < value) max3 = value;
2414
+ }
2415
+ }
2416
+ }
2417
+ }
2418
+ return [min3, max3];
2419
+ }
2420
+
2421
+ // ../../node_modules/.bun/internmap@2.0.3/node_modules/internmap/src/index.js
2422
+ var InternMap = class extends Map {
2423
+ constructor(entries, key = keyof) {
2424
+ super();
2425
+ Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key } });
2426
+ if (entries != null) for (const [key2, value] of entries) this.set(key2, value);
2427
+ }
2428
+ get(key) {
2429
+ return super.get(intern_get(this, key));
2430
+ }
2431
+ has(key) {
2432
+ return super.has(intern_get(this, key));
2433
+ }
2434
+ set(key, value) {
2435
+ return super.set(intern_set(this, key), value);
2436
+ }
2437
+ delete(key) {
2438
+ return super.delete(intern_delete(this, key));
2439
+ }
2440
+ };
2441
+ function intern_get({ _intern, _key }, value) {
2442
+ const key = _key(value);
2443
+ return _intern.has(key) ? _intern.get(key) : value;
2444
+ }
2445
+ function intern_set({ _intern, _key }, value) {
2446
+ const key = _key(value);
2447
+ if (_intern.has(key)) return _intern.get(key);
2448
+ _intern.set(key, value);
2449
+ return value;
2450
+ }
2451
+ function intern_delete({ _intern, _key }, value) {
2452
+ const key = _key(value);
2453
+ if (_intern.has(key)) {
2454
+ value = _intern.get(key);
2455
+ _intern.delete(key);
2456
+ }
2457
+ return value;
2458
+ }
2459
+ function keyof(value) {
2460
+ return value !== null && typeof value === "object" ? value.valueOf() : value;
2461
+ }
2462
+
2463
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ticks.js
2464
+ var e10 = Math.sqrt(50);
2465
+ var e5 = Math.sqrt(10);
2466
+ var e2 = Math.sqrt(2);
2467
+ function tickSpec(start, stop, count) {
2468
+ const step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log10(step)), error = step / Math.pow(10, power), factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;
2469
+ let i1, i2, inc;
2470
+ if (power < 0) {
2471
+ inc = Math.pow(10, -power) / factor;
2472
+ i1 = Math.round(start * inc);
2473
+ i2 = Math.round(stop * inc);
2474
+ if (i1 / inc < start) ++i1;
2475
+ if (i2 / inc > stop) --i2;
2476
+ inc = -inc;
2477
+ } else {
2478
+ inc = Math.pow(10, power) * factor;
2479
+ i1 = Math.round(start / inc);
2480
+ i2 = Math.round(stop / inc);
2481
+ if (i1 * inc < start) ++i1;
2482
+ if (i2 * inc > stop) --i2;
2483
+ }
2484
+ if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);
2485
+ return [i1, i2, inc];
2486
+ }
2487
+ function ticks(start, stop, count) {
2488
+ stop = +stop, start = +start, count = +count;
2489
+ if (!(count > 0)) return [];
2490
+ if (start === stop) return [start];
2491
+ const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);
2492
+ if (!(i2 >= i1)) return [];
2493
+ const n = i2 - i1 + 1, ticks2 = new Array(n);
2494
+ if (reverse) {
2495
+ if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) / -inc;
2496
+ else for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) * inc;
2497
+ } else {
2498
+ if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) / -inc;
2499
+ else for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) * inc;
2500
+ }
2501
+ return ticks2;
2502
+ }
2503
+ function tickIncrement(start, stop, count) {
2504
+ stop = +stop, start = +start, count = +count;
2505
+ return tickSpec(start, stop, count)[2];
2506
+ }
2507
+ function tickStep(start, stop, count) {
2508
+ stop = +stop, start = +start, count = +count;
2509
+ const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);
2510
+ return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);
2511
+ }
2512
+
2513
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/max.js
2514
+ function max2(values, valueof) {
2515
+ let max3;
2516
+ if (valueof === void 0) {
2517
+ for (const value of values) {
2518
+ if (value != null && (max3 < value || max3 === void 0 && value >= value)) {
2519
+ max3 = value;
2520
+ }
2521
+ }
2522
+ } else {
2523
+ let index = -1;
2524
+ for (let value of values) {
2525
+ if ((value = valueof(value, ++index, values)) != null && (max3 < value || max3 === void 0 && value >= value)) {
2526
+ max3 = value;
2527
+ }
2528
+ }
2529
+ }
2530
+ return max3;
2531
+ }
2532
+
2533
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/min.js
2534
+ function min2(values, valueof) {
2535
+ let min3;
2536
+ if (valueof === void 0) {
2537
+ for (const value of values) {
2538
+ if (value != null && (min3 > value || min3 === void 0 && value >= value)) {
2539
+ min3 = value;
2540
+ }
2541
+ }
2542
+ } else {
2543
+ let index = -1;
2544
+ for (let value of values) {
2545
+ if ((value = valueof(value, ++index, values)) != null && (min3 > value || min3 === void 0 && value >= value)) {
2546
+ min3 = value;
2547
+ }
2548
+ }
2549
+ }
2550
+ return min3;
2551
+ }
2552
+
2553
+ // ../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/range.js
2554
+ function range(start, stop, step) {
2555
+ start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
2556
+ var i = -1, n = Math.max(0, Math.ceil((stop - start) / step)) | 0, range2 = new Array(n);
2557
+ while (++i < n) {
2558
+ range2[i] = start + i * step;
2559
+ }
2560
+ return range2;
2561
+ }
2562
+
2563
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/init.js
2564
+ function initRange(domain, range2) {
2565
+ switch (arguments.length) {
2566
+ case 0:
2567
+ break;
2568
+ case 1:
2569
+ this.range(domain);
2570
+ break;
2571
+ default:
2572
+ this.range(range2).domain(domain);
2573
+ break;
2574
+ }
2575
+ return this;
2576
+ }
2577
+ function initInterpolator(domain, interpolator) {
2578
+ switch (arguments.length) {
2579
+ case 0:
2580
+ break;
2581
+ case 1: {
2582
+ if (typeof domain === "function") this.interpolator(domain);
2583
+ else this.range(domain);
2584
+ break;
2585
+ }
2586
+ default: {
2587
+ this.domain(domain);
2588
+ if (typeof interpolator === "function") this.interpolator(interpolator);
2589
+ else this.range(interpolator);
2590
+ break;
2591
+ }
2592
+ }
2593
+ return this;
2594
+ }
2595
+
2596
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/ordinal.js
2597
+ var implicit = /* @__PURE__ */ Symbol("implicit");
2598
+ function ordinal() {
2599
+ var index = new InternMap(), domain = [], range2 = [], unknown = implicit;
2600
+ function scale(d) {
2601
+ let i = index.get(d);
2602
+ if (i === void 0) {
2603
+ if (unknown !== implicit) return unknown;
2604
+ index.set(d, i = domain.push(d) - 1);
2605
+ }
2606
+ return range2[i % range2.length];
2607
+ }
2608
+ scale.domain = function(_) {
2609
+ if (!arguments.length) return domain.slice();
2610
+ domain = [], index = new InternMap();
2611
+ for (const value of _) {
2612
+ if (index.has(value)) continue;
2613
+ index.set(value, domain.push(value) - 1);
2614
+ }
2615
+ return scale;
2616
+ };
2617
+ scale.range = function(_) {
2618
+ return arguments.length ? (range2 = Array.from(_), scale) : range2.slice();
2619
+ };
2620
+ scale.unknown = function(_) {
2621
+ return arguments.length ? (unknown = _, scale) : unknown;
2622
+ };
2623
+ scale.copy = function() {
2624
+ return ordinal(domain, range2).unknown(unknown);
2625
+ };
2626
+ initRange.apply(scale, arguments);
2627
+ return scale;
2628
+ }
2629
+
2630
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/band.js
2631
+ function band() {
2632
+ var scale = ordinal().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, r0 = 0, r1 = 1, step, bandwidth, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;
2633
+ delete scale.unknown;
2634
+ function rescale() {
2635
+ var n = domain().length, reverse = r1 < r0, start = reverse ? r1 : r0, stop = reverse ? r0 : r1;
2636
+ step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
2637
+ if (round) step = Math.floor(step);
2638
+ start += (stop - start - step * (n - paddingInner)) * align;
2639
+ bandwidth = step * (1 - paddingInner);
2640
+ if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
2641
+ var values = range(n).map(function(i) {
2642
+ return start + step * i;
2643
+ });
2644
+ return ordinalRange(reverse ? values.reverse() : values);
2645
+ }
2646
+ scale.domain = function(_) {
2647
+ return arguments.length ? (domain(_), rescale()) : domain();
2648
+ };
2649
+ scale.range = function(_) {
2650
+ return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];
2651
+ };
2652
+ scale.rangeRound = function(_) {
2653
+ return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();
2654
+ };
2655
+ scale.bandwidth = function() {
2656
+ return bandwidth;
2657
+ };
2658
+ scale.step = function() {
2659
+ return step;
2660
+ };
2661
+ scale.round = function(_) {
2662
+ return arguments.length ? (round = !!_, rescale()) : round;
2663
+ };
2664
+ scale.padding = function(_) {
2665
+ return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
2666
+ };
2667
+ scale.paddingInner = function(_) {
2668
+ return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
2669
+ };
2670
+ scale.paddingOuter = function(_) {
2671
+ return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
2672
+ };
2673
+ scale.align = function(_) {
2674
+ return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
2675
+ };
2676
+ scale.copy = function() {
2677
+ return band(domain(), [r0, r1]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);
2678
+ };
2679
+ return initRange.apply(rescale(), arguments);
2680
+ }
2681
+ function pointish(scale) {
2682
+ var copy3 = scale.copy;
2683
+ scale.padding = scale.paddingOuter;
2684
+ delete scale.paddingInner;
2685
+ delete scale.paddingOuter;
2686
+ scale.copy = function() {
2687
+ return pointish(copy3());
2688
+ };
2689
+ return scale;
2690
+ }
2691
+ function point2() {
2692
+ return pointish(band.apply(null, arguments).paddingInner(1));
2693
+ }
2694
+
2695
+ // ../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/define.js
2696
+ function define_default(constructor, factory, prototype) {
2697
+ constructor.prototype = factory.prototype = prototype;
2698
+ prototype.constructor = constructor;
2699
+ }
2700
+ function extend(parent, definition) {
2701
+ var prototype = Object.create(parent.prototype);
2702
+ for (var key in definition) prototype[key] = definition[key];
2703
+ return prototype;
2704
+ }
2705
+
2706
+ // ../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/color.js
2707
+ function Color() {
2708
+ }
2709
+ var darker = 0.7;
2710
+ var brighter = 1 / darker;
2711
+ var reI = "\\s*([+-]?\\d+)\\s*";
2712
+ var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*";
2713
+ var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
2714
+ var reHex = /^#([0-9a-f]{3,8})$/;
2715
+ var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);
2716
+ var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);
2717
+ var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);
2718
+ var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);
2719
+ var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);
2720
+ var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
2721
+ var named = {
2722
+ aliceblue: 15792383,
2723
+ antiquewhite: 16444375,
2724
+ aqua: 65535,
2725
+ aquamarine: 8388564,
2726
+ azure: 15794175,
2727
+ beige: 16119260,
2728
+ bisque: 16770244,
2729
+ black: 0,
2730
+ blanchedalmond: 16772045,
2731
+ blue: 255,
2732
+ blueviolet: 9055202,
2733
+ brown: 10824234,
2734
+ burlywood: 14596231,
2735
+ cadetblue: 6266528,
2736
+ chartreuse: 8388352,
2737
+ chocolate: 13789470,
2738
+ coral: 16744272,
2739
+ cornflowerblue: 6591981,
2740
+ cornsilk: 16775388,
2741
+ crimson: 14423100,
2742
+ cyan: 65535,
2743
+ darkblue: 139,
2744
+ darkcyan: 35723,
2745
+ darkgoldenrod: 12092939,
2746
+ darkgray: 11119017,
2747
+ darkgreen: 25600,
2748
+ darkgrey: 11119017,
2749
+ darkkhaki: 12433259,
2750
+ darkmagenta: 9109643,
2751
+ darkolivegreen: 5597999,
2752
+ darkorange: 16747520,
2753
+ darkorchid: 10040012,
2754
+ darkred: 9109504,
2755
+ darksalmon: 15308410,
2756
+ darkseagreen: 9419919,
2757
+ darkslateblue: 4734347,
2758
+ darkslategray: 3100495,
2759
+ darkslategrey: 3100495,
2760
+ darkturquoise: 52945,
2761
+ darkviolet: 9699539,
2762
+ deeppink: 16716947,
2763
+ deepskyblue: 49151,
2764
+ dimgray: 6908265,
2765
+ dimgrey: 6908265,
2766
+ dodgerblue: 2003199,
2767
+ firebrick: 11674146,
2768
+ floralwhite: 16775920,
2769
+ forestgreen: 2263842,
2770
+ fuchsia: 16711935,
2771
+ gainsboro: 14474460,
2772
+ ghostwhite: 16316671,
2773
+ gold: 16766720,
2774
+ goldenrod: 14329120,
2775
+ gray: 8421504,
2776
+ green: 32768,
2777
+ greenyellow: 11403055,
2778
+ grey: 8421504,
2779
+ honeydew: 15794160,
2780
+ hotpink: 16738740,
2781
+ indianred: 13458524,
2782
+ indigo: 4915330,
2783
+ ivory: 16777200,
2784
+ khaki: 15787660,
2785
+ lavender: 15132410,
2786
+ lavenderblush: 16773365,
2787
+ lawngreen: 8190976,
2788
+ lemonchiffon: 16775885,
2789
+ lightblue: 11393254,
2790
+ lightcoral: 15761536,
2791
+ lightcyan: 14745599,
2792
+ lightgoldenrodyellow: 16448210,
2793
+ lightgray: 13882323,
2794
+ lightgreen: 9498256,
2795
+ lightgrey: 13882323,
2796
+ lightpink: 16758465,
2797
+ lightsalmon: 16752762,
2798
+ lightseagreen: 2142890,
2799
+ lightskyblue: 8900346,
2800
+ lightslategray: 7833753,
2801
+ lightslategrey: 7833753,
2802
+ lightsteelblue: 11584734,
2803
+ lightyellow: 16777184,
2804
+ lime: 65280,
2805
+ limegreen: 3329330,
2806
+ linen: 16445670,
2807
+ magenta: 16711935,
2808
+ maroon: 8388608,
2809
+ mediumaquamarine: 6737322,
2810
+ mediumblue: 205,
2811
+ mediumorchid: 12211667,
2812
+ mediumpurple: 9662683,
2813
+ mediumseagreen: 3978097,
2814
+ mediumslateblue: 8087790,
2815
+ mediumspringgreen: 64154,
2816
+ mediumturquoise: 4772300,
2817
+ mediumvioletred: 13047173,
2818
+ midnightblue: 1644912,
2819
+ mintcream: 16121850,
2820
+ mistyrose: 16770273,
2821
+ moccasin: 16770229,
2822
+ navajowhite: 16768685,
2823
+ navy: 128,
2824
+ oldlace: 16643558,
2825
+ olive: 8421376,
2826
+ olivedrab: 7048739,
2827
+ orange: 16753920,
2828
+ orangered: 16729344,
2829
+ orchid: 14315734,
2830
+ palegoldenrod: 15657130,
2831
+ palegreen: 10025880,
2832
+ paleturquoise: 11529966,
2833
+ palevioletred: 14381203,
2834
+ papayawhip: 16773077,
2835
+ peachpuff: 16767673,
2836
+ peru: 13468991,
2837
+ pink: 16761035,
2838
+ plum: 14524637,
2839
+ powderblue: 11591910,
2840
+ purple: 8388736,
2841
+ rebeccapurple: 6697881,
2842
+ red: 16711680,
2843
+ rosybrown: 12357519,
2844
+ royalblue: 4286945,
2845
+ saddlebrown: 9127187,
2846
+ salmon: 16416882,
2847
+ sandybrown: 16032864,
2848
+ seagreen: 3050327,
2849
+ seashell: 16774638,
2850
+ sienna: 10506797,
2851
+ silver: 12632256,
2852
+ skyblue: 8900331,
2853
+ slateblue: 6970061,
2854
+ slategray: 7372944,
2855
+ slategrey: 7372944,
2856
+ snow: 16775930,
2857
+ springgreen: 65407,
2858
+ steelblue: 4620980,
2859
+ tan: 13808780,
2860
+ teal: 32896,
2861
+ thistle: 14204888,
2862
+ tomato: 16737095,
2863
+ turquoise: 4251856,
2864
+ violet: 15631086,
2865
+ wheat: 16113331,
2866
+ white: 16777215,
2867
+ whitesmoke: 16119285,
2868
+ yellow: 16776960,
2869
+ yellowgreen: 10145074
2870
+ };
2871
+ define_default(Color, color, {
2872
+ copy(channels) {
2873
+ return Object.assign(new this.constructor(), this, channels);
2874
+ },
2875
+ displayable() {
2876
+ return this.rgb().displayable();
2877
+ },
2878
+ hex: color_formatHex,
2879
+ // Deprecated! Use color.formatHex.
2880
+ formatHex: color_formatHex,
2881
+ formatHex8: color_formatHex8,
2882
+ formatHsl: color_formatHsl,
2883
+ formatRgb: color_formatRgb,
2884
+ toString: color_formatRgb
2885
+ });
2886
+ function color_formatHex() {
2887
+ return this.rgb().formatHex();
2888
+ }
2889
+ function color_formatHex8() {
2890
+ return this.rgb().formatHex8();
2891
+ }
2892
+ function color_formatHsl() {
2893
+ return hslConvert(this).formatHsl();
2894
+ }
2895
+ function color_formatRgb() {
2896
+ return this.rgb().formatRgb();
2897
+ }
2898
+ function color(format2) {
2899
+ var m, l;
2900
+ format2 = (format2 + "").trim().toLowerCase();
2901
+ return (m = reHex.exec(format2)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format2)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format2)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format2)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format2)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
2902
+ }
2903
+ function rgbn(n) {
2904
+ return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);
2905
+ }
2906
+ function rgba(r, g, b, a) {
2907
+ if (a <= 0) r = g = b = NaN;
2908
+ return new Rgb(r, g, b, a);
2909
+ }
2910
+ function rgbConvert(o) {
2911
+ if (!(o instanceof Color)) o = color(o);
2912
+ if (!o) return new Rgb();
2913
+ o = o.rgb();
2914
+ return new Rgb(o.r, o.g, o.b, o.opacity);
2915
+ }
2916
+ function rgb(r, g, b, opacity) {
2917
+ return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2918
+ }
2919
+ function Rgb(r, g, b, opacity) {
2920
+ this.r = +r;
2921
+ this.g = +g;
2922
+ this.b = +b;
2923
+ this.opacity = +opacity;
2924
+ }
2925
+ define_default(Rgb, rgb, extend(Color, {
2926
+ brighter(k) {
2927
+ k = k == null ? brighter : Math.pow(brighter, k);
2928
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2929
+ },
2930
+ darker(k) {
2931
+ k = k == null ? darker : Math.pow(darker, k);
2932
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2933
+ },
2934
+ rgb() {
2935
+ return this;
2936
+ },
2937
+ clamp() {
2938
+ return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
2939
+ },
2940
+ displayable() {
2941
+ return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);
2942
+ },
2943
+ hex: rgb_formatHex,
2944
+ // Deprecated! Use color.formatHex.
2945
+ formatHex: rgb_formatHex,
2946
+ formatHex8: rgb_formatHex8,
2947
+ formatRgb: rgb_formatRgb,
2948
+ toString: rgb_formatRgb
2949
+ }));
2950
+ function rgb_formatHex() {
2951
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
2952
+ }
2953
+ function rgb_formatHex8() {
2954
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
2955
+ }
2956
+ function rgb_formatRgb() {
2957
+ const a = clampa(this.opacity);
2958
+ return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
2959
+ }
2960
+ function clampa(opacity) {
2961
+ return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
2962
+ }
2963
+ function clampi(value) {
2964
+ return Math.max(0, Math.min(255, Math.round(value) || 0));
2965
+ }
2966
+ function hex(value) {
2967
+ value = clampi(value);
2968
+ return (value < 16 ? "0" : "") + value.toString(16);
2969
+ }
2970
+ function hsla(h, s, l, a) {
2971
+ if (a <= 0) h = s = l = NaN;
2972
+ else if (l <= 0 || l >= 1) h = s = NaN;
2973
+ else if (s <= 0) h = NaN;
2974
+ return new Hsl(h, s, l, a);
2975
+ }
2976
+ function hslConvert(o) {
2977
+ if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2978
+ if (!(o instanceof Color)) o = color(o);
2979
+ if (!o) return new Hsl();
2980
+ if (o instanceof Hsl) return o;
2981
+ o = o.rgb();
2982
+ var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max3 = Math.max(r, g, b), h = NaN, s = max3 - min3, l = (max3 + min3) / 2;
2983
+ if (s) {
2984
+ if (r === max3) h = (g - b) / s + (g < b) * 6;
2985
+ else if (g === max3) h = (b - r) / s + 2;
2986
+ else h = (r - g) / s + 4;
2987
+ s /= l < 0.5 ? max3 + min3 : 2 - max3 - min3;
2988
+ h *= 60;
2989
+ } else {
2990
+ s = l > 0 && l < 1 ? 0 : h;
2991
+ }
2992
+ return new Hsl(h, s, l, o.opacity);
2993
+ }
2994
+ function hsl(h, s, l, opacity) {
2995
+ return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2996
+ }
2997
+ function Hsl(h, s, l, opacity) {
2998
+ this.h = +h;
2999
+ this.s = +s;
3000
+ this.l = +l;
3001
+ this.opacity = +opacity;
3002
+ }
3003
+ define_default(Hsl, hsl, extend(Color, {
3004
+ brighter(k) {
3005
+ k = k == null ? brighter : Math.pow(brighter, k);
3006
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
3007
+ },
3008
+ darker(k) {
3009
+ k = k == null ? darker : Math.pow(darker, k);
3010
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
3011
+ },
3012
+ rgb() {
3013
+ var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
3014
+ return new Rgb(
3015
+ hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
3016
+ hsl2rgb(h, m1, m2),
3017
+ hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
3018
+ this.opacity
3019
+ );
3020
+ },
3021
+ clamp() {
3022
+ return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
3023
+ },
3024
+ displayable() {
3025
+ return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
3026
+ },
3027
+ formatHsl() {
3028
+ const a = clampa(this.opacity);
3029
+ return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
3030
+ }
3031
+ }));
3032
+ function clamph(value) {
3033
+ value = (value || 0) % 360;
3034
+ return value < 0 ? value + 360 : value;
3035
+ }
3036
+ function clampt(value) {
3037
+ return Math.max(0, Math.min(1, value || 0));
3038
+ }
3039
+ function hsl2rgb(h, m1, m2) {
3040
+ return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
3041
+ }
3042
+
3043
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basis.js
3044
+ function basis(t12, v0, v1, v2, v3) {
3045
+ var t2 = t12 * t12, t3 = t2 * t12;
3046
+ return ((1 - 3 * t12 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t12 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
3047
+ }
3048
+ function basis_default(values) {
3049
+ var n = values.length - 1;
3050
+ return function(t) {
3051
+ var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
3052
+ return basis((t - i / n) * n, v0, v1, v2, v3);
3053
+ };
3054
+ }
3055
+
3056
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basisClosed.js
3057
+ function basisClosed_default(values) {
3058
+ var n = values.length;
3059
+ return function(t) {
3060
+ var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];
3061
+ return basis((t - i / n) * n, v0, v1, v2, v3);
3062
+ };
3063
+ }
3064
+
3065
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/constant.js
3066
+ var constant_default2 = (x2) => () => x2;
3067
+
3068
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/color.js
3069
+ function linear(a, d) {
3070
+ return function(t) {
3071
+ return a + t * d;
3072
+ };
3073
+ }
3074
+ function exponential(a, b, y2) {
3075
+ return a = Math.pow(a, y2), b = Math.pow(b, y2) - a, y2 = 1 / y2, function(t) {
3076
+ return Math.pow(a + t * b, y2);
3077
+ };
3078
+ }
3079
+ function gamma(y2) {
3080
+ return (y2 = +y2) === 1 ? nogamma : function(a, b) {
3081
+ return b - a ? exponential(a, b, y2) : constant_default2(isNaN(a) ? b : a);
3082
+ };
3083
+ }
3084
+ function nogamma(a, b) {
3085
+ var d = b - a;
3086
+ return d ? linear(a, d) : constant_default2(isNaN(a) ? b : a);
3087
+ }
3088
+
3089
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js
3090
+ var rgb_default = (function rgbGamma(y2) {
3091
+ var color2 = gamma(y2);
3092
+ function rgb2(start, end) {
3093
+ var r = color2((start = rgb(start)).r, (end = rgb(end)).r), g = color2(start.g, end.g), b = color2(start.b, end.b), opacity = nogamma(start.opacity, end.opacity);
3094
+ return function(t) {
3095
+ start.r = r(t);
3096
+ start.g = g(t);
3097
+ start.b = b(t);
3098
+ start.opacity = opacity(t);
3099
+ return start + "";
3100
+ };
3101
+ }
3102
+ rgb2.gamma = rgbGamma;
3103
+ return rgb2;
3104
+ })(1);
3105
+ function rgbSpline(spline) {
3106
+ return function(colors) {
3107
+ var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2;
3108
+ for (i = 0; i < n; ++i) {
3109
+ color2 = rgb(colors[i]);
3110
+ r[i] = color2.r || 0;
3111
+ g[i] = color2.g || 0;
3112
+ b[i] = color2.b || 0;
3113
+ }
3114
+ r = spline(r);
3115
+ g = spline(g);
3116
+ b = spline(b);
3117
+ color2.opacity = 1;
3118
+ return function(t) {
3119
+ color2.r = r(t);
3120
+ color2.g = g(t);
3121
+ color2.b = b(t);
3122
+ return color2 + "";
3123
+ };
3124
+ };
3125
+ }
3126
+ var rgbBasis = rgbSpline(basis_default);
3127
+ var rgbBasisClosed = rgbSpline(basisClosed_default);
3128
+
3129
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/numberArray.js
3130
+ function numberArray_default(a, b) {
3131
+ if (!b) b = [];
3132
+ var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i;
3133
+ return function(t) {
3134
+ for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;
3135
+ return c;
3136
+ };
3137
+ }
3138
+ function isNumberArray(x2) {
3139
+ return ArrayBuffer.isView(x2) && !(x2 instanceof DataView);
3140
+ }
3141
+
3142
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/array.js
3143
+ function genericArray(a, b) {
3144
+ var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x2 = new Array(na), c = new Array(nb), i;
3145
+ for (i = 0; i < na; ++i) x2[i] = value_default(a[i], b[i]);
3146
+ for (; i < nb; ++i) c[i] = b[i];
3147
+ return function(t) {
3148
+ for (i = 0; i < na; ++i) c[i] = x2[i](t);
3149
+ return c;
3150
+ };
3151
+ }
3152
+
3153
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/date.js
3154
+ function date_default(a, b) {
3155
+ var d = /* @__PURE__ */ new Date();
3156
+ return a = +a, b = +b, function(t) {
3157
+ return d.setTime(a * (1 - t) + b * t), d;
3158
+ };
3159
+ }
3160
+
3161
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/number.js
3162
+ function number_default(a, b) {
3163
+ return a = +a, b = +b, function(t) {
3164
+ return a * (1 - t) + b * t;
3165
+ };
3166
+ }
3167
+
3168
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/object.js
3169
+ function object_default(a, b) {
3170
+ var i = {}, c = {}, k;
3171
+ if (a === null || typeof a !== "object") a = {};
3172
+ if (b === null || typeof b !== "object") b = {};
3173
+ for (k in b) {
3174
+ if (k in a) {
3175
+ i[k] = value_default(a[k], b[k]);
3176
+ } else {
3177
+ c[k] = b[k];
3178
+ }
3179
+ }
3180
+ return function(t) {
3181
+ for (k in i) c[k] = i[k](t);
3182
+ return c;
3183
+ };
3184
+ }
3185
+
3186
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js
3187
+ var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
3188
+ var reB = new RegExp(reA.source, "g");
3189
+ function zero2(b) {
3190
+ return function() {
3191
+ return b;
3192
+ };
3193
+ }
3194
+ function one(b) {
3195
+ return function(t) {
3196
+ return b(t) + "";
3197
+ };
3198
+ }
3199
+ function string_default(a, b) {
3200
+ var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
3201
+ a = a + "", b = b + "";
3202
+ while ((am = reA.exec(a)) && (bm = reB.exec(b))) {
3203
+ if ((bs = bm.index) > bi) {
3204
+ bs = b.slice(bi, bs);
3205
+ if (s[i]) s[i] += bs;
3206
+ else s[++i] = bs;
3207
+ }
3208
+ if ((am = am[0]) === (bm = bm[0])) {
3209
+ if (s[i]) s[i] += bm;
3210
+ else s[++i] = bm;
3211
+ } else {
3212
+ s[++i] = null;
3213
+ q.push({ i, x: number_default(am, bm) });
3214
+ }
3215
+ bi = reB.lastIndex;
3216
+ }
3217
+ if (bi < b.length) {
3218
+ bs = b.slice(bi);
3219
+ if (s[i]) s[i] += bs;
3220
+ else s[++i] = bs;
3221
+ }
3222
+ return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) {
3223
+ for (var i2 = 0, o; i2 < b; ++i2) s[(o = q[i2]).i] = o.x(t);
3224
+ return s.join("");
3225
+ });
3226
+ }
3227
+
3228
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/value.js
3229
+ function value_default(a, b) {
3230
+ var t = typeof b, c;
3231
+ return b == null || t === "boolean" ? constant_default2(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b);
3232
+ }
3233
+
3234
+ // ../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/round.js
3235
+ function round_default(a, b) {
3236
+ return a = +a, b = +b, function(t) {
3237
+ return Math.round(a * (1 - t) + b * t);
3238
+ };
3239
+ }
3240
+
3241
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/constant.js
3242
+ function constants(x2) {
3243
+ return function() {
3244
+ return x2;
3245
+ };
3246
+ }
3247
+
3248
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/number.js
3249
+ function number2(x2) {
3250
+ return +x2;
3251
+ }
3252
+
3253
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/continuous.js
3254
+ var unit = [0, 1];
3255
+ function identity(x2) {
3256
+ return x2;
3257
+ }
3258
+ function normalize(a, b) {
3259
+ return (b -= a = +a) ? function(x2) {
3260
+ return (x2 - a) / b;
3261
+ } : constants(isNaN(b) ? NaN : 0.5);
3262
+ }
3263
+ function clamper(a, b) {
3264
+ var t;
3265
+ if (a > b) t = a, a = b, b = t;
3266
+ return function(x2) {
3267
+ return Math.max(a, Math.min(b, x2));
3268
+ };
3269
+ }
3270
+ function bimap(domain, range2, interpolate) {
3271
+ var d0 = domain[0], d1 = domain[1], r0 = range2[0], r1 = range2[1];
3272
+ if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
3273
+ else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
3274
+ return function(x2) {
3275
+ return r0(d0(x2));
3276
+ };
3277
+ }
3278
+ function polymap(domain, range2, interpolate) {
3279
+ var j = Math.min(domain.length, range2.length) - 1, d = new Array(j), r = new Array(j), i = -1;
3280
+ if (domain[j] < domain[0]) {
3281
+ domain = domain.slice().reverse();
3282
+ range2 = range2.slice().reverse();
3283
+ }
3284
+ while (++i < j) {
3285
+ d[i] = normalize(domain[i], domain[i + 1]);
3286
+ r[i] = interpolate(range2[i], range2[i + 1]);
3287
+ }
3288
+ return function(x2) {
3289
+ var i2 = bisect_default(domain, x2, 1, j) - 1;
3290
+ return r[i2](d[i2](x2));
3291
+ };
3292
+ }
3293
+ function copy(source, target) {
3294
+ return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
3295
+ }
3296
+ function transformer() {
3297
+ var domain = unit, range2 = unit, interpolate = value_default, transform, untransform, unknown, clamp = identity, piecewise, output, input;
3298
+ function rescale() {
3299
+ var n = Math.min(domain.length, range2.length);
3300
+ if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);
3301
+ piecewise = n > 2 ? polymap : bimap;
3302
+ output = input = null;
3303
+ return scale;
3304
+ }
3305
+ function scale(x2) {
3306
+ return x2 == null || isNaN(x2 = +x2) ? unknown : (output || (output = piecewise(domain.map(transform), range2, interpolate)))(transform(clamp(x2)));
3307
+ }
3308
+ scale.invert = function(y2) {
3309
+ return clamp(untransform((input || (input = piecewise(range2, domain.map(transform), number_default)))(y2)));
3310
+ };
3311
+ scale.domain = function(_) {
3312
+ return arguments.length ? (domain = Array.from(_, number2), rescale()) : domain.slice();
3313
+ };
3314
+ scale.range = function(_) {
3315
+ return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();
3316
+ };
3317
+ scale.rangeRound = function(_) {
3318
+ return range2 = Array.from(_), interpolate = round_default, rescale();
3319
+ };
3320
+ scale.clamp = function(_) {
3321
+ return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;
3322
+ };
3323
+ scale.interpolate = function(_) {
3324
+ return arguments.length ? (interpolate = _, rescale()) : interpolate;
3325
+ };
3326
+ scale.unknown = function(_) {
3327
+ return arguments.length ? (unknown = _, scale) : unknown;
3328
+ };
3329
+ return function(t, u) {
3330
+ transform = t, untransform = u;
3331
+ return rescale();
3332
+ };
3333
+ }
3334
+ function continuous() {
3335
+ return transformer()(identity, identity);
3336
+ }
3337
+
3338
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatDecimal.js
3339
+ function formatDecimal_default(x2) {
3340
+ return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString("en").replace(/,/g, "") : x2.toString(10);
3341
+ }
3342
+ function formatDecimalParts(x2, p) {
3343
+ if (!isFinite(x2) || x2 === 0) return null;
3344
+ var i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf("e"), coefficient = x2.slice(0, i);
3345
+ return [
3346
+ coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
3347
+ +x2.slice(i + 1)
3348
+ ];
3349
+ }
3350
+
3351
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/exponent.js
3352
+ function exponent_default(x2) {
3353
+ return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN;
3354
+ }
3355
+
3356
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatGroup.js
3357
+ function formatGroup_default(grouping, thousands) {
3358
+ return function(value, width) {
3359
+ var i = value.length, t = [], j = 0, g = grouping[0], length = 0;
3360
+ while (i > 0 && g > 0) {
3361
+ if (length + g + 1 > width) g = Math.max(1, width - length);
3362
+ t.push(value.substring(i -= g, i + g));
3363
+ if ((length += g + 1) > width) break;
3364
+ g = grouping[j = (j + 1) % grouping.length];
3365
+ }
3366
+ return t.reverse().join(thousands);
3367
+ };
3368
+ }
3369
+
3370
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatNumerals.js
3371
+ function formatNumerals_default(numerals) {
3372
+ return function(value) {
3373
+ return value.replace(/[0-9]/g, function(i) {
3374
+ return numerals[+i];
3375
+ });
3376
+ };
3377
+ }
3378
+
3379
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatSpecifier.js
3380
+ var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
3381
+ function formatSpecifier(specifier) {
3382
+ if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
3383
+ var match;
3384
+ return new FormatSpecifier({
3385
+ fill: match[1],
3386
+ align: match[2],
3387
+ sign: match[3],
3388
+ symbol: match[4],
3389
+ zero: match[5],
3390
+ width: match[6],
3391
+ comma: match[7],
3392
+ precision: match[8] && match[8].slice(1),
3393
+ trim: match[9],
3394
+ type: match[10]
3395
+ });
3396
+ }
3397
+ formatSpecifier.prototype = FormatSpecifier.prototype;
3398
+ function FormatSpecifier(specifier) {
3399
+ this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
3400
+ this.align = specifier.align === void 0 ? ">" : specifier.align + "";
3401
+ this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
3402
+ this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
3403
+ this.zero = !!specifier.zero;
3404
+ this.width = specifier.width === void 0 ? void 0 : +specifier.width;
3405
+ this.comma = !!specifier.comma;
3406
+ this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
3407
+ this.trim = !!specifier.trim;
3408
+ this.type = specifier.type === void 0 ? "" : specifier.type + "";
3409
+ }
3410
+ FormatSpecifier.prototype.toString = function() {
3411
+ return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
3412
+ };
3413
+
3414
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTrim.js
3415
+ function formatTrim_default(s) {
3416
+ out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
3417
+ switch (s[i]) {
3418
+ case ".":
3419
+ i0 = i1 = i;
3420
+ break;
3421
+ case "0":
3422
+ if (i0 === 0) i0 = i;
3423
+ i1 = i;
3424
+ break;
3425
+ default:
3426
+ if (!+s[i]) break out;
3427
+ if (i0 > 0) i0 = 0;
3428
+ break;
3429
+ }
3430
+ }
3431
+ return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
3432
+ }
3433
+
3434
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatPrefixAuto.js
3435
+ var prefixExponent;
3436
+ function formatPrefixAuto_default(x2, p) {
3437
+ var d = formatDecimalParts(x2, p);
3438
+ if (!d) return prefixExponent = void 0, x2.toPrecision(p);
3439
+ var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;
3440
+ return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x2, Math.max(0, p + i - 1))[0];
3441
+ }
3442
+
3443
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatRounded.js
3444
+ function formatRounded_default(x2, p) {
3445
+ var d = formatDecimalParts(x2, p);
3446
+ if (!d) return x2 + "";
3447
+ var coefficient = d[0], exponent = d[1];
3448
+ return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
3449
+ }
3450
+
3451
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTypes.js
3452
+ var formatTypes_default = {
3453
+ "%": (x2, p) => (x2 * 100).toFixed(p),
3454
+ "b": (x2) => Math.round(x2).toString(2),
3455
+ "c": (x2) => x2 + "",
3456
+ "d": formatDecimal_default,
3457
+ "e": (x2, p) => x2.toExponential(p),
3458
+ "f": (x2, p) => x2.toFixed(p),
3459
+ "g": (x2, p) => x2.toPrecision(p),
3460
+ "o": (x2) => Math.round(x2).toString(8),
3461
+ "p": (x2, p) => formatRounded_default(x2 * 100, p),
3462
+ "r": formatRounded_default,
3463
+ "s": formatPrefixAuto_default,
3464
+ "X": (x2) => Math.round(x2).toString(16).toUpperCase(),
3465
+ "x": (x2) => Math.round(x2).toString(16)
3466
+ };
3467
+
3468
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/identity.js
3469
+ function identity_default2(x2) {
3470
+ return x2;
3471
+ }
3472
+
3473
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/locale.js
3474
+ var map = Array.prototype.map;
3475
+ var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
3476
+ function locale_default(locale3) {
3477
+ var group = locale3.grouping === void 0 || locale3.thousands === void 0 ? identity_default2 : formatGroup_default(map.call(locale3.grouping, Number), locale3.thousands + ""), currencyPrefix = locale3.currency === void 0 ? "" : locale3.currency[0] + "", currencySuffix = locale3.currency === void 0 ? "" : locale3.currency[1] + "", decimal = locale3.decimal === void 0 ? "." : locale3.decimal + "", numerals = locale3.numerals === void 0 ? identity_default2 : formatNumerals_default(map.call(locale3.numerals, String)), percent = locale3.percent === void 0 ? "%" : locale3.percent + "", minus = locale3.minus === void 0 ? "\u2212" : locale3.minus + "", nan = locale3.nan === void 0 ? "NaN" : locale3.nan + "";
3478
+ function newFormat(specifier, options) {
3479
+ specifier = formatSpecifier(specifier);
3480
+ var fill = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;
3481
+ if (type === "n") comma = true, type = "g";
3482
+ else if (!formatTypes_default[type]) precision === void 0 && (precision = 12), trim = true, type = "g";
3483
+ if (zero3 || fill === "0" && align === "=") zero3 = true, fill = "0", align = "=";
3484
+ var prefix = (options && options.prefix !== void 0 ? options.prefix : "") + (symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : ""), suffix = (symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : "") + (options && options.suffix !== void 0 ? options.suffix : "");
3485
+ var formatType = formatTypes_default[type], maybeSuffix = /[defgprs%]/.test(type);
3486
+ precision = precision === void 0 ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
3487
+ function format2(value) {
3488
+ var valuePrefix = prefix, valueSuffix = suffix, i, n, c;
3489
+ if (type === "c") {
3490
+ valueSuffix = formatType(value) + valueSuffix;
3491
+ value = "";
3492
+ } else {
3493
+ value = +value;
3494
+ var valueNegative = value < 0 || 1 / value < 0;
3495
+ value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
3496
+ if (trim) value = formatTrim_default(value);
3497
+ if (valueNegative && +value === 0 && sign2 !== "+") valueNegative = false;
3498
+ valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix;
3499
+ valueSuffix = (type === "s" && !isNaN(value) && prefixExponent !== void 0 ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : "");
3500
+ if (maybeSuffix) {
3501
+ i = -1, n = value.length;
3502
+ while (++i < n) {
3503
+ if (c = value.charCodeAt(i), 48 > c || c > 57) {
3504
+ valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
3505
+ value = value.slice(0, i);
3506
+ break;
3507
+ }
3508
+ }
3509
+ }
3510
+ }
3511
+ if (comma && !zero3) value = group(value, Infinity);
3512
+ var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
3513
+ if (comma && zero3) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
3514
+ switch (align) {
3515
+ case "<":
3516
+ value = valuePrefix + value + valueSuffix + padding;
3517
+ break;
3518
+ case "=":
3519
+ value = valuePrefix + padding + value + valueSuffix;
3520
+ break;
3521
+ case "^":
3522
+ value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
3523
+ break;
3524
+ default:
3525
+ value = padding + valuePrefix + value + valueSuffix;
3526
+ break;
3527
+ }
3528
+ return numerals(value);
3529
+ }
3530
+ format2.toString = function() {
3531
+ return specifier + "";
3532
+ };
3533
+ return format2;
3534
+ }
3535
+ function formatPrefix2(specifier, value) {
3536
+ var e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier), { suffix: prefixes[8 + e / 3] });
3537
+ return function(value2) {
3538
+ return f(k * value2);
3539
+ };
3540
+ }
3541
+ return {
3542
+ format: newFormat,
3543
+ formatPrefix: formatPrefix2
3544
+ };
3545
+ }
3546
+
3547
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/defaultLocale.js
3548
+ var locale;
3549
+ var format;
3550
+ var formatPrefix;
3551
+ defaultLocale({
3552
+ thousands: ",",
3553
+ grouping: [3],
3554
+ currency: ["$", ""]
3555
+ });
3556
+ function defaultLocale(definition) {
3557
+ locale = locale_default(definition);
3558
+ format = locale.format;
3559
+ formatPrefix = locale.formatPrefix;
3560
+ return locale;
3561
+ }
3562
+
3563
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionFixed.js
3564
+ function precisionFixed_default(step) {
3565
+ return Math.max(0, -exponent_default(Math.abs(step)));
3566
+ }
3567
+
3568
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionPrefix.js
3569
+ function precisionPrefix_default(step, value) {
3570
+ return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
3571
+ }
3572
+
3573
+ // ../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionRound.js
3574
+ function precisionRound_default(step, max3) {
3575
+ step = Math.abs(step), max3 = Math.abs(max3) - step;
3576
+ return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1;
3577
+ }
3578
+
3579
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/tickFormat.js
3580
+ function tickFormat(start, stop, count, specifier) {
3581
+ var step = tickStep(start, stop, count), precision;
3582
+ specifier = formatSpecifier(specifier == null ? ",f" : specifier);
3583
+ switch (specifier.type) {
3584
+ case "s": {
3585
+ var value = Math.max(Math.abs(start), Math.abs(stop));
3586
+ if (specifier.precision == null && !isNaN(precision = precisionPrefix_default(step, value))) specifier.precision = precision;
3587
+ return formatPrefix(specifier, value);
3588
+ }
3589
+ case "":
3590
+ case "e":
3591
+ case "g":
3592
+ case "p":
3593
+ case "r": {
3594
+ if (specifier.precision == null && !isNaN(precision = precisionRound_default(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
3595
+ break;
3596
+ }
3597
+ case "f":
3598
+ case "%": {
3599
+ if (specifier.precision == null && !isNaN(precision = precisionFixed_default(step))) specifier.precision = precision - (specifier.type === "%") * 2;
3600
+ break;
3601
+ }
3602
+ }
3603
+ return format(specifier);
3604
+ }
3605
+
3606
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js
3607
+ function linearish(scale) {
3608
+ var domain = scale.domain;
3609
+ scale.ticks = function(count) {
3610
+ var d = domain();
3611
+ return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
3612
+ };
3613
+ scale.tickFormat = function(count, specifier) {
3614
+ var d = domain();
3615
+ return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
3616
+ };
3617
+ scale.nice = function(count) {
3618
+ if (count == null) count = 10;
3619
+ var d = domain();
3620
+ var i0 = 0;
3621
+ var i1 = d.length - 1;
3622
+ var start = d[i0];
3623
+ var stop = d[i1];
3624
+ var prestep;
3625
+ var step;
3626
+ var maxIter = 10;
3627
+ if (stop < start) {
3628
+ step = start, start = stop, stop = step;
3629
+ step = i0, i0 = i1, i1 = step;
3630
+ }
3631
+ while (maxIter-- > 0) {
3632
+ step = tickIncrement(start, stop, count);
3633
+ if (step === prestep) {
3634
+ d[i0] = start;
3635
+ d[i1] = stop;
3636
+ return domain(d);
3637
+ } else if (step > 0) {
3638
+ start = Math.floor(start / step) * step;
3639
+ stop = Math.ceil(stop / step) * step;
3640
+ } else if (step < 0) {
3641
+ start = Math.ceil(start * step) / step;
3642
+ stop = Math.floor(stop * step) / step;
3643
+ } else {
3644
+ break;
3645
+ }
3646
+ prestep = step;
3647
+ }
3648
+ return scale;
3649
+ };
3650
+ return scale;
3651
+ }
3652
+ function linear2() {
3653
+ var scale = continuous();
3654
+ scale.copy = function() {
3655
+ return copy(scale, linear2());
3656
+ };
3657
+ initRange.apply(scale, arguments);
3658
+ return linearish(scale);
3659
+ }
3660
+
3661
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/nice.js
3662
+ function nice(domain, interval) {
3663
+ domain = domain.slice();
3664
+ var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], t;
3665
+ if (x1 < x0) {
3666
+ t = i0, i0 = i1, i1 = t;
3667
+ t = x0, x0 = x1, x1 = t;
3668
+ }
3669
+ domain[i0] = interval.floor(x0);
3670
+ domain[i1] = interval.ceil(x1);
3671
+ return domain;
3672
+ }
3673
+
3674
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/log.js
3675
+ function transformLog(x2) {
3676
+ return Math.log(x2);
3677
+ }
3678
+ function transformExp(x2) {
3679
+ return Math.exp(x2);
3680
+ }
3681
+ function transformLogn(x2) {
3682
+ return -Math.log(-x2);
3683
+ }
3684
+ function transformExpn(x2) {
3685
+ return -Math.exp(-x2);
3686
+ }
3687
+ function pow10(x2) {
3688
+ return isFinite(x2) ? +("1e" + x2) : x2 < 0 ? 0 : x2;
3689
+ }
3690
+ function powp(base) {
3691
+ return base === 10 ? pow10 : base === Math.E ? Math.exp : (x2) => Math.pow(base, x2);
3692
+ }
3693
+ function logp(base) {
3694
+ return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 || (base = Math.log(base), (x2) => Math.log(x2) / base);
3695
+ }
3696
+ function reflect(f) {
3697
+ return (x2, k) => -f(-x2, k);
3698
+ }
3699
+ function loggish(transform) {
3700
+ const scale = transform(transformLog, transformExp);
3701
+ const domain = scale.domain;
3702
+ let base = 10;
3703
+ let logs;
3704
+ let pows;
3705
+ function rescale() {
3706
+ logs = logp(base), pows = powp(base);
3707
+ if (domain()[0] < 0) {
3708
+ logs = reflect(logs), pows = reflect(pows);
3709
+ transform(transformLogn, transformExpn);
3710
+ } else {
3711
+ transform(transformLog, transformExp);
3712
+ }
3713
+ return scale;
3714
+ }
3715
+ scale.base = function(_) {
3716
+ return arguments.length ? (base = +_, rescale()) : base;
3717
+ };
3718
+ scale.domain = function(_) {
3719
+ return arguments.length ? (domain(_), rescale()) : domain();
3720
+ };
3721
+ scale.ticks = (count) => {
3722
+ const d = domain();
3723
+ let u = d[0];
3724
+ let v = d[d.length - 1];
3725
+ const r = v < u;
3726
+ if (r) [u, v] = [v, u];
3727
+ let i = logs(u);
3728
+ let j = logs(v);
3729
+ let k;
3730
+ let t;
3731
+ const n = count == null ? 10 : +count;
3732
+ let z = [];
3733
+ if (!(base % 1) && j - i < n) {
3734
+ i = Math.floor(i), j = Math.ceil(j);
3735
+ if (u > 0) for (; i <= j; ++i) {
3736
+ for (k = 1; k < base; ++k) {
3737
+ t = i < 0 ? k / pows(-i) : k * pows(i);
3738
+ if (t < u) continue;
3739
+ if (t > v) break;
3740
+ z.push(t);
3741
+ }
3742
+ }
3743
+ else for (; i <= j; ++i) {
3744
+ for (k = base - 1; k >= 1; --k) {
3745
+ t = i > 0 ? k / pows(-i) : k * pows(i);
3746
+ if (t < u) continue;
3747
+ if (t > v) break;
3748
+ z.push(t);
3749
+ }
3750
+ }
3751
+ if (z.length * 2 < n) z = ticks(u, v, n);
3752
+ } else {
3753
+ z = ticks(i, j, Math.min(j - i, n)).map(pows);
3754
+ }
3755
+ return r ? z.reverse() : z;
3756
+ };
3757
+ scale.tickFormat = (count, specifier) => {
3758
+ if (count == null) count = 10;
3759
+ if (specifier == null) specifier = base === 10 ? "s" : ",";
3760
+ if (typeof specifier !== "function") {
3761
+ if (!(base % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true;
3762
+ specifier = format(specifier);
3763
+ }
3764
+ if (count === Infinity) return specifier;
3765
+ const k = Math.max(1, base * count / scale.ticks().length);
3766
+ return (d) => {
3767
+ let i = d / pows(Math.round(logs(d)));
3768
+ if (i * base < base - 0.5) i *= base;
3769
+ return i <= k ? specifier(d) : "";
3770
+ };
3771
+ };
3772
+ scale.nice = () => {
3773
+ return domain(nice(domain(), {
3774
+ floor: (x2) => pows(Math.floor(logs(x2))),
3775
+ ceil: (x2) => pows(Math.ceil(logs(x2)))
3776
+ }));
3777
+ };
3778
+ return scale;
3779
+ }
3780
+ function log() {
3781
+ const scale = loggish(transformer()).domain([1, 10]);
3782
+ scale.copy = () => copy(scale, log()).base(scale.base());
3783
+ initRange.apply(scale, arguments);
3784
+ return scale;
3785
+ }
3786
+
3787
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/pow.js
3788
+ function transformPow(exponent) {
3789
+ return function(x2) {
3790
+ return x2 < 0 ? -Math.pow(-x2, exponent) : Math.pow(x2, exponent);
3791
+ };
3792
+ }
3793
+ function transformSqrt(x2) {
3794
+ return x2 < 0 ? -Math.sqrt(-x2) : Math.sqrt(x2);
3795
+ }
3796
+ function transformSquare(x2) {
3797
+ return x2 < 0 ? -x2 * x2 : x2 * x2;
3798
+ }
3799
+ function powish(transform) {
3800
+ var scale = transform(identity, identity), exponent = 1;
3801
+ function rescale() {
3802
+ return exponent === 1 ? transform(identity, identity) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent));
3803
+ }
3804
+ scale.exponent = function(_) {
3805
+ return arguments.length ? (exponent = +_, rescale()) : exponent;
3806
+ };
3807
+ return linearish(scale);
3808
+ }
3809
+ function pow() {
3810
+ var scale = powish(transformer());
3811
+ scale.copy = function() {
3812
+ return copy(scale, pow()).exponent(scale.exponent());
3813
+ };
3814
+ initRange.apply(scale, arguments);
3815
+ return scale;
3816
+ }
3817
+ function sqrt2() {
3818
+ return pow.apply(null, arguments).exponent(0.5);
3819
+ }
3820
+
3821
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/interval.js
3822
+ var t0 = /* @__PURE__ */ new Date();
3823
+ var t1 = /* @__PURE__ */ new Date();
3824
+ function timeInterval(floori, offseti, count, field) {
3825
+ function interval(date2) {
3826
+ return floori(date2 = arguments.length === 0 ? /* @__PURE__ */ new Date() : /* @__PURE__ */ new Date(+date2)), date2;
3827
+ }
3828
+ interval.floor = (date2) => {
3829
+ return floori(date2 = /* @__PURE__ */ new Date(+date2)), date2;
3830
+ };
3831
+ interval.ceil = (date2) => {
3832
+ return floori(date2 = new Date(date2 - 1)), offseti(date2, 1), floori(date2), date2;
3833
+ };
3834
+ interval.round = (date2) => {
3835
+ const d0 = interval(date2), d1 = interval.ceil(date2);
3836
+ return date2 - d0 < d1 - date2 ? d0 : d1;
3837
+ };
3838
+ interval.offset = (date2, step) => {
3839
+ return offseti(date2 = /* @__PURE__ */ new Date(+date2), step == null ? 1 : Math.floor(step)), date2;
3840
+ };
3841
+ interval.range = (start, stop, step) => {
3842
+ const range2 = [];
3843
+ start = interval.ceil(start);
3844
+ step = step == null ? 1 : Math.floor(step);
3845
+ if (!(start < stop) || !(step > 0)) return range2;
3846
+ let previous;
3847
+ do
3848
+ range2.push(previous = /* @__PURE__ */ new Date(+start)), offseti(start, step), floori(start);
3849
+ while (previous < start && start < stop);
3850
+ return range2;
3851
+ };
3852
+ interval.filter = (test) => {
3853
+ return timeInterval((date2) => {
3854
+ if (date2 >= date2) while (floori(date2), !test(date2)) date2.setTime(date2 - 1);
3855
+ }, (date2, step) => {
3856
+ if (date2 >= date2) {
3857
+ if (step < 0) while (++step <= 0) {
3858
+ while (offseti(date2, -1), !test(date2)) {
3859
+ }
3860
+ }
3861
+ else while (--step >= 0) {
3862
+ while (offseti(date2, 1), !test(date2)) {
3863
+ }
3864
+ }
3865
+ }
3866
+ });
3867
+ };
3868
+ if (count) {
3869
+ interval.count = (start, end) => {
3870
+ t0.setTime(+start), t1.setTime(+end);
3871
+ floori(t0), floori(t1);
3872
+ return Math.floor(count(t0, t1));
3873
+ };
3874
+ interval.every = (step) => {
3875
+ step = Math.floor(step);
3876
+ return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? (d) => field(d) % step === 0 : (d) => interval.count(0, d) % step === 0);
3877
+ };
3878
+ }
3879
+ return interval;
3880
+ }
3881
+
3882
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/millisecond.js
3883
+ var millisecond = timeInterval(() => {
3884
+ }, (date2, step) => {
3885
+ date2.setTime(+date2 + step);
3886
+ }, (start, end) => {
3887
+ return end - start;
3888
+ });
3889
+ millisecond.every = (k) => {
3890
+ k = Math.floor(k);
3891
+ if (!isFinite(k) || !(k > 0)) return null;
3892
+ if (!(k > 1)) return millisecond;
3893
+ return timeInterval((date2) => {
3894
+ date2.setTime(Math.floor(date2 / k) * k);
3895
+ }, (date2, step) => {
3896
+ date2.setTime(+date2 + step * k);
3897
+ }, (start, end) => {
3898
+ return (end - start) / k;
3899
+ });
3900
+ };
3901
+ var milliseconds = millisecond.range;
3902
+
3903
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/duration.js
3904
+ var durationSecond = 1e3;
3905
+ var durationMinute = durationSecond * 60;
3906
+ var durationHour = durationMinute * 60;
3907
+ var durationDay = durationHour * 24;
3908
+ var durationWeek = durationDay * 7;
3909
+ var durationMonth = durationDay * 30;
3910
+ var durationYear = durationDay * 365;
3911
+
3912
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/second.js
3913
+ var second = timeInterval((date2) => {
3914
+ date2.setTime(date2 - date2.getMilliseconds());
3915
+ }, (date2, step) => {
3916
+ date2.setTime(+date2 + step * durationSecond);
3917
+ }, (start, end) => {
3918
+ return (end - start) / durationSecond;
3919
+ }, (date2) => {
3920
+ return date2.getUTCSeconds();
3921
+ });
3922
+ var seconds = second.range;
3923
+
3924
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/minute.js
3925
+ var timeMinute = timeInterval((date2) => {
3926
+ date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond);
3927
+ }, (date2, step) => {
3928
+ date2.setTime(+date2 + step * durationMinute);
3929
+ }, (start, end) => {
3930
+ return (end - start) / durationMinute;
3931
+ }, (date2) => {
3932
+ return date2.getMinutes();
3933
+ });
3934
+ var timeMinutes = timeMinute.range;
3935
+ var utcMinute = timeInterval((date2) => {
3936
+ date2.setUTCSeconds(0, 0);
3937
+ }, (date2, step) => {
3938
+ date2.setTime(+date2 + step * durationMinute);
3939
+ }, (start, end) => {
3940
+ return (end - start) / durationMinute;
3941
+ }, (date2) => {
3942
+ return date2.getUTCMinutes();
3943
+ });
3944
+ var utcMinutes = utcMinute.range;
3945
+
3946
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/hour.js
3947
+ var timeHour = timeInterval((date2) => {
3948
+ date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond - date2.getMinutes() * durationMinute);
3949
+ }, (date2, step) => {
3950
+ date2.setTime(+date2 + step * durationHour);
3951
+ }, (start, end) => {
3952
+ return (end - start) / durationHour;
3953
+ }, (date2) => {
3954
+ return date2.getHours();
3955
+ });
3956
+ var timeHours = timeHour.range;
3957
+ var utcHour = timeInterval((date2) => {
3958
+ date2.setUTCMinutes(0, 0, 0);
3959
+ }, (date2, step) => {
3960
+ date2.setTime(+date2 + step * durationHour);
3961
+ }, (start, end) => {
3962
+ return (end - start) / durationHour;
3963
+ }, (date2) => {
3964
+ return date2.getUTCHours();
3965
+ });
3966
+ var utcHours = utcHour.range;
3967
+
3968
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/day.js
3969
+ var timeDay = timeInterval(
3970
+ (date2) => date2.setHours(0, 0, 0, 0),
3971
+ (date2, step) => date2.setDate(date2.getDate() + step),
3972
+ (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,
3973
+ (date2) => date2.getDate() - 1
3974
+ );
3975
+ var timeDays = timeDay.range;
3976
+ var utcDay = timeInterval((date2) => {
3977
+ date2.setUTCHours(0, 0, 0, 0);
3978
+ }, (date2, step) => {
3979
+ date2.setUTCDate(date2.getUTCDate() + step);
3980
+ }, (start, end) => {
3981
+ return (end - start) / durationDay;
3982
+ }, (date2) => {
3983
+ return date2.getUTCDate() - 1;
3984
+ });
3985
+ var utcDays = utcDay.range;
3986
+ var unixDay = timeInterval((date2) => {
3987
+ date2.setUTCHours(0, 0, 0, 0);
3988
+ }, (date2, step) => {
3989
+ date2.setUTCDate(date2.getUTCDate() + step);
3990
+ }, (start, end) => {
3991
+ return (end - start) / durationDay;
3992
+ }, (date2) => {
3993
+ return Math.floor(date2 / durationDay);
3994
+ });
3995
+ var unixDays = unixDay.range;
3996
+
3997
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/week.js
3998
+ function timeWeekday(i) {
3999
+ return timeInterval((date2) => {
4000
+ date2.setDate(date2.getDate() - (date2.getDay() + 7 - i) % 7);
4001
+ date2.setHours(0, 0, 0, 0);
4002
+ }, (date2, step) => {
4003
+ date2.setDate(date2.getDate() + step * 7);
4004
+ }, (start, end) => {
4005
+ return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
4006
+ });
4007
+ }
4008
+ var timeSunday = timeWeekday(0);
4009
+ var timeMonday = timeWeekday(1);
4010
+ var timeTuesday = timeWeekday(2);
4011
+ var timeWednesday = timeWeekday(3);
4012
+ var timeThursday = timeWeekday(4);
4013
+ var timeFriday = timeWeekday(5);
4014
+ var timeSaturday = timeWeekday(6);
4015
+ var timeSundays = timeSunday.range;
4016
+ var timeMondays = timeMonday.range;
4017
+ var timeTuesdays = timeTuesday.range;
4018
+ var timeWednesdays = timeWednesday.range;
4019
+ var timeThursdays = timeThursday.range;
4020
+ var timeFridays = timeFriday.range;
4021
+ var timeSaturdays = timeSaturday.range;
4022
+ function utcWeekday(i) {
4023
+ return timeInterval((date2) => {
4024
+ date2.setUTCDate(date2.getUTCDate() - (date2.getUTCDay() + 7 - i) % 7);
4025
+ date2.setUTCHours(0, 0, 0, 0);
4026
+ }, (date2, step) => {
4027
+ date2.setUTCDate(date2.getUTCDate() + step * 7);
4028
+ }, (start, end) => {
4029
+ return (end - start) / durationWeek;
4030
+ });
4031
+ }
4032
+ var utcSunday = utcWeekday(0);
4033
+ var utcMonday = utcWeekday(1);
4034
+ var utcTuesday = utcWeekday(2);
4035
+ var utcWednesday = utcWeekday(3);
4036
+ var utcThursday = utcWeekday(4);
4037
+ var utcFriday = utcWeekday(5);
4038
+ var utcSaturday = utcWeekday(6);
4039
+ var utcSundays = utcSunday.range;
4040
+ var utcMondays = utcMonday.range;
4041
+ var utcTuesdays = utcTuesday.range;
4042
+ var utcWednesdays = utcWednesday.range;
4043
+ var utcThursdays = utcThursday.range;
4044
+ var utcFridays = utcFriday.range;
4045
+ var utcSaturdays = utcSaturday.range;
4046
+
4047
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/month.js
4048
+ var timeMonth = timeInterval((date2) => {
4049
+ date2.setDate(1);
4050
+ date2.setHours(0, 0, 0, 0);
4051
+ }, (date2, step) => {
4052
+ date2.setMonth(date2.getMonth() + step);
4053
+ }, (start, end) => {
4054
+ return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
4055
+ }, (date2) => {
4056
+ return date2.getMonth();
4057
+ });
4058
+ var timeMonths = timeMonth.range;
4059
+ var utcMonth = timeInterval((date2) => {
4060
+ date2.setUTCDate(1);
4061
+ date2.setUTCHours(0, 0, 0, 0);
4062
+ }, (date2, step) => {
4063
+ date2.setUTCMonth(date2.getUTCMonth() + step);
4064
+ }, (start, end) => {
4065
+ return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
4066
+ }, (date2) => {
4067
+ return date2.getUTCMonth();
4068
+ });
4069
+ var utcMonths = utcMonth.range;
4070
+
4071
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/year.js
4072
+ var timeYear = timeInterval((date2) => {
4073
+ date2.setMonth(0, 1);
4074
+ date2.setHours(0, 0, 0, 0);
4075
+ }, (date2, step) => {
4076
+ date2.setFullYear(date2.getFullYear() + step);
4077
+ }, (start, end) => {
4078
+ return end.getFullYear() - start.getFullYear();
4079
+ }, (date2) => {
4080
+ return date2.getFullYear();
4081
+ });
4082
+ timeYear.every = (k) => {
4083
+ return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date2) => {
4084
+ date2.setFullYear(Math.floor(date2.getFullYear() / k) * k);
4085
+ date2.setMonth(0, 1);
4086
+ date2.setHours(0, 0, 0, 0);
4087
+ }, (date2, step) => {
4088
+ date2.setFullYear(date2.getFullYear() + step * k);
4089
+ });
4090
+ };
4091
+ var timeYears = timeYear.range;
4092
+ var utcYear = timeInterval((date2) => {
4093
+ date2.setUTCMonth(0, 1);
4094
+ date2.setUTCHours(0, 0, 0, 0);
4095
+ }, (date2, step) => {
4096
+ date2.setUTCFullYear(date2.getUTCFullYear() + step);
4097
+ }, (start, end) => {
4098
+ return end.getUTCFullYear() - start.getUTCFullYear();
4099
+ }, (date2) => {
4100
+ return date2.getUTCFullYear();
4101
+ });
4102
+ utcYear.every = (k) => {
4103
+ return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date2) => {
4104
+ date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / k) * k);
4105
+ date2.setUTCMonth(0, 1);
4106
+ date2.setUTCHours(0, 0, 0, 0);
4107
+ }, (date2, step) => {
4108
+ date2.setUTCFullYear(date2.getUTCFullYear() + step * k);
4109
+ });
4110
+ };
4111
+ var utcYears = utcYear.range;
4112
+
4113
+ // ../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/ticks.js
4114
+ function ticker(year, month, week, day, hour, minute) {
4115
+ const tickIntervals = [
4116
+ [second, 1, durationSecond],
4117
+ [second, 5, 5 * durationSecond],
4118
+ [second, 15, 15 * durationSecond],
4119
+ [second, 30, 30 * durationSecond],
4120
+ [minute, 1, durationMinute],
4121
+ [minute, 5, 5 * durationMinute],
4122
+ [minute, 15, 15 * durationMinute],
4123
+ [minute, 30, 30 * durationMinute],
4124
+ [hour, 1, durationHour],
4125
+ [hour, 3, 3 * durationHour],
4126
+ [hour, 6, 6 * durationHour],
4127
+ [hour, 12, 12 * durationHour],
4128
+ [day, 1, durationDay],
4129
+ [day, 2, 2 * durationDay],
4130
+ [week, 1, durationWeek],
4131
+ [month, 1, durationMonth],
4132
+ [month, 3, 3 * durationMonth],
4133
+ [year, 1, durationYear]
4134
+ ];
4135
+ function ticks2(start, stop, count) {
4136
+ const reverse = stop < start;
4137
+ if (reverse) [start, stop] = [stop, start];
4138
+ const interval = count && typeof count.range === "function" ? count : tickInterval(start, stop, count);
4139
+ const ticks3 = interval ? interval.range(start, +stop + 1) : [];
4140
+ return reverse ? ticks3.reverse() : ticks3;
4141
+ }
4142
+ function tickInterval(start, stop, count) {
4143
+ const target = Math.abs(stop - start) / count;
4144
+ const i = bisector(([, , step2]) => step2).right(tickIntervals, target);
4145
+ if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));
4146
+ if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));
4147
+ const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
4148
+ return t.every(step);
4149
+ }
4150
+ return [ticks2, tickInterval];
4151
+ }
4152
+ var [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);
4153
+ var [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);
4154
+
4155
+ // ../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/locale.js
4156
+ function localDate(d) {
4157
+ if (0 <= d.y && d.y < 100) {
4158
+ var date2 = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
4159
+ date2.setFullYear(d.y);
4160
+ return date2;
4161
+ }
4162
+ return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
4163
+ }
4164
+ function utcDate(d) {
4165
+ if (0 <= d.y && d.y < 100) {
4166
+ var date2 = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
4167
+ date2.setUTCFullYear(d.y);
4168
+ return date2;
4169
+ }
4170
+ return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
4171
+ }
4172
+ function newDate(y2, m, d) {
4173
+ return { y: y2, m, d, H: 0, M: 0, S: 0, L: 0 };
4174
+ }
4175
+ function formatLocale(locale3) {
4176
+ var locale_dateTime = locale3.dateTime, locale_date = locale3.date, locale_time = locale3.time, locale_periods = locale3.periods, locale_weekdays = locale3.days, locale_shortWeekdays = locale3.shortDays, locale_months = locale3.months, locale_shortMonths = locale3.shortMonths;
4177
+ var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);
4178
+ var formats = {
4179
+ "a": formatShortWeekday,
4180
+ "A": formatWeekday,
4181
+ "b": formatShortMonth,
4182
+ "B": formatMonth,
4183
+ "c": null,
4184
+ "d": formatDayOfMonth,
4185
+ "e": formatDayOfMonth,
4186
+ "f": formatMicroseconds,
4187
+ "g": formatYearISO,
4188
+ "G": formatFullYearISO,
4189
+ "H": formatHour24,
4190
+ "I": formatHour12,
4191
+ "j": formatDayOfYear,
4192
+ "L": formatMilliseconds,
4193
+ "m": formatMonthNumber,
4194
+ "M": formatMinutes,
4195
+ "p": formatPeriod,
4196
+ "q": formatQuarter,
4197
+ "Q": formatUnixTimestamp,
4198
+ "s": formatUnixTimestampSeconds,
4199
+ "S": formatSeconds,
4200
+ "u": formatWeekdayNumberMonday,
4201
+ "U": formatWeekNumberSunday,
4202
+ "V": formatWeekNumberISO,
4203
+ "w": formatWeekdayNumberSunday,
4204
+ "W": formatWeekNumberMonday,
4205
+ "x": null,
4206
+ "X": null,
4207
+ "y": formatYear,
4208
+ "Y": formatFullYear,
4209
+ "Z": formatZone,
4210
+ "%": formatLiteralPercent
4211
+ };
4212
+ var utcFormats = {
4213
+ "a": formatUTCShortWeekday,
4214
+ "A": formatUTCWeekday,
4215
+ "b": formatUTCShortMonth,
4216
+ "B": formatUTCMonth,
4217
+ "c": null,
4218
+ "d": formatUTCDayOfMonth,
4219
+ "e": formatUTCDayOfMonth,
4220
+ "f": formatUTCMicroseconds,
4221
+ "g": formatUTCYearISO,
4222
+ "G": formatUTCFullYearISO,
4223
+ "H": formatUTCHour24,
4224
+ "I": formatUTCHour12,
4225
+ "j": formatUTCDayOfYear,
4226
+ "L": formatUTCMilliseconds,
4227
+ "m": formatUTCMonthNumber,
4228
+ "M": formatUTCMinutes,
4229
+ "p": formatUTCPeriod,
4230
+ "q": formatUTCQuarter,
4231
+ "Q": formatUnixTimestamp,
4232
+ "s": formatUnixTimestampSeconds,
4233
+ "S": formatUTCSeconds,
4234
+ "u": formatUTCWeekdayNumberMonday,
4235
+ "U": formatUTCWeekNumberSunday,
4236
+ "V": formatUTCWeekNumberISO,
4237
+ "w": formatUTCWeekdayNumberSunday,
4238
+ "W": formatUTCWeekNumberMonday,
4239
+ "x": null,
4240
+ "X": null,
4241
+ "y": formatUTCYear,
4242
+ "Y": formatUTCFullYear,
4243
+ "Z": formatUTCZone,
4244
+ "%": formatLiteralPercent
4245
+ };
4246
+ var parses = {
4247
+ "a": parseShortWeekday,
4248
+ "A": parseWeekday,
4249
+ "b": parseShortMonth,
4250
+ "B": parseMonth,
4251
+ "c": parseLocaleDateTime,
4252
+ "d": parseDayOfMonth,
4253
+ "e": parseDayOfMonth,
4254
+ "f": parseMicroseconds,
4255
+ "g": parseYear,
4256
+ "G": parseFullYear,
4257
+ "H": parseHour24,
4258
+ "I": parseHour24,
4259
+ "j": parseDayOfYear,
4260
+ "L": parseMilliseconds,
4261
+ "m": parseMonthNumber,
4262
+ "M": parseMinutes,
4263
+ "p": parsePeriod,
4264
+ "q": parseQuarter,
4265
+ "Q": parseUnixTimestamp,
4266
+ "s": parseUnixTimestampSeconds,
4267
+ "S": parseSeconds,
4268
+ "u": parseWeekdayNumberMonday,
4269
+ "U": parseWeekNumberSunday,
4270
+ "V": parseWeekNumberISO,
4271
+ "w": parseWeekdayNumberSunday,
4272
+ "W": parseWeekNumberMonday,
4273
+ "x": parseLocaleDate,
4274
+ "X": parseLocaleTime,
4275
+ "y": parseYear,
4276
+ "Y": parseFullYear,
4277
+ "Z": parseZone,
4278
+ "%": parseLiteralPercent
4279
+ };
4280
+ formats.x = newFormat(locale_date, formats);
4281
+ formats.X = newFormat(locale_time, formats);
4282
+ formats.c = newFormat(locale_dateTime, formats);
4283
+ utcFormats.x = newFormat(locale_date, utcFormats);
4284
+ utcFormats.X = newFormat(locale_time, utcFormats);
4285
+ utcFormats.c = newFormat(locale_dateTime, utcFormats);
4286
+ function newFormat(specifier, formats2) {
4287
+ return function(date2) {
4288
+ var string = [], i = -1, j = 0, n = specifier.length, c, pad2, format2;
4289
+ if (!(date2 instanceof Date)) date2 = /* @__PURE__ */ new Date(+date2);
4290
+ while (++i < n) {
4291
+ if (specifier.charCodeAt(i) === 37) {
4292
+ string.push(specifier.slice(j, i));
4293
+ if ((pad2 = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
4294
+ else pad2 = c === "e" ? " " : "0";
4295
+ if (format2 = formats2[c]) c = format2(date2, pad2);
4296
+ string.push(c);
4297
+ j = i + 1;
4298
+ }
4299
+ }
4300
+ string.push(specifier.slice(j, i));
4301
+ return string.join("");
4302
+ };
4303
+ }
4304
+ function newParse(specifier, Z) {
4305
+ return function(string) {
4306
+ var d = newDate(1900, void 0, 1), i = parseSpecifier(d, specifier, string += "", 0), week, day;
4307
+ if (i != string.length) return null;
4308
+ if ("Q" in d) return new Date(d.Q);
4309
+ if ("s" in d) return new Date(d.s * 1e3 + ("L" in d ? d.L : 0));
4310
+ if (Z && !("Z" in d)) d.Z = 0;
4311
+ if ("p" in d) d.H = d.H % 12 + d.p * 12;
4312
+ if (d.m === void 0) d.m = "q" in d ? d.q : 0;
4313
+ if ("V" in d) {
4314
+ if (d.V < 1 || d.V > 53) return null;
4315
+ if (!("w" in d)) d.w = 1;
4316
+ if ("Z" in d) {
4317
+ week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();
4318
+ week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);
4319
+ week = utcDay.offset(week, (d.V - 1) * 7);
4320
+ d.y = week.getUTCFullYear();
4321
+ d.m = week.getUTCMonth();
4322
+ d.d = week.getUTCDate() + (d.w + 6) % 7;
4323
+ } else {
4324
+ week = localDate(newDate(d.y, 0, 1)), day = week.getDay();
4325
+ week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);
4326
+ week = timeDay.offset(week, (d.V - 1) * 7);
4327
+ d.y = week.getFullYear();
4328
+ d.m = week.getMonth();
4329
+ d.d = week.getDate() + (d.w + 6) % 7;
4330
+ }
4331
+ } else if ("W" in d || "U" in d) {
4332
+ if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
4333
+ day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();
4334
+ d.m = 0;
4335
+ d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;
4336
+ }
4337
+ if ("Z" in d) {
4338
+ d.H += d.Z / 100 | 0;
4339
+ d.M += d.Z % 100;
4340
+ return utcDate(d);
4341
+ }
4342
+ return localDate(d);
1566
4343
  };
1567
- marks.push({
1568
- type: "arc",
1569
- path,
1570
- centroid: {
1571
- x: centroidResult[0] + centerX,
1572
- y: centroidResult[1] + centerY
1573
- },
1574
- center,
1575
- innerRadius,
1576
- outerRadius,
1577
- startAngle: arcDatum.startAngle,
1578
- endAngle: arcDatum.endAngle,
1579
- fill: color,
1580
- stroke: "#ffffff",
1581
- strokeWidth: 2,
1582
- data: slice.originalRow,
1583
- aria
1584
- });
1585
4344
  }
1586
- return marks;
1587
- }
1588
-
1589
- // src/charts/pie/labels.ts
1590
- import { estimateTextWidth as estimateTextWidth6, resolveCollisions as resolveCollisions5 } from "@opendata-ai/openchart-core";
1591
- var LABEL_FONT_SIZE5 = 10;
1592
- var LABEL_FONT_WEIGHT5 = 500;
1593
- var LEADER_LINE_OFFSET = 12;
1594
- function computePieLabels(marks, _chartArea, density = "auto", _textFill = "#333333") {
1595
- if (marks.length === 0) return [];
1596
- if (density === "none") return [];
1597
- const centerX = marks[0].center.x;
1598
- const centerY = marks[0].center.y;
1599
- const targetMarks = density === "endpoints" && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;
1600
- const candidates = [];
1601
- const targetMarkIndices = [];
1602
- for (let mi = 0; mi < targetMarks.length; mi++) {
1603
- const mark = targetMarks[mi];
1604
- const ariaLabel = mark.aria.label;
1605
- const firstColon = ariaLabel.indexOf(":");
1606
- const labelText = firstColon >= 0 ? ariaLabel.slice(0, firstColon).trim() : "";
1607
- if (!labelText) continue;
1608
- const textWidth = estimateTextWidth6(labelText, LABEL_FONT_SIZE5, LABEL_FONT_WEIGHT5);
1609
- const textHeight = LABEL_FONT_SIZE5 * 1.2;
1610
- const midAngle = (mark.startAngle + mark.endAngle) / 2;
1611
- const labelRadius = mark.outerRadius + LEADER_LINE_OFFSET;
1612
- const labelX = centerX + Math.sin(midAngle) * labelRadius;
1613
- const labelY = centerY - Math.cos(midAngle) * labelRadius;
1614
- const isRight = Math.sin(midAngle) > 0;
1615
- candidates.push({
1616
- text: labelText,
1617
- anchorX: isRight ? labelX : labelX - textWidth,
1618
- anchorY: labelY - textHeight / 2,
1619
- width: textWidth,
1620
- height: textHeight,
1621
- priority: "data",
1622
- style: {
1623
- fontFamily: "system-ui, -apple-system, sans-serif",
1624
- fontSize: LABEL_FONT_SIZE5,
1625
- fontWeight: LABEL_FONT_WEIGHT5,
1626
- fill: _textFill,
1627
- lineHeight: 1.2,
1628
- textAnchor: isRight ? "start" : "end",
1629
- dominantBaseline: "central"
4345
+ function parseSpecifier(d, specifier, string, j) {
4346
+ var i = 0, n = specifier.length, m = string.length, c, parse;
4347
+ while (i < n) {
4348
+ if (j >= m) return -1;
4349
+ c = specifier.charCodeAt(i++);
4350
+ if (c === 37) {
4351
+ c = specifier.charAt(i++);
4352
+ parse = parses[c in pads ? specifier.charAt(i++) : c];
4353
+ if (!parse || (j = parse(d, string, j)) < 0) return -1;
4354
+ } else if (c != string.charCodeAt(j++)) {
4355
+ return -1;
1630
4356
  }
1631
- });
1632
- targetMarkIndices.push(mi);
4357
+ }
4358
+ return j;
1633
4359
  }
1634
- if (candidates.length === 0) return [];
1635
- let resolved;
1636
- if (density === "all") {
1637
- resolved = candidates.map((c) => ({
1638
- text: c.text,
1639
- x: c.anchorX,
1640
- y: c.anchorY,
1641
- style: c.style,
1642
- visible: true
1643
- }));
1644
- } else {
1645
- resolved = resolveCollisions5(candidates);
4360
+ function parsePeriod(d, string, i) {
4361
+ var n = periodRe.exec(string.slice(i));
4362
+ return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
1646
4363
  }
1647
- for (let i = 0; i < resolved.length && i < targetMarks.length; i++) {
1648
- const label = resolved[i];
1649
- const mark = targetMarks[i];
1650
- if (label.visible) {
1651
- label.connector = {
1652
- from: { x: label.x, y: label.y },
1653
- to: { x: mark.centroid.x, y: mark.centroid.y },
1654
- stroke: _textFill,
1655
- style: "straight"
4364
+ function parseShortWeekday(d, string, i) {
4365
+ var n = shortWeekdayRe.exec(string.slice(i));
4366
+ return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
4367
+ }
4368
+ function parseWeekday(d, string, i) {
4369
+ var n = weekdayRe.exec(string.slice(i));
4370
+ return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
4371
+ }
4372
+ function parseShortMonth(d, string, i) {
4373
+ var n = shortMonthRe.exec(string.slice(i));
4374
+ return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
4375
+ }
4376
+ function parseMonth(d, string, i) {
4377
+ var n = monthRe.exec(string.slice(i));
4378
+ return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
4379
+ }
4380
+ function parseLocaleDateTime(d, string, i) {
4381
+ return parseSpecifier(d, locale_dateTime, string, i);
4382
+ }
4383
+ function parseLocaleDate(d, string, i) {
4384
+ return parseSpecifier(d, locale_date, string, i);
4385
+ }
4386
+ function parseLocaleTime(d, string, i) {
4387
+ return parseSpecifier(d, locale_time, string, i);
4388
+ }
4389
+ function formatShortWeekday(d) {
4390
+ return locale_shortWeekdays[d.getDay()];
4391
+ }
4392
+ function formatWeekday(d) {
4393
+ return locale_weekdays[d.getDay()];
4394
+ }
4395
+ function formatShortMonth(d) {
4396
+ return locale_shortMonths[d.getMonth()];
4397
+ }
4398
+ function formatMonth(d) {
4399
+ return locale_months[d.getMonth()];
4400
+ }
4401
+ function formatPeriod(d) {
4402
+ return locale_periods[+(d.getHours() >= 12)];
4403
+ }
4404
+ function formatQuarter(d) {
4405
+ return 1 + ~~(d.getMonth() / 3);
4406
+ }
4407
+ function formatUTCShortWeekday(d) {
4408
+ return locale_shortWeekdays[d.getUTCDay()];
4409
+ }
4410
+ function formatUTCWeekday(d) {
4411
+ return locale_weekdays[d.getUTCDay()];
4412
+ }
4413
+ function formatUTCShortMonth(d) {
4414
+ return locale_shortMonths[d.getUTCMonth()];
4415
+ }
4416
+ function formatUTCMonth(d) {
4417
+ return locale_months[d.getUTCMonth()];
4418
+ }
4419
+ function formatUTCPeriod(d) {
4420
+ return locale_periods[+(d.getUTCHours() >= 12)];
4421
+ }
4422
+ function formatUTCQuarter(d) {
4423
+ return 1 + ~~(d.getUTCMonth() / 3);
4424
+ }
4425
+ return {
4426
+ format: function(specifier) {
4427
+ var f = newFormat(specifier += "", formats);
4428
+ f.toString = function() {
4429
+ return specifier;
1656
4430
  };
4431
+ return f;
4432
+ },
4433
+ parse: function(specifier) {
4434
+ var p = newParse(specifier += "", false);
4435
+ p.toString = function() {
4436
+ return specifier;
4437
+ };
4438
+ return p;
4439
+ },
4440
+ utcFormat: function(specifier) {
4441
+ var f = newFormat(specifier += "", utcFormats);
4442
+ f.toString = function() {
4443
+ return specifier;
4444
+ };
4445
+ return f;
4446
+ },
4447
+ utcParse: function(specifier) {
4448
+ var p = newParse(specifier += "", true);
4449
+ p.toString = function() {
4450
+ return specifier;
4451
+ };
4452
+ return p;
1657
4453
  }
1658
- }
1659
- return resolved;
4454
+ };
4455
+ }
4456
+ var pads = { "-": "", "_": " ", "0": "0" };
4457
+ var numberRe = /^\s*\d+/;
4458
+ var percentRe = /^%/;
4459
+ var requoteRe = /[\\^$*+?|[\]().{}]/g;
4460
+ function pad(value, fill, width) {
4461
+ var sign2 = value < 0 ? "-" : "", string = (sign2 ? -value : value) + "", length = string.length;
4462
+ return sign2 + (length < width ? new Array(width - length + 1).join(fill) + string : string);
4463
+ }
4464
+ function requote(s) {
4465
+ return s.replace(requoteRe, "\\$&");
4466
+ }
4467
+ function formatRe(names) {
4468
+ return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
4469
+ }
4470
+ function formatLookup(names) {
4471
+ return new Map(names.map((name, i) => [name.toLowerCase(), i]));
4472
+ }
4473
+ function parseWeekdayNumberSunday(d, string, i) {
4474
+ var n = numberRe.exec(string.slice(i, i + 1));
4475
+ return n ? (d.w = +n[0], i + n[0].length) : -1;
4476
+ }
4477
+ function parseWeekdayNumberMonday(d, string, i) {
4478
+ var n = numberRe.exec(string.slice(i, i + 1));
4479
+ return n ? (d.u = +n[0], i + n[0].length) : -1;
4480
+ }
4481
+ function parseWeekNumberSunday(d, string, i) {
4482
+ var n = numberRe.exec(string.slice(i, i + 2));
4483
+ return n ? (d.U = +n[0], i + n[0].length) : -1;
4484
+ }
4485
+ function parseWeekNumberISO(d, string, i) {
4486
+ var n = numberRe.exec(string.slice(i, i + 2));
4487
+ return n ? (d.V = +n[0], i + n[0].length) : -1;
4488
+ }
4489
+ function parseWeekNumberMonday(d, string, i) {
4490
+ var n = numberRe.exec(string.slice(i, i + 2));
4491
+ return n ? (d.W = +n[0], i + n[0].length) : -1;
4492
+ }
4493
+ function parseFullYear(d, string, i) {
4494
+ var n = numberRe.exec(string.slice(i, i + 4));
4495
+ return n ? (d.y = +n[0], i + n[0].length) : -1;
4496
+ }
4497
+ function parseYear(d, string, i) {
4498
+ var n = numberRe.exec(string.slice(i, i + 2));
4499
+ return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;
4500
+ }
4501
+ function parseZone(d, string, i) {
4502
+ var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
4503
+ return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
4504
+ }
4505
+ function parseQuarter(d, string, i) {
4506
+ var n = numberRe.exec(string.slice(i, i + 1));
4507
+ return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;
4508
+ }
4509
+ function parseMonthNumber(d, string, i) {
4510
+ var n = numberRe.exec(string.slice(i, i + 2));
4511
+ return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
4512
+ }
4513
+ function parseDayOfMonth(d, string, i) {
4514
+ var n = numberRe.exec(string.slice(i, i + 2));
4515
+ return n ? (d.d = +n[0], i + n[0].length) : -1;
4516
+ }
4517
+ function parseDayOfYear(d, string, i) {
4518
+ var n = numberRe.exec(string.slice(i, i + 3));
4519
+ return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
4520
+ }
4521
+ function parseHour24(d, string, i) {
4522
+ var n = numberRe.exec(string.slice(i, i + 2));
4523
+ return n ? (d.H = +n[0], i + n[0].length) : -1;
4524
+ }
4525
+ function parseMinutes(d, string, i) {
4526
+ var n = numberRe.exec(string.slice(i, i + 2));
4527
+ return n ? (d.M = +n[0], i + n[0].length) : -1;
4528
+ }
4529
+ function parseSeconds(d, string, i) {
4530
+ var n = numberRe.exec(string.slice(i, i + 2));
4531
+ return n ? (d.S = +n[0], i + n[0].length) : -1;
4532
+ }
4533
+ function parseMilliseconds(d, string, i) {
4534
+ var n = numberRe.exec(string.slice(i, i + 3));
4535
+ return n ? (d.L = +n[0], i + n[0].length) : -1;
4536
+ }
4537
+ function parseMicroseconds(d, string, i) {
4538
+ var n = numberRe.exec(string.slice(i, i + 6));
4539
+ return n ? (d.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;
4540
+ }
4541
+ function parseLiteralPercent(d, string, i) {
4542
+ var n = percentRe.exec(string.slice(i, i + 1));
4543
+ return n ? i + n[0].length : -1;
4544
+ }
4545
+ function parseUnixTimestamp(d, string, i) {
4546
+ var n = numberRe.exec(string.slice(i));
4547
+ return n ? (d.Q = +n[0], i + n[0].length) : -1;
4548
+ }
4549
+ function parseUnixTimestampSeconds(d, string, i) {
4550
+ var n = numberRe.exec(string.slice(i));
4551
+ return n ? (d.s = +n[0], i + n[0].length) : -1;
4552
+ }
4553
+ function formatDayOfMonth(d, p) {
4554
+ return pad(d.getDate(), p, 2);
4555
+ }
4556
+ function formatHour24(d, p) {
4557
+ return pad(d.getHours(), p, 2);
4558
+ }
4559
+ function formatHour12(d, p) {
4560
+ return pad(d.getHours() % 12 || 12, p, 2);
4561
+ }
4562
+ function formatDayOfYear(d, p) {
4563
+ return pad(1 + timeDay.count(timeYear(d), d), p, 3);
4564
+ }
4565
+ function formatMilliseconds(d, p) {
4566
+ return pad(d.getMilliseconds(), p, 3);
4567
+ }
4568
+ function formatMicroseconds(d, p) {
4569
+ return formatMilliseconds(d, p) + "000";
4570
+ }
4571
+ function formatMonthNumber(d, p) {
4572
+ return pad(d.getMonth() + 1, p, 2);
4573
+ }
4574
+ function formatMinutes(d, p) {
4575
+ return pad(d.getMinutes(), p, 2);
4576
+ }
4577
+ function formatSeconds(d, p) {
4578
+ return pad(d.getSeconds(), p, 2);
4579
+ }
4580
+ function formatWeekdayNumberMonday(d) {
4581
+ var day = d.getDay();
4582
+ return day === 0 ? 7 : day;
4583
+ }
4584
+ function formatWeekNumberSunday(d, p) {
4585
+ return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);
4586
+ }
4587
+ function dISO(d) {
4588
+ var day = d.getDay();
4589
+ return day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);
4590
+ }
4591
+ function formatWeekNumberISO(d, p) {
4592
+ d = dISO(d);
4593
+ return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);
4594
+ }
4595
+ function formatWeekdayNumberSunday(d) {
4596
+ return d.getDay();
4597
+ }
4598
+ function formatWeekNumberMonday(d, p) {
4599
+ return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);
4600
+ }
4601
+ function formatYear(d, p) {
4602
+ return pad(d.getFullYear() % 100, p, 2);
4603
+ }
4604
+ function formatYearISO(d, p) {
4605
+ d = dISO(d);
4606
+ return pad(d.getFullYear() % 100, p, 2);
4607
+ }
4608
+ function formatFullYear(d, p) {
4609
+ return pad(d.getFullYear() % 1e4, p, 4);
4610
+ }
4611
+ function formatFullYearISO(d, p) {
4612
+ var day = d.getDay();
4613
+ d = day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);
4614
+ return pad(d.getFullYear() % 1e4, p, 4);
4615
+ }
4616
+ function formatZone(d) {
4617
+ var z = d.getTimezoneOffset();
4618
+ return (z > 0 ? "-" : (z *= -1, "+")) + pad(z / 60 | 0, "0", 2) + pad(z % 60, "0", 2);
4619
+ }
4620
+ function formatUTCDayOfMonth(d, p) {
4621
+ return pad(d.getUTCDate(), p, 2);
4622
+ }
4623
+ function formatUTCHour24(d, p) {
4624
+ return pad(d.getUTCHours(), p, 2);
4625
+ }
4626
+ function formatUTCHour12(d, p) {
4627
+ return pad(d.getUTCHours() % 12 || 12, p, 2);
4628
+ }
4629
+ function formatUTCDayOfYear(d, p) {
4630
+ return pad(1 + utcDay.count(utcYear(d), d), p, 3);
4631
+ }
4632
+ function formatUTCMilliseconds(d, p) {
4633
+ return pad(d.getUTCMilliseconds(), p, 3);
4634
+ }
4635
+ function formatUTCMicroseconds(d, p) {
4636
+ return formatUTCMilliseconds(d, p) + "000";
4637
+ }
4638
+ function formatUTCMonthNumber(d, p) {
4639
+ return pad(d.getUTCMonth() + 1, p, 2);
4640
+ }
4641
+ function formatUTCMinutes(d, p) {
4642
+ return pad(d.getUTCMinutes(), p, 2);
4643
+ }
4644
+ function formatUTCSeconds(d, p) {
4645
+ return pad(d.getUTCSeconds(), p, 2);
4646
+ }
4647
+ function formatUTCWeekdayNumberMonday(d) {
4648
+ var dow = d.getUTCDay();
4649
+ return dow === 0 ? 7 : dow;
4650
+ }
4651
+ function formatUTCWeekNumberSunday(d, p) {
4652
+ return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);
4653
+ }
4654
+ function UTCdISO(d) {
4655
+ var day = d.getUTCDay();
4656
+ return day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);
4657
+ }
4658
+ function formatUTCWeekNumberISO(d, p) {
4659
+ d = UTCdISO(d);
4660
+ return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
4661
+ }
4662
+ function formatUTCWeekdayNumberSunday(d) {
4663
+ return d.getUTCDay();
4664
+ }
4665
+ function formatUTCWeekNumberMonday(d, p) {
4666
+ return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);
4667
+ }
4668
+ function formatUTCYear(d, p) {
4669
+ return pad(d.getUTCFullYear() % 100, p, 2);
4670
+ }
4671
+ function formatUTCYearISO(d, p) {
4672
+ d = UTCdISO(d);
4673
+ return pad(d.getUTCFullYear() % 100, p, 2);
4674
+ }
4675
+ function formatUTCFullYear(d, p) {
4676
+ return pad(d.getUTCFullYear() % 1e4, p, 4);
4677
+ }
4678
+ function formatUTCFullYearISO(d, p) {
4679
+ var day = d.getUTCDay();
4680
+ d = day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);
4681
+ return pad(d.getUTCFullYear() % 1e4, p, 4);
4682
+ }
4683
+ function formatUTCZone() {
4684
+ return "+0000";
4685
+ }
4686
+ function formatLiteralPercent() {
4687
+ return "%";
4688
+ }
4689
+ function formatUnixTimestamp(d) {
4690
+ return +d;
4691
+ }
4692
+ function formatUnixTimestampSeconds(d) {
4693
+ return Math.floor(+d / 1e3);
1660
4694
  }
1661
4695
 
1662
- // src/charts/pie/index.ts
1663
- var pieRenderer = (spec, scales, chartArea, strategy, theme) => {
1664
- const marks = computePieMarks(spec, scales, chartArea, strategy, false);
1665
- const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);
1666
- for (let i = 0; i < marks.length && i < labels.length; i++) {
1667
- marks[i].label = labels[i];
1668
- }
1669
- return marks;
1670
- };
1671
- var donutRenderer = (spec, scales, chartArea, strategy, theme) => {
1672
- const marks = computePieMarks(spec, scales, chartArea, strategy, true);
1673
- const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);
1674
- for (let i = 0; i < marks.length && i < labels.length; i++) {
1675
- marks[i].label = labels[i];
4696
+ // ../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/defaultLocale.js
4697
+ var locale2;
4698
+ var timeFormat;
4699
+ var timeParse;
4700
+ var utcFormat;
4701
+ var utcParse;
4702
+ defaultLocale2({
4703
+ dateTime: "%x, %X",
4704
+ date: "%-m/%-d/%Y",
4705
+ time: "%-I:%M:%S %p",
4706
+ periods: ["AM", "PM"],
4707
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
4708
+ shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
4709
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
4710
+ shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
4711
+ });
4712
+ function defaultLocale2(definition) {
4713
+ locale2 = formatLocale(definition);
4714
+ timeFormat = locale2.format;
4715
+ timeParse = locale2.parse;
4716
+ utcFormat = locale2.utcFormat;
4717
+ utcParse = locale2.utcParse;
4718
+ return locale2;
4719
+ }
4720
+
4721
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/time.js
4722
+ function date(t) {
4723
+ return new Date(t);
4724
+ }
4725
+ function number3(t) {
4726
+ return t instanceof Date ? +t : +/* @__PURE__ */ new Date(+t);
4727
+ }
4728
+ function calendar(ticks2, tickInterval, year, month, week, day, hour, minute, second2, format2) {
4729
+ var scale = continuous(), invert = scale.invert, domain = scale.domain;
4730
+ var formatMillisecond = format2(".%L"), formatSecond = format2(":%S"), formatMinute = format2("%I:%M"), formatHour = format2("%I %p"), formatDay = format2("%a %d"), formatWeek = format2("%b %d"), formatMonth = format2("%B"), formatYear2 = format2("%Y");
4731
+ function tickFormat2(date2) {
4732
+ return (second2(date2) < date2 ? formatMillisecond : minute(date2) < date2 ? formatSecond : hour(date2) < date2 ? formatMinute : day(date2) < date2 ? formatHour : month(date2) < date2 ? week(date2) < date2 ? formatDay : formatWeek : year(date2) < date2 ? formatMonth : formatYear2)(date2);
1676
4733
  }
1677
- return marks;
1678
- };
4734
+ scale.invert = function(y2) {
4735
+ return new Date(invert(y2));
4736
+ };
4737
+ scale.domain = function(_) {
4738
+ return arguments.length ? domain(Array.from(_, number3)) : domain().map(date);
4739
+ };
4740
+ scale.ticks = function(interval) {
4741
+ var d = domain();
4742
+ return ticks2(d[0], d[d.length - 1], interval == null ? 10 : interval);
4743
+ };
4744
+ scale.tickFormat = function(count, specifier) {
4745
+ return specifier == null ? tickFormat2 : format2(specifier);
4746
+ };
4747
+ scale.nice = function(interval) {
4748
+ var d = domain();
4749
+ if (!interval || typeof interval.range !== "function") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);
4750
+ return interval ? domain(nice(d, interval)) : scale;
4751
+ };
4752
+ scale.copy = function() {
4753
+ return copy(scale, calendar(ticks2, tickInterval, year, month, week, day, hour, minute, second2, format2));
4754
+ };
4755
+ return scale;
4756
+ }
4757
+ function time() {
4758
+ return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]), arguments);
4759
+ }
1679
4760
 
1680
- // src/charts/registry.ts
1681
- var renderers = /* @__PURE__ */ new Map();
1682
- function registerChartRenderer(type, renderer) {
1683
- renderers.set(type, renderer);
4761
+ // ../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/sequential.js
4762
+ function transformer2() {
4763
+ var x0 = 0, x1 = 1, t02, t12, k10, transform, interpolator = identity, clamp = false, unknown;
4764
+ function scale(x2) {
4765
+ return x2 == null || isNaN(x2 = +x2) ? unknown : interpolator(k10 === 0 ? 0.5 : (x2 = (transform(x2) - t02) * k10, clamp ? Math.max(0, Math.min(1, x2)) : x2));
4766
+ }
4767
+ scale.domain = function(_) {
4768
+ return arguments.length ? ([x0, x1] = _, t02 = transform(x0 = +x0), t12 = transform(x1 = +x1), k10 = t02 === t12 ? 0 : 1 / (t12 - t02), scale) : [x0, x1];
4769
+ };
4770
+ scale.clamp = function(_) {
4771
+ return arguments.length ? (clamp = !!_, scale) : clamp;
4772
+ };
4773
+ scale.interpolator = function(_) {
4774
+ return arguments.length ? (interpolator = _, scale) : interpolator;
4775
+ };
4776
+ function range2(interpolate) {
4777
+ return function(_) {
4778
+ var r0, r1;
4779
+ return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];
4780
+ };
4781
+ }
4782
+ scale.range = range2(value_default);
4783
+ scale.rangeRound = range2(round_default);
4784
+ scale.unknown = function(_) {
4785
+ return arguments.length ? (unknown = _, scale) : unknown;
4786
+ };
4787
+ return function(t) {
4788
+ transform = t, t02 = t(x0), t12 = t(x1), k10 = t02 === t12 ? 0 : 1 / (t12 - t02);
4789
+ return scale;
4790
+ };
1684
4791
  }
1685
- function getChartRenderer(type) {
1686
- return renderers.get(type);
4792
+ function copy2(source, target) {
4793
+ return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());
1687
4794
  }
1688
- function clearRenderers() {
1689
- renderers.clear();
4795
+ function sequential() {
4796
+ var scale = linearish(transformer2()(identity));
4797
+ scale.copy = function() {
4798
+ return copy2(scale, sequential());
4799
+ };
4800
+ return initInterpolator.apply(scale, arguments);
1690
4801
  }
1691
4802
 
1692
4803
  // src/charts/scatter/compute.ts
1693
- import { max, min } from "d3-array";
1694
- import { scaleSqrt } from "d3-scale";
1695
4804
  var DEFAULT_POINT_RADIUS2 = 5;
1696
4805
  var MIN_BUBBLE_RADIUS = 3;
1697
4806
  var MAX_BUBBLE_RADIUS = 30;
@@ -1709,9 +4818,9 @@ function computeScatterMarks(spec, scales, _chartArea, _strategy) {
1709
4818
  let sizeScale;
1710
4819
  if (sizeField) {
1711
4820
  const sizeValues = spec.data.map((d) => Number(d[sizeField])).filter((v) => Number.isFinite(v));
1712
- const sizeMin = min(sizeValues) ?? 0;
1713
- const sizeMax = max(sizeValues) ?? 1;
1714
- sizeScale = scaleSqrt().domain([sizeMin, sizeMax]).range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS]);
4821
+ const sizeMin = min2(sizeValues) ?? 0;
4822
+ const sizeMax = max2(sizeValues) ?? 1;
4823
+ sizeScale = sqrt2().domain([sizeMin, sizeMax]).range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS]);
1715
4824
  }
1716
4825
  const marks = [];
1717
4826
  for (const row of spec.data) {
@@ -1721,7 +4830,7 @@ function computeScatterMarks(spec, scales, _chartArea, _strategy) {
1721
4830
  const cx = xScale(xVal);
1722
4831
  const cy = yScale(yVal);
1723
4832
  const category = colorField ? String(row[colorField] ?? "") : void 0;
1724
- const color = getColor(scales, category ?? "__default__");
4833
+ const color2 = getColor(scales, category ?? "__default__");
1725
4834
  let radius = DEFAULT_POINT_RADIUS2;
1726
4835
  if (sizeScale && sizeField) {
1727
4836
  const sizeVal = Number(row[sizeField]);
@@ -1742,7 +4851,7 @@ function computeScatterMarks(spec, scales, _chartArea, _strategy) {
1742
4851
  cx,
1743
4852
  cy,
1744
4853
  r: radius,
1745
- fill: color,
4854
+ fill: color2,
1746
4855
  stroke: "#ffffff",
1747
4856
  strokeWidth: 1,
1748
4857
  fillOpacity: 0.7,
@@ -1854,8 +4963,8 @@ function inferFieldType(data, field) {
1854
4963
  numericCount++;
1855
4964
  continue;
1856
4965
  }
1857
- const date = new Date(value);
1858
- if (!Number.isNaN(date.getTime())) {
4966
+ const date2 = new Date(value);
4967
+ if (!Number.isNaN(date2.getTime())) {
1859
4968
  dateCount++;
1860
4969
  continue;
1861
4970
  }
@@ -2466,8 +5575,6 @@ ${errorMessages}`);
2466
5575
  import { adaptTheme, computeChrome, resolveTheme } from "@opendata-ai/openchart-core";
2467
5576
 
2468
5577
  // src/graphs/encoding.ts
2469
- import { max as max2, min as min2 } from "d3-array";
2470
- import { scaleLinear, scaleOrdinal, scaleSqrt as scaleSqrt2 } from "d3-scale";
2471
5578
  var DEFAULT_NODE_RADIUS = 5;
2472
5579
  var MIN_NODE_RADIUS = 3;
2473
5580
  var MAX_NODE_RADIUS = 12;
@@ -2475,19 +5582,19 @@ var DEFAULT_EDGE_WIDTH = 1;
2475
5582
  var MIN_EDGE_WIDTH = 0.5;
2476
5583
  var MAX_EDGE_WIDTH = 4;
2477
5584
  var DEFAULT_STROKE_WIDTH2 = 1;
2478
- function darkenColor(hex, amount = 0.2) {
2479
- const clean = hex.replace(/^#/, "");
2480
- if (clean.length !== 6 && clean.length !== 3) return hex;
5585
+ function darkenColor(hex2, amount = 0.2) {
5586
+ const clean = hex2.replace(/^#/, "");
5587
+ if (clean.length !== 6 && clean.length !== 3) return hex2;
2481
5588
  const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
2482
5589
  const r = Math.max(0, Math.round(parseInt(full.substring(0, 2), 16) * (1 - amount)));
2483
5590
  const g = Math.max(0, Math.round(parseInt(full.substring(2, 4), 16) * (1 - amount)));
2484
5591
  const b = Math.max(0, Math.round(parseInt(full.substring(4, 6), 16) * (1 - amount)));
2485
5592
  return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
2486
5593
  }
2487
- function hexWithOpacity(hex, opacity) {
2488
- const clean = hex.replace(/^#/, "");
5594
+ function hexWithOpacity(hex2, opacity) {
5595
+ const clean = hex2.replace(/^#/, "");
2489
5596
  if (clean.length !== 6 && clean.length !== 3) {
2490
- return hex;
5597
+ return hex2;
2491
5598
  }
2492
5599
  const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
2493
5600
  const r = parseInt(full.substring(0, 2), 16);
@@ -2515,7 +5622,7 @@ function resolveNodeVisuals(nodes, encoding, edges, theme, nodeOverrides) {
2515
5622
  const values = nodes.map((n) => Number(n[field])).filter((v) => Number.isFinite(v));
2516
5623
  const sizeMin = min2(values) ?? 0;
2517
5624
  const sizeMax = max2(values) ?? 1;
2518
- sizeScale = scaleSqrt2().domain([sizeMin, sizeMax]).range([MIN_NODE_RADIUS, MAX_NODE_RADIUS]);
5625
+ sizeScale = sqrt2().domain([sizeMin, sizeMax]).range([MIN_NODE_RADIUS, MAX_NODE_RADIUS]);
2519
5626
  }
2520
5627
  let colorFn;
2521
5628
  if (encoding.nodeColor?.field) {
@@ -2527,14 +5634,14 @@ function resolveNodeVisuals(nodes, encoding, edges, theme, nodeOverrides) {
2527
5634
  const colorMax = max2(values) ?? 1;
2528
5635
  const seqPalettes = Object.values(theme.colors.sequential);
2529
5636
  const palette = seqPalettes.length > 0 ? seqPalettes[0] : ["#ccc", "#333"];
2530
- const colorScale = scaleLinear().domain([colorMin, colorMax]).range([palette[0], palette[palette.length - 1]]);
5637
+ const colorScale = linear2().domain([colorMin, colorMax]).range([palette[0], palette[palette.length - 1]]);
2531
5638
  colorFn = (node) => {
2532
5639
  const val = Number(node[field]);
2533
5640
  return Number.isFinite(val) ? colorScale(val) : theme.colors.categorical[0];
2534
5641
  };
2535
5642
  } else {
2536
5643
  const uniqueValues = [...new Set(nodes.map((n) => String(n[field] ?? "")))];
2537
- const ordinalScale = scaleOrdinal().domain(uniqueValues).range(theme.colors.categorical);
5644
+ const ordinalScale = ordinal().domain(uniqueValues).range(theme.colors.categorical);
2538
5645
  colorFn = (node) => ordinalScale(String(node[field] ?? ""));
2539
5646
  }
2540
5647
  }
@@ -2586,7 +5693,7 @@ function resolveEdgeVisuals(edges, encoding, theme) {
2586
5693
  const values = edges.map((e) => Number(e[field])).filter((v) => Number.isFinite(v));
2587
5694
  const widthMin = min2(values) ?? 0;
2588
5695
  const widthMax = max2(values) ?? 1;
2589
- widthScale = scaleLinear().domain([widthMin, widthMax]).range([MIN_EDGE_WIDTH, MAX_EDGE_WIDTH]);
5696
+ widthScale = linear2().domain([widthMin, widthMax]).range([MIN_EDGE_WIDTH, MAX_EDGE_WIDTH]);
2590
5697
  }
2591
5698
  let edgeColorFn;
2592
5699
  if (encoding.edgeColor?.field) {
@@ -2598,14 +5705,14 @@ function resolveEdgeVisuals(edges, encoding, theme) {
2598
5705
  const colorMax = max2(values) ?? 1;
2599
5706
  const seqPalettes = Object.values(theme.colors.sequential);
2600
5707
  const palette = seqPalettes.length > 0 ? seqPalettes[0] : ["#ccc", "#333"];
2601
- const colorScale = scaleLinear().domain([colorMin, colorMax]).range([palette[0], palette[palette.length - 1]]);
5708
+ const colorScale = linear2().domain([colorMin, colorMax]).range([palette[0], palette[palette.length - 1]]);
2602
5709
  edgeColorFn = (edge) => {
2603
5710
  const val = Number(edge[field]);
2604
5711
  return Number.isFinite(val) ? colorScale(val) : hexWithOpacity(theme.colors.axis, 0.4);
2605
5712
  };
2606
5713
  } else {
2607
5714
  const uniqueValues = [...new Set(edges.map((e) => String(e[field] ?? "")))];
2608
- const ordinalScale = scaleOrdinal().domain(uniqueValues).range(theme.colors.categorical);
5715
+ const ordinalScale = ordinal().domain(uniqueValues).range(theme.colors.categorical);
2609
5716
  edgeColorFn = (edge) => ordinalScale(String(edge[field] ?? ""));
2610
5717
  }
2611
5718
  }
@@ -2689,9 +5796,9 @@ function buildGraphLegend(nodes, communityColorMap, hasCommunities, theme) {
2689
5796
  };
2690
5797
  let entries;
2691
5798
  if (hasCommunities && communityColorMap.size > 0) {
2692
- entries = [...communityColorMap.entries()].map(([label, color]) => ({
5799
+ entries = [...communityColorMap.entries()].map(([label, color2]) => ({
2693
5800
  label,
2694
- color,
5801
+ color: color2,
2695
5802
  shape: "circle",
2696
5803
  active: true
2697
5804
  }));
@@ -2705,9 +5812,9 @@ function buildGraphLegend(nodes, communityColorMap, hasCommunities, theme) {
2705
5812
  if (colorLabels.size <= 1) {
2706
5813
  entries = [];
2707
5814
  } else {
2708
- entries = [...colorLabels.entries()].map(([color, label]) => ({
5815
+ entries = [...colorLabels.entries()].map(([color2, label]) => ({
2709
5816
  label,
2710
- color,
5817
+ color: color2,
2711
5818
  shape: "circle",
2712
5819
  active: true
2713
5820
  }));
@@ -2836,8 +5943,12 @@ function compileGraph(spec, options) {
2836
5943
  var DEFAULT_COLLISION_PADDING = 5;
2837
5944
 
2838
5945
  // src/layout/axes.ts
2839
- import { abbreviateNumber as abbreviateNumber3, formatDate, formatNumber as formatNumber3 } from "@opendata-ai/openchart-core";
2840
- import { format as d3Format2 } from "d3-format";
5946
+ import {
5947
+ abbreviateNumber as abbreviateNumber3,
5948
+ buildD3Formatter as buildD3Formatter3,
5949
+ formatDate,
5950
+ formatNumber as formatNumber3
5951
+ } from "@opendata-ai/openchart-core";
2841
5952
  var TICK_COUNTS = {
2842
5953
  full: 8,
2843
5954
  reduced: 5,
@@ -2862,8 +5973,8 @@ function effectiveDensity(baseDensity, axisLength, minimalThreshold, reducedThre
2862
5973
  function continuousTicks(resolvedScale, density) {
2863
5974
  const scale = resolvedScale.scale;
2864
5975
  const count = resolvedScale.channel.axis?.tickCount ?? TICK_COUNTS[density];
2865
- const ticks = scale.ticks(count);
2866
- return ticks.map((value) => ({
5976
+ const ticks2 = scale.ticks(count);
5977
+ return ticks2.map((value) => ({
2867
5978
  value,
2868
5979
  position: scale(value),
2869
5980
  label: formatTickLabel(value, resolvedScale)
@@ -2898,17 +6009,8 @@ function formatTickLabel(value, resolvedScale) {
2898
6009
  if (resolvedScale.type === "linear" || resolvedScale.type === "log") {
2899
6010
  const num = value;
2900
6011
  if (formatStr) {
2901
- try {
2902
- return d3Format2(formatStr)(num);
2903
- } catch {
2904
- const suffixMatch = formatStr.match(/^(.+[a-z])([^a-z]+)$/i);
2905
- if (suffixMatch) {
2906
- try {
2907
- return d3Format2(suffixMatch[1])(num) + suffixMatch[2];
2908
- } catch {
2909
- }
2910
- }
2911
- }
6012
+ const fmt = buildD3Formatter3(formatStr);
6013
+ if (fmt) return fmt(num);
2912
6014
  }
2913
6015
  if (Math.abs(num) >= 1e3) return abbreviateNumber3(num);
2914
6016
  return formatNumber3(num);
@@ -2946,13 +6048,13 @@ function computeAxes(scales, chartArea, strategy, theme) {
2946
6048
  lineHeight: 1.3
2947
6049
  };
2948
6050
  if (scales.x) {
2949
- const ticks = scales.x.type === "band" || scales.x.type === "point" || scales.x.type === "ordinal" ? categoricalTicks(scales.x, xDensity) : continuousTicks(scales.x, xDensity);
2950
- const gridlines = ticks.map((t) => ({
6051
+ const ticks2 = scales.x.type === "band" || scales.x.type === "point" || scales.x.type === "ordinal" ? categoricalTicks(scales.x, xDensity) : continuousTicks(scales.x, xDensity);
6052
+ const gridlines = ticks2.map((t) => ({
2951
6053
  position: t.position,
2952
6054
  major: true
2953
6055
  }));
2954
6056
  result.x = {
2955
- ticks,
6057
+ ticks: ticks2,
2956
6058
  gridlines: scales.x.channel.axis?.grid ? gridlines : [],
2957
6059
  label: scales.x.channel.axis?.label,
2958
6060
  labelStyle: axisLabelStyle,
@@ -2963,13 +6065,13 @@ function computeAxes(scales, chartArea, strategy, theme) {
2963
6065
  };
2964
6066
  }
2965
6067
  if (scales.y) {
2966
- const ticks = scales.y.type === "band" || scales.y.type === "point" || scales.y.type === "ordinal" ? categoricalTicks(scales.y, yDensity) : continuousTicks(scales.y, yDensity);
2967
- const gridlines = ticks.map((t) => ({
6068
+ const ticks2 = scales.y.type === "band" || scales.y.type === "point" || scales.y.type === "ordinal" ? categoricalTicks(scales.y, yDensity) : continuousTicks(scales.y, yDensity);
6069
+ const gridlines = ticks2.map((t) => ({
2968
6070
  position: t.position,
2969
6071
  major: true
2970
6072
  }));
2971
6073
  result.y = {
2972
- ticks,
6074
+ ticks: ticks2,
2973
6075
  // Y-axis gridlines are shown by default (standard editorial practice)
2974
6076
  gridlines,
2975
6077
  label: scales.y.channel.axis?.label,
@@ -3138,8 +6240,6 @@ function computeGridlines(axes, chartArea, showVertical = false) {
3138
6240
  }
3139
6241
 
3140
6242
  // src/layout/scales.ts
3141
- import { extent, max as max3, min as min3 } from "d3-array";
3142
- import { scaleBand, scaleLinear as scaleLinear2, scaleLog, scaleOrdinal as scaleOrdinal2, scalePoint, scaleTime } from "d3-scale";
3143
6243
  function fieldValues(data, field) {
3144
6244
  return data.map((d) => d[field]).filter((v) => v != null);
3145
6245
  }
@@ -3164,7 +6264,7 @@ function uniqueStrings(values) {
3164
6264
  function buildTimeScale(channel, data, rangeStart, rangeEnd) {
3165
6265
  const values = parseDates(fieldValues(data, channel.field));
3166
6266
  const domain = channel.scale?.domain ? [new Date(channel.scale.domain[0]), new Date(channel.scale.domain[1])] : extent(values);
3167
- const scale = scaleTime().domain(domain).range([rangeStart, rangeEnd]);
6267
+ const scale = time().domain(domain).range([rangeStart, rangeEnd]);
3168
6268
  if (channel.scale?.nice !== false) {
3169
6269
  scale.nice();
3170
6270
  }
@@ -3179,14 +6279,14 @@ function buildLinearScale(channel, data, rangeStart, rangeEnd) {
3179
6279
  domainMin = d0;
3180
6280
  domainMax = d1;
3181
6281
  } else {
3182
- domainMin = min3(values) ?? 0;
3183
- domainMax = max3(values) ?? 1;
6282
+ domainMin = min2(values) ?? 0;
6283
+ domainMax = max2(values) ?? 1;
3184
6284
  if (channel.scale?.zero !== false) {
3185
6285
  domainMin = Math.min(0, domainMin);
3186
6286
  domainMax = Math.max(0, domainMax);
3187
6287
  }
3188
6288
  }
3189
- const scale = scaleLinear2().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]);
6289
+ const scale = linear2().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]);
3190
6290
  if (channel.scale?.nice !== false) {
3191
6291
  scale.nice();
3192
6292
  }
@@ -3194,31 +6294,31 @@ function buildLinearScale(channel, data, rangeStart, rangeEnd) {
3194
6294
  }
3195
6295
  function buildLogScale(channel, data, rangeStart, rangeEnd) {
3196
6296
  const values = parseNumbers(fieldValues(data, channel.field)).filter((v) => v > 0);
3197
- const domainMin = min3(values) ?? 1;
3198
- const domainMax = max3(values) ?? 10;
3199
- const scale = scaleLog().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]).nice();
6297
+ const domainMin = min2(values) ?? 1;
6298
+ const domainMax = max2(values) ?? 10;
6299
+ const scale = log().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]).nice();
3200
6300
  return { scale, type: "log", channel };
3201
6301
  }
3202
6302
  function buildBandScale(channel, data, rangeStart, rangeEnd) {
3203
6303
  const values = channel.scale?.domain ? channel.scale.domain : uniqueStrings(fieldValues(data, channel.field));
3204
- const scale = scaleBand().domain(values).range([rangeStart, rangeEnd]).padding(0.35);
6304
+ const scale = band().domain(values).range([rangeStart, rangeEnd]).padding(0.35);
3205
6305
  return { scale, type: "band", channel };
3206
6306
  }
3207
6307
  function buildPointScale(channel, data, rangeStart, rangeEnd) {
3208
6308
  const values = channel.scale?.domain ? channel.scale.domain : uniqueStrings(fieldValues(data, channel.field));
3209
- const scale = scalePoint().domain(values).range([rangeStart, rangeEnd]).padding(0.5);
6309
+ const scale = point2().domain(values).range([rangeStart, rangeEnd]).padding(0.5);
3210
6310
  return { scale, type: "point", channel };
3211
6311
  }
3212
6312
  function buildOrdinalColorScale(channel, data, palette) {
3213
6313
  const values = uniqueStrings(fieldValues(data, channel.field));
3214
- const scale = scaleOrdinal2().domain(values).range(palette);
6314
+ const scale = ordinal().domain(values).range(palette);
3215
6315
  return { scale, type: "ordinal", channel };
3216
6316
  }
3217
6317
  function buildSequentialColorScale(channel, data, palette) {
3218
6318
  const values = parseNumbers(fieldValues(data, channel.field));
3219
- const domainMin = min3(values) ?? 0;
3220
- const domainMax = max3(values) ?? 1;
3221
- const scale = scaleLinear2().domain([domainMin, domainMax]).range([palette[0], palette[palette.length - 1]]).clamp(true);
6319
+ const domainMin = min2(values) ?? 0;
6320
+ const domainMax = max2(values) ?? 1;
6321
+ const scale = linear2().domain([domainMin, domainMax]).range([palette[0], palette[palette.length - 1]]).clamp(true);
3222
6322
  return { scale, type: "sequential", channel };
3223
6323
  }
3224
6324
  function buildPositionalScale(channel, data, rangeStart, rangeEnd, chartType, axis) {
@@ -3381,6 +6481,23 @@ function extractColorEntries(spec, theme) {
3381
6481
  }));
3382
6482
  }
3383
6483
  function computeLegend(spec, strategy, theme, chartArea) {
6484
+ if (spec.legend?.show === false) {
6485
+ return {
6486
+ position: "top",
6487
+ entries: [],
6488
+ bounds: { x: 0, y: 0, width: 0, height: 0 },
6489
+ labelStyle: {
6490
+ fontFamily: theme.fonts.family,
6491
+ fontSize: theme.fonts.sizes.small,
6492
+ fontWeight: theme.fonts.weights.normal,
6493
+ fill: theme.colors.text,
6494
+ lineHeight: 1.3
6495
+ },
6496
+ swatchSize: SWATCH_SIZE2,
6497
+ swatchGap: SWATCH_GAP2,
6498
+ entryGap: ENTRY_GAP2
6499
+ };
6500
+ }
3384
6501
  const entries = extractColorEntries(spec, theme);
3385
6502
  const labelStyle = {
3386
6503
  fontFamily: theme.fonts.family,
@@ -3492,24 +6609,24 @@ function computeBarCell(value, config, columnMax, columnMin, theme, _darkMode) {
3492
6609
  };
3493
6610
  }
3494
6611
  function computeColumnMax(data, key) {
3495
- let max4 = 0;
6612
+ let max3 = 0;
3496
6613
  for (const row of data) {
3497
6614
  const val = row[key];
3498
- if (typeof val === "number" && Number.isFinite(val) && val > max4) {
3499
- max4 = val;
6615
+ if (typeof val === "number" && Number.isFinite(val) && val > max3) {
6616
+ max3 = val;
3500
6617
  }
3501
6618
  }
3502
- return max4;
6619
+ return max3;
3503
6620
  }
3504
6621
  function computeColumnMin(data, key) {
3505
- let min4 = 0;
6622
+ let min3 = 0;
3506
6623
  for (const row of data) {
3507
6624
  const val = row[key];
3508
- if (typeof val === "number" && Number.isFinite(val) && val < min4) {
3509
- min4 = val;
6625
+ if (typeof val === "number" && Number.isFinite(val) && val < min3) {
6626
+ min3 = val;
3510
6627
  }
3511
6628
  }
3512
- return min4;
6629
+ return min3;
3513
6630
  }
3514
6631
 
3515
6632
  // src/tables/category-colors.ts
@@ -3563,7 +6680,6 @@ function computeCategoryColors(data, column, theme, darkMode) {
3563
6680
 
3564
6681
  // src/tables/format-cells.ts
3565
6682
  import { formatDate as formatDate2, formatNumber as formatNumber4 } from "@opendata-ai/openchart-core";
3566
- import { format as d3Format3 } from "d3-format";
3567
6683
  function isNumericValue(value) {
3568
6684
  if (typeof value === "number") return Number.isFinite(value);
3569
6685
  return false;
@@ -3583,7 +6699,7 @@ function formatCell(value, column) {
3583
6699
  }
3584
6700
  if (column.format && isNumericValue(value)) {
3585
6701
  try {
3586
- const formatter = d3Format3(column.format);
6702
+ const formatter = format(column.format);
3587
6703
  return {
3588
6704
  value,
3589
6705
  formattedValue: formatter(value),
@@ -3616,7 +6732,7 @@ function formatValueForSearch(value, column) {
3616
6732
  if (value == null) return "";
3617
6733
  if (column.format && isNumericValue(value)) {
3618
6734
  try {
3619
- return d3Format3(column.format)(value);
6735
+ return format(column.format)(value);
3620
6736
  } catch {
3621
6737
  }
3622
6738
  }
@@ -3628,8 +6744,6 @@ function formatValueForSearch(value, column) {
3628
6744
 
3629
6745
  // src/tables/heatmap.ts
3630
6746
  import { adaptColorForDarkMode as adaptColorForDarkMode2 } from "@opendata-ai/openchart-core";
3631
- import { interpolateRgb } from "d3-interpolate";
3632
- import { scaleSequential } from "d3-scale";
3633
6747
  function interpolatorFromStops(stops) {
3634
6748
  if (stops.length === 0) return () => "#ffffff";
3635
6749
  if (stops.length === 1) return () => stops[0];
@@ -3639,7 +6753,7 @@ function interpolatorFromStops(stops) {
3639
6753
  const lo = Math.floor(segment);
3640
6754
  const hi = Math.min(lo + 1, stops.length - 1);
3641
6755
  const frac = segment - lo;
3642
- return interpolateRgb(stops[lo], stops[hi])(frac);
6756
+ return rgb_default(stops[lo], stops[hi])(frac);
3643
6757
  };
3644
6758
  }
3645
6759
  function resolvePalette(palette, theme) {
@@ -3670,13 +6784,13 @@ function computeHeatmapColors(data, column, theme, darkMode) {
3670
6784
  if (config.domain) {
3671
6785
  domain = config.domain;
3672
6786
  } else {
3673
- let min4 = Infinity;
3674
- let max4 = -Infinity;
6787
+ let min3 = Infinity;
6788
+ let max3 = -Infinity;
3675
6789
  for (const { value } of numericValues) {
3676
- if (value < min4) min4 = value;
3677
- if (value > max4) max4 = value;
6790
+ if (value < min3) min3 = value;
6791
+ if (value > max3) max3 = value;
3678
6792
  }
3679
- domain = [min4, max4];
6793
+ domain = [min3, max3];
3680
6794
  }
3681
6795
  let stops = resolvePalette(config.palette, theme);
3682
6796
  if (darkMode) {
@@ -3685,7 +6799,7 @@ function computeHeatmapColors(data, column, theme, darkMode) {
3685
6799
  stops = stops.map((c) => adaptColorForDarkMode2(c, lightBg, darkBg));
3686
6800
  }
3687
6801
  const interpolator = interpolatorFromStops(stops);
3688
- const scale = scaleSequential(interpolator).domain(domain).clamp(true);
6802
+ const scale = sequential(interpolator).domain(domain).clamp(true);
3689
6803
  for (const { index, value } of numericValues) {
3690
6804
  const bg = scale(value);
3691
6805
  const textColor = accessibleTextColor(bg);
@@ -3791,42 +6905,42 @@ function extractValues(row, columnKey, config) {
3791
6905
  function computeSparkline(values, config, theme, _darkMode) {
3792
6906
  if (values.length === 0) return null;
3793
6907
  const type = config.type ?? "line";
3794
- const color = config.color ?? theme.colors.categorical[0];
3795
- let min4 = Infinity;
3796
- let max4 = -Infinity;
6908
+ const color2 = config.color ?? theme.colors.categorical[0];
6909
+ let min3 = Infinity;
6910
+ let max3 = -Infinity;
3797
6911
  for (const v of values) {
3798
- if (v < min4) min4 = v;
3799
- if (v > max4) max4 = v;
6912
+ if (v < min3) min3 = v;
6913
+ if (v > max3) max3 = v;
3800
6914
  }
3801
- const range = max4 - min4;
3802
- const normalize = (v) => range === 0 ? 0.5 : (v - min4) / range;
6915
+ const range2 = max3 - min3;
6916
+ const normalize2 = (v) => range2 === 0 ? 0.5 : (v - min3) / range2;
3803
6917
  const startValue = values[0];
3804
6918
  const endValue = values[values.length - 1];
3805
6919
  if (type === "line") {
3806
6920
  const points2 = values.map((v, i) => ({
3807
6921
  x: values.length === 1 ? 0.5 : i / (values.length - 1),
3808
- y: normalize(v)
6922
+ y: normalize2(v)
3809
6923
  }));
3810
6924
  return {
3811
6925
  type,
3812
6926
  points: points2,
3813
6927
  bars: [],
3814
- color,
6928
+ color: color2,
3815
6929
  count: values.length,
3816
6930
  startValue,
3817
6931
  endValue
3818
6932
  };
3819
6933
  }
3820
- const bars = values.map(normalize);
6934
+ const bars = values.map(normalize2);
3821
6935
  const points = values.map((v, i) => ({
3822
6936
  x: values.length === 1 ? 0.5 : i / (values.length - 1),
3823
- y: normalize(v)
6937
+ y: normalize2(v)
3824
6938
  }));
3825
6939
  return {
3826
6940
  type,
3827
6941
  points,
3828
6942
  bars,
3829
- color,
6943
+ color: color2,
3830
6944
  count: values.length,
3831
6945
  startValue,
3832
6946
  endValue
@@ -4090,16 +7204,15 @@ function compileTableLayout(spec, options, theme) {
4090
7204
 
4091
7205
  // src/tooltips/compute.ts
4092
7206
  import { formatDate as formatDate3, formatNumber as formatNumber5 } from "@opendata-ai/openchart-core";
4093
- import { format as d3Format4 } from "d3-format";
4094
- function formatValue(value, fieldType, format) {
7207
+ function formatValue(value, fieldType, format2) {
4095
7208
  if (value == null) return "";
4096
7209
  if (fieldType === "temporal" || value instanceof Date) {
4097
7210
  return formatDate3(value);
4098
7211
  }
4099
7212
  if (typeof value === "number") {
4100
- if (format) {
7213
+ if (format2) {
4101
7214
  try {
4102
- return d3Format4(format)(value);
7215
+ return format(format2)(value);
4103
7216
  } catch {
4104
7217
  return formatNumber5(value);
4105
7218
  }
@@ -4108,13 +7221,13 @@ function formatValue(value, fieldType, format) {
4108
7221
  }
4109
7222
  return String(value);
4110
7223
  }
4111
- function buildFields(row, encoding, color) {
7224
+ function buildFields(row, encoding, color2) {
4112
7225
  const fields = [];
4113
7226
  if (encoding.y) {
4114
7227
  fields.push({
4115
7228
  label: encoding.y.axis?.label ?? encoding.y.field,
4116
7229
  value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),
4117
- color
7230
+ color: color2
4118
7231
  });
4119
7232
  }
4120
7233
  if (encoding.x) {
@@ -4279,14 +7392,52 @@ function compileChart(spec, options) {
4279
7392
  if (normalized.type === "graph") {
4280
7393
  throw new Error("compileChart received a graph spec. Use compileGraph instead.");
4281
7394
  }
4282
- const chartSpec = normalized;
7395
+ let chartSpec = normalized;
7396
+ const breakpoint = getBreakpoint(options.width);
7397
+ const strategy = getLayoutStrategy(breakpoint);
7398
+ const rawSpec = spec;
7399
+ const overrides = rawSpec.overrides;
7400
+ if (overrides?.[breakpoint]) {
7401
+ const bp = overrides[breakpoint];
7402
+ if (bp.chrome) {
7403
+ chartSpec = {
7404
+ ...chartSpec,
7405
+ chrome: {
7406
+ ...chartSpec.chrome,
7407
+ ...bp.chrome
7408
+ }
7409
+ };
7410
+ }
7411
+ if (bp.labels) {
7412
+ chartSpec = {
7413
+ ...chartSpec,
7414
+ labels: {
7415
+ ...chartSpec.labels,
7416
+ ...bp.labels
7417
+ }
7418
+ };
7419
+ }
7420
+ if (bp.legend) {
7421
+ chartSpec = {
7422
+ ...chartSpec,
7423
+ legend: {
7424
+ ...chartSpec.legend,
7425
+ ...bp.legend
7426
+ }
7427
+ };
7428
+ }
7429
+ if (bp.annotations) {
7430
+ chartSpec = {
7431
+ ...chartSpec,
7432
+ annotations: bp.annotations
7433
+ };
7434
+ }
7435
+ }
4283
7436
  const mergedThemeConfig = options.theme ? { ...chartSpec.theme, ...options.theme } : chartSpec.theme;
4284
7437
  let theme = resolveTheme2(mergedThemeConfig);
4285
7438
  if (options.darkMode) {
4286
7439
  theme = adaptTheme2(theme);
4287
7440
  }
4288
- const breakpoint = getBreakpoint(options.width);
4289
- const strategy = getLayoutStrategy(breakpoint);
4290
7441
  const preliminaryArea = {
4291
7442
  x: 0,
4292
7443
  y: 0,