@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.
- package/dist/{chunk-TORJ77G7.mjs → chunk-UYH37PPI.mjs} +534 -275
- package/dist/index.mjs +28 -10
- package/dist/react.mjs +1 -1
- package/dist/types/autoRamp.d.ts +39 -0
- package/dist/types/contract.d.ts +3 -1
- package/dist/types/deltaE.d.ts +6 -0
- package/dist/types/host.d.ts +12 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/valuePlacement.d.ts +34 -0
- package/package.json +1 -1
|
@@ -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,
|
|
215
|
-
if (void 0 !== C2.escapeChar && (
|
|
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(
|
|
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 ===
|
|
239
|
-
else if (F4 ===
|
|
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.
|
|
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-
|
|
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
|
|
1102
|
-
var
|
|
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(
|
|
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
|
|
1411
|
+
function He(n) {
|
|
1108
1412
|
for (let [e, t] of n) {
|
|
1109
|
-
let i2 =
|
|
1110
|
-
i2 && !
|
|
1413
|
+
let i2 = ee.get(e);
|
|
1414
|
+
i2 && !ee.has(t) && ee.set(t, i2);
|
|
1111
1415
|
}
|
|
1112
1416
|
}
|
|
1113
|
-
|
|
1114
|
-
var
|
|
1115
|
-
var
|
|
1116
|
-
var
|
|
1117
|
-
var
|
|
1118
|
-
function
|
|
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
|
|
1125
|
-
function
|
|
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
|
|
1129
|
-
var
|
|
1130
|
-
var
|
|
1131
|
-
var
|
|
1132
|
-
function
|
|
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 =
|
|
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
|
-
|
|
1144
|
-
|
|
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
|
|
1450
|
+
function we(n, e) {
|
|
1147
1451
|
if (!e) return false;
|
|
1148
|
-
let t =
|
|
1149
|
-
return n.test(
|
|
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
|
|
1152
|
-
return
|
|
1455
|
+
function Ee(n) {
|
|
1456
|
+
return we(Je, n);
|
|
1153
1457
|
}
|
|
1154
|
-
function
|
|
1155
|
-
return
|
|
1458
|
+
function it(n) {
|
|
1459
|
+
return we(Qe, n) || Ee(n);
|
|
1156
1460
|
}
|
|
1157
|
-
var
|
|
1158
|
-
function
|
|
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 ||
|
|
1464
|
+
return e === "categorical" ? "Categorical" : e === "ordinal" ? "Ordinal" : e === "continuous" || n?.isMeasure === true || De.test(String(n?.dataType ?? "")) ? "Continuous" : "Categorical";
|
|
1161
1465
|
}
|
|
1162
|
-
function
|
|
1163
|
-
return n?.isMeasure === true ||
|
|
1466
|
+
function st(n) {
|
|
1467
|
+
return n?.isMeasure === true || De.test(String(n?.dataType ?? ""));
|
|
1164
1468
|
}
|
|
1165
|
-
function
|
|
1166
|
-
let e = n ?? {}, t =
|
|
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 (
|
|
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" &&
|
|
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 } :
|
|
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
|
|
1178
|
-
let e =
|
|
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
|
|
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
|
|
1191
|
-
return
|
|
1494
|
+
function Yt(n) {
|
|
1495
|
+
return Le(n)[0];
|
|
1192
1496
|
}
|
|
1193
|
-
function
|
|
1497
|
+
function Kt(n, e) {
|
|
1194
1498
|
if (e !== "sum" && e !== "count") return false;
|
|
1195
1499
|
if (e === "count") return true;
|
|
1196
|
-
let t =
|
|
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
|
|
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 >=
|
|
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 >=
|
|
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),
|
|
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
|
|
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 >
|
|
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
|
|
2010
|
+
var EMPTY2 = { markCount: 0, legendMarkCount: 0, containerKind: "empty" };
|
|
1707
2011
|
function censusMarks(container) {
|
|
1708
|
-
if (!container || typeof container.querySelectorAll !== "function") return
|
|
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
|
|
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
|
|
1744
|
-
var
|
|
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
|
|
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
|
|
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 >
|
|
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 =
|
|
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 = { ...
|
|
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
|
|
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/
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
var
|
|
1828
|
-
var
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
const
|
|
1837
|
-
const
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
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
|
-
|
|
1931
|
-
|
|
1932
|
-
if (
|
|
1933
|
-
|
|
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
|
|
1946
|
-
if (!container || typeof container.querySelectorAll !== "function") return EMPTY3;
|
|
2163
|
+
function censusValuePlacement(container, data) {
|
|
1947
2164
|
try {
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
if (
|
|
1952
|
-
const
|
|
1953
|
-
|
|
1954
|
-
const
|
|
1955
|
-
|
|
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
|
|
1958
|
-
if (
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
const
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
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 (
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
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 (
|
|
1985
|
-
let
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
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
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
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
|
|
2249
|
+
return EMPTY4;
|
|
2008
2250
|
}
|
|
2009
2251
|
}
|
|
2010
|
-
function
|
|
2252
|
+
function valuePlacementFlag(c2) {
|
|
2011
2253
|
if (c2.marks === 0) return "";
|
|
2012
|
-
|
|
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
|
|
2208
|
-
if (!
|
|
2451
|
+
const st2 = container[CONTAINER_SLOT_AXIS_PIN];
|
|
2452
|
+
if (!st2) return;
|
|
2209
2453
|
try {
|
|
2210
|
-
container.removeEventListener("scroll",
|
|
2454
|
+
container.removeEventListener("scroll", st2.onScroll);
|
|
2211
2455
|
} catch {
|
|
2212
2456
|
}
|
|
2213
2457
|
try {
|
|
2214
|
-
if (
|
|
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
|
|
2393
|
-
const edge2 = axisPinPlacement(contentBand,
|
|
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" ?
|
|
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
|
|
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 * (
|
|
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
|
|
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 = { ...
|
|
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
|
|
2912
|
-
|
|
2913
|
-
|
|
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(
|
|
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
|
-
|
|
3238
|
-
|
|
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
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
censusColourSpread,
|
|
3254
|
-
colourSpreadFlag,
|
|
3511
|
+
VALUE_AXIS_MIN_FIT,
|
|
3512
|
+
censusValuePlacement,
|
|
3513
|
+
valuePlacementFlag,
|
|
3255
3514
|
SCROLL_SLACK_PX,
|
|
3256
3515
|
needsScroll,
|
|
3257
3516
|
contentExtentOf,
|