@sportsdataverse/sdvplot 0.0.0-stage → 0.1.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 +94 -0
- package/README.md +908 -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 +132 -0
- package/dist/chartjs.js +339 -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-C2CDY5OG.js +137 -0
- package/dist/chunk-C2CDY5OG.js.map +1 -0
- package/dist/chunk-E7G7VSLV.js +43 -0
- package/dist/chunk-E7G7VSLV.js.map +1 -0
- package/dist/chunk-J6R2LEJ7.js +58 -0
- package/dist/chunk-J6R2LEJ7.js.map +1 -0
- package/dist/chunk-JJFTD4VB.js +175 -0
- package/dist/chunk-JJFTD4VB.js.map +1 -0
- package/dist/chunk-KKH6ABMA.js +223 -0
- package/dist/chunk-KKH6ABMA.js.map +1 -0
- package/dist/chunk-NLPH2VZT.js +127 -0
- package/dist/chunk-NLPH2VZT.js.map +1 -0
- package/dist/chunk-OKEE4AH6.js +30 -0
- package/dist/chunk-OKEE4AH6.js.map +1 -0
- package/dist/chunk-QY65DUEF.js +306 -0
- package/dist/chunk-QY65DUEF.js.map +1 -0
- package/dist/chunk-RMT2GMFH.js +97 -0
- package/dist/chunk-RMT2GMFH.js.map +1 -0
- package/dist/chunk-SEBO35DV.js +76 -0
- package/dist/chunk-SEBO35DV.js.map +1 -0
- package/dist/chunk-TAXO3VXH.js +556 -0
- package/dist/chunk-TAXO3VXH.js.map +1 -0
- package/dist/chunk-TDNBAEQB.js +105 -0
- package/dist/chunk-TDNBAEQB.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/d3.d.ts +234 -0
- package/dist/d3.js +198 -0
- package/dist/d3.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/headshots-B2J_LOO8.d.ts +40 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.js +10 -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/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/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/ohl-2FEM554G.js +113 -0
- package/dist/ohl-C5Q4W6JB.js +32 -0
- package/dist/ohl-TQ4J46VC.js +66 -0
- package/dist/phf-H7POU2KW.js +32 -0
- package/dist/phf-K5IFMZUM.js +13 -0
- package/dist/phf-TWJI3BOW.js +20 -0
- package/dist/plot.d.ts +449 -0
- package/dist/plot.js +711 -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 +101 -0
- package/dist/react.js +164 -0
- package/dist/react.js.map +1 -0
- package/dist/resolve-CQW-jzvr.d.ts +28 -0
- package/dist/selection-D4T3PkRt.d.ts +140 -0
- package/dist/shots.d.ts +364 -0
- package/dist/shots.js +85 -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/surfaces-ChaD9nei.d.ts +38 -0
- package/dist/testing.d.ts +75 -0
- package/dist/testing.js +240 -0
- package/dist/testing.js.map +1 -0
- package/dist/tiers-B6pUBPcE.d.ts +93 -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/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/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 +154 -3
package/dist/plotly.js
ADDED
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { axisLetter, axisPlacements, aspect, imageSources, colorList, markPlacements } from './chunk-SEBO35DV.js';
|
|
2
|
+
export { embedSources } from './chunk-SEBO35DV.js';
|
|
3
|
+
import { checkHeight, checkAlpha } from './chunk-RMT2GMFH.js';
|
|
4
|
+
import './chunk-KKH6ABMA.js';
|
|
5
|
+
import './chunk-TAXO3VXH.js';
|
|
6
|
+
import { InputError, warn, UnsupportedTargetError } from './chunk-E7G7VSLV.js';
|
|
7
|
+
|
|
8
|
+
// src/plotly.ts
|
|
9
|
+
var DEFAULT_WIDTH = 700;
|
|
10
|
+
var DEFAULT_HEIGHT = 450;
|
|
11
|
+
var DEFAULT_MARGIN = { l: 80, r: 80, t: 100, b: 80 };
|
|
12
|
+
var READABLE = /* @__PURE__ */ new Set(["scatter", "scattergl", "bar"]);
|
|
13
|
+
var REF = /^([xy])(\d*)$/;
|
|
14
|
+
function figureOf(target) {
|
|
15
|
+
if (typeof target !== "object" || target === null || !Array.isArray(target.data)) {
|
|
16
|
+
throw new UnsupportedTargetError(
|
|
17
|
+
`sdvplot/plotly draws on a { data, layout } figure, got ${typeof target}`
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
const f = target;
|
|
21
|
+
return { ...f, layout: structuredClone(f.layout ?? {}) };
|
|
22
|
+
}
|
|
23
|
+
function axisKey(ref, letter) {
|
|
24
|
+
const m = REF.exec(ref);
|
|
25
|
+
if (m === null || m[1] !== letter) {
|
|
26
|
+
throw new InputError(
|
|
27
|
+
`${letter}ref must name ${letter === "x" ? "an x" : "a y"} axis such as "${letter}" or "${letter}2", got ${JSON.stringify(ref)}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return `${letter}axis${m[2] ?? ""}`;
|
|
31
|
+
}
|
|
32
|
+
function axisOf(layout, ref, letter) {
|
|
33
|
+
const key = axisKey(ref, letter);
|
|
34
|
+
const ax = layout[key] ?? {};
|
|
35
|
+
layout[key] = ax;
|
|
36
|
+
return ax;
|
|
37
|
+
}
|
|
38
|
+
function margin(layout, side) {
|
|
39
|
+
return layout.margin?.[side] ?? DEFAULT_MARGIN[side];
|
|
40
|
+
}
|
|
41
|
+
function tracesOn(fig, letter, ref) {
|
|
42
|
+
return fig.data.filter((t) => (t[`${letter}axis`] ?? letter) === ref);
|
|
43
|
+
}
|
|
44
|
+
function vals(t, letter) {
|
|
45
|
+
return (t[letter] ?? []).filter((v) => v !== null && v !== void 0);
|
|
46
|
+
}
|
|
47
|
+
function col(t, letter) {
|
|
48
|
+
const v = t[letter];
|
|
49
|
+
if (v !== void 0) return [...v];
|
|
50
|
+
const other = t[letter === "x" ? "y" : "x"] ?? [];
|
|
51
|
+
const start = t[`${letter}0`] ?? 0;
|
|
52
|
+
const step = t[`d${letter}`] ?? 1;
|
|
53
|
+
return other.map((_, i) => start + i * step);
|
|
54
|
+
}
|
|
55
|
+
function valueKind(v) {
|
|
56
|
+
if (typeof v === "number" || typeof v === "bigint") return "linear";
|
|
57
|
+
if (v instanceof Date) return "date";
|
|
58
|
+
if (typeof v === "string") {
|
|
59
|
+
if (v.trim() !== "" && Number.isFinite(Number(v))) return "linear";
|
|
60
|
+
return /^\d{4}-\d{2}(-\d{2})?/.test(v) && !Number.isNaN(Date.parse(v)) ? "date" : "category";
|
|
61
|
+
}
|
|
62
|
+
return "linear";
|
|
63
|
+
}
|
|
64
|
+
function axisType(fig, letter, ref, values) {
|
|
65
|
+
const declared = axisOf(fig.layout, ref, letter).type;
|
|
66
|
+
let kind;
|
|
67
|
+
if (declared !== void 0 && declared !== "-") kind = declared;
|
|
68
|
+
else {
|
|
69
|
+
const kinds = new Set(
|
|
70
|
+
[...tracesOn(fig, letter, ref).flatMap((t) => vals(t, letter)), ...values].filter((v) => v !== null && v !== void 0).map(valueKind)
|
|
71
|
+
);
|
|
72
|
+
kind = kinds.has("date") ? "date" : kinds.has("category") ? "category" : "linear";
|
|
73
|
+
}
|
|
74
|
+
if (kind !== "linear" && kind !== "category") {
|
|
75
|
+
throw new InputError(`sdvplot does not support ${kind} axes yet (${ref}); use a linear or category axis`);
|
|
76
|
+
}
|
|
77
|
+
return kind;
|
|
78
|
+
}
|
|
79
|
+
function categories(fig, letter, ref) {
|
|
80
|
+
const ax = axisOf(fig.layout, ref, letter);
|
|
81
|
+
const order = ax.categoryorder ?? (ax.categoryarray !== void 0 ? "array" : "trace");
|
|
82
|
+
const fromTraces = [...new Set(tracesOn(fig, letter, ref).flatMap((t) => vals(t, letter)))];
|
|
83
|
+
if (order === "array") {
|
|
84
|
+
const listed = [...ax.categoryarray ?? []];
|
|
85
|
+
return [...listed, ...fromTraces.filter((c) => !listed.includes(c))];
|
|
86
|
+
}
|
|
87
|
+
if (order === "trace") return fromTraces;
|
|
88
|
+
if (order === "category ascending" || order === "category descending") {
|
|
89
|
+
const sign = order === "category descending" ? -1 : 1;
|
|
90
|
+
return [...fromTraces].sort((a, b) => String(a).localeCompare(String(b)) * sign);
|
|
91
|
+
}
|
|
92
|
+
throw new InputError(
|
|
93
|
+
`sdvplot does not support categoryorder=${JSON.stringify(order)} yet (${ref}); use "trace" or "array"`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function unmeasurable(what, ref, letter) {
|
|
97
|
+
return new InputError(
|
|
98
|
+
`cannot work out the ${ref} range of ${what}; set it first, e.g. layout.${letter}axis.range = [lo, hi], then add the marks`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
var num = (v) => typeof v === "number" ? v : typeof v === "bigint" ? Number(v) : typeof v === "string" && v.trim() !== "" ? Number(v) : v instanceof Date ? v.getTime() : null;
|
|
102
|
+
function extent(fig, letter, ref, coords2, index) {
|
|
103
|
+
const out = [...coords2];
|
|
104
|
+
const across = letter === "x" ? "y" : "x";
|
|
105
|
+
const layout = fig.layout;
|
|
106
|
+
const stacked = layout.barmode === "stack" || layout.barmode === "relative";
|
|
107
|
+
const ends = /* @__PURE__ */ new Map();
|
|
108
|
+
const filled = /* @__PURE__ */ new Set();
|
|
109
|
+
for (const t of tracesOn(fig, letter, ref)) {
|
|
110
|
+
const type = t.type ?? "scatter";
|
|
111
|
+
if (!READABLE.has(type)) throw unmeasurable(`a ${type} trace`, ref, letter);
|
|
112
|
+
const subplot = `${t.xaxis ?? "x"}|${t.yaxis ?? "y"}`;
|
|
113
|
+
const along = letter === (t.orientation === "h" ? "x" : "y");
|
|
114
|
+
const nums = index !== null && t[letter] !== void 0 ? col(t, letter).map((v) => index.get(v) ?? null) : col(t, letter).map(num);
|
|
115
|
+
if (type === "bar" && along) {
|
|
116
|
+
if (t.base !== void 0 || layout.barnorm !== void 0 || stacked && t.offsetgroup !== void 0) {
|
|
117
|
+
throw unmeasurable("bars with a base, barnorm or stacked offsetgroups", ref, letter);
|
|
118
|
+
}
|
|
119
|
+
out.push(0);
|
|
120
|
+
if (stacked) {
|
|
121
|
+
const positions = col(t, across);
|
|
122
|
+
nums.forEach((v, i) => {
|
|
123
|
+
if (v === null || Number.isNaN(v)) return;
|
|
124
|
+
const key = `${subplot}|${String(positions[i])}|${layout.barmode === "relative" && v < 0}`;
|
|
125
|
+
const end = (ends.get(key) ?? 0) + v;
|
|
126
|
+
ends.set(key, end);
|
|
127
|
+
out.push(end);
|
|
128
|
+
});
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
out.push(...nums.filter((v) => v !== null));
|
|
133
|
+
if (type === "bar" && index === null && !along) {
|
|
134
|
+
const spots = [...new Set(nums.filter((v) => v !== null))].sort((a, b) => a - b);
|
|
135
|
+
const gaps = spots.slice(1).map((b, i) => b - spots[i]);
|
|
136
|
+
const half = (gaps.length ? Math.min(...gaps) : 1) / 2;
|
|
137
|
+
if (spots.length > 0) out.push(spots[0] - half, spots[spots.length - 1] + half);
|
|
138
|
+
} else if (type !== "bar") {
|
|
139
|
+
if (t.stackgroup !== void 0 && along)
|
|
140
|
+
throw unmeasurable("stacked scatter traces (stackgroup)", ref, letter);
|
|
141
|
+
if (t.fill === `tozero${letter}` || t.fill === `tonext${letter}` && !filled.has(subplot)) out.push(0);
|
|
142
|
+
filled.add(subplot);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (index !== null) out.push(-0.5, index.size - 0.5);
|
|
146
|
+
return out.filter((v) => !Number.isNaN(v));
|
|
147
|
+
}
|
|
148
|
+
function range(fig, letter, ref, coords2, index, mark) {
|
|
149
|
+
const ax = axisOf(fig.layout, ref, letter);
|
|
150
|
+
if (ax.range !== void 0 && ax.range[0] != null && ax.range[1] != null && (ax.autorange === void 0 || ax.autorange === false)) {
|
|
151
|
+
return [Number(ax.range[0]), Number(ax.range[1])];
|
|
152
|
+
}
|
|
153
|
+
const data = extent(fig, letter, ref, coords2, index);
|
|
154
|
+
const lo = data.length ? Math.min(...data) : 0;
|
|
155
|
+
const hi = data.length ? Math.max(...data) : 1;
|
|
156
|
+
const span2 = (hi - lo || 1) / Math.max(1 - mark, 0.5);
|
|
157
|
+
const mid = (lo + hi) / 2;
|
|
158
|
+
let rng = [mid - span2 / 2, mid + span2 / 2];
|
|
159
|
+
if (typeof ax.autorange === "string" && ax.autorange.includes("reversed")) rng = [rng[1], rng[0]];
|
|
160
|
+
ax.range = rng;
|
|
161
|
+
ax.autorange = false;
|
|
162
|
+
return rng;
|
|
163
|
+
}
|
|
164
|
+
function plotSize(layout, xref, yref) {
|
|
165
|
+
const w = (layout.width ?? DEFAULT_WIDTH) - margin(layout, "l") - margin(layout, "r");
|
|
166
|
+
const h = (layout.height ?? DEFAULT_HEIGHT) - margin(layout, "t") - margin(layout, "b");
|
|
167
|
+
const xd = layout[axisKey(xref, "x")]?.domain ?? [0, 1];
|
|
168
|
+
const yd = layout[axisKey(yref, "y")]?.domain ?? [0, 1];
|
|
169
|
+
return [w * (xd[1] - xd[0]), h * (yd[1] - yd[0])];
|
|
170
|
+
}
|
|
171
|
+
function coords(fig, letter, ref, values) {
|
|
172
|
+
if (axisType(fig, letter, ref, values) === "linear") return [values.map(num), null];
|
|
173
|
+
const index = new Map(categories(fig, letter, ref).map((c, i) => [c, i]));
|
|
174
|
+
return [values.map((v) => index.get(v) ?? null), index];
|
|
175
|
+
}
|
|
176
|
+
function add(target, rows, kind, o) {
|
|
177
|
+
const h = checkHeight(o.height ?? 0.1);
|
|
178
|
+
const a = checkAlpha(o.alpha ?? 1);
|
|
179
|
+
const xref = o.xref ?? "x";
|
|
180
|
+
const yref = o.yref ?? "y";
|
|
181
|
+
const layer = o.layer ?? "above";
|
|
182
|
+
const fig = figureOf(target);
|
|
183
|
+
axisKey(xref, "x");
|
|
184
|
+
axisKey(yref, "y");
|
|
185
|
+
const placements = markPlacements(rows, kind, o);
|
|
186
|
+
const [xs, xIndex] = coords(
|
|
187
|
+
fig,
|
|
188
|
+
"x",
|
|
189
|
+
xref,
|
|
190
|
+
placements.map((p) => p.x)
|
|
191
|
+
);
|
|
192
|
+
const [ys, yIndex] = coords(
|
|
193
|
+
fig,
|
|
194
|
+
"y",
|
|
195
|
+
yref,
|
|
196
|
+
placements.map((p) => p.y)
|
|
197
|
+
);
|
|
198
|
+
const keep = placements.map((_, i) => i).filter((i) => xs[i] !== null && ys[i] !== null);
|
|
199
|
+
if (keep.length < placements.length) {
|
|
200
|
+
const off = placements.filter((_, i) => !keep.includes(i)).map((p) => p.id);
|
|
201
|
+
warn(
|
|
202
|
+
`plotly:${kind}:off-axis:${off.join(",")}`,
|
|
203
|
+
`skipped ${off.length} point(s) whose category is not on the axis: ${JSON.stringify(off)}`
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const kept = keep.map((i) => placements[i]);
|
|
207
|
+
const kx = keep.map((i) => xs[i]);
|
|
208
|
+
const ky = keep.map((i) => ys[i]);
|
|
209
|
+
if (kept.length === 0) return fig;
|
|
210
|
+
const [plotW, plotH] = plotSize(fig.layout, xref, yref);
|
|
211
|
+
const widest = Math.max(...kept.map(aspect));
|
|
212
|
+
const [xLo, xHi] = range(fig, "x", xref, kx, xIndex, h * widest * plotH / plotW);
|
|
213
|
+
const [yLo, yHi] = range(fig, "y", yref, ky, yIndex, h);
|
|
214
|
+
const sizex = 2 * Math.abs(xHi - xLo);
|
|
215
|
+
const sources = imageSources(kept, o.embed);
|
|
216
|
+
const images = kept.map((p, i) => ({
|
|
217
|
+
source: sources[i],
|
|
218
|
+
x: kx[i],
|
|
219
|
+
y: ky[i],
|
|
220
|
+
xref,
|
|
221
|
+
yref,
|
|
222
|
+
sizex,
|
|
223
|
+
sizey: h * Math.abs(yHi - yLo),
|
|
224
|
+
sizing: "contain",
|
|
225
|
+
xanchor: "center",
|
|
226
|
+
yanchor: "middle",
|
|
227
|
+
opacity: a,
|
|
228
|
+
layer,
|
|
229
|
+
name: `sdvplot:${kind}:${p.id}`
|
|
230
|
+
}));
|
|
231
|
+
fig.layout.images = [...fig.layout.images ?? [], ...images];
|
|
232
|
+
return fig;
|
|
233
|
+
}
|
|
234
|
+
function withLogos(figure, rows, o) {
|
|
235
|
+
return add(figure, rows, "logo", o);
|
|
236
|
+
}
|
|
237
|
+
function withWordmarks(figure, rows, o) {
|
|
238
|
+
return add(figure, rows, "wordmark", o);
|
|
239
|
+
}
|
|
240
|
+
function withHeadshots(figure, rows, o) {
|
|
241
|
+
return add(figure, rows, "headshot", o);
|
|
242
|
+
}
|
|
243
|
+
function span(layout, ref) {
|
|
244
|
+
const r = layout[axisKey(ref, ref[0])]?.range ?? [0, 1];
|
|
245
|
+
return Math.abs(Number(r[1]) - Number(r[0]));
|
|
246
|
+
}
|
|
247
|
+
function imageHeight(layout, im) {
|
|
248
|
+
return im.sizey / (im.yref === "paper" || im.yref.endsWith(" domain") ? 1 : span(layout, im.yref));
|
|
249
|
+
}
|
|
250
|
+
function drawnMarks(figure) {
|
|
251
|
+
const fig = figureOf(figure);
|
|
252
|
+
return (fig.layout.images ?? []).flatMap((im) => {
|
|
253
|
+
const parts = (im.name ?? "").split(":", 3);
|
|
254
|
+
return parts[0] === "sdvplot" && parts[1] !== "axis" ? [[parts[2] ?? "", im.x, im.y, imageHeight(fig.layout, im), im.source]] : [];
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function withAxisLogos(figure, axis, o) {
|
|
258
|
+
const letter = axisLetter(axis);
|
|
259
|
+
const h = checkHeight(o.height ?? 0.1);
|
|
260
|
+
const xref = o.xref ?? "x";
|
|
261
|
+
const yref = o.yref ?? "y";
|
|
262
|
+
axisKey(xref, "x");
|
|
263
|
+
axisKey(yref, "y");
|
|
264
|
+
const cref = letter === "x" ? xref : yref;
|
|
265
|
+
const fig = figureOf(figure);
|
|
266
|
+
if (axisType(fig, letter, cref, []) !== "category") {
|
|
267
|
+
throw new InputError(`withAxisLogos needs a category ${letter} axis (${cref}) with team names on it`);
|
|
268
|
+
}
|
|
269
|
+
const cats = categories(fig, letter, cref);
|
|
270
|
+
const labels = cats.map(String);
|
|
271
|
+
const placements = axisPlacements(labels, letter, o);
|
|
272
|
+
const ax = axisOf(fig.layout, cref, letter);
|
|
273
|
+
const drawn = new Set(placements.map((p) => Number(letter === "x" ? p.x : p.y)));
|
|
274
|
+
const keep = cats.flatMap((_, i) => drawn.has(i) ? [] : [i]);
|
|
275
|
+
ax.tickmode = "array";
|
|
276
|
+
if (keep.length === 0) {
|
|
277
|
+
ax.showticklabels = false;
|
|
278
|
+
ax.tickvals = cats;
|
|
279
|
+
ax.ticktext = labels;
|
|
280
|
+
} else {
|
|
281
|
+
ax.showticklabels = true;
|
|
282
|
+
ax.tickvals = keep.map((i) => cats[i]);
|
|
283
|
+
ax.ticktext = keep.map((i) => labels[i]);
|
|
284
|
+
}
|
|
285
|
+
if (placements.length === 0) return fig;
|
|
286
|
+
const layout = fig.layout;
|
|
287
|
+
const plotH = plotSize(layout, xref, yref)[1];
|
|
288
|
+
let lo = 0;
|
|
289
|
+
let hi = 1;
|
|
290
|
+
if (letter === "x") {
|
|
291
|
+
const [y0, y1] = layout[axisKey(yref, "y")]?.domain ?? [0, 1];
|
|
292
|
+
const over = h * (y1 - y0) - y0;
|
|
293
|
+
if (over > 0)
|
|
294
|
+
layout.margin = {
|
|
295
|
+
...layout.margin,
|
|
296
|
+
b: margin(layout, "b") + Math.ceil(over * plotH / (y1 - y0) / (1 + over))
|
|
297
|
+
};
|
|
298
|
+
} else {
|
|
299
|
+
[lo, hi] = range(fig, "y", yref, [], new Map(cats.map((c, i) => [c, i])), 0);
|
|
300
|
+
layout.margin = {
|
|
301
|
+
...layout.margin,
|
|
302
|
+
l: margin(layout, "l") + Math.ceil(h * plotH * Math.max(...placements.map(aspect)))
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
const sources = imageSources(placements, o.embed);
|
|
306
|
+
const xDom0 = layout[axisKey(xref, "x")]?.domain?.[0] ?? 0;
|
|
307
|
+
const images = placements.map((p, i) => {
|
|
308
|
+
const loc = Number(letter === "x" ? p.x : p.y);
|
|
309
|
+
const common = {
|
|
310
|
+
source: sources[i],
|
|
311
|
+
sizing: "contain",
|
|
312
|
+
layer: "above",
|
|
313
|
+
name: `sdvplot:axis:${letter}:${p.id}`
|
|
314
|
+
};
|
|
315
|
+
return letter === "x" ? {
|
|
316
|
+
...common,
|
|
317
|
+
x: loc,
|
|
318
|
+
y: 0,
|
|
319
|
+
xref,
|
|
320
|
+
yref: `${yref} domain`,
|
|
321
|
+
// 0..1 = the subplot's own height, so `sizey: h` is `h` of it
|
|
322
|
+
sizex: 2 * cats.length,
|
|
323
|
+
sizey: h,
|
|
324
|
+
xanchor: "center",
|
|
325
|
+
yanchor: "top"
|
|
326
|
+
} : {
|
|
327
|
+
...common,
|
|
328
|
+
x: xDom0,
|
|
329
|
+
y: loc,
|
|
330
|
+
xref: "paper",
|
|
331
|
+
yref,
|
|
332
|
+
sizex: 1,
|
|
333
|
+
sizey: h * Math.abs(hi - lo),
|
|
334
|
+
xanchor: "right",
|
|
335
|
+
yanchor: "middle"
|
|
336
|
+
};
|
|
337
|
+
});
|
|
338
|
+
layout.images = [...layout.images ?? [], ...images];
|
|
339
|
+
return fig;
|
|
340
|
+
}
|
|
341
|
+
function teamColorway(league, teams, o = {}) {
|
|
342
|
+
return colorList(league, teams, o).map((c) => c ?? o.fallback ?? "#808080");
|
|
343
|
+
}
|
|
344
|
+
function drawnAxisMarks(figure, axis) {
|
|
345
|
+
const letter = axisLetter(axis);
|
|
346
|
+
const fig = figureOf(figure);
|
|
347
|
+
return (fig.layout.images ?? []).flatMap((im) => {
|
|
348
|
+
const p = (im.name ?? "").split(":", 4);
|
|
349
|
+
return p[0] === "sdvplot" && p[1] === "axis" && p[2] === letter ? [[p[3] ?? "", letter === "x" ? im.x : im.y, imageHeight(fig.layout, im)]] : [];
|
|
350
|
+
}).sort((a, b) => a[1] - b[1]);
|
|
351
|
+
}
|
|
352
|
+
function visibleAxisLabels(figure, axis) {
|
|
353
|
+
const letter = axisLetter(axis);
|
|
354
|
+
const ax = figureOf(figure).layout[axisKey(letter, letter)];
|
|
355
|
+
return ax?.showticklabels === false ? [] : [...ax?.ticktext ?? []].filter((t) => t !== "");
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export { drawnAxisMarks, drawnMarks, teamColorway, visibleAxisLabels, withAxisLogos, withHeadshots, withLogos, withWordmarks };
|
|
359
|
+
//# sourceMappingURL=plotly.js.map
|
|
360
|
+
//# sourceMappingURL=plotly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plotly.ts"],"names":["coords","span"],"mappings":"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","file":"plotly.js","sourcesContent":["/** The Plotly adapter: logos, wordmarks, headshots and axis logos as layout images on a plain `{ data, layout }` figure.\n * Pure: plotly.js is never imported at runtime; the figure is a plain object and a NEW one is returned. */\nimport {\n type AxisOptions,\n type DrawnAxisMark,\n type DrawnMark,\n type HeadshotOptions,\n type MarkOptions,\n type Placement,\n type Row,\n aspect,\n axisLetter,\n axisPlacements,\n checkAlpha,\n checkHeight,\n colorList,\n imageSources,\n markPlacements,\n} from \"./_web.js\";\nimport { InputError, UnsupportedTargetError, warn } from \"./errors.js\";\nimport type { IdSystem, League, SeasonInput } from \"./types.js\";\n\nexport type { AxisOptions, DrawnAxisMark, DrawnMark, HeadshotOptions, MarkOptions, Row } from \"./_web.js\";\nexport { embedSources } from \"./_web.js\"; // public: the README tells callers to build `embed` with it\n\n/** Structural types for a plotly.js figure: the subset `sdvplot/plotly` reads and writes. No runtime import of plotly.js. */\nexport interface PlotlyAxis {\n type?: \"-\" | \"linear\" | \"log\" | \"date\" | \"category\";\n range?: readonly [unknown, unknown];\n autorange?: boolean | \"reversed\";\n categoryorder?: string;\n categoryarray?: readonly unknown[];\n domain?: readonly [number, number];\n tickmode?: string;\n tickvals?: readonly unknown[];\n ticktext?: readonly string[];\n showticklabels?: boolean;\n}\nexport interface LayoutImage {\n source: string;\n xref: string;\n yref: string;\n x: number;\n y: number;\n sizex: number;\n sizey: number;\n sizing: \"contain\" | \"fill\" | \"stretch\";\n xanchor: \"left\" | \"center\" | \"right\";\n yanchor: \"top\" | \"middle\" | \"bottom\";\n opacity?: number;\n layer?: \"above\" | \"below\";\n name?: string;\n}\n// A18: an index-signature pattern may not contain a literal (TS1337), so `xaxis`/`yaxis` are declared and the pattern\n// covers the numbered axes only.\nexport interface PlotlyLayout {\n width?: number;\n height?: number;\n margin?: { l?: number; r?: number; t?: number; b?: number };\n barmode?: string;\n barnorm?: string;\n images?: readonly LayoutImage[];\n xaxis?: PlotlyAxis;\n yaxis?: PlotlyAxis;\n [axis: `${\"x\" | \"y\"}axis${number}`]: PlotlyAxis | undefined;\n}\nexport interface PlotlyTrace {\n type?: string;\n x?: readonly unknown[];\n y?: readonly unknown[];\n x0?: number;\n y0?: number;\n dx?: number;\n dy?: number;\n xaxis?: string;\n yaxis?: string;\n orientation?: \"v\" | \"h\";\n base?: unknown;\n offsetgroup?: string;\n stackgroup?: string;\n fill?: string;\n}\nexport interface PlotlyFigure {\n data: readonly PlotlyTrace[];\n layout?: PlotlyLayout;\n}\n\n/** `withLogos` / `withWordmarks` options: the shared ones plus the subplot axes and the image layer. */\nexport interface PlotlyMarkOptions extends MarkOptions {\n /** The x axis the images are placed on, e.g. \"x2\" for a subplot. Default \"x\". */\n xref?: string;\n /** The y axis the images are placed on, e.g. \"y2\" for a subplot. Default \"y\". */\n yref?: string;\n /** Draw the images above (default) or below the traces. */\n layer?: \"above\" | \"below\";\n}\n/** `withHeadshots` options: the shared ones plus the subplot axes and the image layer. */\nexport interface PlotlyHeadshotOptions extends HeadshotOptions {\n /** The x axis the images are placed on, e.g. \"x2\" for a subplot. Default \"x\". */\n xref?: string;\n /** The y axis the images are placed on, e.g. \"y2\" for a subplot. Default \"y\". */\n yref?: string;\n /** Draw the images above (default) or below the traces. */\n layer?: \"above\" | \"below\";\n}\n\nconst DEFAULT_WIDTH = 700; // plotly.js when layout.width/height are unset\nconst DEFAULT_HEIGHT = 450;\nconst DEFAULT_MARGIN = { l: 80, r: 80, t: 100, b: 80 } as const; // plotly.js when layout.margin is unset\nconst READABLE = new Set([\"scatter\", \"scattergl\", \"bar\"]); // trace types whose extent we can work out\nconst REF = /^([xy])(\\d*)$/;\n\ntype Letter = \"x\" | \"y\";\ntype AxisKey = \"xaxis\" | \"yaxis\" | `${Letter}axis${number}`;\n\nfunction figureOf(target: unknown): PlotlyFigure {\n if (typeof target !== \"object\" || target === null || !Array.isArray((target as PlotlyFigure).data)) {\n throw new UnsupportedTargetError(\n `sdvplot/plotly draws on a { data, layout } figure, got ${typeof target}`,\n );\n }\n const f = target as PlotlyFigure;\n return { ...f, layout: structuredClone(f.layout ?? {}) }; // keep config/frames/etc.; layout is what we patch, traces are read only\n}\n\nfunction axisKey(ref: string, letter: Letter): AxisKey {\n const m = REF.exec(ref);\n if (m === null || m[1] !== letter) {\n throw new InputError(\n `${letter}ref must name ${letter === \"x\" ? \"an x\" : \"a y\"} axis such as \"${letter}\" or \"${letter}2\", got ${JSON.stringify(ref)}`,\n );\n }\n return `${letter}axis${m[2] ?? \"\"}` as AxisKey;\n}\nfunction axisOf(layout: PlotlyLayout, ref: string, letter: Letter): PlotlyAxis {\n const key = axisKey(ref, letter);\n const ax = layout[key] ?? {};\n layout[key] = ax;\n return ax;\n}\nfunction margin(layout: PlotlyLayout, side: keyof typeof DEFAULT_MARGIN): number {\n return layout.margin?.[side] ?? DEFAULT_MARGIN[side];\n}\n\nfunction tracesOn(fig: PlotlyFigure, letter: Letter, ref: string): PlotlyTrace[] {\n return fig.data.filter((t) => (t[`${letter}axis`] ?? letter) === ref);\n}\nfunction vals(t: PlotlyTrace, letter: Letter): unknown[] {\n return (t[letter] ?? []).filter((v) => v !== null && v !== undefined);\n}\n/** A trace's values point by point; without them, where Plotly draws it: x0 + i·dx. */\nfunction col(t: PlotlyTrace, letter: Letter): unknown[] {\n const v = t[letter];\n if (v !== undefined) return [...v];\n const other = t[letter === \"x\" ? \"y\" : \"x\"] ?? [];\n const start = t[`${letter}0`] ?? 0;\n const step = t[`d${letter}`] ?? 1;\n return other.map((_, i) => start + i * step);\n}\n\nfunction valueKind(v: unknown): \"linear\" | \"date\" | \"category\" {\n if (typeof v === \"number\" || typeof v === \"bigint\") return \"linear\";\n if (v instanceof Date) return \"date\";\n if (typeof v === \"string\") {\n if (v.trim() !== \"\" && Number.isFinite(Number(v))) return \"linear\";\n return /^\\d{4}-\\d{2}(-\\d{2})?/.test(v) && !Number.isNaN(Date.parse(v)) ? \"date\" : \"category\";\n }\n return \"linear\";\n}\nfunction axisType(\n fig: PlotlyFigure,\n letter: Letter,\n ref: string,\n values: readonly unknown[],\n): \"linear\" | \"category\" {\n const declared = axisOf(fig.layout!, ref, letter).type;\n let kind: string;\n if (declared !== undefined && declared !== \"-\") kind = declared;\n else {\n const kinds = new Set(\n [...tracesOn(fig, letter, ref).flatMap((t) => vals(t, letter)), ...values]\n .filter((v) => v !== null && v !== undefined)\n .map(valueKind),\n );\n kind = kinds.has(\"date\") ? \"date\" : kinds.has(\"category\") ? \"category\" : \"linear\";\n }\n if (kind !== \"linear\" && kind !== \"category\") {\n throw new InputError(`sdvplot does not support ${kind} axes yet (${ref}); use a linear or category axis`);\n }\n return kind;\n}\n/** A category axis' categories in display order: categoryarray, or first appearance across the traces. */\nfunction categories(fig: PlotlyFigure, letter: Letter, ref: string): unknown[] {\n const ax = axisOf(fig.layout!, ref, letter);\n const order = ax.categoryorder ?? (ax.categoryarray !== undefined ? \"array\" : \"trace\");\n const fromTraces = [...new Set(tracesOn(fig, letter, ref).flatMap((t) => vals(t, letter)))];\n if (order === \"array\") {\n const listed = [...(ax.categoryarray ?? [])];\n return [...listed, ...fromTraces.filter((c) => !listed.includes(c))];\n }\n if (order === \"trace\") return fromTraces;\n if (order === \"category ascending\" || order === \"category descending\") {\n const sign = order === \"category descending\" ? -1 : 1;\n return [...fromTraces].sort((a, b) => String(a).localeCompare(String(b)) * sign);\n }\n throw new InputError(\n `sdvplot does not support categoryorder=${JSON.stringify(order)} yet (${ref}); use \"trace\" or \"array\"`,\n );\n}\nfunction unmeasurable(what: string, ref: string, letter: Letter): InputError {\n return new InputError(\n `cannot work out the ${ref} range of ${what}; set it first, e.g. layout.${letter}axis.range = [lo, hi], then add the marks`,\n );\n}\nconst num = (v: unknown): number | null =>\n typeof v === \"number\"\n ? v\n : typeof v === \"bigint\"\n ? Number(v)\n : typeof v === \"string\" && v.trim() !== \"\"\n ? Number(v)\n : v instanceof Date\n ? v.getTime()\n : null;\n\n/** Every coordinate the axis' traces span, plus the new marks: the data Plotly's autorange would fit. */\nfunction extent(\n fig: PlotlyFigure,\n letter: Letter,\n ref: string,\n coords: readonly number[],\n index: Map<unknown, number> | null,\n): number[] {\n const out = [...coords];\n const across: Letter = letter === \"x\" ? \"y\" : \"x\";\n const layout = fig.layout!;\n const stacked = layout.barmode === \"stack\" || layout.barmode === \"relative\";\n const ends = new Map<string, number>(); // where each bar stack ends so far (Plotly stacks in trace order)\n const filled = new Set<string>(); // subplots that already have a scatter, for fill=\"tonext…\"\n for (const t of tracesOn(fig, letter, ref)) {\n const type = t.type ?? \"scatter\";\n if (!READABLE.has(type)) throw unmeasurable(`a ${type} trace`, ref, letter);\n const subplot = `${t.xaxis ?? \"x\"}|${t.yaxis ?? \"y\"}`;\n const along = letter === (t.orientation === \"h\" ? \"x\" : \"y\"); // bar lengths and stacks run along this axis\n const nums: (number | null)[] =\n index !== null && t[letter] !== undefined\n ? col(t, letter).map((v) => index.get(v) ?? null)\n : col(t, letter).map(num);\n if (type === \"bar\" && along) {\n if (t.base !== undefined || layout.barnorm !== undefined || (stacked && t.offsetgroup !== undefined)) {\n throw unmeasurable(\"bars with a base, barnorm or stacked offsetgroups\", ref, letter);\n }\n out.push(0); // bars start at zero\n if (stacked) {\n const positions = col(t, across);\n nums.forEach((v, i) => {\n if (v === null || Number.isNaN(v)) return;\n const key = `${subplot}|${String(positions[i])}|${layout.barmode === \"relative\" && v < 0}`;\n const end = (ends.get(key) ?? 0) + v;\n ends.set(key, end);\n out.push(end);\n });\n continue;\n }\n }\n out.push(...nums.filter((v): v is number => v !== null));\n if (type === \"bar\" && index === null && !along) {\n // a bar is as wide as the gap between bars\n const spots = [...new Set(nums.filter((v): v is number => v !== null))].sort((a, b) => a - b);\n const gaps = spots.slice(1).map((b, i) => b - spots[i]!);\n const half = (gaps.length ? Math.min(...gaps) : 1) / 2; // Python: min(..., default=1.0) / 2 (A33)\n if (spots.length > 0) out.push(spots[0]! - half, spots[spots.length - 1]! + half);\n } else if (type !== \"bar\") {\n if (t.stackgroup !== undefined && along)\n throw unmeasurable(\"stacked scatter traces (stackgroup)\", ref, letter);\n if (t.fill === `tozero${letter}` || (t.fill === `tonext${letter}` && !filled.has(subplot))) out.push(0);\n filled.add(subplot);\n }\n }\n if (index !== null) out.push(-0.5, index.size - 0.5); // a category axis shows every category's band\n return out.filter((v) => !Number.isNaN(v));\n}\n\n/** The axis range: as set, or the extent with half a mark of room at each end, then pinned. `mark` = fraction of the axis one mark covers. */\nfunction range(\n fig: PlotlyFigure,\n letter: Letter,\n ref: string,\n coords: readonly number[],\n index: Map<unknown, number> | null,\n mark: number,\n): [number, number] {\n const ax = axisOf(fig.layout!, ref, letter);\n if (\n ax.range !== undefined &&\n ax.range[0] != null &&\n ax.range[1] != null &&\n (ax.autorange === undefined || ax.autorange === false)\n ) {\n return [Number(ax.range[0]), Number(ax.range[1])];\n }\n const data = extent(fig, letter, ref, coords, index);\n const lo = data.length ? Math.min(...data) : 0;\n const hi = data.length ? Math.max(...data) : 1;\n const span = (hi - lo || 1) / Math.max(1 - mark, 0.5);\n const mid = (lo + hi) / 2;\n let rng: [number, number] = [mid - span / 2, mid + span / 2];\n if (typeof ax.autorange === \"string\" && ax.autorange.includes(\"reversed\")) rng = [rng[1], rng[0]];\n ax.range = rng;\n ax.autorange = false;\n return rng;\n}\n/** The subplot's size in pixels at the layout's width and height. */\nfunction plotSize(layout: PlotlyLayout, xref: string, yref: string): [number, number] {\n const w = (layout.width ?? DEFAULT_WIDTH) - margin(layout, \"l\") - margin(layout, \"r\");\n const h = (layout.height ?? DEFAULT_HEIGHT) - margin(layout, \"t\") - margin(layout, \"b\");\n const xd = layout[axisKey(xref, \"x\")]?.domain ?? [0, 1];\n const yd = layout[axisKey(yref, \"y\")]?.domain ?? [0, 1];\n return [w * (xd[1] - xd[0]), h * (yd[1] - yd[0])];\n}\n/** Values as axis coordinates: numbers as they are, categories as their index (null when not on the axis). */\nfunction coords(\n fig: PlotlyFigure,\n letter: Letter,\n ref: string,\n values: readonly unknown[],\n): [(number | null)[], Map<unknown, number> | null] {\n if (axisType(fig, letter, ref, values) === \"linear\") return [values.map(num), null];\n const index = new Map(categories(fig, letter, ref).map((c, i) => [c, i] as const));\n return [values.map((v) => index.get(v) ?? null), index];\n}\n\nfunction add(\n target: unknown,\n rows: readonly Row[],\n kind: \"logo\" | \"wordmark\" | \"headshot\",\n o: PlotlyMarkOptions | PlotlyHeadshotOptions,\n): PlotlyFigure {\n const h = checkHeight(o.height ?? 0.1);\n const a = checkAlpha(o.alpha ?? 1);\n const xref = o.xref ?? \"x\";\n const yref = o.yref ?? \"y\";\n const layer = o.layer ?? \"above\";\n const fig = figureOf(target);\n axisKey(xref, \"x\");\n axisKey(yref, \"y\");\n const placements = markPlacements(rows, kind, o);\n const [xs, xIndex] = coords(\n fig,\n \"x\",\n xref,\n placements.map((p) => p.x),\n );\n const [ys, yIndex] = coords(\n fig,\n \"y\",\n yref,\n placements.map((p) => p.y),\n );\n const keep = placements.map((_, i) => i).filter((i) => xs[i] !== null && ys[i] !== null);\n if (keep.length < placements.length) {\n const off = placements.filter((_, i) => !keep.includes(i)).map((p) => p.id);\n warn(\n `plotly:${kind}:off-axis:${off.join(\",\")}`,\n `skipped ${off.length} point(s) whose category is not on the axis: ${JSON.stringify(off)}`,\n );\n }\n const kept: Placement[] = keep.map((i) => placements[i]!);\n const kx = keep.map((i) => xs[i] as number);\n const ky = keep.map((i) => ys[i] as number);\n if (kept.length === 0) return fig;\n const [plotW, plotH] = plotSize(fig.layout!, xref, yref);\n const widest = Math.max(...kept.map(aspect));\n const [xLo, xHi] = range(fig, \"x\", xref, kx, xIndex, (h * widest * plotH) / plotW);\n const [yLo, yHi] = range(fig, \"y\", yref, ky, yIndex, h);\n const sizex = 2 * Math.abs(xHi - xLo); // only bounds the width: \"contain\" fits each image by height\n const sources = imageSources(kept, o.embed);\n const images: LayoutImage[] = kept.map((p, i) => ({\n source: sources[i]!,\n x: kx[i]!,\n y: ky[i]!,\n xref,\n yref,\n sizex,\n sizey: h * Math.abs(yHi - yLo),\n sizing: \"contain\",\n xanchor: \"center\",\n yanchor: \"middle\",\n opacity: a,\n layer,\n name: `sdvplot:${kind}:${p.id}`,\n }));\n fig.layout!.images = [...(fig.layout!.images ?? []), ...images];\n return fig;\n}\n\n// A29: each verb is overloaded — the structural type, then the caller's own type (e.g. plotly.js's\n// { data: Data[]; layout: Partial<Layout> }) back unchanged. No library type enters the public .d.ts.\nexport function withLogos(figure: PlotlyFigure, rows: readonly Row[], o: PlotlyMarkOptions): PlotlyFigure;\nexport function withLogos<F extends object>(figure: F, rows: readonly Row[], o: PlotlyMarkOptions): F;\nexport function withLogos(figure: object, rows: readonly Row[], o: PlotlyMarkOptions): object {\n return add(figure, rows, \"logo\", o);\n}\nexport function withWordmarks(figure: PlotlyFigure, rows: readonly Row[], o: PlotlyMarkOptions): PlotlyFigure;\nexport function withWordmarks<F extends object>(figure: F, rows: readonly Row[], o: PlotlyMarkOptions): F;\nexport function withWordmarks(figure: object, rows: readonly Row[], o: PlotlyMarkOptions): object {\n return add(figure, rows, \"wordmark\", o);\n}\nexport function withHeadshots(\n figure: PlotlyFigure,\n rows: readonly Row[],\n o: PlotlyHeadshotOptions,\n): PlotlyFigure;\nexport function withHeadshots<F extends object>(figure: F, rows: readonly Row[], o: PlotlyHeadshotOptions): F;\nexport function withHeadshots(figure: object, rows: readonly Row[], o: PlotlyHeadshotOptions): object {\n return add(figure, rows, \"headshot\", o);\n}\n\nfunction span(layout: PlotlyLayout, ref: string): number {\n const r = layout[axisKey(ref, ref[0] as Letter)]?.range ?? [0, 1];\n return Math.abs(Number(r[1]) - Number(r[0]));\n}\n/** A layout image's emitted height as a fraction of its subplot's height: sizey over its y reference's span\n * (1 for \"paper\" and for an axis' \"domain\", whose 0..1 is that subplot's height). */\nfunction imageHeight(layout: PlotlyLayout, im: LayoutImage): number {\n return im.sizey / (im.yref === \"paper\" || im.yref.endsWith(\" domain\") ? 1 : span(layout, im.yref));\n}\n\n/** Test hook: [teamId, x, y, height, source] for each image withLogos/withWordmarks/withHeadshots drew. */\nexport function drawnMarks(figure: PlotlyFigure): DrawnMark[] {\n const fig = figureOf(figure);\n return (fig.layout!.images ?? []).flatMap((im): DrawnMark[] => {\n const parts = (im.name ?? \"\").split(\":\", 3);\n return parts[0] === \"sdvplot\" && parts[1] !== \"axis\"\n ? [[parts[2] ?? \"\", im.x, im.y, imageHeight(fig.layout!, im), im.source]]\n : [];\n });\n}\n\n/** `withAxisLogos` options: the shared ones plus the subplot axes. */\nexport interface PlotlyAxisOptions extends AxisOptions {\n /** The subplot's x axis, e.g. \"x2\". Default \"x\". */\n xref?: string;\n /** The subplot's y axis, e.g. \"y2\". Default \"y\". */\n yref?: string;\n}\n\n/** Team logos (or wordmarks, `markType`) in place of the tick labels of a category axis.\n * `xref`/`yref` pick the subplot axes (default \"x\"/\"y\"); the category axis is the one named by `axis`.\n * Pixel sizing uses `layout.width`/`layout.height`; when unset it assumes Plotly's 700x450 default, which is\n * approximate under autosize (images stay correctly placed in paper/data units).\n * x: images hang under the subplot in its y domain units (`height` of that subplot, exact), and `margin.b` grows by\n * what they reach below the paper; under an upper subplot they hang into the subplot below.\n * y: images sit left of the plot in data y; the range is pinned to the category bands so `sizey = h × span`.\n * Hover still names each category: the labels are hidden (`showticklabels: false`), not blanked, because Plotly's hover\n * reads a tick's text. With an unresolved category only those keep a tick, so a drawn one loses its tick mark and grid\n * line (both off by default on a category axis). */\nexport function withAxisLogos(figure: PlotlyFigure, axis: \"x\" | \"y\", o: PlotlyAxisOptions): PlotlyFigure;\nexport function withAxisLogos<F extends object>(figure: F, axis: \"x\" | \"y\", o: PlotlyAxisOptions): F;\nexport function withAxisLogos(figure: object, axis: \"x\" | \"y\", o: PlotlyAxisOptions): object {\n const letter = axisLetter(axis);\n const h = checkHeight(o.height ?? 0.1);\n const xref = o.xref ?? \"x\";\n const yref = o.yref ?? \"y\";\n axisKey(xref, \"x\");\n axisKey(yref, \"y\");\n const cref = letter === \"x\" ? xref : yref;\n const fig = figureOf(figure);\n if (axisType(fig, letter, cref, []) !== \"category\") {\n throw new InputError(`withAxisLogos needs a category ${letter} axis (${cref}) with team names on it`);\n }\n const cats = categories(fig, letter, cref);\n const labels = cats.map(String);\n const placements = axisPlacements(labels, letter, o);\n const ax = axisOf(fig.layout!, cref, letter);\n const drawn = new Set(placements.map((p) => Number(letter === \"x\" ? p.x : p.y)));\n // Plotly's hover label of a category is its tick text (axes.tickText), so a drawn category never gets a blank one:\n // every category drawn, hide the labels and keep a tick per category; else only the unresolved categories keep one.\n const keep = cats.flatMap((_, i) => (drawn.has(i) ? [] : [i]));\n ax.tickmode = \"array\";\n if (keep.length === 0) {\n ax.showticklabels = false;\n ax.tickvals = cats;\n ax.ticktext = labels;\n } else {\n ax.showticklabels = true; // undo an earlier all-drawn call on this axis\n ax.tickvals = keep.map((i) => cats[i]);\n ax.ticktext = keep.map((i) => labels[i]!);\n }\n if (placements.length === 0) return fig;\n const layout = fig.layout!;\n const plotH = plotSize(layout, xref, yref)[1];\n let lo = 0;\n let hi = 1;\n if (letter === \"x\") {\n // the images reach `over` (paper units) below the paper; the margin grows by that many px of the paper it\n // shrinks: Δb = over × (P − Δb), so Δb = over·P / (1 + over), P the paper's plot height\n const [y0, y1] = layout[axisKey(yref, \"y\")]?.domain ?? [0, 1];\n const over = h * (y1 - y0) - y0;\n if (over > 0)\n layout.margin = {\n ...layout.margin,\n b: margin(layout, \"b\") + Math.ceil((over * plotH) / (y1 - y0) / (1 + over)),\n };\n } else {\n [lo, hi] = range(fig, \"y\", yref, [], new Map(cats.map((c, i) => [c, i] as const)), 0);\n layout.margin = {\n ...layout.margin,\n l: margin(layout, \"l\") + Math.ceil(h * plotH * Math.max(...placements.map(aspect))),\n };\n }\n const sources = imageSources(placements, o.embed);\n const xDom0 = layout[axisKey(xref, \"x\")]?.domain?.[0] ?? 0;\n const images: LayoutImage[] = placements.map((p, i) => {\n const loc = Number(letter === \"x\" ? p.x : p.y);\n const common = {\n source: sources[i]!,\n sizing: \"contain\" as const,\n layer: \"above\" as const,\n name: `sdvplot:axis:${letter}:${p.id}`,\n };\n return letter === \"x\"\n ? {\n ...common,\n x: loc,\n y: 0,\n xref,\n yref: `${yref} domain`, // 0..1 = the subplot's own height, so `sizey: h` is `h` of it\n sizex: 2 * cats.length,\n sizey: h,\n xanchor: \"center\",\n yanchor: \"top\",\n }\n : {\n ...common,\n x: xDom0,\n y: loc,\n xref: \"paper\",\n yref,\n sizex: 1,\n sizey: h * Math.abs(hi - lo),\n xanchor: \"right\",\n yanchor: \"middle\",\n };\n });\n layout.images = [...(layout.images ?? []), ...images];\n return fig;\n}\n\n/** One colour per team, in order, for `layout.colorway` (Plotly cycles it per trace). */\nexport function teamColorway(\n league: League,\n teams: readonly unknown[],\n o: { which?: \"primary\" | \"secondary\"; season?: SeasonInput; idSystem?: IdSystem; fallback?: string } = {},\n): string[] {\n return colorList(league, teams, o).map((c) => c ?? o.fallback ?? \"#808080\");\n}\n\n/** Test hook: [teamId, category index, height] for each image on `axis`, in tick order. */\nexport function drawnAxisMarks(figure: PlotlyFigure, axis: \"x\" | \"y\"): DrawnAxisMark[] {\n const letter = axisLetter(axis);\n const fig = figureOf(figure);\n return (fig.layout!.images ?? [])\n .flatMap((im): DrawnAxisMark[] => {\n const p = (im.name ?? \"\").split(\":\", 4);\n return p[0] === \"sdvplot\" && p[1] === \"axis\" && p[2] === letter\n ? [[p[3] ?? \"\", letter === \"x\" ? im.x : im.y, imageHeight(fig.layout!, im)]]\n : [];\n })\n .sort((a, b) => a[1] - b[1]);\n}\n/** Test hook: the tick labels on `axis` still shown as text. */\nexport function visibleAxisLabels(figure: PlotlyFigure, axis: \"x\" | \"y\"): string[] {\n const letter = axisLetter(axis);\n const ax = figureOf(figure).layout![axisKey(letter, letter)];\n return ax?.showticklabels === false ? [] : [...(ax?.ticktext ?? [])].filter((t) => t !== \"\");\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/data/aliases/pwhl.ts
|
|
2
|
+
var aliases = [
|
|
3
|
+
{ "id_system": "hockeytech", "value": "1", "team_id": "1", "valid_from": null, "valid_to": null },
|
|
4
|
+
{ "id_system": "hockeytech", "value": "10", "team_id": "10", "valid_from": null, "valid_to": null },
|
|
5
|
+
{ "id_system": "hockeytech", "value": "11", "team_id": "11", "valid_from": null, "valid_to": null },
|
|
6
|
+
{ "id_system": "hockeytech", "value": "12", "team_id": "12", "valid_from": null, "valid_to": null },
|
|
7
|
+
{ "id_system": "hockeytech", "value": "13", "team_id": "13", "valid_from": null, "valid_to": null },
|
|
8
|
+
{ "id_system": "hockeytech", "value": "2", "team_id": "2", "valid_from": null, "valid_to": null },
|
|
9
|
+
{ "id_system": "hockeytech", "value": "3", "team_id": "3", "valid_from": null, "valid_to": null },
|
|
10
|
+
{ "id_system": "hockeytech", "value": "4", "team_id": "4", "valid_from": null, "valid_to": null },
|
|
11
|
+
{ "id_system": "hockeytech", "value": "5", "team_id": "5", "valid_from": null, "valid_to": null },
|
|
12
|
+
{ "id_system": "hockeytech", "value": "6", "team_id": "6", "valid_from": null, "valid_to": null },
|
|
13
|
+
{ "id_system": "hockeytech", "value": "8", "team_id": "8", "valid_from": null, "valid_to": null },
|
|
14
|
+
{ "id_system": "hockeytech", "value": "9", "team_id": "9", "valid_from": null, "valid_to": null },
|
|
15
|
+
{ "id_system": "mark", "value": "hockeytech:1", "team_id": "1", "valid_from": null, "valid_to": null },
|
|
16
|
+
{ "id_system": "mark", "value": "hockeytech:10", "team_id": "10", "valid_from": null, "valid_to": null },
|
|
17
|
+
{ "id_system": "mark", "value": "hockeytech:11", "team_id": "11", "valid_from": null, "valid_to": null },
|
|
18
|
+
{ "id_system": "mark", "value": "hockeytech:12", "team_id": "12", "valid_from": null, "valid_to": null },
|
|
19
|
+
{ "id_system": "mark", "value": "hockeytech:13", "team_id": "13", "valid_from": null, "valid_to": null },
|
|
20
|
+
{ "id_system": "mark", "value": "hockeytech:2", "team_id": "2", "valid_from": null, "valid_to": null },
|
|
21
|
+
{ "id_system": "mark", "value": "hockeytech:3", "team_id": "3", "valid_from": null, "valid_to": null },
|
|
22
|
+
{ "id_system": "mark", "value": "hockeytech:4", "team_id": "4", "valid_from": null, "valid_to": null },
|
|
23
|
+
{ "id_system": "mark", "value": "hockeytech:5", "team_id": "5", "valid_from": null, "valid_to": null },
|
|
24
|
+
{ "id_system": "mark", "value": "hockeytech:6", "team_id": "6", "valid_from": null, "valid_to": null },
|
|
25
|
+
{ "id_system": "mark", "value": "hockeytech:8", "team_id": "8", "valid_from": null, "valid_to": null },
|
|
26
|
+
{ "id_system": "mark", "value": "hockeytech:9", "team_id": "9", "valid_from": null, "valid_to": null },
|
|
27
|
+
{ "id_system": "name", "value": "Boston Fleet", "team_id": "1", "valid_from": null, "valid_to": null },
|
|
28
|
+
{ "id_system": "name", "value": "Minnesota Frost", "team_id": "2", "valid_from": null, "valid_to": null },
|
|
29
|
+
{ "id_system": "name", "value": "Montr\xE9al Victoire", "team_id": "3", "valid_from": null, "valid_to": null },
|
|
30
|
+
{ "id_system": "name", "value": "New York Sirens", "team_id": "4", "valid_from": null, "valid_to": null },
|
|
31
|
+
{ "id_system": "name", "value": "Ottawa Charge", "team_id": "5", "valid_from": null, "valid_to": null },
|
|
32
|
+
{ "id_system": "name", "value": "PWHL Detroit", "team_id": "10", "valid_from": null, "valid_to": null },
|
|
33
|
+
{ "id_system": "name", "value": "PWHL Hamilton", "team_id": "11", "valid_from": null, "valid_to": null },
|
|
34
|
+
{ "id_system": "name", "value": "PWHL Las Vegas", "team_id": "12", "valid_from": null, "valid_to": null },
|
|
35
|
+
{ "id_system": "name", "value": "PWHL San Jose", "team_id": "13", "valid_from": null, "valid_to": null },
|
|
36
|
+
{ "id_system": "name", "value": "Seattle Torrent", "team_id": "8", "valid_from": null, "valid_to": null },
|
|
37
|
+
{ "id_system": "name", "value": "Toronto Sceptres", "team_id": "6", "valid_from": null, "valid_to": null },
|
|
38
|
+
{ "id_system": "name", "value": "Vancouver Goldeneyes", "team_id": "9", "valid_from": null, "valid_to": null },
|
|
39
|
+
{ "id_system": "team_id", "value": "1", "team_id": "1", "valid_from": null, "valid_to": null },
|
|
40
|
+
{ "id_system": "team_id", "value": "10", "team_id": "10", "valid_from": null, "valid_to": null },
|
|
41
|
+
{ "id_system": "team_id", "value": "11", "team_id": "11", "valid_from": null, "valid_to": null },
|
|
42
|
+
{ "id_system": "team_id", "value": "12", "team_id": "12", "valid_from": null, "valid_to": null },
|
|
43
|
+
{ "id_system": "team_id", "value": "13", "team_id": "13", "valid_from": null, "valid_to": null },
|
|
44
|
+
{ "id_system": "team_id", "value": "2", "team_id": "2", "valid_from": null, "valid_to": null },
|
|
45
|
+
{ "id_system": "team_id", "value": "3", "team_id": "3", "valid_from": null, "valid_to": null },
|
|
46
|
+
{ "id_system": "team_id", "value": "4", "team_id": "4", "valid_from": null, "valid_to": null },
|
|
47
|
+
{ "id_system": "team_id", "value": "5", "team_id": "5", "valid_from": null, "valid_to": null },
|
|
48
|
+
{ "id_system": "team_id", "value": "6", "team_id": "6", "valid_from": null, "valid_to": null },
|
|
49
|
+
{ "id_system": "team_id", "value": "8", "team_id": "8", "valid_from": null, "valid_to": null },
|
|
50
|
+
{ "id_system": "team_id", "value": "9", "team_id": "9", "valid_from": null, "valid_to": null }
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
export { aliases };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/data/teams/pwhl.ts
|
|
2
|
+
var teams = [
|
|
3
|
+
{ "league": "pwhl", "team_id": "1", "abbr": null, "name": "Boston Fleet", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#081d2b", "color_secondary": "#769f99", "color_source": "logo" },
|
|
4
|
+
{ "league": "pwhl", "team_id": "10", "abbr": null, "name": "PWHL Detroit", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#c12e30", "color_secondary": "#8f6667", "color_source": "logo" },
|
|
5
|
+
{ "league": "pwhl", "team_id": "11", "abbr": null, "name": "PWHL Hamilton", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#5c0a17", "color_secondary": "#e2a035", "color_source": "logo" },
|
|
6
|
+
{ "league": "pwhl", "team_id": "12", "abbr": null, "name": "PWHL Las Vegas", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#717237", "color_secondary": "#dfc287", "color_source": "logo" },
|
|
7
|
+
{ "league": "pwhl", "team_id": "13", "abbr": null, "name": "PWHL San Jose", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#f69245", "color_secondary": "#7a88a2", "color_source": "logo" },
|
|
8
|
+
{ "league": "pwhl", "team_id": "2", "abbr": null, "name": "Minnesota Frost", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#9e7db8", "color_secondary": "#262161", "color_source": "logo" },
|
|
9
|
+
{ "league": "pwhl", "team_id": "3", "abbr": null, "name": "Montr\xE9al Victoire", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#872a36", "color_secondary": "#0a2041", "color_source": "logo" },
|
|
10
|
+
{ "league": "pwhl", "team_id": "4", "abbr": null, "name": "New York Sirens", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#00b9b3", "color_secondary": "#081c3e", "color_source": "logo" },
|
|
11
|
+
{ "league": "pwhl", "team_id": "5", "abbr": null, "name": "Ottawa Charge", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#a51d30", "color_secondary": "#fbc657", "color_source": "logo" },
|
|
12
|
+
{ "league": "pwhl", "team_id": "6", "abbr": null, "name": "Toronto Sceptres", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#061838", "color_secondary": "#9c8023", "color_source": "logo" },
|
|
13
|
+
{ "league": "pwhl", "team_id": "8", "abbr": null, "name": "Seattle Torrent", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#8cb7c9", "color_secondary": "#0a5458", "color_source": "logo" },
|
|
14
|
+
{ "league": "pwhl", "team_id": "9", "abbr": null, "name": "Vancouver Goldeneyes", "short_name": null, "location": null, "program": "pro", "conference_id": null, "conference": null, "color_primary": "#10457f", "color_secondary": "#ca9351", "color_source": "logo" }
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export { teams };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/data/marks/pwhl.ts
|
|
2
|
+
var marks = [
|
|
3
|
+
{ "team_id": "12", "mark_type": "logo", "variant": "default", "valid_from": 2027, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "17c15b98599063a9fd63d36bb2e4029bfbb0a7a02a13fefd0451188b3f6df9b9", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
4
|
+
{ "team_id": "13", "mark_type": "logo", "variant": "default", "valid_from": 2027, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "2147fa76c29a65c65f65290aafdc50e220c8a584642610d71cc20bad58b5bc65", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
5
|
+
{ "team_id": "11", "mark_type": "logo", "variant": "default", "valid_from": 2027, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "be52d27b8d57d95cc5a9ac9655e99f5d716672f1900cd2e8a68a703f6b952d3a", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
6
|
+
{ "team_id": "10", "mark_type": "logo", "variant": "default", "valid_from": 2027, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "ce6e02698d335fcd95357cf3595fd4d9d33937c885ae4bfa96919147c46a9466", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
7
|
+
{ "team_id": "9", "mark_type": "logo", "variant": "default", "valid_from": 2026, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "c6eaba58b6ed8cedb4a3df06121cb485dd590be7fce0d27bb1ecbb4c7f450aa1", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
8
|
+
{ "team_id": "8", "mark_type": "logo", "variant": "default", "valid_from": 2026, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "c7048ccd8b9c67a960d839c5e4677fb11151791788a5d352fe4816c1abd73525", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
9
|
+
{ "team_id": "1", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "3bd2dc150c80a412148e1f74ab2502ec2a1f0d598651b7deda3f5a87083561b0", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
10
|
+
{ "team_id": "5", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "42808d4a136e68c31e4bdc200f53298e07f8ef276aea53e907cd33615b7c3966", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
11
|
+
{ "team_id": "6", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "8bda0153d8521618ecd71ec81b725b2c71786131565d018d45012e4b90b7a40b", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
12
|
+
{ "team_id": "3", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "a759c039a69f07aac2403b29f65851cdab0f160974ef8384f6bb2a7ccfa95f82", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
13
|
+
{ "team_id": "4", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "bf645a1dd0f9b6ac1ff8be88fc1f836b767f634612b2acdd5c23558dc4919d16", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
14
|
+
{ "team_id": "2", "mark_type": "logo", "variant": "default", "valid_from": 2024, "valid_to": 2027, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "cbf942375ad3b11560c2bb1c457bb520329faf18cc353bddd8d5c771bf4dcd39", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
15
|
+
{ "team_id": "1", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "3bd2dc150c80a412148e1f74ab2502ec2a1f0d598651b7deda3f5a87083561b0", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
16
|
+
{ "team_id": "5", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "42808d4a136e68c31e4bdc200f53298e07f8ef276aea53e907cd33615b7c3966", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
17
|
+
{ "team_id": "6", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "8bda0153d8521618ecd71ec81b725b2c71786131565d018d45012e4b90b7a40b", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
18
|
+
{ "team_id": "3", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "a759c039a69f07aac2403b29f65851cdab0f160974ef8384f6bb2a7ccfa95f82", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
19
|
+
{ "team_id": "4", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "bf645a1dd0f9b6ac1ff8be88fc1f836b767f634612b2acdd5c23558dc4919d16", "ext": "png", "width": 500, "height": 500, "source_rank": 2 },
|
|
20
|
+
{ "team_id": "2", "mark_type": "logo", "variant": "default", "valid_from": 2025, "valid_to": 2025, "source": "hockeytech", "first_seen": "2026-09-30", "sha256": "cbf942375ad3b11560c2bb1c457bb520329faf18cc353bddd8d5c771bf4dcd39", "ext": "png", "width": 500, "height": 500, "source_rank": 2 }
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
export { marks };
|