@bicharts/chart-host 0.5.98 → 0.5.100

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,306 @@ 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 painted = [];
640
+ for (const el of els) {
641
+ const rgb = toRgb(fillOf(el, styleOf(el, ownerDoc)));
642
+ if (rgb) painted.push({ rgb, tag: String(el.tagName || "").toLowerCase() });
643
+ }
644
+ const byTag = /* @__PURE__ */ new Map();
645
+ for (const p2 of painted) {
646
+ const g3 = byTag.get(p2.tag) ?? { fills: /* @__PURE__ */ new Set(), n: 0 };
647
+ g3.fills.add(p2.rgb.join(","));
648
+ g3.n++;
649
+ byTag.set(p2.tag, g3);
650
+ }
651
+ const overlays = new Set([...byTag].filter(([, g3]) => g3.fills.size === 1 && g3.n >= MIN_MARKS).map(([t]) => t));
652
+ const restFills = new Set([...byTag].filter(([t]) => !overlays.has(t)).flatMap(([, g3]) => [...g3.fills]));
653
+ const counted = restFills.size > 1 ? painted.filter((p2) => !overlays.has(p2.tag)) : painted;
654
+ const distinct = /* @__PURE__ */ new Set();
655
+ const cells = /* @__PURE__ */ new Map();
656
+ let marks = 0;
657
+ for (const { rgb } of counted) {
658
+ marks++;
659
+ distinct.add(rgb.join(","));
660
+ const k2 = cellKey(rgb);
661
+ const cur = cells.get(k2);
662
+ if (cur) cur.n++;
663
+ else cells.set(k2, { rgb, n: 1 });
664
+ }
665
+ if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY;
666
+ const top = [...cells.values()].sort((a4, b2) => b2.n - a4.n).slice(0, MAX_CELLS);
667
+ const cs = top.map((c2) => hexToLab(hex(c2.rgb))).filter((l2) => l2 !== null);
668
+ if (cs.length < MIN_RAMP_FILLS) return EMPTY;
669
+ const d = cs.map(() => new Array(cs.length).fill(0));
670
+ let span = 0, lo = 0, hi = 1;
671
+ for (let i2 = 0; i2 < cs.length; i2++) {
672
+ for (let j3 = i2 + 1; j3 < cs.length; j3++) {
673
+ const v3 = deltaE2000(cs[i2], cs[j3]);
674
+ d[i2][j3] = v3;
675
+ d[j3][i2] = v3;
676
+ if (v3 > span) {
677
+ span = v3;
678
+ lo = i2;
679
+ hi = j3;
680
+ }
681
+ }
682
+ }
683
+ if (span <= 0) return EMPTY;
684
+ let slack = 0, interior = 0;
685
+ for (let i2 = 0; i2 < cs.length; i2++) {
686
+ if (i2 === lo || i2 === hi) continue;
687
+ slack += (d[lo][i2] + d[i2][hi]) / span - 1;
688
+ interior++;
689
+ }
690
+ if (interior < 2 || slack / interior > RAMP_SLACK_MAX) return EMPTY;
691
+ let crowd = 0;
692
+ for (let i2 = 0; i2 < cs.length; i2++) {
693
+ let n = 0;
694
+ for (let j3 = 0; j3 < cs.length; j3++) {
695
+ if (i2 === j3 || d[i2][j3] <= SAME_SHADE_DELTA_E) n += top[j3].n;
696
+ }
697
+ if (n > crowd) crowd = n;
698
+ }
699
+ return {
700
+ marks,
701
+ distinctFills: distinct.size,
702
+ crowdShare: Math.round(crowd / marks * 100),
703
+ spanDeltaE: Math.round(span)
704
+ };
705
+ } catch {
706
+ return EMPTY;
707
+ }
708
+ }
709
+ function colourSpreadFlag(c2) {
710
+ if (c2.marks === 0) return "";
711
+ return "ramp:d3:crowd" + Math.min(80, Math.floor(c2.crowdShare / 20) * 20);
712
+ }
713
+
714
+ // src/autoRamp.ts
715
+ var AUTO_RAMP_CLASSES = 7;
716
+ var AUTO_RAMP_DRAWN_OPACITY = 0.5;
717
+ var AUTO_RAMP_MIN_STEP_DELTA_E = 2.3;
718
+ var FALLBACK_ACCENT = "#3182bd";
719
+ var MIN_ACCENT_VS_CANVAS = 20;
720
+ var HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
721
+ function normHex(raw) {
722
+ if (typeof raw !== "string") return null;
723
+ const m = HEX.exec(raw.trim());
724
+ if (!m) return null;
725
+ const h2 = m[1].length === 3 ? m[1].split("").map((c2) => c2 + c2).join("") : m[1];
726
+ return "#" + h2.toLowerCase();
727
+ }
728
+ function mixLab(a4, b2, t) {
729
+ 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 };
730
+ }
731
+ function paintedOver(fg, canvas, alpha) {
732
+ const f4 = [1, 3, 5].map((i2) => parseInt(fg.slice(i2, i2 + 2), 16));
733
+ const c2 = [1, 3, 5].map((i2) => parseInt(canvas.slice(i2, i2 + 2), 16));
734
+ const mixed = f4.map((v3, i2) => Math.round(v3 * alpha + c2[i2] * (1 - alpha))).map((v3) => v3.toString(16).padStart(2, "0"));
735
+ return hexToLab("#" + mixed.join(""));
736
+ }
737
+ function autoRampMinStep(low, high, canvas, classes = AUTO_RAMP_CLASSES, opacity = AUTO_RAMP_DRAWN_OPACITY) {
738
+ const lo = hexToLab(low), hi = hexToLab(high);
739
+ const bg = normHex(canvas);
740
+ if (!lo || !hi || !bg || classes < 2) return NaN;
741
+ let prev = null, min = Infinity;
742
+ for (let k2 = 0; k2 < classes; k2++) {
743
+ const painted = paintedOver(labToHex(mixLab(lo, hi, k2 / (classes - 1))), bg, opacity);
744
+ if (prev) min = Math.min(min, deltaE2000(prev, painted));
745
+ prev = painted;
746
+ }
747
+ return min;
748
+ }
749
+ function autoRampCanvas(p2) {
750
+ return normHex(p2.backgroundColor) ?? normHex(p2.themeBg) ?? "#ffffff";
751
+ }
752
+ var memoKey = "";
753
+ var memoValue = { low: "", high: "" };
754
+ function resolveAutoColorScale(p2) {
755
+ const canvas = autoRampCanvas(p2);
756
+ const palette = Array.isArray(p2.palette) ? p2.palette : [];
757
+ const key = [canvas, p2.isHighContrast ? 1 : 0, p2.themeAccent ?? "", p2.themeFg ?? "", palette.join(",")].join("|");
758
+ if (key === memoKey) return memoValue;
759
+ const bg = hexToLab(canvas);
760
+ const darkCanvas = bg.L < 50;
761
+ const usable = (hex2) => {
762
+ const lab = hex2 ? hexToLab(hex2) : null;
763
+ return !!lab && deltaE2000(lab, bg) >= MIN_ACCENT_VS_CANVAS;
764
+ };
765
+ const candidates = p2.isHighContrast ? [normHex(p2.themeAccent), normHex(p2.themeFg)] : [...palette.map(normHex), normHex(p2.themeAccent), normHex(p2.themeFg)];
766
+ const accent = candidates.find(usable) ?? FALLBACK_ACCENT;
767
+ const A = hexToLab(accent);
768
+ let t = 0.1;
769
+ let low = mixLab(bg, A, t);
770
+ while (t < 0.6 && deltaE2000(paintedOver(labToHex(low), canvas, AUTO_RAMP_DRAWN_OPACITY), bg) < SAME_SHADE_DELTA_E) {
771
+ t += 0.02;
772
+ low = mixLab(bg, A, t);
773
+ }
774
+ const lowHex = labToHex(low);
775
+ let high = { ...A };
776
+ let highHex = labToHex(high);
777
+ for (let step = 0; step < 80 && autoRampMinStep(lowHex, highHex, canvas) < AUTO_RAMP_MIN_STEP_DELTA_E; step++) {
778
+ const L2 = Math.max(4, Math.min(98, high.L + (darkCanvas ? 1 : -1)));
779
+ if (L2 === high.L) break;
780
+ high = { ...high, L: L2 };
781
+ highHex = labToHex(high);
782
+ }
783
+ memoKey = key;
784
+ memoValue = { low: lowHex, high: highHex };
785
+ return memoValue;
786
+ }
787
+
488
788
  // src/defaults.ts
489
789
  var clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n));
490
790
  var numberOr = (raw, dflt) => {
@@ -540,6 +840,10 @@ function resolveOptions(p2) {
540
840
  // ---- live-restyle knobs: `raw || undefined` / `.toString() || undefined` ----
541
841
  colorScaleLow: p2.colorScaleLow || void 0,
542
842
  colorScaleHigh: p2.colorScaleHigh || void 0,
843
+ // DERIVED, never passed: the automatic ends a blank picker stands for, resolved from the
844
+ // same palette and canvas the chart is handed on this render (autoRamp.ts).
845
+ colorScaleAutoLow: resolveAutoColorScale(p2).low,
846
+ colorScaleAutoHigh: resolveAutoColorScale(p2).high,
543
847
  // "" (global, the default), "frame", or "self"; anything else fails open to global.
544
848
  colorScaleScope: p2.colorScaleScope === "frame" || p2.colorScaleScope === "self" ? p2.colorScaleScope : "",
545
849
  // Math.max(50, Math.min(100, Number(raw) || 95)) — only meaningful under "self".
@@ -1095,89 +1399,89 @@ function Wt(n, s2) {
1095
1399
  return { iso: i2, unmatched: M, matchedRows: h2, totalRows: n.length };
1096
1400
  }
1097
1401
 
1098
- // ../shape-core/dist/chunk-Q5LUBDNU.mjs
1402
+ // ../shape-core/dist/chunk-U7SGOTKH.mjs
1099
1403
  var import_papaparse = __toESM(require_papaparse_min(), 1);
1100
1404
  /*! @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 = (() => {
1405
+ 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" };
1406
+ var ee = (() => {
1103
1407
  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);
1408
+ for (let e of Object.keys(Ae)) for (let t of Ae[e].split(/\s+/)) t && n.set(t, e);
1105
1409
  return n;
1106
1410
  })();
1107
- function Ve(n) {
1411
+ function He(n) {
1108
1412
  for (let [e, t] of n) {
1109
- let i2 = Q2.get(e);
1110
- i2 && !Q2.has(t) && Q2.set(t, i2);
1413
+ let i2 = ee.get(e);
1414
+ i2 && !ee.has(t) && ee.set(t, i2);
1111
1415
  }
1112
1416
  }
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) {
1417
+ He(N);
1418
+ 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"];
1419
+ 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"];
1420
+ var Ze = ["latitude", "longitude"];
1421
+ var Xe = ["latitude", "longitude"];
1422
+ function j2(n) {
1119
1423
  return Array.from(n).map((e) => {
1120
1424
  let t = e.normalize("NFD").replace(/[̀-ͯ]/g, "");
1121
1425
  return t.length === 1 ? t : e;
1122
1426
  }).join("");
1123
1427
  }
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) {
1428
+ 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"];
1429
+ function je(n) {
1126
1430
  return [...n].sort((e, t) => t.length - e.length).map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+")).join("|");
1127
1431
  }
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) {
1432
+ var Ne = new RegExp("^\\s*(?:(?:sum|count|count\\s+distinct|distinct\\s+count)\\s+of\\s+|(?:" + je(oe) + ")\\s+)", "i");
1433
+ var qe = /(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])/g;
1434
+ var Qe = new RegExp("\\b(" + Ke.join("|") + ")\\b|(" + $e.join("|") + ")$", "i");
1435
+ var Je = new RegExp("\\b(" + Ze.join("|") + ")\\b|(" + Xe.join("|") + ")$", "i");
1436
+ function xe(n) {
1133
1437
  if (!n) return "";
1134
- let e = String(n), t = Re.exec(Z2(e));
1438
+ let e = String(n), t = Ne.exec(j2(e));
1135
1439
  return (t ? e.slice(t[0].length) : e).trim();
1136
1440
  }
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
1441
  function et(n) {
1143
- let e = ve(n);
1144
- return e.length === 0 ? "" : e.replace(Xe, " ");
1442
+ return !!n && Ne.test(j2(String(n)));
1443
+ }
1444
+ 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"];
1445
+ 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");
1446
+ function nt(n) {
1447
+ let e = xe(n);
1448
+ return e.length === 0 ? "" : e.replace(qe, " ");
1145
1449
  }
1146
- function xe(n, e) {
1450
+ function we(n, e) {
1147
1451
  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(" ")));
1452
+ let t = xe(e);
1453
+ return n.test(j2(nt(e))) || n.test(j2(t)) || n.test(j2(s(t).join(" ")));
1150
1454
  }
1151
- function Ie(n) {
1152
- return xe(qe, n);
1455
+ function Ee(n) {
1456
+ return we(Je, n);
1153
1457
  }
1154
- function tt(n) {
1155
- return xe(je, n) || Ie(n);
1458
+ function it(n) {
1459
+ return we(Qe, n) || Ee(n);
1156
1460
  }
1157
- var we = /int|double|decimal|single|float|number|currency|money/i;
1158
- function nt(n) {
1461
+ var De = /int|double|decimal|single|float|number|currency|money/i;
1462
+ function rt2(n) {
1159
1463
  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";
1464
+ return e === "categorical" ? "Categorical" : e === "ordinal" ? "Ordinal" : e === "continuous" || n?.isMeasure === true || De.test(String(n?.dataType ?? "")) ? "Continuous" : "Categorical";
1161
1465
  }
1162
- function it(n) {
1163
- return n?.isMeasure === true || we.test(String(n?.dataType ?? ""));
1466
+ function st(n) {
1467
+ return n?.isMeasure === true || De.test(String(n?.dataType ?? ""));
1164
1468
  }
1165
- function Ee(n) {
1166
- let e = n ?? {}, t = nt(e);
1469
+ function Oe(n) {
1470
+ let e = n ?? {}, t = rt2(e);
1167
1471
  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 };
1472
+ if (Ee(e.name)) return { nature: t, additivity: "positional", basis: "name", suppressed: true };
1169
1473
  let i2 = String(e.additivity ?? "").trim().toLowerCase();
1170
- if (!(i2 === "additive" && Qe(e.name))) {
1474
+ if (!(i2 === "additive" && et(e.name))) {
1171
1475
  if (i2 === "additive") return { nature: t, additivity: "additive", basis: "measured", suppressed: false };
1172
1476
  if (i2 === "part_of_whole") return { nature: t, additivity: "part_of_whole", basis: "measured", suppressed: false };
1173
1477
  if (i2 === "intensive_rate") return { nature: t, additivity: "intensive_rate", basis: "measured", suppressed: false };
1174
1478
  }
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 };
1479
+ 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
1480
  }
1177
- function De(n) {
1178
- let e = Ee(n), t = n ?? {};
1481
+ function Le(n) {
1482
+ let e = Oe(n), t = n ?? {};
1179
1483
  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"];
1484
+ if (e.nature === "Ordinal") return st(t) ? ["median", "average", "min", "max", "first", "distinctcount", "count"] : ["first", "distinctcount", "count"];
1181
1485
  switch (e.additivity) {
1182
1486
  case "positional":
1183
1487
  return ["min", "max", "count", "distinctcount", "first"];
@@ -1187,20 +1491,20 @@ function De(n) {
1187
1491
  return ["sum", "average", "median", "min", "max", "count", "distinctcount", "first"];
1188
1492
  }
1189
1493
  }
1190
- function Bt(n) {
1191
- return De(n)[0];
1494
+ function Yt(n) {
1495
+ return Le(n)[0];
1192
1496
  }
1193
- function Yt(n, e) {
1497
+ function Kt(n, e) {
1194
1498
  if (e !== "sum" && e !== "count") return false;
1195
1499
  if (e === "count") return true;
1196
- let t = Ee(n);
1500
+ let t = Oe(n);
1197
1501
  return t.additivity === "additive" || t.additivity === "part_of_whole" || t.additivity === "unknown";
1198
1502
  }
1199
1503
 
1200
1504
  // ../shape-core/dist/index.mjs
1201
1505
  /*! @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
1506
  var E2 = 2;
1203
- var Z3 = 400;
1507
+ var Z2 = 400;
1204
1508
  function G2(r) {
1205
1509
  return !!E(r);
1206
1510
  }
@@ -1209,7 +1513,7 @@ function C(r) {
1209
1513
  for (let e of r) {
1210
1514
  if (e == null) continue;
1211
1515
  let s2 = u(String(e));
1212
- if (!V(s2) && !n.has(s2) && (n.add(s2), n.size >= Z3)) break;
1516
+ if (!V(s2) && !n.has(s2) && (n.add(s2), n.size >= Z2)) break;
1213
1517
  }
1214
1518
  return Array.from(n);
1215
1519
  }
@@ -1243,7 +1547,7 @@ function F3(r) {
1243
1547
  for (let e of r) {
1244
1548
  if (e == null) continue;
1245
1549
  let s2 = String(e).trim();
1246
- if (!V(u(s2)) && !n.has(s2) && (n.add(s2), n.size >= Z3)) break;
1550
+ if (!V(u(s2)) && !n.has(s2) && (n.add(s2), n.size >= Z2)) break;
1247
1551
  }
1248
1552
  return Array.from(n);
1249
1553
  }
@@ -1335,7 +1639,7 @@ function le(r, n, e, s2, c2) {
1335
1639
  }
1336
1640
  t && (o.city = t.name, A.push(`city=${t.name} (${t.pct}% known cities)`));
1337
1641
  }
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) => {
1642
+ 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
1643
  let i2 = +String(t[o.lat] ?? "").trim(), a4 = +String(t[o.lon] ?? "").trim();
1340
1644
  return isFinite(i2) && isFinite(a4) && i2 >= -90 && i2 <= 90 && a4 >= -180 && a4 <= 180 && String(t[o.lat] ?? "").trim() !== "" && String(t[o.lon] ?? "").trim() !== "";
1341
1645
  });
@@ -1626,7 +1930,7 @@ function createMarkResolver(env) {
1626
1930
  // src/hitTargets.ts
1627
1931
  var SVG_NS = "http://www.w3.org/2000/svg";
1628
1932
  var HIT_ATTR = "data-lch-hit";
1629
- var ELEMENT_CAP = 5e3;
1933
+ var ELEMENT_CAP2 = 5e3;
1630
1934
  function ensureCrossfilterHitTargets(container, doc) {
1631
1935
  const report = { tagged: 0, hitRects: 0, peFlips: 0, peStrokeOnly: 0 };
1632
1936
  try {
@@ -1635,7 +1939,7 @@ function ensureCrossfilterHitTargets(container, doc) {
1635
1939
  `.${MARK_CLASS}, .${LEGEND_MARK_CLASS}, .${AXIS_FILTER_CLASS}`
1636
1940
  );
1637
1941
  report.tagged = els.length;
1638
- if (els.length === 0 || els.length > ELEMENT_CAP) return report;
1942
+ if (els.length === 0 || els.length > ELEMENT_CAP2) return report;
1639
1943
  const ownerDoc = doc ?? container.ownerDocument;
1640
1944
  const view = ownerDoc?.defaultView;
1641
1945
  const computed = (el) => {
@@ -1703,9 +2007,9 @@ function ensureCrossfilterHitTargets(container, doc) {
1703
2007
  }
1704
2008
 
1705
2009
  // src/blankRender.ts
1706
- var EMPTY = { markCount: 0, legendMarkCount: 0, containerKind: "empty" };
2010
+ var EMPTY2 = { markCount: 0, legendMarkCount: 0, containerKind: "empty" };
1707
2011
  function censusMarks(container) {
1708
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY;
2012
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY2;
1709
2013
  try {
1710
2014
  const marks = /* @__PURE__ */ new Set();
1711
2015
  for (const el of Array.from(container.querySelectorAll(`.${MARK_CLASS}`))) marks.add(el);
@@ -1723,7 +2027,7 @@ function censusMarks(container) {
1723
2027
  containerKind: hasSvg ? "svg" : hasAnything ? "html" : "empty"
1724
2028
  };
1725
2029
  } catch {
1726
- return EMPTY;
2030
+ return EMPTY2;
1727
2031
  }
1728
2032
  }
1729
2033
  function isBlankRender(i2) {
@@ -1740,8 +2044,8 @@ function blankRenderFlag(lang, cause) {
1740
2044
 
1741
2045
  // src/hitBands.ts
1742
2046
  var MIN_HIT_BAND_PX = 8;
1743
- var ELEMENT_CAP2 = 5e3;
1744
- var EMPTY2 = {
2047
+ var ELEMENT_CAP3 = 5e3;
2048
+ var EMPTY3 = {
1745
2049
  openStrokes: 0,
1746
2050
  interactive: 0,
1747
2051
  hairline: 0,
@@ -1749,7 +2053,7 @@ var EMPTY2 = {
1749
2053
  widestPx: 0
1750
2054
  };
1751
2055
  var OPEN_TAGS = /* @__PURE__ */ new Set(["path", "line", "polyline"]);
1752
- function styleOf(el, doc) {
2056
+ function styleOf2(el, doc) {
1753
2057
  try {
1754
2058
  const view = doc?.defaultView;
1755
2059
  return view?.getComputedStyle ? view.getComputedStyle(el) : null;
@@ -1774,19 +2078,19 @@ function widthPx(raw) {
1774
2078
  return isFinite(n) ? n : NaN;
1775
2079
  }
1776
2080
  function censusHitBands(container, doc) {
1777
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY2;
2081
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY3;
1778
2082
  try {
1779
2083
  const els = Array.from(
1780
2084
  container.querySelectorAll(`.${MARK_CLASS}, [${ROW_IDX_ATTR}]`)
1781
2085
  );
1782
- if (els.length === 0 || els.length > ELEMENT_CAP2) return EMPTY2;
2086
+ if (els.length === 0 || els.length > ELEMENT_CAP3) return EMPTY3;
1783
2087
  const ownerDoc = doc ?? container.ownerDocument;
1784
2088
  const widestByGeom = /* @__PURE__ */ new Map();
1785
2089
  const rows = [];
1786
2090
  for (const el of els) {
1787
2091
  const tag = String(el.tagName || "").toLowerCase();
1788
2092
  if (!OPEN_TAGS.has(tag)) continue;
1789
- const cs = styleOf(el, ownerDoc);
2093
+ const cs = styleOf2(el, ownerDoc);
1790
2094
  const open = isUnfilled(attrOrComputed(el, "fill", cs));
1791
2095
  const w2 = widthPx(attrOrComputed(el, "stroke-width", cs) || "1");
1792
2096
  const geom = String(el.getAttribute?.("d") ?? "") || `${tag}#${String(el.getAttribute?.(ROW_IDX_ATTR) ?? "")}`;
@@ -1797,7 +2101,7 @@ function censusHitBands(container, doc) {
1797
2101
  if (prev === void 0 || w2 > prev) widestByGeom.set(geom, w2);
1798
2102
  }
1799
2103
  }
1800
- const out = { ...EMPTY2 };
2104
+ const out = { ...EMPTY3 };
1801
2105
  for (const r of rows) {
1802
2106
  if (!r.open) continue;
1803
2107
  out.openStrokes++;
@@ -1811,7 +2115,7 @@ function censusHitBands(container, doc) {
1811
2115
  }
1812
2116
  return out;
1813
2117
  } catch {
1814
- return EMPTY2;
2118
+ return EMPTY3;
1815
2119
  }
1816
2120
  }
1817
2121
  function hitBandFlag(c2) {
@@ -1819,197 +2123,137 @@ function hitBandFlag(c2) {
1819
2123
  return c2.uncovered > 0 ? "hitband:d3:thin" : "hitband:d3:ok";
1820
2124
  }
1821
2125
 
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
- ];
2126
+ // src/valuePlacement.ts
2127
+ var MIN_MARKS2 = 24;
2128
+ var ELEMENT_CAP4 = 5e3;
2129
+ var FIT_SAMPLE = 90;
2130
+ var VALUE_AXIS_MIN_FIT = 0.8;
2131
+ var MIN_AXIS_SPAN_PX = 40;
2132
+ var EMPTY4 = { marks: 0, axis: "", column: "", fit: 0, offShare: 0, medianOffRadii: 0 };
2133
+ function num(el, name) {
2134
+ const v3 = el.getAttribute?.(name);
2135
+ if (v3 === null || v3 === void 0 || String(v3).trim() === "") return NaN;
2136
+ return parseFloat(String(v3));
2137
+ }
2138
+ function median(xs) {
2139
+ if (!xs.length) return NaN;
2140
+ const s2 = [...xs].sort((a4, b2) => a4 - b2);
2141
+ const m = s2.length >> 1;
2142
+ return s2.length % 2 ? s2[m] : (s2[m - 1] + s2[m]) / 2;
2143
+ }
2144
+ function robustLine(v3, pos) {
2145
+ const n = v3.length;
2146
+ const step = Math.max(1, Math.floor(n / FIT_SAMPLE));
2147
+ const idx = [];
2148
+ for (let i2 = 0; i2 < n; i2 += step) idx.push(i2);
2149
+ const slopes = [];
2150
+ for (let p2 = 0; p2 < idx.length; p2++) {
2151
+ for (let q3 = p2 + 1; q3 < idx.length; q3++) {
2152
+ const dv = v3[idx[q3]] - v3[idx[p2]];
2153
+ if (Math.abs(dv) < 1e-12) continue;
2154
+ slopes.push((pos[idx[q3]] - pos[idx[p2]]) / dv);
2155
+ }
1929
2156
  }
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("");
2157
+ if (slopes.length < 3) return null;
2158
+ const b2 = median(slopes);
2159
+ if (!Number.isFinite(b2) || Math.abs(b2) < 1e-12) return null;
2160
+ const a4 = median(pos.map((y4, i2) => y4 - b2 * v3[i2]));
2161
+ return Number.isFinite(a4) ? { a: a4, b: b2 } : null;
1944
2162
  }
1945
- function censusColourSpread(container, doc) {
1946
- if (!container || typeof container.querySelectorAll !== "function") return EMPTY3;
2163
+ function censusValuePlacement(container, data) {
1947
2164
  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;
2165
+ if (!container || typeof container.querySelectorAll !== "function") return EMPTY4;
2166
+ const rows = data?.rows;
2167
+ const columns = data?.columns ?? [];
2168
+ if (!Array.isArray(rows) || !rows.length || !columns.length) return EMPTY4;
2169
+ const els = Array.from(container.querySelectorAll(`circle[${ROW_IDX_ATTR}]`));
2170
+ if (els.length < MIN_MARKS2 || els.length > ELEMENT_CAP4) return EMPTY4;
2171
+ const dots = [];
2172
+ const seen = /* @__PURE__ */ new Set();
1956
2173
  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 });
2174
+ const raw = String(el.getAttribute(ROW_IDX_ATTR) ?? "").trim();
2175
+ if (!/^\d+$/.test(raw)) continue;
2176
+ const i2 = +raw;
2177
+ const row = rows[i2];
2178
+ const x2 = num(el, "cx"), y4 = num(el, "cy"), r = num(el, "r");
2179
+ if (!row || !Number.isFinite(x2) || !Number.isFinite(y4) || !(r > 0)) continue;
2180
+ seen.add(i2);
2181
+ dots.push({ row, x: x2, y: y4, r });
1965
2182
  }
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;
2183
+ if (dots.length < MIN_MARKS2 || seen.size < dots.length * 0.9) return EMPTY4;
2184
+ let best = null;
2185
+ for (let c2 = 0; c2 < columns.length; c2++) {
2186
+ if (/^__.*__$/.test(String(columns[c2]?.name ?? ""))) continue;
2187
+ const vals = dots.map((d) => {
2188
+ const v3 = d.row[c2];
2189
+ return v3 === null || v3 === void 0 || v3 === "" ? NaN : typeof v3 === "number" ? v3 : Number(v3);
2190
+ });
2191
+ const finite = vals.filter(Number.isFinite);
2192
+ if (finite.length < dots.length * 0.9 || new Set(finite).size < 8) continue;
2193
+ const logs = finite.every((v3) => v3 > 0) ? [false, true] : [false];
2194
+ for (const log of logs) {
2195
+ for (const axis of ["x", "y"]) {
2196
+ const keep = [];
2197
+ const v3 = [], pos = [];
2198
+ dots.forEach((d, k2) => {
2199
+ if (!Number.isFinite(vals[k2])) return;
2200
+ keep.push(k2);
2201
+ v3.push(log ? Math.log10(vals[k2]) : vals[k2]);
2202
+ pos.push(axis === "x" ? d.x : d.y);
2203
+ });
2204
+ const line = robustLine(v3, pos);
2205
+ if (!line) continue;
2206
+ const lo = Math.min(...pos), hi = Math.max(...pos);
2207
+ if (hi - lo < MIN_AXIS_SPAN_PX) continue;
2208
+ const mean = pos.reduce((s2, p2) => s2 + p2, 0) / pos.length;
2209
+ let ssRes = 0, ssTot = 0;
2210
+ const res = pos.map((p2, k2) => {
2211
+ const e = p2 - (line.a + line.b * v3[k2]);
2212
+ ssRes += e * e;
2213
+ ssTot += (p2 - mean) ** 2;
2214
+ return e;
2215
+ });
2216
+ if (ssTot <= 0) continue;
2217
+ const fit = 1 - ssRes / ssTot;
2218
+ if (fit >= VALUE_AXIS_MIN_FIT && (!best || fit > best.fit)) {
2219
+ const full = new Array(dots.length).fill(NaN);
2220
+ keep.forEach((k2, j3) => {
2221
+ full[k2] = res[j3];
2222
+ });
2223
+ best = { col: c2, axis, fit, res: full, log };
2224
+ }
1981
2225
  }
1982
2226
  }
1983
2227
  }
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
- }
2228
+ if (!best) return EMPTY4;
2229
+ let off = 0, measured = 0;
2230
+ const radii = [];
2231
+ dots.forEach((d, k2) => {
2232
+ const e = best.res[k2];
2233
+ if (!Number.isFinite(e)) return;
2234
+ measured++;
2235
+ const inRadii = Math.abs(e) / Math.max(d.r, 1);
2236
+ radii.push(inRadii);
2237
+ if (inRadii > 1) off++;
2238
+ });
2239
+ if (measured < MIN_MARKS2) return EMPTY4;
2000
2240
  return {
2001
- marks,
2002
- distinctFills: distinct.size,
2003
- crowdShare: Math.round(crowd / marks * 100),
2004
- spanDeltaE: Math.round(span)
2241
+ marks: measured,
2242
+ axis: best.axis,
2243
+ column: String(columns[best.col]?.name ?? ""),
2244
+ fit: Math.round(best.fit * 1e3) / 1e3,
2245
+ offShare: Math.round(off / measured * 1e3) / 10,
2246
+ medianOffRadii: Math.round(median(radii) * 100) / 100
2005
2247
  };
2006
2248
  } catch {
2007
- return EMPTY3;
2249
+ return EMPTY4;
2008
2250
  }
2009
2251
  }
2010
- function colourSpreadFlag(c2) {
2252
+ function valuePlacementFlag(c2) {
2011
2253
  if (c2.marks === 0) return "";
2012
- return "ramp:d3:crowd" + Math.min(80, Math.floor(c2.crowdShare / 20) * 20);
2254
+ const s2 = c2.offShare;
2255
+ const bucket = s2 <= 0 ? 0 : s2 < 5 ? 1 : s2 < 20 ? 5 : s2 < 50 ? 20 : 50;
2256
+ return "place:d3:off" + bucket;
2013
2257
  }
2014
2258
 
2015
2259
  // src/fit.ts
@@ -2204,14 +2448,14 @@ var SVG_NS2 = "http://www.w3.org/2000/svg";
2204
2448
  var AXIS_PIN_MAX_CARRIED = 12;
2205
2449
  function unpinScrolledAxis(container) {
2206
2450
  if (!container) return;
2207
- const st = container[CONTAINER_SLOT_AXIS_PIN];
2208
- if (!st) return;
2451
+ const st2 = container[CONTAINER_SLOT_AXIS_PIN];
2452
+ if (!st2) return;
2209
2453
  try {
2210
- container.removeEventListener("scroll", st.onScroll);
2454
+ container.removeEventListener("scroll", st2.onScroll);
2211
2455
  } catch {
2212
2456
  }
2213
2457
  try {
2214
- if (st.overlay.parentNode) st.overlay.parentNode.removeChild(st.overlay);
2458
+ if (st2.overlay.parentNode) st2.overlay.parentNode.removeChild(st2.overlay);
2215
2459
  } catch {
2216
2460
  }
2217
2461
  try {
@@ -2389,15 +2633,15 @@ function pinScrolledAxis(container, svg) {
2389
2633
  const svgTop = svgBox.top - cRect.top - container.clientTop + container.scrollTop;
2390
2634
  const contentBand = { top: svgTop + band.top, bottom: svgTop + band.bottom };
2391
2635
  const place = () => {
2392
- const st = container.scrollTop, vh = container.clientHeight;
2393
- const edge2 = axisPinPlacement(contentBand, st, vh);
2636
+ const st2 = container.scrollTop, vh = container.clientHeight;
2637
+ const edge2 = axisPinPlacement(contentBand, st2, vh);
2394
2638
  if (!edge2) {
2395
2639
  o.display = "none";
2396
2640
  return null;
2397
2641
  }
2398
2642
  o.display = "block";
2399
2643
  o.left = `${svgLeft}px`;
2400
- o.top = `${edge2 === "top" ? st : st + vh - bandPx}px`;
2644
+ o.top = `${edge2 === "top" ? st2 : st2 + vh - bandPx}px`;
2401
2645
  return edge2;
2402
2646
  };
2403
2647
  const onScroll = () => {
@@ -2613,10 +2857,10 @@ function glyphSampleGrid(box, n = GLYPH_SAMPLE_N) {
2613
2857
  if (!box || !(box.width > 0) || !(box.height > 0) || !(n >= 1)) return out;
2614
2858
  const k2 = Math.floor(n);
2615
2859
  for (let i2 = 0; i2 < k2; i2++) {
2616
- for (let j2 = 0; j2 < k2; j2++) {
2860
+ for (let j3 = 0; j3 < k2; j3++) {
2617
2861
  out.push({
2618
2862
  x: box.left + box.width * (i2 + 0.5) / k2,
2619
- y: box.top + box.height * (j2 + 0.5) / k2
2863
+ y: box.top + box.height * (j3 + 0.5) / k2
2620
2864
  });
2621
2865
  }
2622
2866
  }
@@ -2634,7 +2878,7 @@ function hexToRGB(hex2) {
2634
2878
  // src/labelContrastDom.ts
2635
2879
  var LABEL_CONTRAST_DONE_ATTR = "data-lch-contrast";
2636
2880
  var LABEL_CONTRAST_CAP = 2e3;
2637
- var EMPTY4 = { rects: 0, scanned: 0, fixed: 0, pillsBoosted: 0, offFill: 0, pageMajority: 0 };
2881
+ var EMPTY5 = { rects: 0, scanned: 0, fixed: 0, pillsBoosted: 0, offFill: 0, pageMajority: 0 };
2638
2882
  function backedSamples(el, pts) {
2639
2883
  try {
2640
2884
  const ge = el;
@@ -2657,7 +2901,7 @@ function backedSamples(el, pts) {
2657
2901
  }
2658
2902
  }
2659
2903
  function applyLabelContrast(container, opts = {}) {
2660
- const report = { ...EMPTY4 };
2904
+ const report = { ...EMPTY5 };
2661
2905
  if (!container) {
2662
2906
  report.skipped = "no-container";
2663
2907
  return report;
@@ -2908,9 +3152,9 @@ function createChartHost(container, config) {
2908
3152
  const ensureAffordanceStyles = () => {
2909
3153
  try {
2910
3154
  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 = `
3155
+ const st2 = doc.createElement("style");
3156
+ st2.id = "bic-chart-host-affordances";
3157
+ st2.textContent = `
2914
3158
  /* TYPOGRAPHY FIREWALL. Generated charts set font-size but almost never line-height or
2915
3159
  letter-spacing, so they INHERIT whatever the host page cascades in. A page with
2916
3160
  \`:root { font: 18px/145% }\` (the stock Vite template does exactly this) hands every
@@ -2959,7 +3203,7 @@ function createChartHost(container, config) {
2959
3203
  font-weight: 700 !important;
2960
3204
  text-decoration: underline !important;
2961
3205
  }`;
2962
- (doc.head || doc.documentElement)?.appendChild(st);
3206
+ (doc.head || doc.documentElement)?.appendChild(st2);
2963
3207
  } catch {
2964
3208
  }
2965
3209
  };
@@ -3126,6 +3370,12 @@ function createChartHost(container, config) {
3126
3370
  } catch {
3127
3371
  }
3128
3372
  }
3373
+ if (config.onValuePlacementCensus) {
3374
+ try {
3375
+ config.onValuePlacementCensus(censusValuePlacement(container, data));
3376
+ } catch {
3377
+ }
3378
+ }
3129
3379
  if (fitOpts !== false) {
3130
3380
  try {
3131
3381
  const r = fitRenderedChart(container, fitOpts === true ? {} : fitOpts);
@@ -3224,6 +3474,17 @@ export {
3224
3474
  VALUE_AXIS_BASELINE_DEFAULT,
3225
3475
  SEASONAL_MARKERS_DEFAULT,
3226
3476
  MAX_MAP_POINTS_DEFAULT,
3477
+ deltaEHex,
3478
+ SAME_SHADE_DELTA_E,
3479
+ MIN_RAMP_FILLS,
3480
+ censusColourSpread,
3481
+ colourSpreadFlag,
3482
+ AUTO_RAMP_CLASSES,
3483
+ AUTO_RAMP_DRAWN_OPACITY,
3484
+ AUTO_RAMP_MIN_STEP_DELTA_E,
3485
+ autoRampMinStep,
3486
+ autoRampCanvas,
3487
+ resolveAutoColorScale,
3227
3488
  resolveOptions,
3228
3489
  geoAssetFor,
3229
3490
  loadGeo,
@@ -3234,10 +3495,10 @@ export {
3234
3495
  L3,
3235
3496
  p,
3236
3497
  u2 as u,
3237
- Ee,
3238
- De,
3239
- Bt,
3498
+ Oe,
3499
+ Le,
3240
3500
  Yt,
3501
+ Kt,
3241
3502
  buildRenderPayload,
3242
3503
  createMarkResolver,
3243
3504
  ensureCrossfilterHitTargets,
@@ -3247,11 +3508,9 @@ export {
3247
3508
  MIN_HIT_BAND_PX,
3248
3509
  censusHitBands,
3249
3510
  hitBandFlag,
3250
- deltaEHex,
3251
- SAME_SHADE_DELTA_E,
3252
- MIN_RAMP_FILLS,
3253
- censusColourSpread,
3254
- colourSpreadFlag,
3511
+ VALUE_AXIS_MIN_FIT,
3512
+ censusValuePlacement,
3513
+ valuePlacementFlag,
3255
3514
  SCROLL_SLACK_PX,
3256
3515
  needsScroll,
3257
3516
  contentExtentOf,