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