@sportsdataverse/sdvplot 0.0.0-stage → 0.2.0
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/LICENSE +21 -0
- package/NOTICE.md +109 -0
- package/README.md +984 -2
- package/dist/_web-D7Aa5Rd8.d.ts +69 -0
- package/dist/aaf-GJ3SH34T.js +13 -0
- package/dist/aaf-HCYN5T6Y.js +37 -0
- package/dist/aaf-ZAE5KS2Y.js +13 -0
- package/dist/ahl-E66MDVCU.js +66 -0
- package/dist/ahl-NPQQWZEV.js +249 -0
- package/dist/ahl-QRDU73XX.js +309 -0
- package/dist/axis-CraWQRUJ.d.ts +49 -0
- package/dist/bins.d.ts +174 -0
- package/dist/bins.js +4 -0
- package/dist/bins.js.map +1 -0
- package/dist/cfb-F42SVS4X.js +5000 -0
- package/dist/cfb-P3SHEYRZ.js +692 -0
- package/dist/cfb-WXRZANLP.js +10226 -0
- package/dist/chartjs-surface.d.ts +42 -0
- package/dist/chartjs-surface.js +65 -0
- package/dist/chartjs-surface.js.map +1 -0
- package/dist/chartjs.d.ts +162 -0
- package/dist/chartjs.js +342 -0
- package/dist/chartjs.js.map +1 -0
- package/dist/chunk-4C3GX6QO.js +92 -0
- package/dist/chunk-4C3GX6QO.js.map +1 -0
- package/dist/chunk-57WFSI4Q.js +128 -0
- package/dist/chunk-57WFSI4Q.js.map +1 -0
- package/dist/chunk-7ULOCCFL.js +313 -0
- package/dist/chunk-7ULOCCFL.js.map +1 -0
- package/dist/chunk-AMXASQHT.js +120 -0
- package/dist/chunk-AMXASQHT.js.map +1 -0
- package/dist/chunk-B2MP37SR.js +175 -0
- package/dist/chunk-B2MP37SR.js.map +1 -0
- package/dist/chunk-C2CDY5OG.js +137 -0
- package/dist/chunk-C2CDY5OG.js.map +1 -0
- package/dist/chunk-DYMUVE6K.js +127 -0
- package/dist/chunk-DYMUVE6K.js.map +1 -0
- package/dist/chunk-E7G7VSLV.js +43 -0
- package/dist/chunk-E7G7VSLV.js.map +1 -0
- package/dist/chunk-H2C3FMMA.js +300 -0
- package/dist/chunk-H2C3FMMA.js.map +1 -0
- package/dist/chunk-J4P4HDBF.js +175 -0
- package/dist/chunk-J4P4HDBF.js.map +1 -0
- package/dist/chunk-J6R2LEJ7.js +58 -0
- package/dist/chunk-J6R2LEJ7.js.map +1 -0
- package/dist/chunk-M3XD2OSN.js +132 -0
- package/dist/chunk-M3XD2OSN.js.map +1 -0
- package/dist/chunk-OIILARXI.js +30 -0
- package/dist/chunk-OIILARXI.js.map +1 -0
- package/dist/chunk-RPVVJY74.js +170 -0
- package/dist/chunk-RPVVJY74.js.map +1 -0
- package/dist/chunk-UL5M6KDE.js +205 -0
- package/dist/chunk-UL5M6KDE.js.map +1 -0
- package/dist/chunk-WQT4IVLX.js +10 -0
- package/dist/chunk-WQT4IVLX.js.map +1 -0
- package/dist/chunk-ZAEQXFJM.js +556 -0
- package/dist/chunk-ZAEQXFJM.js.map +1 -0
- package/dist/cricket-KPCYG2HL.js +493 -0
- package/dist/cricket-NDXLE25B.js +116 -0
- package/dist/cricket-YUUF7P6M.js +160 -0
- package/dist/cytoscape.d.ts +188 -0
- package/dist/cytoscape.js +219 -0
- package/dist/cytoscape.js.map +1 -0
- package/dist/d3.d.ts +234 -0
- package/dist/d3.js +198 -0
- package/dist/d3.js.map +1 -0
- package/dist/deckgl.d.ts +232 -0
- package/dist/deckgl.js +197 -0
- package/dist/deckgl.js.map +1 -0
- package/dist/echarts.d.ts +121 -0
- package/dist/echarts.js +228 -0
- package/dist/echarts.js.map +1 -0
- package/dist/echl-3CR4RGFC.js +241 -0
- package/dist/echl-NPC32C23.js +107 -0
- package/dist/echl-PI33DGJC.js +64 -0
- package/dist/export.d.ts +130 -0
- package/dist/export.js +258 -0
- package/dist/export.js.map +1 -0
- package/dist/g2.d.ts +251 -0
- package/dist/g2.js +102 -0
- package/dist/g2.js.map +1 -0
- package/dist/headshots-B2J_LOO8.d.ts +40 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/interact.d.ts +567 -0
- package/dist/interact.js +809 -0
- package/dist/interact.js.map +1 -0
- package/dist/lightweight-charts.d.ts +217 -0
- package/dist/lightweight-charts.js +155 -0
- package/dist/lightweight-charts.js.map +1 -0
- package/dist/maplibre.d.ts +271 -0
- package/dist/maplibre.js +175 -0
- package/dist/maplibre.js.map +1 -0
- package/dist/marks-DH-tQIP-.d.ts +75 -0
- package/dist/mbb-3TRLVW3H.js +3619 -0
- package/dist/mbb-DQUHCHZP.js +5111 -0
- package/dist/mbb-PRAIO2P5.js +371 -0
- package/dist/milb-6IQ6NCEW.js +291 -0
- package/dist/milb-EYY5MD4T.js +1752 -0
- package/dist/milb-EYZ4SZLI.js +797 -0
- package/dist/mlb-4PBUJSVQ.js +35 -0
- package/dist/mlb-FHPY3GQJ.js +701 -0
- package/dist/mlb-REVGL3N2.js +665 -0
- package/dist/mui.d.ts +338 -0
- package/dist/mui.js +184 -0
- package/dist/mui.js.map +1 -0
- package/dist/nba-ATT775GS.js +485 -0
- package/dist/nba-LKM4UHVU.js +482 -0
- package/dist/nba-YX7PXM3R.js +35 -0
- package/dist/nbagl-3WGZCZ4S.js +37 -0
- package/dist/nbagl-LP4XJRAL.js +229 -0
- package/dist/nbagl-VTTOU7LN.js +499 -0
- package/dist/ncaa_baseball-UV75LNVR.js +2670 -0
- package/dist/ncaa_baseball-VD5J5C72.js +419 -0
- package/dist/ncaa_baseball-YRBS32D6.js +4592 -0
- package/dist/ncaa_mhockey-IMYHS7QS.js +1033 -0
- package/dist/ncaa_mhockey-TXTKWHE3.js +115 -0
- package/dist/ncaa_mhockey-U3MFW5VT.js +663 -0
- package/dist/ncaa_softball-6WR6KS64.js +420 -0
- package/dist/ncaa_softball-RZCTIE56.js +2654 -0
- package/dist/ncaa_softball-VOD4PVGY.js +4599 -0
- package/dist/ncaa_whockey-6XXGUTBK.js +607 -0
- package/dist/ncaa_whockey-AKKYKY67.js +53 -0
- package/dist/ncaa_whockey-KBEKXFBB.js +293 -0
- package/dist/nfl-BDB2HYAR.js +625 -0
- package/dist/nfl-EHYHDLJD.js +37 -0
- package/dist/nfl-VF4NJCHY.js +514 -0
- package/dist/nfl_gsis-UY64JO37.js +4 -0
- package/dist/nhl-6WPHME7H.js +511 -0
- package/dist/nhl-EMIJFZHY.js +884 -0
- package/dist/nhl-ISFUKRFU.js +37 -0
- package/dist/nivo.d.ts +193 -0
- package/dist/nivo.js +8 -0
- package/dist/nivo.js.map +1 -0
- package/dist/ohl-2FEM554G.js +113 -0
- package/dist/ohl-C5Q4W6JB.js +32 -0
- package/dist/ohl-TQ4J46VC.js +66 -0
- package/dist/perspective.d.ts +198 -0
- package/dist/perspective.js +171 -0
- package/dist/perspective.js.map +1 -0
- package/dist/phf-H7POU2KW.js +32 -0
- package/dist/phf-K5IFMZUM.js +13 -0
- package/dist/phf-TWJI3BOW.js +20 -0
- package/dist/placement-UWkqUzpa.d.ts +32 -0
- package/dist/plot.d.ts +451 -0
- package/dist/plot.js +712 -0
- package/dist/plot.js.map +1 -0
- package/dist/plotly.d.ts +129 -0
- package/dist/plotly.js +360 -0
- package/dist/plotly.js.map +1 -0
- package/dist/pwhl-OX3BO4JI.js +53 -0
- package/dist/pwhl-W44OC3C6.js +17 -0
- package/dist/pwhl-ZJGG3H7W.js +23 -0
- package/dist/qmjhl-5HISEHLL.js +35 -0
- package/dist/qmjhl-DA3UHKE5.js +125 -0
- package/dist/qmjhl-YG4BOQPF.js +614 -0
- package/dist/react.d.ts +377 -0
- package/dist/react.js +522 -0
- package/dist/react.js.map +1 -0
- package/dist/recharts.d.ts +162 -0
- package/dist/recharts.js +8 -0
- package/dist/recharts.js.map +1 -0
- package/dist/resolve-CQW-jzvr.d.ts +28 -0
- package/dist/selection-D4T3PkRt.d.ts +140 -0
- package/dist/shadcn.d.ts +83 -0
- package/dist/shadcn.js +88 -0
- package/dist/shadcn.js.map +1 -0
- package/dist/shots.d.ts +364 -0
- package/dist/shots.js +86 -0
- package/dist/shots.js.map +1 -0
- package/dist/soccer-7BH3ZLVL.js +7898 -0
- package/dist/soccer-MRU25OGE.js +2636 -0
- package/dist/soccer-PF4IPPVA.js +12342 -0
- package/dist/surface-TR7YFJW3.js +4 -0
- package/dist/surface-TR7YFJW3.js.map +1 -0
- package/dist/surfaces-MIG7HOFU.js +6 -0
- package/dist/surfaces-MIG7HOFU.js.map +1 -0
- package/dist/surfaces-W-odWLpT.d.ts +47 -0
- package/dist/svelte/HeadshotMark.svelte +25 -0
- package/dist/svelte/HeadshotMark.svelte.d.ts +10 -0
- package/dist/svelte/HeadshotMark.svelte.d.ts.map +1 -0
- package/dist/svelte/LogoMark.svelte +25 -0
- package/dist/svelte/LogoMark.svelte.d.ts +10 -0
- package/dist/svelte/LogoMark.svelte.d.ts.map +1 -0
- package/dist/svelte/Marks.svelte +25 -0
- package/dist/svelte/Marks.svelte.d.ts +10 -0
- package/dist/svelte/Marks.svelte.d.ts.map +1 -0
- package/dist/svelte/Surface.svelte +29 -0
- package/dist/svelte/Surface.svelte.d.ts +9 -0
- package/dist/svelte/Surface.svelte.d.ts.map +1 -0
- package/dist/svelte/SurfaceBackdrop.svelte +26 -0
- package/dist/svelte/SurfaceBackdrop.svelte.d.ts +11 -0
- package/dist/svelte/SurfaceBackdrop.svelte.d.ts.map +1 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +11 -0
- package/dist/svelte-core.d.ts +139 -0
- package/dist/svelte-core.js +123 -0
- package/dist/svelte-core.js.map +1 -0
- package/dist/tanstack.d.ts +240 -0
- package/dist/tanstack.js +110 -0
- package/dist/tanstack.js.map +1 -0
- package/dist/testing.d.ts +75 -0
- package/dist/testing.js +239 -0
- package/dist/testing.js.map +1 -0
- package/dist/three.d.ts +223 -0
- package/dist/three.js +50 -0
- package/dist/three.js.map +1 -0
- package/dist/tiers-BN4md-GB.d.ts +65 -0
- package/dist/types-C7n6gJF3.d.ts +62 -0
- package/dist/ufl-7VLZTLTT.js +143 -0
- package/dist/ufl-CCMBLPSW.js +100 -0
- package/dist/ufl-F2BJRXME.js +16 -0
- package/dist/unovis.d.ts +127 -0
- package/dist/unovis.js +108 -0
- package/dist/unovis.js.map +1 -0
- package/dist/uplot.d.ts +120 -0
- package/dist/uplot.js +110 -0
- package/dist/uplot.js.map +1 -0
- package/dist/usfl-4CR5RMZJ.js +32 -0
- package/dist/usfl-LD7HP2YK.js +14 -0
- package/dist/usfl-VU4YSJQD.js +19 -0
- package/dist/ushl-CPG2LB4L.js +73 -0
- package/dist/ushl-PQL6HJAD.js +88 -0
- package/dist/ushl-ZT2ATPHK.js +22 -0
- package/dist/vega.d.ts +85 -0
- package/dist/vega.js +362 -0
- package/dist/vega.js.map +1 -0
- package/dist/victory.d.ts +107 -0
- package/dist/victory.js +38 -0
- package/dist/victory.js.map +1 -0
- package/dist/wbb-3KHCDYTK.js +5087 -0
- package/dist/wbb-BMX53Q3Q.js +369 -0
- package/dist/wbb-QNRN2CJJ.js +3620 -0
- package/dist/whl-4ATYZWUB.js +97 -0
- package/dist/whl-RVFPL6MH.js +79 -0
- package/dist/whl-Y7ASKYMM.js +28 -0
- package/dist/wnba-FWX5SFVI.js +232 -0
- package/dist/wnba-GX6HZR4B.js +220 -0
- package/dist/wnba-NTMWIPP6.js +20 -0
- package/dist/xfl-43R2JMJK.js +30 -0
- package/dist/xfl-H3BXQPZZ.js +16 -0
- package/dist/xfl-XON7A7FI.js +69 -0
- package/package.json +366 -3
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { placeSync } from './chunk-7ULOCCFL.js';
|
|
2
|
+
import { HEADSHOT_ASPECT, teamColorsSync, resolveSync } from './chunk-ZAEQXFJM.js';
|
|
3
|
+
import { hex6, onColor, mix, contrast } from './chunk-J6R2LEJ7.js';
|
|
4
|
+
import { warn, InputError, DownloadError } from './chunk-E7G7VSLV.js';
|
|
5
|
+
|
|
6
|
+
// src/team-palette.ts
|
|
7
|
+
var MIN_CONTRAST = 3;
|
|
8
|
+
var MIN_DELTA_E = 20;
|
|
9
|
+
var STEP = 0.05;
|
|
10
|
+
var lin = (v) => {
|
|
11
|
+
const s = v / 255;
|
|
12
|
+
return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
|
|
13
|
+
};
|
|
14
|
+
var f = (t) => t > 216 / 24389 ? Math.cbrt(t) : 24389 / 27 * t / 116 + 16 / 116;
|
|
15
|
+
function lab(color) {
|
|
16
|
+
const n = Number.parseInt(hex6(color, { dropAlpha: true }).slice(1), 16);
|
|
17
|
+
const [r, g, b] = [lin(n >> 16), lin(n >> 8 & 255), lin(n & 255)];
|
|
18
|
+
const x = f((0.4124 * r + 0.3576 * g + 0.1805 * b) / 0.95047);
|
|
19
|
+
const y = f(0.2126 * r + 0.7152 * g + 0.0722 * b);
|
|
20
|
+
const z = f((0.0193 * r + 0.1192 * g + 0.9505 * b) / 1.08883);
|
|
21
|
+
return [116 * y - 16, 500 * (x - y), 200 * (y - z)];
|
|
22
|
+
}
|
|
23
|
+
var finv = (t) => t > 6 / 29 ? t ** 3 : 3 * (6 / 29) ** 2 * (t - 4 / 29);
|
|
24
|
+
var gamma = (v) => {
|
|
25
|
+
const c = Math.min(1, Math.max(0, v));
|
|
26
|
+
const s = c <= 31308e-7 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
|
|
27
|
+
return Math.round(s * 255).toString(16).padStart(2, "0");
|
|
28
|
+
};
|
|
29
|
+
function fromLab([l, a, b]) {
|
|
30
|
+
const fy = (l + 16) / 116;
|
|
31
|
+
const [x, y, z] = [0.95047 * finv(fy + a / 500), finv(fy), 1.08883 * finv(fy - b / 200)];
|
|
32
|
+
return `#${gamma(3.2406 * x - 1.5372 * y - 0.4986 * z)}${gamma(-0.9689 * x + 1.8758 * y + 0.0415 * z)}${gamma(0.0557 * x - 0.204 * y + 1.057 * z)}`;
|
|
33
|
+
}
|
|
34
|
+
var dist = (p, q) => Math.hypot((p[0] ?? 0) - (q[0] ?? 0), (p[1] ?? 0) - (q[1] ?? 0), (p[2] ?? 0) - (q[2] ?? 0));
|
|
35
|
+
var L_STEPS = Array.from({ length: 25 }, (_, k) => (k % 2 === 0 ? 1 : -1) * 4 * Math.ceil(k / 2));
|
|
36
|
+
var H_STEPS = Array.from({ length: 36 }, (_, k) => (k % 2 === 0 ? 1 : -1) * 10 * Math.ceil(k / 2));
|
|
37
|
+
var C_STEPS = [0, -15, 15, -30, 30, 45];
|
|
38
|
+
function nearby(base) {
|
|
39
|
+
const [l, a, b] = lab(base);
|
|
40
|
+
const c = Math.hypot(a, b);
|
|
41
|
+
const h = Math.atan2(b, a);
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const dl of L_STEPS)
|
|
44
|
+
for (const dh of H_STEPS)
|
|
45
|
+
for (const dc of C_STEPS) {
|
|
46
|
+
const cc = Math.max(0, c + dc);
|
|
47
|
+
const hh = h + dh * Math.PI / 180;
|
|
48
|
+
out.push(fromLab([Math.min(100, Math.max(0, l + dl)), cc * Math.cos(hh), cc * Math.sin(hh)]));
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function readable(c, alt, bg) {
|
|
53
|
+
if (contrast(c, bg) >= MIN_CONTRAST) return c;
|
|
54
|
+
if (alt != null && contrast(alt, bg) >= MIN_CONTRAST) return alt;
|
|
55
|
+
const ink = onColor(bg);
|
|
56
|
+
for (let t = STEP; t < 1; t += STEP) {
|
|
57
|
+
const m = mix(c, ink, t);
|
|
58
|
+
if (contrast(m, bg) >= MIN_CONTRAST) return m;
|
|
59
|
+
}
|
|
60
|
+
return ink;
|
|
61
|
+
}
|
|
62
|
+
function teamPalette(colors, alts, background, labels = colors.map((_, i) => `#${i + 1}`)) {
|
|
63
|
+
const bg = hex6(background);
|
|
64
|
+
const ink = onColor(bg);
|
|
65
|
+
const out = [];
|
|
66
|
+
const labs = [];
|
|
67
|
+
const clash = (c) => {
|
|
68
|
+
const p = lab(c);
|
|
69
|
+
return labs.findIndex((q) => dist(p, q) < MIN_DELTA_E);
|
|
70
|
+
};
|
|
71
|
+
const ok = (c) => contrast(c, bg) >= MIN_CONTRAST && clash(c) < 0;
|
|
72
|
+
const keep = (c) => {
|
|
73
|
+
out.push(c);
|
|
74
|
+
labs.push(lab(c));
|
|
75
|
+
};
|
|
76
|
+
colors.forEach((color, i) => {
|
|
77
|
+
const alt = alts[i] ?? null;
|
|
78
|
+
const first = readable(color, alt, bg);
|
|
79
|
+
if (clash(first) < 0) return keep(first);
|
|
80
|
+
const second = alt === null ? null : readable(alt, null, bg);
|
|
81
|
+
if (second !== null && ok(second)) return keep(second);
|
|
82
|
+
const pool = [first];
|
|
83
|
+
for (let t = STEP; t < 1; t += STEP) pool.push(mix(first, ink, t), mix(first, bg, t));
|
|
84
|
+
pool.push(...nearby(first));
|
|
85
|
+
if (second !== null) pool.push(...nearby(second));
|
|
86
|
+
const brand = lab(color);
|
|
87
|
+
let pick;
|
|
88
|
+
let best = Number.POSITIVE_INFINITY;
|
|
89
|
+
const seen = /* @__PURE__ */ new Set();
|
|
90
|
+
for (const c of pool) {
|
|
91
|
+
if (seen.has(c)) continue;
|
|
92
|
+
seen.add(c);
|
|
93
|
+
const d = dist(lab(c), brand);
|
|
94
|
+
if (d < best && ok(c)) {
|
|
95
|
+
pick = c;
|
|
96
|
+
best = d;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (pick !== void 0) return keep(pick);
|
|
100
|
+
const j = clash(first);
|
|
101
|
+
warn(
|
|
102
|
+
`team-palette:${bg}:${labels[j]}:${labels[i]}`,
|
|
103
|
+
`${labels[i]} (${first}) stays within \u0394E ${MIN_DELTA_E} of ${labels[j]} (${out[j]}) on ${bg}: no readable colour of it is distinct`
|
|
104
|
+
);
|
|
105
|
+
keep(first);
|
|
106
|
+
});
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/_web.ts
|
|
111
|
+
function aspect(p) {
|
|
112
|
+
return p.aspect ?? HEADSHOT_ASPECT;
|
|
113
|
+
}
|
|
114
|
+
function axisLetter(axis) {
|
|
115
|
+
if (axis !== "x" && axis !== "y")
|
|
116
|
+
throw new InputError(`axis must be "x" or "y", got ${JSON.stringify(axis)}`);
|
|
117
|
+
return axis;
|
|
118
|
+
}
|
|
119
|
+
function imageSource(p, embed) {
|
|
120
|
+
return embed?.get(p.url) ?? encodeURI(p.url).replace(/%25([0-9A-Fa-f]{2})/g, "%$1");
|
|
121
|
+
}
|
|
122
|
+
function imageSources(ps, embed) {
|
|
123
|
+
return ps.map((p) => imageSource(p, embed));
|
|
124
|
+
}
|
|
125
|
+
async function embedSources(urls, fetchFn = fetch) {
|
|
126
|
+
const out = /* @__PURE__ */ new Map();
|
|
127
|
+
for (const url of new Set(urls)) {
|
|
128
|
+
const res = await fetchFn(url);
|
|
129
|
+
if (!res.ok) throw new DownloadError(`embed: ${url} answered ${res.status}`, url, res.status);
|
|
130
|
+
const mime = res.headers.get("content-type")?.split(";")[0]?.trim() || (url.toLowerCase().endsWith(".svg") ? "image/svg+xml" : "application/octet-stream");
|
|
131
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
132
|
+
let bin = "";
|
|
133
|
+
for (const b of bytes) bin += String.fromCharCode(b);
|
|
134
|
+
out.set(url, `data:${mime};base64,${btoa(bin)}`);
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
function column(rows, name, what) {
|
|
139
|
+
if (rows.length > 0 && !rows.some((r) => name in r))
|
|
140
|
+
throw new InputError(`${what} column ${JSON.stringify(name)} is not in rows`);
|
|
141
|
+
return rows.map((r) => r[name]);
|
|
142
|
+
}
|
|
143
|
+
function seasons(rows, season) {
|
|
144
|
+
if (typeof season === "string" && rows.some((r) => season in r))
|
|
145
|
+
return rows.map((r) => r[season]);
|
|
146
|
+
return season;
|
|
147
|
+
}
|
|
148
|
+
function markPlacements(rows, kind, o) {
|
|
149
|
+
const xs = column(rows, o.x, "x");
|
|
150
|
+
const ys = column(rows, o.y, "y");
|
|
151
|
+
if (kind === "headshot") {
|
|
152
|
+
const h = o;
|
|
153
|
+
return placeSync(xs, ys, column(rows, h.player, "player"), {
|
|
154
|
+
league: h.league,
|
|
155
|
+
kind,
|
|
156
|
+
idSystem: h.idSystem ?? "espn"
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const m = o;
|
|
160
|
+
const po = { league: m.league, kind };
|
|
161
|
+
if (m.season !== void 0) po.season = seasons(rows, m.season);
|
|
162
|
+
if (m.variant !== void 0) po.variant = m.variant;
|
|
163
|
+
if (m.idSystem !== void 0) po.idSystem = m.idSystem;
|
|
164
|
+
return placeSync(xs, ys, column(rows, m.team, "team"), po);
|
|
165
|
+
}
|
|
166
|
+
function axisPlacements(labels, letter, o) {
|
|
167
|
+
const index = labels.map((_, i) => i);
|
|
168
|
+
const across = labels.map(() => 0);
|
|
169
|
+
const po = { league: o.league, kind: o.markType ?? "logo" };
|
|
170
|
+
if (o.season !== void 0) po.season = o.season;
|
|
171
|
+
if (o.variant !== void 0) po.variant = o.variant;
|
|
172
|
+
if (o.idSystem !== void 0) po.idSystem = o.idSystem;
|
|
173
|
+
return placeSync(letter === "x" ? index : across, letter === "x" ? across : index, labels, po);
|
|
174
|
+
}
|
|
175
|
+
function colorList(league, teams, o = {}) {
|
|
176
|
+
return teamColorsSync(league, teams, o).map((c) => c ?? null);
|
|
177
|
+
}
|
|
178
|
+
function colorPalette(league, teams, o = {}) {
|
|
179
|
+
const fallback = o.fallback ?? "#808080";
|
|
180
|
+
const season = o.season === void 0 ? {} : { season: o.season };
|
|
181
|
+
const ids = resolveSync(teams, league, {
|
|
182
|
+
...season,
|
|
183
|
+
...o.idSystem === void 0 ? {} : { idSystem: o.idSystem },
|
|
184
|
+
...o.strict === void 0 ? {} : { strict: o.strict }
|
|
185
|
+
});
|
|
186
|
+
const known = [...new Set(ids.filter((id) => id !== void 0))];
|
|
187
|
+
const which = o.which ?? "primary";
|
|
188
|
+
const co = { ...season, idSystem: "team_id" };
|
|
189
|
+
const main = colorList(league, known, { ...co, which });
|
|
190
|
+
const other = colorList(league, known, { ...co, which: which === "primary" ? "secondary" : "primary" });
|
|
191
|
+
const colors = main.map((c, i) => c ?? other[i] ?? fallback);
|
|
192
|
+
const bg = o.background === void 0 ? void 0 : hex6(o.background);
|
|
193
|
+
const palette = bg === void 0 ? colors : teamPalette(
|
|
194
|
+
colors.map((c) => hex6(c, { dropAlpha: true })),
|
|
195
|
+
other,
|
|
196
|
+
bg,
|
|
197
|
+
known
|
|
198
|
+
);
|
|
199
|
+
const byId = new Map(known.map((id, j) => [id, palette[j]]));
|
|
200
|
+
return ids.map((id) => id === void 0 ? fallback : byId.get(id));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { aspect, axisLetter, axisPlacements, colorList, colorPalette, column, embedSources, imageSource, imageSources, markPlacements, seasons, teamPalette };
|
|
204
|
+
//# sourceMappingURL=chunk-UL5M6KDE.js.map
|
|
205
|
+
//# sourceMappingURL=chunk-UL5M6KDE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/team-palette.ts","../src/_web.ts"],"names":[],"mappings":"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","file":"chunk-UL5M6KDE.js","sourcesContent":["/**\n * Team colours for a chart background: each colour readable against it (3:1, WCAG 1.4.11) and distinct from the teams\n * before it (CIE76 ΔE). Internal, shared by the chart adapters that take a `background`; it depends only on\n * `contrast.ts` and `errors.ts`.\n */\nimport { contrast, hex6, mix, onColor } from \"./contrast.js\";\nimport { warn } from \"./errors.js\";\n\n/** WCAG 1.4.11 (non-text contrast): a graphical object needs 3:1 against what is next to it. */\nexport const MIN_CONTRAST = 3;\n/**\n * The smallest CIE76 ΔE (Lab distance) two teams' colours may sit apart. ΔE 2.3 is a just-noticeable difference for\n * two large patches side by side; a chart compares thin lines and small marks a legend away from each other, which\n * needs several times that (at 10, New England's and Kansas City's reds ended 10.2 apart on black). 20 is the\n * largest value measured (2026-10-18) to leave every team distinct with no warning: thresholds 10 to 20 on the full\n * NBA (30), NFL (32), MLB (30) and NHL (32) in league order, on #181a1b, #000000 and #ffffff, all gave zero warnings\n * with this search, and 20 is the cap set for it (test/team-palette.test.ts holds every one of those cells at 20).\n */\nexport const MIN_DELTA_E = 20;\n/** The step, as a fraction of the way to the target colour, of the readable and lightness mixes. */\nconst STEP = 0.05;\n\nconst lin = (v: number): number => {\n const s = v / 255;\n return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n};\nconst f = (t: number): number => (t > 216 / 24389 ? Math.cbrt(t) : ((24389 / 27) * t) / 116 + 16 / 116);\n/** CIE Lab (D65) of a hex colour. */\nfunction lab(color: string): [number, number, number] {\n const n = Number.parseInt(hex6(color, { dropAlpha: true }).slice(1), 16);\n const [r, g, b] = [lin(n >> 16), lin((n >> 8) & 255), lin(n & 255)];\n const x = f((0.4124 * r + 0.3576 * g + 0.1805 * b) / 0.95047);\n const y = f(0.2126 * r + 0.7152 * g + 0.0722 * b);\n const z = f((0.0193 * r + 0.1192 * g + 0.9505 * b) / 1.08883);\n return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n}\nconst finv = (t: number): number => (t > 6 / 29 ? t ** 3 : 3 * (6 / 29) ** 2 * (t - 4 / 29));\nconst gamma = (v: number): string => {\n const c = Math.min(1, Math.max(0, v)); // out of gamut: clipped, and the hex is what gets measured\n const s = c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n return Math.round(s * 255)\n .toString(16)\n .padStart(2, \"0\");\n};\n/** The hex colour of a CIE Lab (D65) triple, clipped to sRGB. */\nfunction fromLab([l, a, b]: readonly [number, number, number]): string {\n const fy = (l + 16) / 116;\n const [x, y, z] = [0.95047 * finv(fy + a / 500), finv(fy), 1.08883 * finv(fy - b / 200)];\n return `#${gamma(3.2406 * x - 1.5372 * y - 0.4986 * z)}${gamma(-0.9689 * x + 1.8758 * y + 0.0415 * z)}${gamma(0.0557 * x - 0.204 * y + 1.057 * z)}`;\n}\nconst dist = (p: readonly number[], q: readonly number[]): number =>\n Math.hypot((p[0] ?? 0) - (q[0] ?? 0), (p[1] ?? 0) - (q[1] ?? 0), (p[2] ?? 0) - (q[2] ?? 0));\n/** CIE76 ΔE: the Euclidean distance of two colours in Lab. */\nexport function deltaE(a: string, b: string): number {\n return dist(lab(a), lab(b));\n}\n\n// The synthetic search grid around a team colour, in LCh: lightness, hue and chroma steps. ponytail: a fixed grid of\n// about 5,000 points per base colour, scanned only for a team whose brand colours both clash (milliseconds per palette).\nconst L_STEPS = Array.from({ length: 25 }, (_, k) => (k % 2 === 0 ? 1 : -1) * 4 * Math.ceil(k / 2)); // 0, -4, 4, … ±48\nconst H_STEPS = Array.from({ length: 36 }, (_, k) => (k % 2 === 0 ? 1 : -1) * 10 * Math.ceil(k / 2)); // 0, -10, 10, … 180\nconst C_STEPS = [0, -15, 15, -30, 30, 45];\n/** Colours near `base`: its lightness, hue and chroma stepped, each clipped to sRGB. */\nfunction nearby(base: string): string[] {\n const [l, a, b] = lab(base);\n const c = Math.hypot(a, b);\n const h = Math.atan2(b, a);\n const out: string[] = [];\n for (const dl of L_STEPS)\n for (const dh of H_STEPS)\n for (const dc of C_STEPS) {\n const cc = Math.max(0, c + dc);\n const hh = h + (dh * Math.PI) / 180;\n out.push(fromLab([Math.min(100, Math.max(0, l + dl)), cc * Math.cos(hh), cc * Math.sin(hh)]));\n }\n return out;\n}\n\n/** `c`, else `alt`, else `c` mixed towards the background's ink until it reaches 3:1 against `bg`. */\nexport function readable(c: string, alt: string | null | undefined, bg: string): string {\n if (contrast(c, bg) >= MIN_CONTRAST) return c;\n if (alt != null && contrast(alt, bg) >= MIN_CONTRAST) return alt;\n const ink = onColor(bg);\n for (let t = STEP; t < 1; t += STEP) {\n const m = mix(c, ink, t);\n if (contrast(m, bg) >= MIN_CONTRAST) return m;\n }\n return ink;\n}\n\n/**\n * One colour per team for a chart on `background`, in order: each readable against it, and at least `MIN_DELTA_E`\n * from every earlier team's colour. A team whose readable colour is too close to an earlier one tries its other\n * colour (made readable); failing that, the colours near both (lightness, hue in LCh and chroma stepped) that are 3:1\n * and distinct, taking the one closest to the team's brand colour (ΔE; the first generated on a tie). Only when none\n * is left does it keep the readable colour and warn once. Deterministic: the same colours give the same palette. A\n * colour already readable and distinct is returned as it is.\n *\n * @param colors - each team's colour (`#rrggbb`).\n * @param alts - each team's other colour, or null.\n * @param labels - names for the warning (default: the positions).\n */\nexport function teamPalette(\n colors: readonly string[],\n alts: readonly (string | null | undefined)[],\n background: string,\n labels: readonly string[] = colors.map((_, i) => `#${i + 1}`),\n): string[] {\n const bg = hex6(background);\n const ink = onColor(bg);\n const out: string[] = [];\n const labs: [number, number, number][] = [];\n const clash = (c: string): number => {\n const p = lab(c);\n return labs.findIndex((q) => dist(p, q) < MIN_DELTA_E);\n };\n const ok = (c: string): boolean => contrast(c, bg) >= MIN_CONTRAST && clash(c) < 0;\n const keep = (c: string): void => {\n out.push(c);\n labs.push(lab(c));\n };\n colors.forEach((color, i) => {\n const alt = alts[i] ?? null;\n const first = readable(color, alt, bg);\n if (clash(first) < 0) return keep(first);\n const second = alt === null ? null : readable(alt, null, bg);\n if (second !== null && ok(second)) return keep(second);\n // the synthetic candidates, the one nearest the brand colour first\n const pool = [first];\n for (let t = STEP; t < 1; t += STEP) pool.push(mix(first, ink, t), mix(first, bg, t));\n pool.push(...nearby(first));\n if (second !== null) pool.push(...nearby(second));\n const brand = lab(color);\n let pick: string | undefined;\n let best = Number.POSITIVE_INFINITY;\n const seen = new Set<string>();\n for (const c of pool) {\n if (seen.has(c)) continue;\n seen.add(c);\n const d = dist(lab(c), brand);\n if (d < best && ok(c)) {\n pick = c;\n best = d;\n }\n }\n if (pick !== undefined) return keep(pick);\n const j = clash(first);\n warn(\n `team-palette:${bg}:${labels[j]}:${labels[i]}`,\n `${labels[i]} (${first}) stays within ΔE ${MIN_DELTA_E} of ${labels[j]} (${out[j]}) on ${bg}: no readable colour of it is distinct`,\n );\n keep(first);\n });\n return out;\n}\n","/** What the spec adapters (Plotly, Vega-Lite, ECharts) share: image sources, aspect ratios, row access, team colours. */\nimport { teamColorsSync } from \"./colors.js\";\nimport { hex6 } from \"./contrast.js\";\nimport { DownloadError, InputError } from \"./errors.js\";\nimport { HEADSHOT_ASPECT } from \"./headshots.js\";\nimport { type Kind, type PlaceOptions, type Placement, placeSync as place } from \"./placement.js\";\nimport { type Value, resolveSync } from \"./resolve.js\";\nimport { teamPalette } from \"./team-palette.js\";\nimport type { IdSystem, League, MarkType, SeasonInput, Variant, Which } from \"./types.js\";\n\nexport type { Placement } from \"./placement.js\";\nexport { checkAlpha, checkHeight, placeSync as place } from \"./placement.js\";\n\n/** What the module-level test hooks return. Positional on purpose (cheap to assert); the contract shim in test/adapters.contract.test.ts converts. */\nexport type DrawnMark = readonly [id: string, x: unknown, y: unknown, height: number, url: string];\nexport type DrawnAxisMark = readonly [id: string, index: number, height: number];\n\nexport type Row = Record<string, unknown>;\n/** Options of `withLogos` / `withWordmarks` (each adapter adds its own subplot options). */\nexport interface MarkOptions {\n /** Name of the row column holding each mark's x position. */\n x: string;\n /** Name of the row column holding each mark's y position. */\n y: string;\n /** Name of the row column holding the team (abbreviation, name or id; see `idSystem`). */\n team: string;\n /** The league the teams (or players) belong to, e.g. \"nfl\". */\n league: League;\n /** A season (number or string) for every row, or the name of a row column holding each row's season. */\n season?: SeasonInput;\n /** Mark height as a fraction of the plot area's height, in (0, 1]. Default 0.1. */\n height?: number;\n /** Opacity in [0, 1]. Default 1. */\n alpha?: number;\n /** Logo variant, e.g. \"dark\". Default \"default\". */\n variant?: Variant;\n /** How the `team` values are read. Default \"auto\". */\n idSystem?: IdSystem;\n /** url → data URI map from `embedSources`, to inline the images. */\n embed?: ReadonlyMap<string, string>;\n}\n/** Options of `withHeadshots`. */\nexport interface HeadshotOptions {\n /** Name of the row column holding each headshot's x position. */\n x: string;\n /** Name of the row column holding each headshot's y position. */\n y: string;\n /** Name of the row column holding the player id. */\n player: string;\n /** The league the teams (or players) belong to, e.g. \"nfl\". */\n league: League;\n /** Headshot height as a fraction of the plot area's height, in (0, 1]. Default 0.1. */\n height?: number;\n /** Opacity in [0, 1]. Default 1. */\n alpha?: number;\n /** What the `player` ids are: ESPN athlete ids, or nflverse gsis ids (needs `loadGsis()` first). Default \"espn\". */\n idSystem?: \"espn\" | \"gsis\";\n /** url → data URI map from `embedSources`, to inline the images. */\n embed?: ReadonlyMap<string, string>;\n}\n/** Options of `withAxisLogos`: the categories of the axis are the teams. */\nexport interface AxisOptions {\n /** The league the teams (or players) belong to, e.g. \"nfl\". */\n league: League;\n /** The season the axis' teams are resolved for. */\n season?: SeasonInput;\n /** Image height as a fraction of the plot area's height, in (0, 1]. Default 0.1. */\n height?: number;\n /** Logo variant, e.g. \"dark\". Default \"default\". */\n variant?: Variant;\n /** \"logo\" (default) or \"wordmark\". */\n markType?: MarkType;\n /** How the axis categories are read. Default \"auto\". */\n idSystem?: IdSystem;\n /** url → data URI map from `embedSources`, to inline the images. */\n embed?: ReadonlyMap<string, string>;\n}\n\nexport function aspect(p: Placement): number {\n return p.aspect ?? HEADSHOT_ASPECT;\n}\n\nexport function axisLetter(axis: string): \"x\" | \"y\" {\n if (axis !== \"x\" && axis !== \"y\")\n throw new InputError(`axis must be \"x\" or \"y\", got ${JSON.stringify(axis)}`);\n return axis;\n}\n\n// encodeURI keeps the URL punctuation Python's SAFE_URL keeps (-._~:/?#[]@!$&()*+,;=%) and escapes the rest, so an\n// unvalidated URL still cannot close an attribute the adapter writes it into. `%` is re-escaped only when it does not\n// already start a %XX escape.\nexport function imageSource(p: Placement, embed?: ReadonlyMap<string, string>): string {\n return embed?.get(p.url) ?? encodeURI(p.url).replace(/%25([0-9A-Fa-f]{2})/g, \"%$1\");\n}\nexport function imageSources(ps: readonly Placement[], embed?: ReadonlyMap<string, string>): string[] {\n return ps.map((p) => imageSource(p, embed));\n}\n\n/** Data URIs for each distinct url, fetched once each. The one async helper of the adapters: call it, then pass the map as `embed`. */\nexport async function embedSources(\n urls: Iterable<string>,\n fetchFn: typeof fetch = fetch,\n): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n for (const url of new Set(urls)) {\n const res = await fetchFn(url);\n if (!res.ok) throw new DownloadError(`embed: ${url} answered ${res.status}`, url, res.status);\n // `||`: an empty content-type header falls back to the inferred type too\n const mime =\n res.headers.get(\"content-type\")?.split(\";\")[0]?.trim() ||\n (url.toLowerCase().endsWith(\".svg\") ? \"image/svg+xml\" : \"application/octet-stream\");\n const bytes = new Uint8Array(await res.arrayBuffer());\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n out.set(url, `data:${mime};base64,${btoa(bin)}`);\n }\n return out;\n}\n\n// Cells are typed Value for placeSync; a Date (temporal x) or any other cell passes through it untouched.\nexport function column(rows: readonly Row[], name: string, what: string): Value[] {\n if (rows.length > 0 && !rows.some((r) => name in r))\n throw new InputError(`${what} column ${JSON.stringify(name)} is not in rows`);\n return rows.map((r) => r[name] as Value);\n}\n\nexport function seasons(\n rows: readonly Row[],\n season: MarkOptions[\"season\"],\n): readonly SeasonInput[] | SeasonInput {\n if (typeof season === \"string\" && rows.some((r) => season in r))\n return rows.map((r) => r[season] as SeasonInput);\n return season as SeasonInput;\n}\n\n/** placeSync over row columns (x, y, team or player, season value or column), leaving out options the caller left out. */\nexport function markPlacements(\n rows: readonly Row[],\n kind: Kind,\n o: MarkOptions | HeadshotOptions,\n): Placement[] {\n const xs = column(rows, o.x, \"x\");\n const ys = column(rows, o.y, \"y\");\n if (kind === \"headshot\") {\n const h = o as HeadshotOptions;\n return place(xs, ys, column(rows, h.player, \"player\"), {\n league: h.league,\n kind,\n idSystem: h.idSystem ?? \"espn\",\n });\n }\n const m = o as MarkOptions;\n const po: PlaceOptions = { league: m.league, kind };\n if (m.season !== undefined) po.season = seasons(rows, m.season);\n if (m.variant !== undefined) po.variant = m.variant;\n if (m.idSystem !== undefined) po.idSystem = m.idSystem;\n return place(xs, ys, column(rows, m.team, \"team\"), po);\n}\n/** placeSync over a category axis: label i sits at index i along `letter` and 0 across, so `p.x`/`p.y` is its tick index. */\nexport function axisPlacements(labels: readonly string[], letter: \"x\" | \"y\", o: AxisOptions): Placement[] {\n const index = labels.map((_, i) => i);\n const across = labels.map(() => 0);\n const po: PlaceOptions = { league: o.league, kind: o.markType ?? \"logo\" };\n if (o.season !== undefined) po.season = o.season;\n if (o.variant !== undefined) po.variant = o.variant;\n if (o.idSystem !== undefined) po.idSystem = o.idSystem;\n return place(letter === \"x\" ? index : across, letter === \"x\" ? across : index, labels, po);\n}\n\nexport function colorList(\n league: League,\n teams: readonly unknown[],\n o: { which?: \"primary\" | \"secondary\"; season?: SeasonInput; idSystem?: IdSystem } = {},\n): (string | null)[] {\n return teamColorsSync(league, teams as readonly Value[], o).map((c) => c ?? null);\n}\n\n/**\n * The shared team palette behind every adapter's `teamColorPalette`: one colour per entry of `teams`, in order. Each\n * value is resolved to its team (one warning for the values that do not resolve) and takes that team's `which`\n * colour, else its other colour, else `fallback`. With `background`, the colours are the shared palette\n * (`teamPalette`: 3:1 against it, ΔE 20 apart) over the distinct resolved teams in order of first appearance, so\n * aliases of one team (\"KC\", 12, \"Kansas City Chiefs\") share one colour, and a value that does not resolve takes\n * `fallback` with no palette slot, so it never moves a real team's colour. Python's `perspective._palette` and\n * `pydeck._end_colors`.\n */\nexport function colorPalette(\n league: League,\n teams: readonly unknown[],\n o: {\n which?: Which;\n season?: SeasonInput;\n idSystem?: IdSystem;\n fallback?: string;\n background?: string;\n /** Throw UnresolvedTeamError for a value that does not resolve, instead of warning. Default false. */\n strict?: boolean;\n } = {},\n): string[] {\n const fallback = o.fallback ?? \"#808080\";\n const season = o.season === undefined ? {} : { season: o.season };\n const ids = resolveSync(teams as readonly Value[], league, {\n ...season,\n ...(o.idSystem === undefined ? {} : { idSystem: o.idSystem }),\n ...(o.strict === undefined ? {} : { strict: o.strict }),\n });\n const known = [...new Set(ids.filter((id) => id !== undefined))];\n const which = o.which ?? \"primary\";\n const co = { ...season, idSystem: \"team_id\" as const };\n const main = colorList(league, known, { ...co, which });\n const other = colorList(league, known, { ...co, which: which === \"primary\" ? \"secondary\" : \"primary\" });\n const colors = main.map((c, i) => c ?? other[i] ?? fallback);\n const bg = o.background === undefined ? undefined : hex6(o.background);\n const palette =\n bg === undefined\n ? colors\n : teamPalette(\n colors.map((c) => hex6(c, { dropAlpha: true })),\n other,\n bg,\n known,\n );\n const byId = new Map(known.map((id, j) => [id, palette[j]!]));\n return ids.map((id) => (id === undefined ? fallback : byId.get(id)!));\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/content-id.ts
|
|
2
|
+
function contentId(prefix, text) {
|
|
3
|
+
let h = 2166136261;
|
|
4
|
+
for (let i = 0; i < text.length; i++) h = Math.imul(h ^ text.charCodeAt(i), 16777619);
|
|
5
|
+
return `${prefix}-${(h >>> 0).toString(36)}`;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { contentId };
|
|
9
|
+
//# sourceMappingURL=chunk-WQT4IVLX.js.map
|
|
10
|
+
//# sourceMappingURL=chunk-WQT4IVLX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/content-id.ts"],"names":[],"mappings":";AACO,SAAS,SAAA,CAAU,QAAgB,IAAA,EAAsB;AAC9D,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,QAAU,CAAA;AACtF,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAA,CAAK,MAAM,CAAA,EAAG,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC5C","file":"chunk-WQT4IVLX.js","sourcesContent":["/** FNV-1a: an id that is a function of the content it names, stable across SSR, hydration and prerender. */\nexport function contentId(prefix: string, text: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < text.length; i++) h = Math.imul(h ^ text.charCodeAt(i), 0x01000193);\n return `${prefix}-${(h >>> 0).toString(36)}`;\n}\n"]}
|