@bicharts/chart-host 0.6.113 → 0.6.116
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/README.md +94 -5
- package/dist/adapters.mjs +3 -3
- package/dist/card.mjs +2 -2
- package/dist/category-colours.mjs +275 -0
- package/dist/{chunk-7XT5OJ6M.mjs → chunk-63IUMWY2.mjs} +40 -3
- package/dist/{chunk-AEO5SFEQ.mjs → chunk-EFKGSDFF.mjs} +1 -1
- package/dist/{chunk-TE54AFRN.mjs → chunk-GZSYTDFN.mjs} +531 -393
- package/dist/{chunk-PELRAFYZ.mjs → chunk-IW6BKFF5.mjs} +1 -1
- package/dist/{chunk-OLCUKXKL.mjs → chunk-JMLSNV5Q.mjs} +1 -1
- package/dist/chunk-JTZTTJJK.mjs +244 -0
- package/dist/{chunk-FIG5DIW7.mjs → chunk-K2TH7D5V.mjs} +335 -335
- package/dist/{chunk-KY4FI2HA.mjs → chunk-QG5TENI3.mjs} +5 -1
- package/dist/{chunk-KGVNZR23.mjs → chunk-RLOIA7QK.mjs} +1 -1
- package/dist/{chunk-IL5M7K6Z.mjs → chunk-TUZCM7SX.mjs} +2 -2
- package/dist/{chunk-GTJG3SMD.mjs → chunk-VGJH63LZ.mjs} +1 -1
- package/dist/{chunk-2KLFIGTQ.mjs → chunk-ZZBX5ZJ6.mjs} +145 -18
- package/dist/dax.mjs +23 -1
- package/dist/index.mjs +97 -16
- package/dist/legend-fit.mjs +3 -3
- package/dist/page.mjs +7 -5
- package/dist/provinces.mjs +4 -4
- package/dist/react.mjs +18 -14
- package/dist/testing.mjs +1 -1
- package/dist/types/categoryColours.d.ts +71 -0
- package/dist/types/contract.d.ts +16 -3
- package/dist/types/dax.d.ts +26 -0
- package/dist/types/filterScope.d.ts +52 -4
- package/dist/types/fit.d.ts +6 -1
- package/dist/types/fitDom.d.ts +13 -0
- package/dist/types/host.d.ts +19 -5
- package/dist/types/index.d.ts +7 -4
- package/dist/types/keyboardMarks.d.ts +1 -1
- package/dist/types/markFollower.d.ts +21 -0
- package/dist/types/page.d.ts +1 -1
- package/dist/types/qualifyTable.d.ts +52 -0
- package/dist/types/react.d.ts +11 -3
- package/dist/types/selectionMarker.d.ts +92 -0
- package/dist/zoom-memory.mjs +1 -1
- package/package.json +6 -1
- /package/dist/{chunk-5YSZABCS.mjs → chunk-LXTW6YII.mjs} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
2
2
|
import {
|
|
3
3
|
SNAPSHOT_SVG_ATTR
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QG5TENI3.mjs";
|
|
5
5
|
|
|
6
6
|
// src/snapshot.ts
|
|
7
7
|
var DEFAULT_TIMEOUT_MS = 2e3;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
2
|
+
import {
|
|
3
|
+
MARK_CLASS,
|
|
4
|
+
ROW_IDX_ATTR
|
|
5
|
+
} from "./chunk-QG5TENI3.mjs";
|
|
6
|
+
|
|
7
|
+
// src/deltaE.ts
|
|
8
|
+
function linearise(c) {
|
|
9
|
+
const v = c / 255;
|
|
10
|
+
return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
11
|
+
}
|
|
12
|
+
var Xn = 0.95047;
|
|
13
|
+
var Yn = 1;
|
|
14
|
+
var Zn = 1.08883;
|
|
15
|
+
var EPS = 216 / 24389;
|
|
16
|
+
var KAPPA = 24389 / 27;
|
|
17
|
+
function f(t) {
|
|
18
|
+
return t > EPS ? Math.cbrt(t) : (KAPPA * t + 16) / 116;
|
|
19
|
+
}
|
|
20
|
+
function rgbToLab(r, g, b) {
|
|
21
|
+
const R = linearise(r), G = linearise(g), B = linearise(b);
|
|
22
|
+
const X = 0.4124564 * R + 0.3575761 * G + 0.1804375 * B;
|
|
23
|
+
const Y = 0.2126729 * R + 0.7151522 * G + 0.072175 * B;
|
|
24
|
+
const Z = 0.0193339 * R + 0.119192 * G + 0.9503041 * B;
|
|
25
|
+
const fx = f(X / Xn), fy = f(Y / Yn), fz = f(Z / Zn);
|
|
26
|
+
return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) };
|
|
27
|
+
}
|
|
28
|
+
function hexToLab(hex2) {
|
|
29
|
+
const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex2.trim());
|
|
30
|
+
if (!m) return null;
|
|
31
|
+
const h = m[1].length === 3 ? m[1][0] + m[1][0] + m[1][1] + m[1][1] + m[1][2] + m[1][2] : m[1];
|
|
32
|
+
return rgbToLab(parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16));
|
|
33
|
+
}
|
|
34
|
+
var RAD = Math.PI / 180;
|
|
35
|
+
var DEG = 180 / Math.PI;
|
|
36
|
+
var NEUTRAL_CHROMA = 1e-4;
|
|
37
|
+
function deltaE2000(c1, c2) {
|
|
38
|
+
const C1 = Math.hypot(c1.a, c1.b), C2 = Math.hypot(c2.a, c2.b);
|
|
39
|
+
const Cbar = (C1 + C2) / 2;
|
|
40
|
+
const C7 = Math.pow(Cbar, 7);
|
|
41
|
+
const G = 0.5 * (1 - Math.sqrt(C7 / (C7 + Math.pow(25, 7))));
|
|
42
|
+
const a1p = (1 + G) * c1.a, a2p = (1 + G) * c2.a;
|
|
43
|
+
const C1p = Math.hypot(a1p, c1.b), C2p = Math.hypot(a2p, c2.b);
|
|
44
|
+
const neutral = C1p < NEUTRAL_CHROMA || C2p < NEUTRAL_CHROMA;
|
|
45
|
+
const h1p = C1p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c1.b, a1p) * DEG + 360) % 360;
|
|
46
|
+
const h2p = C2p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c2.b, a2p) * DEG + 360) % 360;
|
|
47
|
+
const dLp = c2.L - c1.L;
|
|
48
|
+
const dCp = C2p - C1p;
|
|
49
|
+
let dhp;
|
|
50
|
+
if (neutral) dhp = 0;
|
|
51
|
+
else if (Math.abs(h2p - h1p) <= 180) dhp = h2p - h1p;
|
|
52
|
+
else if (h2p - h1p > 180) dhp = h2p - h1p - 360;
|
|
53
|
+
else dhp = h2p - h1p + 360;
|
|
54
|
+
const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(dhp / 2 * RAD);
|
|
55
|
+
const Lbarp = (c1.L + c2.L) / 2;
|
|
56
|
+
const Cbarp = (C1p + C2p) / 2;
|
|
57
|
+
let hbarp;
|
|
58
|
+
if (neutral) hbarp = h1p + h2p;
|
|
59
|
+
else if (Math.abs(h1p - h2p) <= 180) hbarp = (h1p + h2p) / 2;
|
|
60
|
+
else if (h1p + h2p < 360) hbarp = (h1p + h2p + 360) / 2;
|
|
61
|
+
else hbarp = (h1p + h2p - 360) / 2;
|
|
62
|
+
const T = 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);
|
|
63
|
+
const dTheta = 30 * Math.exp(-Math.pow((hbarp - 275) / 25, 2));
|
|
64
|
+
const Cbarp7 = Math.pow(Cbarp, 7);
|
|
65
|
+
const RC = 2 * Math.sqrt(Cbarp7 / (Cbarp7 + Math.pow(25, 7)));
|
|
66
|
+
const RT = -RC * Math.sin(2 * dTheta * RAD);
|
|
67
|
+
const Lm50 = Math.pow(Lbarp - 50, 2);
|
|
68
|
+
const SL = 1 + 0.015 * Lm50 / Math.sqrt(20 + Lm50);
|
|
69
|
+
const SC = 1 + 0.045 * Cbarp;
|
|
70
|
+
const SH = 1 + 0.015 * Cbarp * T;
|
|
71
|
+
const tL = dLp / SL, tC = dCp / SC, tH = dHp / SH;
|
|
72
|
+
return Math.sqrt(tL * tL + tC * tC + tH * tH + RT * tC * tH);
|
|
73
|
+
}
|
|
74
|
+
function labToHex(lab) {
|
|
75
|
+
const finv = (t) => {
|
|
76
|
+
const t3 = t * t * t;
|
|
77
|
+
return t3 > EPS ? t3 : (116 * t - 16) / KAPPA;
|
|
78
|
+
};
|
|
79
|
+
const fy = (lab.L + 16) / 116, fx = fy + lab.a / 500, fz = fy - lab.b / 200;
|
|
80
|
+
const X = Xn * finv(fx);
|
|
81
|
+
const Y = Yn * (lab.L > KAPPA * EPS ? fy * fy * fy : lab.L / KAPPA);
|
|
82
|
+
const Z = Zn * finv(fz);
|
|
83
|
+
const lin = [
|
|
84
|
+
3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z,
|
|
85
|
+
-0.969266 * X + 1.8760108 * Y + 0.041556 * Z,
|
|
86
|
+
0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z
|
|
87
|
+
];
|
|
88
|
+
return "#" + lin.map((v) => {
|
|
89
|
+
const c = Math.max(0, Math.min(1, v));
|
|
90
|
+
const g = c <= 31308e-7 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
|
|
91
|
+
return Math.round(g * 255).toString(16).padStart(2, "0");
|
|
92
|
+
}).join("");
|
|
93
|
+
}
|
|
94
|
+
function deltaEHex(a, b) {
|
|
95
|
+
const la = hexToLab(a), lb = hexToLab(b);
|
|
96
|
+
return la && lb ? deltaE2000(la, lb) : NaN;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// src/colourSpread.ts
|
|
100
|
+
var SAME_SHADE_DELTA_E = 5;
|
|
101
|
+
var MIN_RAMP_FILLS = 4;
|
|
102
|
+
var RAMP_SLACK_MAX = 0.15;
|
|
103
|
+
var MIN_MARKS = 24;
|
|
104
|
+
var ELEMENT_CAP = 5e3;
|
|
105
|
+
var MAX_CELLS = 48;
|
|
106
|
+
var CELL_STEP = 32;
|
|
107
|
+
var EMPTY = { marks: 0, distinctFills: 0, crowdShare: 0, spanDeltaE: 0 };
|
|
108
|
+
function styleOf(el, doc) {
|
|
109
|
+
try {
|
|
110
|
+
const view = doc?.defaultView;
|
|
111
|
+
return view?.getComputedStyle ? view.getComputedStyle(el) : null;
|
|
112
|
+
} catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function fillOf(el, cs) {
|
|
117
|
+
const a = el.getAttribute?.("fill");
|
|
118
|
+
if (a !== null && a !== void 0 && String(a).trim() !== "") return String(a).trim();
|
|
119
|
+
const c = cs?.fill;
|
|
120
|
+
return c === null || c === void 0 ? "" : String(c).trim();
|
|
121
|
+
}
|
|
122
|
+
function toRgb(raw) {
|
|
123
|
+
const s = raw.trim().toLowerCase();
|
|
124
|
+
if (!s || s === "none" || s === "transparent") return null;
|
|
125
|
+
const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(s);
|
|
126
|
+
if (hex2) {
|
|
127
|
+
const h = hex2[1];
|
|
128
|
+
const full = h.length === 3 ? h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : h;
|
|
129
|
+
return [
|
|
130
|
+
parseInt(full.slice(0, 2), 16),
|
|
131
|
+
parseInt(full.slice(2, 4), 16),
|
|
132
|
+
parseInt(full.slice(4, 6), 16)
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
const m = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)\s*)?\)$/.exec(s);
|
|
136
|
+
if (!m) return null;
|
|
137
|
+
if (m[4] !== void 0 && parseFloat(m[4]) === 0) return null;
|
|
138
|
+
return [Math.round(parseFloat(m[1])), Math.round(parseFloat(m[2])), Math.round(parseFloat(m[3]))];
|
|
139
|
+
}
|
|
140
|
+
function cellKey(rgb) {
|
|
141
|
+
return [
|
|
142
|
+
Math.round(rgb[0] / CELL_STEP),
|
|
143
|
+
Math.round(rgb[1] / CELL_STEP),
|
|
144
|
+
Math.round(rgb[2] / CELL_STEP)
|
|
145
|
+
].join(",");
|
|
146
|
+
}
|
|
147
|
+
function hex(rgb) {
|
|
148
|
+
return "#" + rgb.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, "0")).join("");
|
|
149
|
+
}
|
|
150
|
+
function censusColourSpread(container, doc) {
|
|
151
|
+
if (!container || typeof container.querySelectorAll !== "function") return EMPTY;
|
|
152
|
+
try {
|
|
153
|
+
const els = Array.from(
|
|
154
|
+
container.querySelectorAll(`.${MARK_CLASS}, [${ROW_IDX_ATTR}]`)
|
|
155
|
+
);
|
|
156
|
+
if (els.length === 0 || els.length > ELEMENT_CAP) return EMPTY;
|
|
157
|
+
const ownerDoc = doc ?? container.ownerDocument;
|
|
158
|
+
const painted = [];
|
|
159
|
+
for (const el of els) {
|
|
160
|
+
const rgb = toRgb(fillOf(el, styleOf(el, ownerDoc)));
|
|
161
|
+
if (rgb) painted.push({ rgb, tag: String(el.tagName || "").toLowerCase() });
|
|
162
|
+
}
|
|
163
|
+
const byTag = /* @__PURE__ */ new Map();
|
|
164
|
+
for (const p of painted) {
|
|
165
|
+
const g = byTag.get(p.tag) ?? { fills: /* @__PURE__ */ new Set(), n: 0 };
|
|
166
|
+
g.fills.add(p.rgb.join(","));
|
|
167
|
+
g.n++;
|
|
168
|
+
byTag.set(p.tag, g);
|
|
169
|
+
}
|
|
170
|
+
const overlays = new Set([...byTag].filter(([, g]) => g.fills.size === 1 && g.n >= MIN_MARKS).map(([t]) => t));
|
|
171
|
+
const restFills = new Set([...byTag].filter(([t]) => !overlays.has(t)).flatMap(([, g]) => [...g.fills]));
|
|
172
|
+
const counted = restFills.size > 1 ? painted.filter((p) => !overlays.has(p.tag)) : painted;
|
|
173
|
+
const distinct = /* @__PURE__ */ new Set();
|
|
174
|
+
const cells = /* @__PURE__ */ new Map();
|
|
175
|
+
let marks = 0;
|
|
176
|
+
for (const { rgb } of counted) {
|
|
177
|
+
marks++;
|
|
178
|
+
distinct.add(rgb.join(","));
|
|
179
|
+
const k = cellKey(rgb);
|
|
180
|
+
const cur = cells.get(k);
|
|
181
|
+
if (cur) cur.n++;
|
|
182
|
+
else cells.set(k, { rgb, n: 1 });
|
|
183
|
+
}
|
|
184
|
+
if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY;
|
|
185
|
+
const top = [...cells.values()].sort((a, b) => b.n - a.n).slice(0, MAX_CELLS);
|
|
186
|
+
const cs = top.map((c) => hexToLab(hex(c.rgb))).filter((l) => l !== null);
|
|
187
|
+
if (cs.length < MIN_RAMP_FILLS) return EMPTY;
|
|
188
|
+
const d = cs.map(() => new Array(cs.length).fill(0));
|
|
189
|
+
let span = 0, lo = 0, hi = 1;
|
|
190
|
+
for (let i = 0; i < cs.length; i++) {
|
|
191
|
+
for (let j = i + 1; j < cs.length; j++) {
|
|
192
|
+
const v = deltaE2000(cs[i], cs[j]);
|
|
193
|
+
d[i][j] = v;
|
|
194
|
+
d[j][i] = v;
|
|
195
|
+
if (v > span) {
|
|
196
|
+
span = v;
|
|
197
|
+
lo = i;
|
|
198
|
+
hi = j;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (span <= 0) return EMPTY;
|
|
203
|
+
let slack = 0, interior = 0;
|
|
204
|
+
for (let i = 0; i < cs.length; i++) {
|
|
205
|
+
if (i === lo || i === hi) continue;
|
|
206
|
+
slack += (d[lo][i] + d[i][hi]) / span - 1;
|
|
207
|
+
interior++;
|
|
208
|
+
}
|
|
209
|
+
if (interior < 2 || slack / interior > RAMP_SLACK_MAX) return EMPTY;
|
|
210
|
+
let crowd = 0;
|
|
211
|
+
for (let i = 0; i < cs.length; i++) {
|
|
212
|
+
let n = 0;
|
|
213
|
+
for (let j = 0; j < cs.length; j++) {
|
|
214
|
+
if (i === j || d[i][j] <= SAME_SHADE_DELTA_E) n += top[j].n;
|
|
215
|
+
}
|
|
216
|
+
if (n > crowd) crowd = n;
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
marks,
|
|
220
|
+
distinctFills: distinct.size,
|
|
221
|
+
crowdShare: Math.round(crowd / marks * 100),
|
|
222
|
+
spanDeltaE: Math.round(span)
|
|
223
|
+
};
|
|
224
|
+
} catch {
|
|
225
|
+
return EMPTY;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function colourSpreadFlag(c) {
|
|
229
|
+
if (c.marks === 0) return "";
|
|
230
|
+
return "ramp:d3:crowd" + Math.min(80, Math.floor(c.crowdShare / 20) * 20);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export {
|
|
234
|
+
rgbToLab,
|
|
235
|
+
hexToLab,
|
|
236
|
+
deltaE2000,
|
|
237
|
+
labToHex,
|
|
238
|
+
deltaEHex,
|
|
239
|
+
SAME_SHADE_DELTA_E,
|
|
240
|
+
MIN_RAMP_FILLS,
|
|
241
|
+
RAMP_SLACK_MAX,
|
|
242
|
+
censusColourSpread,
|
|
243
|
+
colourSpreadFlag
|
|
244
|
+
};
|