@bicharts/chart-host 0.5.97 → 0.5.99

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.
@@ -211,8 +211,8 @@ var require_papaparse_min = __commonJS({
211
211
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
212
212
  }
213
213
  function E4(C2) {
214
- var S = (C2 = C2 || {}).delimiter, O2 = C2.newline, x2 = C2.comments, I2 = C2.step, A = C2.preview, T3 = C2.fastMode, D3 = null, L2 = false, F4 = null == C2.quoteChar ? '"' : C2.quoteChar, j2 = F4;
215
- if (void 0 !== C2.escapeChar && (j2 = C2.escapeChar), ("string" != typeof S || -1 < v3.BAD_DELIMITERS.indexOf(S)) && (S = ","), x2 === S) throw new Error("Comment character same as delimiter");
214
+ var S = (C2 = C2 || {}).delimiter, O2 = C2.newline, x2 = C2.comments, I2 = C2.step, A = C2.preview, T3 = C2.fastMode, D3 = null, L2 = false, F4 = null == C2.quoteChar ? '"' : C2.quoteChar, j3 = F4;
215
+ if (void 0 !== C2.escapeChar && (j3 = C2.escapeChar), ("string" != typeof S || -1 < v3.BAD_DELIMITERS.indexOf(S)) && (S = ","), x2 === S) throw new Error("Comment character same as delimiter");
216
216
  true === x2 ? x2 = "#" : ("string" != typeof x2 || -1 < v3.BAD_DELIMITERS.indexOf(x2)) && (x2 = false), "\n" !== O2 && "\r" !== O2 && "\r\n" !== O2 && (O2 = "\n");
217
217
  var z3 = 0, M = false;
218
218
  this.parse = function(i4, t, r2) {
@@ -232,11 +232,11 @@ var require_papaparse_min = __commonJS({
232
232
  }
233
233
  return w2();
234
234
  }
235
- for (var p4 = i4.indexOf(S, z3), g4 = i4.indexOf(O2, z3), _3 = new RegExp(U2(j2) + U2(F4), "g"), m2 = i4.indexOf(F4, z3); ; ) if (i4[z3] === F4) for (m2 = z3, z3++; ; ) {
235
+ for (var p4 = i4.indexOf(S, z3), g4 = i4.indexOf(O2, z3), _3 = new RegExp(U2(j3) + U2(F4), "g"), m2 = i4.indexOf(F4, z3); ; ) if (i4[z3] === F4) for (m2 = z3, z3++; ; ) {
236
236
  if (-1 === (m2 = i4.indexOf(F4, m2 + 1))) return r2 || u5.push({ type: "Quotes", code: "MissingQuotes", message: "Quoted field unterminated", row: h3.length, index: z3 }), E5();
237
237
  if (m2 === n2 - 1) return E5(i4.substring(z3, m2).replace(_3, F4));
238
- if (F4 === j2 && i4[m2 + 1] === j2) m2++;
239
- else if (F4 === j2 || 0 === m2 || i4[m2 - 1] !== j2) {
238
+ if (F4 === j3 && i4[m2 + 1] === j3) m2++;
239
+ else if (F4 === j3 || 0 === m2 || i4[m2 - 1] !== j3) {
240
240
  -1 !== p4 && p4 < m2 + 1 && (p4 = i4.indexOf(S, m2 + 1));
241
241
  var y5 = v4(-1 === (g4 = -1 !== g4 && g4 < m2 + 1 ? i4.indexOf(O2, m2 + 1) : g4) ? p4 : Math.min(p4, g4));
242
242
  if (i4.substr(m2 + 1 + y5, e) === S) {
@@ -435,7 +435,7 @@ var require_papaparse_min = __commonJS({
435
435
  });
436
436
 
437
437
  // src/contract.ts
438
- var HOST_CONTRACT_VERSION = "1.7.0";
438
+ var HOST_CONTRACT_VERSION = "1.8.0";
439
439
  var GEO_POINT_PRECISIONS = ["latlon", "city", "zip3", "state", "country"];
440
440
  var MARK_CLASS = "d3-mark";
441
441
  var LEGEND_MARK_CLASS = "d3-legend-mark";
@@ -485,6 +485,293 @@ var VALUE_AXIS_BASELINE_DEFAULT = "fit";
485
485
  var SEASONAL_MARKERS_DEFAULT = "auto";
486
486
  var MAX_MAP_POINTS_DEFAULT = 2e3;
487
487
 
488
+ // src/deltaE.ts
489
+ function linearise(c2) {
490
+ const v3 = c2 / 255;
491
+ return v3 <= 0.04045 ? v3 / 12.92 : Math.pow((v3 + 0.055) / 1.055, 2.4);
492
+ }
493
+ var Xn = 0.95047;
494
+ var Yn = 1;
495
+ var Zn = 1.08883;
496
+ var EPS = 216 / 24389;
497
+ var KAPPA = 24389 / 27;
498
+ function f(t) {
499
+ return t > EPS ? Math.cbrt(t) : (KAPPA * t + 16) / 116;
500
+ }
501
+ function rgbToLab(r, g3, b2) {
502
+ const R = linearise(r), G3 = linearise(g3), B2 = linearise(b2);
503
+ const X2 = 0.4124564 * R + 0.3575761 * G3 + 0.1804375 * B2;
504
+ const Y2 = 0.2126729 * R + 0.7151522 * G3 + 0.072175 * B2;
505
+ const Z3 = 0.0193339 * R + 0.119192 * G3 + 0.9503041 * B2;
506
+ const fx = f(X2 / Xn), fy = f(Y2 / Yn), fz = f(Z3 / Zn);
507
+ return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) };
508
+ }
509
+ function hexToLab(hex2) {
510
+ const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex2.trim());
511
+ if (!m) return null;
512
+ const h2 = m[1].length === 3 ? m[1][0] + m[1][0] + m[1][1] + m[1][1] + m[1][2] + m[1][2] : m[1];
513
+ return rgbToLab(parseInt(h2.slice(0, 2), 16), parseInt(h2.slice(2, 4), 16), parseInt(h2.slice(4, 6), 16));
514
+ }
515
+ var RAD = Math.PI / 180;
516
+ var DEG = 180 / Math.PI;
517
+ var NEUTRAL_CHROMA = 1e-4;
518
+ function deltaE2000(c1, c2) {
519
+ const C1 = Math.hypot(c1.a, c1.b), C2 = Math.hypot(c2.a, c2.b);
520
+ const Cbar = (C1 + C2) / 2;
521
+ const C7 = Math.pow(Cbar, 7);
522
+ const G3 = 0.5 * (1 - Math.sqrt(C7 / (C7 + Math.pow(25, 7))));
523
+ const a1p = (1 + G3) * c1.a, a2p = (1 + G3) * c2.a;
524
+ const C1p = Math.hypot(a1p, c1.b), C2p = Math.hypot(a2p, c2.b);
525
+ const neutral = C1p < NEUTRAL_CHROMA || C2p < NEUTRAL_CHROMA;
526
+ const h1p = C1p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c1.b, a1p) * DEG + 360) % 360;
527
+ const h2p = C2p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c2.b, a2p) * DEG + 360) % 360;
528
+ const dLp = c2.L - c1.L;
529
+ const dCp = C2p - C1p;
530
+ let dhp;
531
+ if (neutral) dhp = 0;
532
+ else if (Math.abs(h2p - h1p) <= 180) dhp = h2p - h1p;
533
+ else if (h2p - h1p > 180) dhp = h2p - h1p - 360;
534
+ else dhp = h2p - h1p + 360;
535
+ const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(dhp / 2 * RAD);
536
+ const Lbarp = (c1.L + c2.L) / 2;
537
+ const Cbarp = (C1p + C2p) / 2;
538
+ let hbarp;
539
+ if (neutral) hbarp = h1p + h2p;
540
+ else if (Math.abs(h1p - h2p) <= 180) hbarp = (h1p + h2p) / 2;
541
+ else if (h1p + h2p < 360) hbarp = (h1p + h2p + 360) / 2;
542
+ else hbarp = (h1p + h2p - 360) / 2;
543
+ const T3 = 1 - 0.17 * Math.cos((hbarp - 30) * RAD) + 0.24 * Math.cos(2 * hbarp * RAD) + 0.32 * Math.cos((3 * hbarp + 6) * RAD) - 0.2 * Math.cos((4 * hbarp - 63) * RAD);
544
+ const dTheta = 30 * Math.exp(-Math.pow((hbarp - 275) / 25, 2));
545
+ const Cbarp7 = Math.pow(Cbarp, 7);
546
+ const RC = 2 * Math.sqrt(Cbarp7 / (Cbarp7 + Math.pow(25, 7)));
547
+ const RT = -RC * Math.sin(2 * dTheta * RAD);
548
+ const Lm50 = Math.pow(Lbarp - 50, 2);
549
+ const SL = 1 + 0.015 * Lm50 / Math.sqrt(20 + Lm50);
550
+ const SC = 1 + 0.045 * Cbarp;
551
+ const SH = 1 + 0.015 * Cbarp * T3;
552
+ const tL = dLp / SL, tC = dCp / SC, tH = dHp / SH;
553
+ return Math.sqrt(tL * tL + tC * tC + tH * tH + RT * tC * tH);
554
+ }
555
+ function labToHex(lab) {
556
+ const finv = (t) => {
557
+ const t32 = t * t * t;
558
+ return t32 > EPS ? t32 : (116 * t - 16) / KAPPA;
559
+ };
560
+ const fy = (lab.L + 16) / 116, fx = fy + lab.a / 500, fz = fy - lab.b / 200;
561
+ const X2 = Xn * finv(fx);
562
+ const Y2 = Yn * (lab.L > KAPPA * EPS ? fy * fy * fy : lab.L / KAPPA);
563
+ const Z3 = Zn * finv(fz);
564
+ const lin = [
565
+ 3.2404542 * X2 - 1.5371385 * Y2 - 0.4985314 * Z3,
566
+ -0.969266 * X2 + 1.8760108 * Y2 + 0.041556 * Z3,
567
+ 0.0556434 * X2 - 0.2040259 * Y2 + 1.0572252 * Z3
568
+ ];
569
+ return "#" + lin.map((v3) => {
570
+ const c2 = Math.max(0, Math.min(1, v3));
571
+ const g3 = c2 <= 31308e-7 ? 12.92 * c2 : 1.055 * Math.pow(c2, 1 / 2.4) - 0.055;
572
+ return Math.round(g3 * 255).toString(16).padStart(2, "0");
573
+ }).join("");
574
+ }
575
+ function deltaEHex(a4, b2) {
576
+ const la = hexToLab(a4), lb = hexToLab(b2);
577
+ return la && lb ? deltaE2000(la, lb) : NaN;
578
+ }
579
+
580
+ // src/colourSpread.ts
581
+ var SAME_SHADE_DELTA_E = 5;
582
+ var MIN_RAMP_FILLS = 4;
583
+ var RAMP_SLACK_MAX = 0.15;
584
+ var MIN_MARKS = 24;
585
+ var ELEMENT_CAP = 5e3;
586
+ var MAX_CELLS = 48;
587
+ var CELL_STEP = 32;
588
+ var EMPTY = { marks: 0, distinctFills: 0, crowdShare: 0, spanDeltaE: 0 };
589
+ function styleOf(el, doc) {
590
+ try {
591
+ const view = doc?.defaultView;
592
+ return view?.getComputedStyle ? view.getComputedStyle(el) : null;
593
+ } catch {
594
+ return null;
595
+ }
596
+ }
597
+ function fillOf(el, cs) {
598
+ const a4 = el.getAttribute?.("fill");
599
+ if (a4 !== null && a4 !== void 0 && String(a4).trim() !== "") return String(a4).trim();
600
+ const c2 = cs?.fill;
601
+ return c2 === null || c2 === void 0 ? "" : String(c2).trim();
602
+ }
603
+ function toRgb(raw) {
604
+ const s2 = raw.trim().toLowerCase();
605
+ if (!s2 || s2 === "none" || s2 === "transparent") return null;
606
+ const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(s2);
607
+ if (hex2) {
608
+ const h2 = hex2[1];
609
+ const full = h2.length === 3 ? h2[0] + h2[0] + h2[1] + h2[1] + h2[2] + h2[2] : h2;
610
+ return [
611
+ parseInt(full.slice(0, 2), 16),
612
+ parseInt(full.slice(2, 4), 16),
613
+ parseInt(full.slice(4, 6), 16)
614
+ ];
615
+ }
616
+ const m = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)\s*)?\)$/.exec(s2);
617
+ if (!m) return null;
618
+ if (m[4] !== void 0 && parseFloat(m[4]) === 0) return null;
619
+ return [Math.round(parseFloat(m[1])), Math.round(parseFloat(m[2])), Math.round(parseFloat(m[3]))];
620
+ }
621
+ function cellKey(rgb) {
622
+ return [
623
+ Math.round(rgb[0] / CELL_STEP),
624
+ Math.round(rgb[1] / CELL_STEP),
625
+ Math.round(rgb[2] / CELL_STEP)
626
+ ].join(",");
627
+ }
628
+ function hex(rgb) {
629
+ return "#" + rgb.map((v3) => Math.max(0, Math.min(255, v3)).toString(16).padStart(2, "0")).join("");
630
+ }
631
+ function censusColourSpread(container, doc) {
632
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY;
633
+ try {
634
+ const els = Array.from(
635
+ container.querySelectorAll(`.${MARK_CLASS}, [${ROW_IDX_ATTR}]`)
636
+ );
637
+ if (els.length === 0 || els.length > ELEMENT_CAP) return EMPTY;
638
+ const ownerDoc = doc ?? container.ownerDocument;
639
+ const distinct = /* @__PURE__ */ new Set();
640
+ const cells = /* @__PURE__ */ new Map();
641
+ let marks = 0;
642
+ for (const el of els) {
643
+ const rgb = toRgb(fillOf(el, styleOf(el, ownerDoc)));
644
+ if (!rgb) continue;
645
+ marks++;
646
+ distinct.add(rgb.join(","));
647
+ const k2 = cellKey(rgb);
648
+ const cur = cells.get(k2);
649
+ if (cur) cur.n++;
650
+ else cells.set(k2, { rgb, n: 1 });
651
+ }
652
+ if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY;
653
+ const top = [...cells.values()].sort((a4, b2) => b2.n - a4.n).slice(0, MAX_CELLS);
654
+ const cs = top.map((c2) => hexToLab(hex(c2.rgb))).filter((l2) => l2 !== null);
655
+ if (cs.length < MIN_RAMP_FILLS) return EMPTY;
656
+ const d = cs.map(() => new Array(cs.length).fill(0));
657
+ let span = 0, lo = 0, hi = 1;
658
+ for (let i2 = 0; i2 < cs.length; i2++) {
659
+ for (let j3 = i2 + 1; j3 < cs.length; j3++) {
660
+ const v3 = deltaE2000(cs[i2], cs[j3]);
661
+ d[i2][j3] = v3;
662
+ d[j3][i2] = v3;
663
+ if (v3 > span) {
664
+ span = v3;
665
+ lo = i2;
666
+ hi = j3;
667
+ }
668
+ }
669
+ }
670
+ if (span <= 0) return EMPTY;
671
+ let slack = 0, interior = 0;
672
+ for (let i2 = 0; i2 < cs.length; i2++) {
673
+ if (i2 === lo || i2 === hi) continue;
674
+ slack += (d[lo][i2] + d[i2][hi]) / span - 1;
675
+ interior++;
676
+ }
677
+ if (interior < 2 || slack / interior > RAMP_SLACK_MAX) return EMPTY;
678
+ let crowd = 0;
679
+ for (let i2 = 0; i2 < cs.length; i2++) {
680
+ let n = 0;
681
+ for (let j3 = 0; j3 < cs.length; j3++) {
682
+ if (i2 === j3 || d[i2][j3] <= SAME_SHADE_DELTA_E) n += top[j3].n;
683
+ }
684
+ if (n > crowd) crowd = n;
685
+ }
686
+ return {
687
+ marks,
688
+ distinctFills: distinct.size,
689
+ crowdShare: Math.round(crowd / marks * 100),
690
+ spanDeltaE: Math.round(span)
691
+ };
692
+ } catch {
693
+ return EMPTY;
694
+ }
695
+ }
696
+ function colourSpreadFlag(c2) {
697
+ if (c2.marks === 0) return "";
698
+ return "ramp:d3:crowd" + Math.min(80, Math.floor(c2.crowdShare / 20) * 20);
699
+ }
700
+
701
+ // src/autoRamp.ts
702
+ var AUTO_RAMP_CLASSES = 7;
703
+ var AUTO_RAMP_DRAWN_OPACITY = 0.5;
704
+ var AUTO_RAMP_MIN_STEP_DELTA_E = 2.3;
705
+ var FALLBACK_ACCENT = "#3182bd";
706
+ var MIN_ACCENT_VS_CANVAS = 20;
707
+ var HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
708
+ function normHex(raw) {
709
+ if (typeof raw !== "string") return null;
710
+ const m = HEX.exec(raw.trim());
711
+ if (!m) return null;
712
+ const h2 = m[1].length === 3 ? m[1].split("").map((c2) => c2 + c2).join("") : m[1];
713
+ return "#" + h2.toLowerCase();
714
+ }
715
+ function mixLab(a4, b2, t) {
716
+ return { L: a4.L + (b2.L - a4.L) * t, a: a4.a + (b2.a - a4.a) * t, b: a4.b + (b2.b - a4.b) * t };
717
+ }
718
+ function paintedOver(fg, canvas, alpha) {
719
+ const f4 = [1, 3, 5].map((i2) => parseInt(fg.slice(i2, i2 + 2), 16));
720
+ const c2 = [1, 3, 5].map((i2) => parseInt(canvas.slice(i2, i2 + 2), 16));
721
+ const mixed = f4.map((v3, i2) => Math.round(v3 * alpha + c2[i2] * (1 - alpha))).map((v3) => v3.toString(16).padStart(2, "0"));
722
+ return hexToLab("#" + mixed.join(""));
723
+ }
724
+ function autoRampMinStep(low, high, canvas, classes = AUTO_RAMP_CLASSES, opacity = AUTO_RAMP_DRAWN_OPACITY) {
725
+ const lo = hexToLab(low), hi = hexToLab(high);
726
+ const bg = normHex(canvas);
727
+ if (!lo || !hi || !bg || classes < 2) return NaN;
728
+ let prev = null, min = Infinity;
729
+ for (let k2 = 0; k2 < classes; k2++) {
730
+ const painted = paintedOver(labToHex(mixLab(lo, hi, k2 / (classes - 1))), bg, opacity);
731
+ if (prev) min = Math.min(min, deltaE2000(prev, painted));
732
+ prev = painted;
733
+ }
734
+ return min;
735
+ }
736
+ function autoRampCanvas(p2) {
737
+ return normHex(p2.backgroundColor) ?? normHex(p2.themeBg) ?? "#ffffff";
738
+ }
739
+ var memoKey = "";
740
+ var memoValue = { low: "", high: "" };
741
+ function resolveAutoColorScale(p2) {
742
+ const canvas = autoRampCanvas(p2);
743
+ const palette = Array.isArray(p2.palette) ? p2.palette : [];
744
+ const key = [canvas, p2.isHighContrast ? 1 : 0, p2.themeAccent ?? "", p2.themeFg ?? "", palette.join(",")].join("|");
745
+ if (key === memoKey) return memoValue;
746
+ const bg = hexToLab(canvas);
747
+ const darkCanvas = bg.L < 50;
748
+ const usable = (hex2) => {
749
+ const lab = hex2 ? hexToLab(hex2) : null;
750
+ return !!lab && deltaE2000(lab, bg) >= MIN_ACCENT_VS_CANVAS;
751
+ };
752
+ const candidates = p2.isHighContrast ? [normHex(p2.themeAccent), normHex(p2.themeFg)] : [...palette.map(normHex), normHex(p2.themeAccent), normHex(p2.themeFg)];
753
+ const accent = candidates.find(usable) ?? FALLBACK_ACCENT;
754
+ const A = hexToLab(accent);
755
+ let t = 0.1;
756
+ let low = mixLab(bg, A, t);
757
+ while (t < 0.6 && deltaE2000(paintedOver(labToHex(low), canvas, AUTO_RAMP_DRAWN_OPACITY), bg) < SAME_SHADE_DELTA_E) {
758
+ t += 0.02;
759
+ low = mixLab(bg, A, t);
760
+ }
761
+ const lowHex = labToHex(low);
762
+ let high = { ...A };
763
+ let highHex = labToHex(high);
764
+ for (let step = 0; step < 80 && autoRampMinStep(lowHex, highHex, canvas) < AUTO_RAMP_MIN_STEP_DELTA_E; step++) {
765
+ const L2 = Math.max(4, Math.min(98, high.L + (darkCanvas ? 1 : -1)));
766
+ if (L2 === high.L) break;
767
+ high = { ...high, L: L2 };
768
+ highHex = labToHex(high);
769
+ }
770
+ memoKey = key;
771
+ memoValue = { low: lowHex, high: highHex };
772
+ return memoValue;
773
+ }
774
+
488
775
  // src/defaults.ts
489
776
  var clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n));
490
777
  var numberOr = (raw, dflt) => {
@@ -540,6 +827,10 @@ function resolveOptions(p2) {
540
827
  // ---- live-restyle knobs: `raw || undefined` / `.toString() || undefined` ----
541
828
  colorScaleLow: p2.colorScaleLow || void 0,
542
829
  colorScaleHigh: p2.colorScaleHigh || void 0,
830
+ // DERIVED, never passed: the automatic ends a blank picker stands for, resolved from the
831
+ // same palette and canvas the chart is handed on this render (autoRamp.ts).
832
+ colorScaleAutoLow: resolveAutoColorScale(p2).low,
833
+ colorScaleAutoHigh: resolveAutoColorScale(p2).high,
543
834
  // "" (global, the default), "frame", or "self"; anything else fails open to global.
544
835
  colorScaleScope: p2.colorScaleScope === "frame" || p2.colorScaleScope === "self" ? p2.colorScaleScope : "",
545
836
  // Math.max(50, Math.min(100, Number(raw) || 95)) — only meaningful under "self".
@@ -1095,89 +1386,89 @@ function Wt(n, s2) {
1095
1386
  return { iso: i2, unmatched: M, matchedRows: h2, totalRows: n.length };
1096
1387
  }
1097
1388
 
1098
- // ../shape-core/dist/chunk-5MZ6HMKL.mjs
1389
+ // ../shape-core/dist/chunk-U7SGOTKH.mjs
1099
1390
  var import_papaparse = __toESM(require_papaparse_min(), 1);
1100
1391
  /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
1101
- var Ce = { "north-america": "AG AI AW BB BL BM BQ BS BZ CA CR CU CW DM DO GD GL GP GT HN HT JM KN KY LC MF MQ MS MX NI PA PM PR SV SX TC TT US VC VG VI", "south-america": "AR BO BR CL CO EC FK GF GY PE PY SR UY VE", europe: "AD AL AT AX BA BE BG BY CH CY CZ DE DK EE ES FI FO FR GB GG GI GR HR HU IE IM IS IT JE LI LT LU LV MC MD ME MK MT NL NO PL PT RO RS RU SE SI SJ SK SM UA VA", africa: "AO BF BI BJ BW CD CF CG CI CM CV DJ DZ EG EH ER ET GA GH GM GN GQ GW KE KM LR LS LY MA MG ML MR MU MW MZ NA NE NG RE RW SC SD SH SL SN SO SS ST SZ TD TG TN TZ UG YT ZA ZM ZW", asia: "AE AF AM AZ BD BH BN BT CC CN CX GE HK ID IL IN IO IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO MV MY NP OM PH PK PS QA SA SG SY TH TJ TL TM TR TW UZ VN YE", oceania: "AS AU CK FJ FM GU KI MH MP NC NF NR NU NZ PF PG PN PW SB TK TO TV UM VU WF WS", antarctica: "AQ BV GS HM TF" };
1102
- var Q2 = (() => {
1392
+ var Ae = { "north-america": "AG AI AW BB BL BM BQ BS BZ CA CR CU CW DM DO GD GL GP GT HN HT JM KN KY LC MF MQ MS MX NI PA PM PR SV SX TC TT US VC VG VI", "south-america": "AR BO BR CL CO EC FK GF GY PE PY SR UY VE", europe: "AD AL AT AX BA BE BG BY CH CY CZ DE DK EE ES FI FO FR GB GG GI GR HR HU IE IM IS IT JE LI LT LU LV MC MD ME MK MT NL NO PL PT RO RS RU SE SI SJ SK SM UA VA", africa: "AO BF BI BJ BW CD CF CG CI CM CV DJ DZ EG EH ER ET GA GH GM GN GQ GW KE KM LR LS LY MA MG ML MR MU MW MZ NA NE NG RE RW SC SD SH SL SN SO SS ST SZ TD TG TN TZ UG YT ZA ZM ZW", asia: "AE AF AM AZ BD BH BN BT CC CN CX GE HK ID IL IN IO IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO MV MY NP OM PH PK PS QA SA SG SY TH TJ TL TM TR TW UZ VN YE", oceania: "AS AU CK FJ FM GU KI MH MP NC NF NR NU NZ PF PG PN PW SB TK TO TV UM VU WF WS", antarctica: "AQ BV GS HM TF" };
1393
+ var ee = (() => {
1103
1394
  let n = /* @__PURE__ */ new Map();
1104
- for (let e of Object.keys(Ce)) for (let t of Ce[e].split(/\s+/)) t && n.set(t, e);
1395
+ for (let e of Object.keys(Ae)) for (let t of Ae[e].split(/\s+/)) t && n.set(t, e);
1105
1396
  return n;
1106
1397
  })();
1107
- function Ve(n) {
1398
+ function He(n) {
1108
1399
  for (let [e, t] of n) {
1109
- let i2 = Q2.get(e);
1110
- i2 && !Q2.has(t) && Q2.set(t, i2);
1400
+ let i2 = ee.get(e);
1401
+ i2 && !ee.has(t) && ee.set(t, i2);
1111
1402
  }
1112
1403
  }
1113
- Ve(N);
1114
- var Ye = ["rate", "ratio", "pct", "percent", "percentage", "rating", "share", "score", "index", "nps", "csat", "margin", "yield", "coverage", "utilization", "z[_-]?score", "average", "avg", "mean", "median", "stddev", "variance", "gpa", "percentile", "quantile", "efficiency", "accuracy", "probability", "multiplier", "coefficient", "correlation", "occupancy", "age", "bmi", "temperature", "density", "pressure", "humidity", "ph", "velocity", "speed", "elevation", "altitude", "latency", "throughput", "bandwidth", "iops", "temperatuur", "temperatur", "temperatura", "teplota", "lampotila", "homerseklet", "sicaklik", "pression", "presion", "pressao", "pressione", "druck", "tryck", "tlak", "paine", "nyomas", "presiune", "humidite", "humedad", "umidade", "umidita", "feuchtigkeit", "vochtigheid", "kosteus", "vlhkost", "vitesse", "velocidad", "velocidade", "velocita", "geschwindigkeit", "snelheid", "hastighet", "hastighed", "rychlost", "nopeus", "sebesseg", "brzina", "predkosc", "densite", "densidad", "densidade", "densita", "dichte", "dichtheid", "hustota", "tiheys", "gustoca", "moyenne", "mediane", "promedio", "mediana", "gemiddelde", "durchschnitt", "mittelwert", "genomsnitt", "gennemsnit", "gjennomsnitt", "keskiarvo", "atlag", "ortalama", "prosjek", "srednia", "prumer", "priemer", "medie", "taux", "tasa", "taxa", "tasso", "verhaltnis", "verhouding", "aandeel", "anteil", "andel", "osuus", "podil", "udzial", "udio", "pourcentage", "porcentaje", "percentual", "prozent", "procent", "prosentti", "szazalek", "yuzde", "participacion", "participacao", "pondere", "omjer", "arany", "oran", "rata", "leeftijd", "edad", "idade", "wiek", "eletkor", "varsta", "puntuacion", "pontuacao", "punteggio", "betyg", "ocena", "indice", "indeks", "wskaznik", "puan"];
1115
- var He = ["pct", "percent", "percentage", "rate", "ratio", "rating", "share", "score", "index", "nps", "csat", "margin", "yield", "coverage", "utilization", "gpa", "percentile", "quantile", "bmi", "density", "pressure", "humidity", "velocity", "efficiency", "occupancy", "latency", "throughput", "bandwidth", "iops"];
1116
- var Ke = ["latitude", "longitude"];
1117
- var $e = ["latitude", "longitude"];
1118
- function Z2(n) {
1404
+ He(N);
1405
+ var Ke = ["rate", "ratio", "pct", "percent", "percentage", "rating", "share", "score", "index", "nps", "csat", "margin", "yield", "coverage", "utilization", "z[_-]?score", "average", "avg", "mean", "median", "stddev", "variance", "gpa", "percentile", "quantile", "efficiency", "accuracy", "probability", "multiplier", "coefficient", "correlation", "occupancy", "age", "bmi", "temperature", "density", "pressure", "humidity", "ph", "velocity", "speed", "elevation", "altitude", "latency", "throughput", "bandwidth", "iops", "temperatuur", "temperatur", "temperatura", "teplota", "lampotila", "homerseklet", "sicaklik", "pression", "presion", "pressao", "pressione", "druck", "tryck", "tlak", "paine", "nyomas", "presiune", "humidite", "humedad", "umidade", "umidita", "feuchtigkeit", "vochtigheid", "kosteus", "vlhkost", "vitesse", "velocidad", "velocidade", "velocita", "geschwindigkeit", "snelheid", "hastighet", "hastighed", "rychlost", "nopeus", "sebesseg", "brzina", "predkosc", "densite", "densidad", "densidade", "densita", "dichte", "dichtheid", "hustota", "tiheys", "gustoca", "moyenne", "mediane", "promedio", "mediana", "gemiddelde", "durchschnitt", "mittelwert", "genomsnitt", "gennemsnit", "gjennomsnitt", "keskiarvo", "atlag", "ortalama", "prosjek", "srednia", "prumer", "priemer", "medie", "taux", "tasa", "taxa", "tasso", "verhaltnis", "verhouding", "aandeel", "anteil", "andel", "osuus", "podil", "udzial", "udio", "pourcentage", "porcentaje", "percentual", "prozent", "procent", "prosentti", "szazalek", "yuzde", "participacion", "participacao", "pondere", "omjer", "arany", "oran", "rata", "leeftijd", "edad", "idade", "wiek", "eletkor", "varsta", "puntuacion", "pontuacao", "punteggio", "betyg", "ocena", "indice", "indeks", "wskaznik", "puan"];
1406
+ var $e = ["pct", "percent", "percentage", "rate", "ratio", "rating", "share", "score", "index", "nps", "csat", "margin", "yield", "coverage", "utilization", "gpa", "percentile", "quantile", "bmi", "density", "pressure", "humidity", "velocity", "efficiency", "occupancy", "latency", "throughput", "bandwidth", "iops"];
1407
+ var Ze = ["latitude", "longitude"];
1408
+ var Xe = ["latitude", "longitude"];
1409
+ function j2(n) {
1119
1410
  return Array.from(n).map((e) => {
1120
1411
  let t = e.normalize("NFD").replace(/[̀-ͯ]/g, "");
1121
1412
  return t.length === 1 ? t : e;
1122
1413
  }).join("");
1123
1414
  }
1124
- var re = ["somme de", "suma de", "soma de", "summe von", "som van", "somma di", "summa av", "sum av", "sum af", "soucet z", "suma z", "totaal van", "total de", "toplam", "osszeg", "nombre de", "recuento de", "contagem de", "anzahl von", "aantal van", "conteggio di", "antal av", "lukumaara", "pocet z"];
1125
- function Ze(n) {
1415
+ var oe = ["somme de", "suma de", "soma de", "summe von", "som van", "somma di", "summa av", "sum av", "sum af", "soucet z", "suma z", "totaal van", "total de", "toplam", "osszeg", "nombre de", "recuento de", "contagem de", "anzahl von", "aantal van", "conteggio di", "antal av", "lukumaara", "pocet z"];
1416
+ function je(n) {
1126
1417
  return [...n].sort((e, t) => t.length - e.length).map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+")).join("|");
1127
1418
  }
1128
- var Re = new RegExp("^\\s*(?:(?:sum|count|count\\s+distinct|distinct\\s+count)\\s+of\\s+|(?:" + Ze(re) + ")\\s+)", "i");
1129
- var Xe = /(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])/g;
1130
- var je = new RegExp("\\b(" + Ye.join("|") + ")\\b|(" + He.join("|") + ")$", "i");
1131
- var qe = new RegExp("\\b(" + Ke.join("|") + ")\\b|(" + $e.join("|") + ")$", "i");
1132
- function ve(n) {
1419
+ var Ne = new RegExp("^\\s*(?:(?:sum|count|count\\s+distinct|distinct\\s+count)\\s+of\\s+|(?:" + je(oe) + ")\\s+)", "i");
1420
+ var qe = /(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])/g;
1421
+ var Qe = new RegExp("\\b(" + Ke.join("|") + ")\\b|(" + $e.join("|") + ")$", "i");
1422
+ var Je = new RegExp("\\b(" + Ze.join("|") + ")\\b|(" + Xe.join("|") + ")$", "i");
1423
+ function xe(n) {
1133
1424
  if (!n) return "";
1134
- let e = String(n), t = Re.exec(Z2(e));
1425
+ let e = String(n), t = Ne.exec(j2(e));
1135
1426
  return (t ? e.slice(t[0].length) : e).trim();
1136
1427
  }
1137
- function Qe(n) {
1138
- return !!n && Re.test(Z2(String(n)));
1139
- }
1140
- var Je = ["count (distinct)", "count distinct", "distinct count", "standard deviation", "average", "variance", "median", "product", "stddev", "std dev", "count", "sum", "avg", "min", "minimum", "max", "maximum", "var"];
1141
- var Ae = new RegExp("^\\s*(" + [...Je].sort((n, e) => e.length - n.length).map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+")).join("|") + ")\\s+of\\s+", "i");
1142
1428
  function et(n) {
1143
- let e = ve(n);
1144
- return e.length === 0 ? "" : e.replace(Xe, " ");
1429
+ return !!n && Ne.test(j2(String(n)));
1430
+ }
1431
+ var tt = ["count (distinct)", "count distinct", "distinct count", "standard deviation", "average", "variance", "median", "product", "stddev", "std dev", "count", "sum", "avg", "min", "minimum", "max", "maximum", "var"];
1432
+ var Re = new RegExp("^\\s*(" + [...tt].sort((n, e) => e.length - n.length).map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+")).join("|") + ")\\s+of\\s+", "i");
1433
+ function nt(n) {
1434
+ let e = xe(n);
1435
+ return e.length === 0 ? "" : e.replace(qe, " ");
1145
1436
  }
1146
- function xe(n, e) {
1437
+ function we(n, e) {
1147
1438
  if (!e) return false;
1148
- let t = ve(e);
1149
- return n.test(Z2(et(e))) || n.test(Z2(t)) || n.test(Z2(s(t).join(" ")));
1439
+ let t = xe(e);
1440
+ return n.test(j2(nt(e))) || n.test(j2(t)) || n.test(j2(s(t).join(" ")));
1150
1441
  }
1151
- function Ie(n) {
1152
- return xe(qe, n);
1442
+ function Ee(n) {
1443
+ return we(Je, n);
1153
1444
  }
1154
- function tt(n) {
1155
- return xe(je, n) || Ie(n);
1445
+ function it(n) {
1446
+ return we(Qe, n) || Ee(n);
1156
1447
  }
1157
- var we = /int|double|decimal|single|float|number|currency|money/i;
1158
- function nt(n) {
1448
+ var De = /int|double|decimal|single|float|number|currency|money/i;
1449
+ function rt2(n) {
1159
1450
  let e = String(n?.valueNature ?? "").trim().toLowerCase();
1160
- return e === "categorical" ? "Categorical" : e === "ordinal" ? "Ordinal" : e === "continuous" || n?.isMeasure === true || we.test(String(n?.dataType ?? "")) ? "Continuous" : "Categorical";
1451
+ return e === "categorical" ? "Categorical" : e === "ordinal" ? "Ordinal" : e === "continuous" || n?.isMeasure === true || De.test(String(n?.dataType ?? "")) ? "Continuous" : "Categorical";
1161
1452
  }
1162
- function it(n) {
1163
- return n?.isMeasure === true || we.test(String(n?.dataType ?? ""));
1453
+ function st(n) {
1454
+ return n?.isMeasure === true || De.test(String(n?.dataType ?? ""));
1164
1455
  }
1165
- function Ee(n) {
1166
- let e = n ?? {}, t = nt(e);
1456
+ function Oe(n) {
1457
+ let e = n ?? {}, t = rt2(e);
1167
1458
  if (t !== "Continuous") return { nature: t, additivity: "unknown", basis: "role", suppressed: false };
1168
- if (Ie(e.name)) return { nature: t, additivity: "positional", basis: "name", suppressed: true };
1459
+ if (Ee(e.name)) return { nature: t, additivity: "positional", basis: "name", suppressed: true };
1169
1460
  let i2 = String(e.additivity ?? "").trim().toLowerCase();
1170
- if (!(i2 === "additive" && Qe(e.name))) {
1461
+ if (!(i2 === "additive" && et(e.name))) {
1171
1462
  if (i2 === "additive") return { nature: t, additivity: "additive", basis: "measured", suppressed: false };
1172
1463
  if (i2 === "part_of_whole") return { nature: t, additivity: "part_of_whole", basis: "measured", suppressed: false };
1173
1464
  if (i2 === "intensive_rate") return { nature: t, additivity: "intensive_rate", basis: "measured", suppressed: false };
1174
1465
  }
1175
- return e.discourageAggregationAcrossGroups === true ? { nature: t, additivity: "intensive_rate", basis: "host-flag", suppressed: false } : tt(e.name) ? { nature: t, additivity: "intensive_rate", basis: "name", suppressed: false } : { nature: t, additivity: "additive", basis: "default", suppressed: false };
1466
+ return e.discourageAggregationAcrossGroups === true ? { nature: t, additivity: "intensive_rate", basis: "host-flag", suppressed: false } : it(e.name) ? { nature: t, additivity: "intensive_rate", basis: "name", suppressed: false } : { nature: t, additivity: "additive", basis: "default", suppressed: false };
1176
1467
  }
1177
- function De(n) {
1178
- let e = Ee(n), t = n ?? {};
1468
+ function Le(n) {
1469
+ let e = Oe(n), t = n ?? {};
1179
1470
  if (e.nature === "Categorical") return ["first", "distinctcount", "count"];
1180
- if (e.nature === "Ordinal") return it(t) ? ["median", "average", "min", "max", "first", "distinctcount", "count"] : ["first", "distinctcount", "count"];
1471
+ if (e.nature === "Ordinal") return st(t) ? ["median", "average", "min", "max", "first", "distinctcount", "count"] : ["first", "distinctcount", "count"];
1181
1472
  switch (e.additivity) {
1182
1473
  case "positional":
1183
1474
  return ["min", "max", "count", "distinctcount", "first"];
@@ -1187,20 +1478,20 @@ function De(n) {
1187
1478
  return ["sum", "average", "median", "min", "max", "count", "distinctcount", "first"];
1188
1479
  }
1189
1480
  }
1190
- function Bt(n) {
1191
- return De(n)[0];
1481
+ function Yt(n) {
1482
+ return Le(n)[0];
1192
1483
  }
1193
- function Yt(n, e) {
1484
+ function Kt(n, e) {
1194
1485
  if (e !== "sum" && e !== "count") return false;
1195
1486
  if (e === "count") return true;
1196
- let t = Ee(n);
1487
+ let t = Oe(n);
1197
1488
  return t.additivity === "additive" || t.additivity === "part_of_whole" || t.additivity === "unknown";
1198
1489
  }
1199
1490
 
1200
1491
  // ../shape-core/dist/index.mjs
1201
1492
  /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
1202
1493
  var E2 = 2;
1203
- var Z3 = 400;
1494
+ var Z2 = 400;
1204
1495
  function G2(r) {
1205
1496
  return !!E(r);
1206
1497
  }
@@ -1209,7 +1500,7 @@ function C(r) {
1209
1500
  for (let e of r) {
1210
1501
  if (e == null) continue;
1211
1502
  let s2 = u(String(e));
1212
- if (!V(s2) && !n.has(s2) && (n.add(s2), n.size >= Z3)) break;
1503
+ if (!V(s2) && !n.has(s2) && (n.add(s2), n.size >= Z2)) break;
1213
1504
  }
1214
1505
  return Array.from(n);
1215
1506
  }
@@ -1243,7 +1534,7 @@ function F3(r) {
1243
1534
  for (let e of r) {
1244
1535
  if (e == null) continue;
1245
1536
  let s2 = String(e).trim();
1246
- if (!V(u(s2)) && !n.has(s2) && (n.add(s2), n.size >= Z3)) break;
1537
+ if (!V(u(s2)) && !n.has(s2) && (n.add(s2), n.size >= Z2)) break;
1247
1538
  }
1248
1539
  return Array.from(n);
1249
1540
  }
@@ -1335,7 +1626,7 @@ function le(r, n, e, s2, c2) {
1335
1626
  }
1336
1627
  t && (o.city = t.name, A.push(`city=${t.name} (${t.pct}% known cities)`));
1337
1628
  }
1338
- let B2 = o.country ? l2(o.country) : [], L2 = !!o.country && P2(B2), j2 = L2 ? new Set(B2.map((t) => E(t == null ? null : String(t))).filter(Boolean)).size : 0, K2 = L2 && j2 >= 2, N2 = !!(o.lat && o.lon) && n.some((t) => {
1629
+ let B2 = o.country ? l2(o.country) : [], L2 = !!o.country && P2(B2), j3 = L2 ? new Set(B2.map((t) => E(t == null ? null : String(t))).filter(Boolean)).size : 0, K2 = L2 && j3 >= 2, N2 = !!(o.lat && o.lon) && n.some((t) => {
1339
1630
  let i2 = +String(t[o.lat] ?? "").trim(), a4 = +String(t[o.lon] ?? "").trim();
1340
1631
  return isFinite(i2) && isFinite(a4) && i2 >= -90 && i2 <= 90 && a4 >= -180 && a4 <= 180 && String(t[o.lat] ?? "").trim() !== "" && String(t[o.lon] ?? "").trim() !== "";
1341
1632
  });
@@ -1626,7 +1917,7 @@ function createMarkResolver(env) {
1626
1917
  // src/hitTargets.ts
1627
1918
  var SVG_NS = "http://www.w3.org/2000/svg";
1628
1919
  var HIT_ATTR = "data-lch-hit";
1629
- var ELEMENT_CAP = 5e3;
1920
+ var ELEMENT_CAP2 = 5e3;
1630
1921
  function ensureCrossfilterHitTargets(container, doc) {
1631
1922
  const report = { tagged: 0, hitRects: 0, peFlips: 0, peStrokeOnly: 0 };
1632
1923
  try {
@@ -1635,7 +1926,7 @@ function ensureCrossfilterHitTargets(container, doc) {
1635
1926
  `.${MARK_CLASS}, .${LEGEND_MARK_CLASS}, .${AXIS_FILTER_CLASS}`
1636
1927
  );
1637
1928
  report.tagged = els.length;
1638
- if (els.length === 0 || els.length > ELEMENT_CAP) return report;
1929
+ if (els.length === 0 || els.length > ELEMENT_CAP2) return report;
1639
1930
  const ownerDoc = doc ?? container.ownerDocument;
1640
1931
  const view = ownerDoc?.defaultView;
1641
1932
  const computed = (el) => {
@@ -1703,9 +1994,9 @@ function ensureCrossfilterHitTargets(container, doc) {
1703
1994
  }
1704
1995
 
1705
1996
  // src/blankRender.ts
1706
- var EMPTY = { markCount: 0, legendMarkCount: 0, containerKind: "empty" };
1997
+ var EMPTY2 = { markCount: 0, legendMarkCount: 0, containerKind: "empty" };
1707
1998
  function censusMarks(container) {
1708
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY;
1999
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY2;
1709
2000
  try {
1710
2001
  const marks = /* @__PURE__ */ new Set();
1711
2002
  for (const el of Array.from(container.querySelectorAll(`.${MARK_CLASS}`))) marks.add(el);
@@ -1723,7 +2014,7 @@ function censusMarks(container) {
1723
2014
  containerKind: hasSvg ? "svg" : hasAnything ? "html" : "empty"
1724
2015
  };
1725
2016
  } catch {
1726
- return EMPTY;
2017
+ return EMPTY2;
1727
2018
  }
1728
2019
  }
1729
2020
  function isBlankRender(i2) {
@@ -1740,8 +2031,8 @@ function blankRenderFlag(lang, cause) {
1740
2031
 
1741
2032
  // src/hitBands.ts
1742
2033
  var MIN_HIT_BAND_PX = 8;
1743
- var ELEMENT_CAP2 = 5e3;
1744
- var EMPTY2 = {
2034
+ var ELEMENT_CAP3 = 5e3;
2035
+ var EMPTY3 = {
1745
2036
  openStrokes: 0,
1746
2037
  interactive: 0,
1747
2038
  hairline: 0,
@@ -1749,7 +2040,7 @@ var EMPTY2 = {
1749
2040
  widestPx: 0
1750
2041
  };
1751
2042
  var OPEN_TAGS = /* @__PURE__ */ new Set(["path", "line", "polyline"]);
1752
- function styleOf(el, doc) {
2043
+ function styleOf2(el, doc) {
1753
2044
  try {
1754
2045
  const view = doc?.defaultView;
1755
2046
  return view?.getComputedStyle ? view.getComputedStyle(el) : null;
@@ -1774,19 +2065,19 @@ function widthPx(raw) {
1774
2065
  return isFinite(n) ? n : NaN;
1775
2066
  }
1776
2067
  function censusHitBands(container, doc) {
1777
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY2;
2068
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY3;
1778
2069
  try {
1779
2070
  const els = Array.from(
1780
2071
  container.querySelectorAll(`.${MARK_CLASS}, [${ROW_IDX_ATTR}]`)
1781
2072
  );
1782
- if (els.length === 0 || els.length > ELEMENT_CAP2) return EMPTY2;
2073
+ if (els.length === 0 || els.length > ELEMENT_CAP3) return EMPTY3;
1783
2074
  const ownerDoc = doc ?? container.ownerDocument;
1784
2075
  const widestByGeom = /* @__PURE__ */ new Map();
1785
2076
  const rows = [];
1786
2077
  for (const el of els) {
1787
2078
  const tag = String(el.tagName || "").toLowerCase();
1788
2079
  if (!OPEN_TAGS.has(tag)) continue;
1789
- const cs = styleOf(el, ownerDoc);
2080
+ const cs = styleOf2(el, ownerDoc);
1790
2081
  const open = isUnfilled(attrOrComputed(el, "fill", cs));
1791
2082
  const w2 = widthPx(attrOrComputed(el, "stroke-width", cs) || "1");
1792
2083
  const geom = String(el.getAttribute?.("d") ?? "") || `${tag}#${String(el.getAttribute?.(ROW_IDX_ATTR) ?? "")}`;
@@ -1797,7 +2088,7 @@ function censusHitBands(container, doc) {
1797
2088
  if (prev === void 0 || w2 > prev) widestByGeom.set(geom, w2);
1798
2089
  }
1799
2090
  }
1800
- const out = { ...EMPTY2 };
2091
+ const out = { ...EMPTY3 };
1801
2092
  for (const r of rows) {
1802
2093
  if (!r.open) continue;
1803
2094
  out.openStrokes++;
@@ -1811,7 +2102,7 @@ function censusHitBands(container, doc) {
1811
2102
  }
1812
2103
  return out;
1813
2104
  } catch {
1814
- return EMPTY2;
2105
+ return EMPTY3;
1815
2106
  }
1816
2107
  }
1817
2108
  function hitBandFlag(c2) {
@@ -1819,197 +2110,137 @@ function hitBandFlag(c2) {
1819
2110
  return c2.uncovered > 0 ? "hitband:d3:thin" : "hitband:d3:ok";
1820
2111
  }
1821
2112
 
1822
- // src/deltaE.ts
1823
- function linearise(c2) {
1824
- const v3 = c2 / 255;
1825
- return v3 <= 0.04045 ? v3 / 12.92 : Math.pow((v3 + 0.055) / 1.055, 2.4);
1826
- }
1827
- var Xn = 0.95047;
1828
- var Yn = 1;
1829
- var Zn = 1.08883;
1830
- var EPS = 216 / 24389;
1831
- var KAPPA = 24389 / 27;
1832
- function f2(t) {
1833
- return t > EPS ? Math.cbrt(t) : (KAPPA * t + 16) / 116;
1834
- }
1835
- function rgbToLab(r, g3, b2) {
1836
- const R = linearise(r), G3 = linearise(g3), B2 = linearise(b2);
1837
- const X2 = 0.4124564 * R + 0.3575761 * G3 + 0.1804375 * B2;
1838
- const Y2 = 0.2126729 * R + 0.7151522 * G3 + 0.072175 * B2;
1839
- const Z4 = 0.0193339 * R + 0.119192 * G3 + 0.9503041 * B2;
1840
- const fx = f2(X2 / Xn), fy = f2(Y2 / Yn), fz = f2(Z4 / Zn);
1841
- return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) };
1842
- }
1843
- function hexToLab(hex2) {
1844
- const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex2.trim());
1845
- if (!m) return null;
1846
- const h2 = m[1].length === 3 ? m[1][0] + m[1][0] + m[1][1] + m[1][1] + m[1][2] + m[1][2] : m[1];
1847
- return rgbToLab(parseInt(h2.slice(0, 2), 16), parseInt(h2.slice(2, 4), 16), parseInt(h2.slice(4, 6), 16));
1848
- }
1849
- var RAD = Math.PI / 180;
1850
- var DEG = 180 / Math.PI;
1851
- var NEUTRAL_CHROMA = 1e-4;
1852
- function deltaE2000(c1, c2) {
1853
- const C1 = Math.hypot(c1.a, c1.b), C2 = Math.hypot(c2.a, c2.b);
1854
- const Cbar = (C1 + C2) / 2;
1855
- const C7 = Math.pow(Cbar, 7);
1856
- const G3 = 0.5 * (1 - Math.sqrt(C7 / (C7 + Math.pow(25, 7))));
1857
- const a1p = (1 + G3) * c1.a, a2p = (1 + G3) * c2.a;
1858
- const C1p = Math.hypot(a1p, c1.b), C2p = Math.hypot(a2p, c2.b);
1859
- const neutral = C1p < NEUTRAL_CHROMA || C2p < NEUTRAL_CHROMA;
1860
- const h1p = C1p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c1.b, a1p) * DEG + 360) % 360;
1861
- const h2p = C2p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c2.b, a2p) * DEG + 360) % 360;
1862
- const dLp = c2.L - c1.L;
1863
- const dCp = C2p - C1p;
1864
- let dhp;
1865
- if (neutral) dhp = 0;
1866
- else if (Math.abs(h2p - h1p) <= 180) dhp = h2p - h1p;
1867
- else if (h2p - h1p > 180) dhp = h2p - h1p - 360;
1868
- else dhp = h2p - h1p + 360;
1869
- const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(dhp / 2 * RAD);
1870
- const Lbarp = (c1.L + c2.L) / 2;
1871
- const Cbarp = (C1p + C2p) / 2;
1872
- let hbarp;
1873
- if (neutral) hbarp = h1p + h2p;
1874
- else if (Math.abs(h1p - h2p) <= 180) hbarp = (h1p + h2p) / 2;
1875
- else if (h1p + h2p < 360) hbarp = (h1p + h2p + 360) / 2;
1876
- else hbarp = (h1p + h2p - 360) / 2;
1877
- const T3 = 1 - 0.17 * Math.cos((hbarp - 30) * RAD) + 0.24 * Math.cos(2 * hbarp * RAD) + 0.32 * Math.cos((3 * hbarp + 6) * RAD) - 0.2 * Math.cos((4 * hbarp - 63) * RAD);
1878
- const dTheta = 30 * Math.exp(-Math.pow((hbarp - 275) / 25, 2));
1879
- const Cbarp7 = Math.pow(Cbarp, 7);
1880
- const RC = 2 * Math.sqrt(Cbarp7 / (Cbarp7 + Math.pow(25, 7)));
1881
- const RT = -RC * Math.sin(2 * dTheta * RAD);
1882
- const Lm50 = Math.pow(Lbarp - 50, 2);
1883
- const SL = 1 + 0.015 * Lm50 / Math.sqrt(20 + Lm50);
1884
- const SC = 1 + 0.045 * Cbarp;
1885
- const SH = 1 + 0.015 * Cbarp * T3;
1886
- const tL = dLp / SL, tC = dCp / SC, tH = dHp / SH;
1887
- return Math.sqrt(tL * tL + tC * tC + tH * tH + RT * tC * tH);
1888
- }
1889
- function deltaEHex(a4, b2) {
1890
- const la = hexToLab(a4), lb = hexToLab(b2);
1891
- return la && lb ? deltaE2000(la, lb) : NaN;
1892
- }
1893
-
1894
- // src/colourSpread.ts
1895
- var SAME_SHADE_DELTA_E = 5;
1896
- var MIN_RAMP_FILLS = 4;
1897
- var RAMP_SLACK_MAX = 0.15;
1898
- var MIN_MARKS = 24;
1899
- var ELEMENT_CAP3 = 5e3;
1900
- var MAX_CELLS = 48;
1901
- var CELL_STEP = 32;
1902
- var EMPTY3 = { marks: 0, distinctFills: 0, crowdShare: 0, spanDeltaE: 0 };
1903
- function styleOf2(el, doc) {
1904
- try {
1905
- const view = doc?.defaultView;
1906
- return view?.getComputedStyle ? view.getComputedStyle(el) : null;
1907
- } catch {
1908
- return null;
1909
- }
1910
- }
1911
- function fillOf(el, cs) {
1912
- const a4 = el.getAttribute?.("fill");
1913
- if (a4 !== null && a4 !== void 0 && String(a4).trim() !== "") return String(a4).trim();
1914
- const c2 = cs?.fill;
1915
- return c2 === null || c2 === void 0 ? "" : String(c2).trim();
1916
- }
1917
- function toRgb(raw) {
1918
- const s2 = raw.trim().toLowerCase();
1919
- if (!s2 || s2 === "none" || s2 === "transparent") return null;
1920
- const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(s2);
1921
- if (hex2) {
1922
- const h2 = hex2[1];
1923
- const full = h2.length === 3 ? h2[0] + h2[0] + h2[1] + h2[1] + h2[2] + h2[2] : h2;
1924
- return [
1925
- parseInt(full.slice(0, 2), 16),
1926
- parseInt(full.slice(2, 4), 16),
1927
- parseInt(full.slice(4, 6), 16)
1928
- ];
2113
+ // src/valuePlacement.ts
2114
+ var MIN_MARKS2 = 24;
2115
+ var ELEMENT_CAP4 = 5e3;
2116
+ var FIT_SAMPLE = 90;
2117
+ var VALUE_AXIS_MIN_FIT = 0.8;
2118
+ var MIN_AXIS_SPAN_PX = 40;
2119
+ var EMPTY4 = { marks: 0, axis: "", column: "", fit: 0, offShare: 0, medianOffRadii: 0 };
2120
+ function num(el, name) {
2121
+ const v3 = el.getAttribute?.(name);
2122
+ if (v3 === null || v3 === void 0 || String(v3).trim() === "") return NaN;
2123
+ return parseFloat(String(v3));
2124
+ }
2125
+ function median(xs) {
2126
+ if (!xs.length) return NaN;
2127
+ const s2 = [...xs].sort((a4, b2) => a4 - b2);
2128
+ const m = s2.length >> 1;
2129
+ return s2.length % 2 ? s2[m] : (s2[m - 1] + s2[m]) / 2;
2130
+ }
2131
+ function robustLine(v3, pos) {
2132
+ const n = v3.length;
2133
+ const step = Math.max(1, Math.floor(n / FIT_SAMPLE));
2134
+ const idx = [];
2135
+ for (let i2 = 0; i2 < n; i2 += step) idx.push(i2);
2136
+ const slopes = [];
2137
+ for (let p2 = 0; p2 < idx.length; p2++) {
2138
+ for (let q3 = p2 + 1; q3 < idx.length; q3++) {
2139
+ const dv = v3[idx[q3]] - v3[idx[p2]];
2140
+ if (Math.abs(dv) < 1e-12) continue;
2141
+ slopes.push((pos[idx[q3]] - pos[idx[p2]]) / dv);
2142
+ }
1929
2143
  }
1930
- const m = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)\s*)?\)$/.exec(s2);
1931
- if (!m) return null;
1932
- if (m[4] !== void 0 && parseFloat(m[4]) === 0) return null;
1933
- return [Math.round(parseFloat(m[1])), Math.round(parseFloat(m[2])), Math.round(parseFloat(m[3]))];
1934
- }
1935
- function cellKey(rgb) {
1936
- return [
1937
- Math.round(rgb[0] / CELL_STEP),
1938
- Math.round(rgb[1] / CELL_STEP),
1939
- Math.round(rgb[2] / CELL_STEP)
1940
- ].join(",");
1941
- }
1942
- function hex(rgb) {
1943
- return "#" + rgb.map((v3) => Math.max(0, Math.min(255, v3)).toString(16).padStart(2, "0")).join("");
2144
+ if (slopes.length < 3) return null;
2145
+ const b2 = median(slopes);
2146
+ if (!Number.isFinite(b2) || Math.abs(b2) < 1e-12) return null;
2147
+ const a4 = median(pos.map((y4, i2) => y4 - b2 * v3[i2]));
2148
+ return Number.isFinite(a4) ? { a: a4, b: b2 } : null;
1944
2149
  }
1945
- function censusColourSpread(container, doc) {
1946
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY3;
2150
+ function censusValuePlacement(container, data) {
1947
2151
  try {
1948
- const els = Array.from(
1949
- container.querySelectorAll(`.${MARK_CLASS}, [${ROW_IDX_ATTR}]`)
1950
- );
1951
- if (els.length === 0 || els.length > ELEMENT_CAP3) return EMPTY3;
1952
- const ownerDoc = doc ?? container.ownerDocument;
1953
- const distinct = /* @__PURE__ */ new Set();
1954
- const cells = /* @__PURE__ */ new Map();
1955
- let marks = 0;
2152
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY4;
2153
+ const rows = data?.rows;
2154
+ const columns = data?.columns ?? [];
2155
+ if (!Array.isArray(rows) || !rows.length || !columns.length) return EMPTY4;
2156
+ const els = Array.from(container.querySelectorAll(`circle[${ROW_IDX_ATTR}]`));
2157
+ if (els.length < MIN_MARKS2 || els.length > ELEMENT_CAP4) return EMPTY4;
2158
+ const dots = [];
2159
+ const seen = /* @__PURE__ */ new Set();
1956
2160
  for (const el of els) {
1957
- const rgb = toRgb(fillOf(el, styleOf2(el, ownerDoc)));
1958
- if (!rgb) continue;
1959
- marks++;
1960
- distinct.add(rgb.join(","));
1961
- const k2 = cellKey(rgb);
1962
- const cur = cells.get(k2);
1963
- if (cur) cur.n++;
1964
- else cells.set(k2, { rgb, n: 1 });
2161
+ const raw = String(el.getAttribute(ROW_IDX_ATTR) ?? "").trim();
2162
+ if (!/^\d+$/.test(raw)) continue;
2163
+ const i2 = +raw;
2164
+ const row = rows[i2];
2165
+ const x2 = num(el, "cx"), y4 = num(el, "cy"), r = num(el, "r");
2166
+ if (!row || !Number.isFinite(x2) || !Number.isFinite(y4) || !(r > 0)) continue;
2167
+ seen.add(i2);
2168
+ dots.push({ row, x: x2, y: y4, r });
1965
2169
  }
1966
- if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY3;
1967
- const top = [...cells.values()].sort((a4, b2) => b2.n - a4.n).slice(0, MAX_CELLS);
1968
- const cs = top.map((c2) => hexToLab(hex(c2.rgb))).filter((l2) => l2 !== null);
1969
- if (cs.length < MIN_RAMP_FILLS) return EMPTY3;
1970
- const d = cs.map(() => new Array(cs.length).fill(0));
1971
- let span = 0, lo = 0, hi = 1;
1972
- for (let i2 = 0; i2 < cs.length; i2++) {
1973
- for (let j2 = i2 + 1; j2 < cs.length; j2++) {
1974
- const v3 = deltaE2000(cs[i2], cs[j2]);
1975
- d[i2][j2] = v3;
1976
- d[j2][i2] = v3;
1977
- if (v3 > span) {
1978
- span = v3;
1979
- lo = i2;
1980
- hi = j2;
2170
+ if (dots.length < MIN_MARKS2 || seen.size < dots.length * 0.9) return EMPTY4;
2171
+ let best = null;
2172
+ for (let c2 = 0; c2 < columns.length; c2++) {
2173
+ if (/^__.*__$/.test(String(columns[c2]?.name ?? ""))) continue;
2174
+ const vals = dots.map((d) => {
2175
+ const v3 = d.row[c2];
2176
+ return v3 === null || v3 === void 0 || v3 === "" ? NaN : typeof v3 === "number" ? v3 : Number(v3);
2177
+ });
2178
+ const finite = vals.filter(Number.isFinite);
2179
+ if (finite.length < dots.length * 0.9 || new Set(finite).size < 8) continue;
2180
+ const logs = finite.every((v3) => v3 > 0) ? [false, true] : [false];
2181
+ for (const log of logs) {
2182
+ for (const axis of ["x", "y"]) {
2183
+ const keep = [];
2184
+ const v3 = [], pos = [];
2185
+ dots.forEach((d, k2) => {
2186
+ if (!Number.isFinite(vals[k2])) return;
2187
+ keep.push(k2);
2188
+ v3.push(log ? Math.log10(vals[k2]) : vals[k2]);
2189
+ pos.push(axis === "x" ? d.x : d.y);
2190
+ });
2191
+ const line = robustLine(v3, pos);
2192
+ if (!line) continue;
2193
+ const lo = Math.min(...pos), hi = Math.max(...pos);
2194
+ if (hi - lo < MIN_AXIS_SPAN_PX) continue;
2195
+ const mean = pos.reduce((s2, p2) => s2 + p2, 0) / pos.length;
2196
+ let ssRes = 0, ssTot = 0;
2197
+ const res = pos.map((p2, k2) => {
2198
+ const e = p2 - (line.a + line.b * v3[k2]);
2199
+ ssRes += e * e;
2200
+ ssTot += (p2 - mean) ** 2;
2201
+ return e;
2202
+ });
2203
+ if (ssTot <= 0) continue;
2204
+ const fit = 1 - ssRes / ssTot;
2205
+ if (fit >= VALUE_AXIS_MIN_FIT && (!best || fit > best.fit)) {
2206
+ const full = new Array(dots.length).fill(NaN);
2207
+ keep.forEach((k2, j3) => {
2208
+ full[k2] = res[j3];
2209
+ });
2210
+ best = { col: c2, axis, fit, res: full, log };
2211
+ }
1981
2212
  }
1982
2213
  }
1983
2214
  }
1984
- if (span <= 0) return EMPTY3;
1985
- let slack = 0, interior = 0;
1986
- for (let i2 = 0; i2 < cs.length; i2++) {
1987
- if (i2 === lo || i2 === hi) continue;
1988
- slack += (d[lo][i2] + d[i2][hi]) / span - 1;
1989
- interior++;
1990
- }
1991
- if (interior < 2 || slack / interior > RAMP_SLACK_MAX) return EMPTY3;
1992
- let crowd = 0;
1993
- for (let i2 = 0; i2 < cs.length; i2++) {
1994
- let n = 0;
1995
- for (let j2 = 0; j2 < cs.length; j2++) {
1996
- if (i2 === j2 || d[i2][j2] <= SAME_SHADE_DELTA_E) n += top[j2].n;
1997
- }
1998
- if (n > crowd) crowd = n;
1999
- }
2215
+ if (!best) return EMPTY4;
2216
+ let off = 0, measured = 0;
2217
+ const radii = [];
2218
+ dots.forEach((d, k2) => {
2219
+ const e = best.res[k2];
2220
+ if (!Number.isFinite(e)) return;
2221
+ measured++;
2222
+ const inRadii = Math.abs(e) / Math.max(d.r, 1);
2223
+ radii.push(inRadii);
2224
+ if (inRadii > 1) off++;
2225
+ });
2226
+ if (measured < MIN_MARKS2) return EMPTY4;
2000
2227
  return {
2001
- marks,
2002
- distinctFills: distinct.size,
2003
- crowdShare: Math.round(crowd / marks * 100),
2004
- spanDeltaE: Math.round(span)
2228
+ marks: measured,
2229
+ axis: best.axis,
2230
+ column: String(columns[best.col]?.name ?? ""),
2231
+ fit: Math.round(best.fit * 1e3) / 1e3,
2232
+ offShare: Math.round(off / measured * 1e3) / 10,
2233
+ medianOffRadii: Math.round(median(radii) * 100) / 100
2005
2234
  };
2006
2235
  } catch {
2007
- return EMPTY3;
2236
+ return EMPTY4;
2008
2237
  }
2009
2238
  }
2010
- function colourSpreadFlag(c2) {
2239
+ function valuePlacementFlag(c2) {
2011
2240
  if (c2.marks === 0) return "";
2012
- return "ramp:d3:crowd" + Math.min(80, Math.floor(c2.crowdShare / 20) * 20);
2241
+ const s2 = c2.offShare;
2242
+ const bucket = s2 <= 0 ? 0 : s2 < 5 ? 1 : s2 < 20 ? 5 : s2 < 50 ? 20 : 50;
2243
+ return "place:d3:off" + bucket;
2013
2244
  }
2014
2245
 
2015
2246
  // src/fit.ts
@@ -2204,14 +2435,14 @@ var SVG_NS2 = "http://www.w3.org/2000/svg";
2204
2435
  var AXIS_PIN_MAX_CARRIED = 12;
2205
2436
  function unpinScrolledAxis(container) {
2206
2437
  if (!container) return;
2207
- const st = container[CONTAINER_SLOT_AXIS_PIN];
2208
- if (!st) return;
2438
+ const st2 = container[CONTAINER_SLOT_AXIS_PIN];
2439
+ if (!st2) return;
2209
2440
  try {
2210
- container.removeEventListener("scroll", st.onScroll);
2441
+ container.removeEventListener("scroll", st2.onScroll);
2211
2442
  } catch {
2212
2443
  }
2213
2444
  try {
2214
- if (st.overlay.parentNode) st.overlay.parentNode.removeChild(st.overlay);
2445
+ if (st2.overlay.parentNode) st2.overlay.parentNode.removeChild(st2.overlay);
2215
2446
  } catch {
2216
2447
  }
2217
2448
  try {
@@ -2389,15 +2620,15 @@ function pinScrolledAxis(container, svg) {
2389
2620
  const svgTop = svgBox.top - cRect.top - container.clientTop + container.scrollTop;
2390
2621
  const contentBand = { top: svgTop + band.top, bottom: svgTop + band.bottom };
2391
2622
  const place = () => {
2392
- const st = container.scrollTop, vh = container.clientHeight;
2393
- const edge2 = axisPinPlacement(contentBand, st, vh);
2623
+ const st2 = container.scrollTop, vh = container.clientHeight;
2624
+ const edge2 = axisPinPlacement(contentBand, st2, vh);
2394
2625
  if (!edge2) {
2395
2626
  o.display = "none";
2396
2627
  return null;
2397
2628
  }
2398
2629
  o.display = "block";
2399
2630
  o.left = `${svgLeft}px`;
2400
- o.top = `${edge2 === "top" ? st : st + vh - bandPx}px`;
2631
+ o.top = `${edge2 === "top" ? st2 : st2 + vh - bandPx}px`;
2401
2632
  return edge2;
2402
2633
  };
2403
2634
  const onScroll = () => {
@@ -2613,10 +2844,10 @@ function glyphSampleGrid(box, n = GLYPH_SAMPLE_N) {
2613
2844
  if (!box || !(box.width > 0) || !(box.height > 0) || !(n >= 1)) return out;
2614
2845
  const k2 = Math.floor(n);
2615
2846
  for (let i2 = 0; i2 < k2; i2++) {
2616
- for (let j2 = 0; j2 < k2; j2++) {
2847
+ for (let j3 = 0; j3 < k2; j3++) {
2617
2848
  out.push({
2618
2849
  x: box.left + box.width * (i2 + 0.5) / k2,
2619
- y: box.top + box.height * (j2 + 0.5) / k2
2850
+ y: box.top + box.height * (j3 + 0.5) / k2
2620
2851
  });
2621
2852
  }
2622
2853
  }
@@ -2634,7 +2865,7 @@ function hexToRGB(hex2) {
2634
2865
  // src/labelContrastDom.ts
2635
2866
  var LABEL_CONTRAST_DONE_ATTR = "data-lch-contrast";
2636
2867
  var LABEL_CONTRAST_CAP = 2e3;
2637
- var EMPTY4 = { rects: 0, scanned: 0, fixed: 0, pillsBoosted: 0, offFill: 0, pageMajority: 0 };
2868
+ var EMPTY5 = { rects: 0, scanned: 0, fixed: 0, pillsBoosted: 0, offFill: 0, pageMajority: 0 };
2638
2869
  function backedSamples(el, pts) {
2639
2870
  try {
2640
2871
  const ge = el;
@@ -2657,7 +2888,7 @@ function backedSamples(el, pts) {
2657
2888
  }
2658
2889
  }
2659
2890
  function applyLabelContrast(container, opts = {}) {
2660
- const report = { ...EMPTY4 };
2891
+ const report = { ...EMPTY5 };
2661
2892
  if (!container) {
2662
2893
  report.skipped = "no-container";
2663
2894
  return report;
@@ -2908,9 +3139,9 @@ function createChartHost(container, config) {
2908
3139
  const ensureAffordanceStyles = () => {
2909
3140
  try {
2910
3141
  if (!doc || doc.getElementById("bic-chart-host-affordances")) return;
2911
- const st = doc.createElement("style");
2912
- st.id = "bic-chart-host-affordances";
2913
- st.textContent = `
3142
+ const st2 = doc.createElement("style");
3143
+ st2.id = "bic-chart-host-affordances";
3144
+ st2.textContent = `
2914
3145
  /* TYPOGRAPHY FIREWALL. Generated charts set font-size but almost never line-height or
2915
3146
  letter-spacing, so they INHERIT whatever the host page cascades in. A page with
2916
3147
  \`:root { font: 18px/145% }\` (the stock Vite template does exactly this) hands every
@@ -2959,7 +3190,7 @@ function createChartHost(container, config) {
2959
3190
  font-weight: 700 !important;
2960
3191
  text-decoration: underline !important;
2961
3192
  }`;
2962
- (doc.head || doc.documentElement)?.appendChild(st);
3193
+ (doc.head || doc.documentElement)?.appendChild(st2);
2963
3194
  } catch {
2964
3195
  }
2965
3196
  };
@@ -3126,6 +3357,12 @@ function createChartHost(container, config) {
3126
3357
  } catch {
3127
3358
  }
3128
3359
  }
3360
+ if (config.onValuePlacementCensus) {
3361
+ try {
3362
+ config.onValuePlacementCensus(censusValuePlacement(container, data));
3363
+ } catch {
3364
+ }
3365
+ }
3129
3366
  if (fitOpts !== false) {
3130
3367
  try {
3131
3368
  const r = fitRenderedChart(container, fitOpts === true ? {} : fitOpts);
@@ -3224,6 +3461,17 @@ export {
3224
3461
  VALUE_AXIS_BASELINE_DEFAULT,
3225
3462
  SEASONAL_MARKERS_DEFAULT,
3226
3463
  MAX_MAP_POINTS_DEFAULT,
3464
+ deltaEHex,
3465
+ SAME_SHADE_DELTA_E,
3466
+ MIN_RAMP_FILLS,
3467
+ censusColourSpread,
3468
+ colourSpreadFlag,
3469
+ AUTO_RAMP_CLASSES,
3470
+ AUTO_RAMP_DRAWN_OPACITY,
3471
+ AUTO_RAMP_MIN_STEP_DELTA_E,
3472
+ autoRampMinStep,
3473
+ autoRampCanvas,
3474
+ resolveAutoColorScale,
3227
3475
  resolveOptions,
3228
3476
  geoAssetFor,
3229
3477
  loadGeo,
@@ -3234,10 +3482,10 @@ export {
3234
3482
  L3,
3235
3483
  p,
3236
3484
  u2 as u,
3237
- Ee,
3238
- De,
3239
- Bt,
3485
+ Oe,
3486
+ Le,
3240
3487
  Yt,
3488
+ Kt,
3241
3489
  buildRenderPayload,
3242
3490
  createMarkResolver,
3243
3491
  ensureCrossfilterHitTargets,
@@ -3247,11 +3495,9 @@ export {
3247
3495
  MIN_HIT_BAND_PX,
3248
3496
  censusHitBands,
3249
3497
  hitBandFlag,
3250
- deltaEHex,
3251
- SAME_SHADE_DELTA_E,
3252
- MIN_RAMP_FILLS,
3253
- censusColourSpread,
3254
- colourSpreadFlag,
3498
+ VALUE_AXIS_MIN_FIT,
3499
+ censusValuePlacement,
3500
+ valuePlacementFlag,
3255
3501
  SCROLL_SLACK_PX,
3256
3502
  needsScroll,
3257
3503
  contentExtentOf,