@sportsdataverse/sdvplot 0.1.0 → 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.
Files changed (135) hide show
  1. package/NOTICE.md +15 -0
  2. package/README.md +84 -8
  3. package/dist/chartjs-surface.d.ts +2 -2
  4. package/dist/chartjs-surface.js +2 -2
  5. package/dist/chartjs-surface.js.map +1 -1
  6. package/dist/chartjs.d.ts +32 -2
  7. package/dist/chartjs.js +7 -4
  8. package/dist/chartjs.js.map +1 -1
  9. package/dist/chunk-57WFSI4Q.js +128 -0
  10. package/dist/chunk-57WFSI4Q.js.map +1 -0
  11. package/dist/{chunk-KKH6ABMA.js → chunk-7ULOCCFL.js} +94 -4
  12. package/dist/chunk-7ULOCCFL.js.map +1 -0
  13. package/dist/chunk-AMXASQHT.js +120 -0
  14. package/dist/chunk-AMXASQHT.js.map +1 -0
  15. package/dist/chunk-B2MP37SR.js +175 -0
  16. package/dist/chunk-B2MP37SR.js.map +1 -0
  17. package/dist/{chunk-NLPH2VZT.js → chunk-DYMUVE6K.js} +4 -4
  18. package/dist/{chunk-NLPH2VZT.js.map → chunk-DYMUVE6K.js.map} +1 -1
  19. package/dist/{chunk-QY65DUEF.js → chunk-H2C3FMMA.js} +4 -10
  20. package/dist/chunk-H2C3FMMA.js.map +1 -0
  21. package/dist/{chunk-JJFTD4VB.js → chunk-J4P4HDBF.js} +4 -4
  22. package/dist/{chunk-JJFTD4VB.js.map → chunk-J4P4HDBF.js.map} +1 -1
  23. package/dist/chunk-M3XD2OSN.js +132 -0
  24. package/dist/chunk-M3XD2OSN.js.map +1 -0
  25. package/dist/{chunk-OKEE4AH6.js → chunk-OIILARXI.js} +3 -3
  26. package/dist/{chunk-OKEE4AH6.js.map → chunk-OIILARXI.js.map} +1 -1
  27. package/dist/chunk-RPVVJY74.js +170 -0
  28. package/dist/chunk-RPVVJY74.js.map +1 -0
  29. package/dist/chunk-UL5M6KDE.js +205 -0
  30. package/dist/chunk-UL5M6KDE.js.map +1 -0
  31. package/dist/chunk-WQT4IVLX.js +10 -0
  32. package/dist/chunk-WQT4IVLX.js.map +1 -0
  33. package/dist/{chunk-TAXO3VXH.js → chunk-ZAEQXFJM.js} +3 -3
  34. package/dist/{chunk-TAXO3VXH.js.map → chunk-ZAEQXFJM.js.map} +1 -1
  35. package/dist/cytoscape.d.ts +188 -0
  36. package/dist/cytoscape.js +219 -0
  37. package/dist/cytoscape.js.map +1 -0
  38. package/dist/d3.d.ts +3 -3
  39. package/dist/d3.js +6 -6
  40. package/dist/d3.js.map +1 -1
  41. package/dist/deckgl.d.ts +232 -0
  42. package/dist/deckgl.js +197 -0
  43. package/dist/deckgl.js.map +1 -0
  44. package/dist/echarts.js +5 -5
  45. package/dist/g2.d.ts +251 -0
  46. package/dist/g2.js +102 -0
  47. package/dist/g2.js.map +1 -0
  48. package/dist/index.d.ts +2 -1
  49. package/dist/index.js +4 -5
  50. package/dist/lightweight-charts.d.ts +217 -0
  51. package/dist/lightweight-charts.js +155 -0
  52. package/dist/lightweight-charts.js.map +1 -0
  53. package/dist/maplibre.d.ts +271 -0
  54. package/dist/maplibre.js +175 -0
  55. package/dist/maplibre.js.map +1 -0
  56. package/dist/mui.d.ts +338 -0
  57. package/dist/mui.js +184 -0
  58. package/dist/mui.js.map +1 -0
  59. package/dist/nivo.d.ts +193 -0
  60. package/dist/nivo.js +8 -0
  61. package/dist/nivo.js.map +1 -0
  62. package/dist/perspective.d.ts +198 -0
  63. package/dist/perspective.js +171 -0
  64. package/dist/perspective.js.map +1 -0
  65. package/dist/placement-UWkqUzpa.d.ts +32 -0
  66. package/dist/plot.d.ts +7 -5
  67. package/dist/plot.js +9 -8
  68. package/dist/plot.js.map +1 -1
  69. package/dist/plotly.js +5 -5
  70. package/dist/react.d.ts +279 -3
  71. package/dist/react.js +364 -6
  72. package/dist/react.js.map +1 -1
  73. package/dist/recharts.d.ts +162 -0
  74. package/dist/recharts.js +8 -0
  75. package/dist/recharts.js.map +1 -0
  76. package/dist/shadcn.d.ts +83 -0
  77. package/dist/shadcn.js +88 -0
  78. package/dist/shadcn.js.map +1 -0
  79. package/dist/shots.js +3 -2
  80. package/dist/shots.js.map +1 -1
  81. package/dist/surface-TR7YFJW3.js +4 -0
  82. package/dist/surface-TR7YFJW3.js.map +1 -0
  83. package/dist/surfaces-MIG7HOFU.js +6 -0
  84. package/dist/surfaces-MIG7HOFU.js.map +1 -0
  85. package/dist/surfaces-W-odWLpT.d.ts +47 -0
  86. package/dist/svelte/HeadshotMark.svelte +25 -0
  87. package/dist/svelte/HeadshotMark.svelte.d.ts +10 -0
  88. package/dist/svelte/HeadshotMark.svelte.d.ts.map +1 -0
  89. package/dist/svelte/LogoMark.svelte +25 -0
  90. package/dist/svelte/LogoMark.svelte.d.ts +10 -0
  91. package/dist/svelte/LogoMark.svelte.d.ts.map +1 -0
  92. package/dist/svelte/Marks.svelte +25 -0
  93. package/dist/svelte/Marks.svelte.d.ts +10 -0
  94. package/dist/svelte/Marks.svelte.d.ts.map +1 -0
  95. package/dist/svelte/Surface.svelte +29 -0
  96. package/dist/svelte/Surface.svelte.d.ts +9 -0
  97. package/dist/svelte/Surface.svelte.d.ts.map +1 -0
  98. package/dist/svelte/SurfaceBackdrop.svelte +26 -0
  99. package/dist/svelte/SurfaceBackdrop.svelte.d.ts +11 -0
  100. package/dist/svelte/SurfaceBackdrop.svelte.d.ts.map +1 -0
  101. package/dist/svelte/index.d.ts +13 -0
  102. package/dist/svelte/index.d.ts.map +1 -0
  103. package/dist/svelte/index.js +11 -0
  104. package/dist/svelte-core.d.ts +139 -0
  105. package/dist/svelte-core.js +123 -0
  106. package/dist/svelte-core.js.map +1 -0
  107. package/dist/tanstack.d.ts +240 -0
  108. package/dist/tanstack.js +110 -0
  109. package/dist/tanstack.js.map +1 -0
  110. package/dist/testing.js +4 -5
  111. package/dist/testing.js.map +1 -1
  112. package/dist/three.d.ts +223 -0
  113. package/dist/three.js +50 -0
  114. package/dist/three.js.map +1 -0
  115. package/dist/{tiers-B6pUBPcE.d.ts → tiers-BN4md-GB.d.ts} +2 -30
  116. package/dist/unovis.d.ts +127 -0
  117. package/dist/unovis.js +108 -0
  118. package/dist/unovis.js.map +1 -0
  119. package/dist/uplot.d.ts +120 -0
  120. package/dist/uplot.js +110 -0
  121. package/dist/uplot.js.map +1 -0
  122. package/dist/vega.js +5 -5
  123. package/dist/victory.d.ts +107 -0
  124. package/dist/victory.js +38 -0
  125. package/dist/victory.js.map +1 -0
  126. package/package.json +218 -6
  127. package/dist/chunk-KKH6ABMA.js.map +0 -1
  128. package/dist/chunk-QY65DUEF.js.map +0 -1
  129. package/dist/chunk-RMT2GMFH.js +0 -97
  130. package/dist/chunk-RMT2GMFH.js.map +0 -1
  131. package/dist/chunk-SEBO35DV.js +0 -76
  132. package/dist/chunk-SEBO35DV.js.map +0 -1
  133. package/dist/chunk-TDNBAEQB.js +0 -105
  134. package/dist/chunk-TDNBAEQB.js.map +0 -1
  135. package/dist/surfaces-ChaD9nei.d.ts +0 -38
@@ -1,76 +0,0 @@
1
- import { placeSync } from './chunk-RMT2GMFH.js';
2
- import { HEADSHOT_ASPECT, teamColorsSync } from './chunk-TAXO3VXH.js';
3
- import { InputError, DownloadError } from './chunk-E7G7VSLV.js';
4
-
5
- // src/_web.ts
6
- function aspect(p) {
7
- return p.aspect ?? HEADSHOT_ASPECT;
8
- }
9
- function axisLetter(axis) {
10
- if (axis !== "x" && axis !== "y")
11
- throw new InputError(`axis must be "x" or "y", got ${JSON.stringify(axis)}`);
12
- return axis;
13
- }
14
- function imageSource(p, embed) {
15
- return embed?.get(p.url) ?? encodeURI(p.url).replace(/%25([0-9A-Fa-f]{2})/g, "%$1");
16
- }
17
- function imageSources(ps, embed) {
18
- return ps.map((p) => imageSource(p, embed));
19
- }
20
- async function embedSources(urls, fetchFn = fetch) {
21
- const out = /* @__PURE__ */ new Map();
22
- for (const url of new Set(urls)) {
23
- const res = await fetchFn(url);
24
- if (!res.ok) throw new DownloadError(`embed: ${url} answered ${res.status}`, url, res.status);
25
- const mime = res.headers.get("content-type")?.split(";")[0]?.trim() || (url.toLowerCase().endsWith(".svg") ? "image/svg+xml" : "application/octet-stream");
26
- const bytes = new Uint8Array(await res.arrayBuffer());
27
- let bin = "";
28
- for (const b of bytes) bin += String.fromCharCode(b);
29
- out.set(url, `data:${mime};base64,${btoa(bin)}`);
30
- }
31
- return out;
32
- }
33
- function column(rows, name, what) {
34
- if (rows.length > 0 && !rows.some((r) => name in r))
35
- throw new InputError(`${what} column ${JSON.stringify(name)} is not in rows`);
36
- return rows.map((r) => r[name]);
37
- }
38
- function seasons(rows, season) {
39
- if (typeof season === "string" && rows.some((r) => season in r))
40
- return rows.map((r) => r[season]);
41
- return season;
42
- }
43
- function markPlacements(rows, kind, o) {
44
- const xs = column(rows, o.x, "x");
45
- const ys = column(rows, o.y, "y");
46
- if (kind === "headshot") {
47
- const h = o;
48
- return placeSync(xs, ys, column(rows, h.player, "player"), {
49
- league: h.league,
50
- kind,
51
- idSystem: h.idSystem ?? "espn"
52
- });
53
- }
54
- const m = o;
55
- const po = { league: m.league, kind };
56
- if (m.season !== void 0) po.season = seasons(rows, m.season);
57
- if (m.variant !== void 0) po.variant = m.variant;
58
- if (m.idSystem !== void 0) po.idSystem = m.idSystem;
59
- return placeSync(xs, ys, column(rows, m.team, "team"), po);
60
- }
61
- function axisPlacements(labels, letter, o) {
62
- const index = labels.map((_, i) => i);
63
- const across = labels.map(() => 0);
64
- const po = { league: o.league, kind: o.markType ?? "logo" };
65
- if (o.season !== void 0) po.season = o.season;
66
- if (o.variant !== void 0) po.variant = o.variant;
67
- if (o.idSystem !== void 0) po.idSystem = o.idSystem;
68
- return placeSync(letter === "x" ? index : across, letter === "x" ? across : index, labels, po);
69
- }
70
- function colorList(league, teams, o = {}) {
71
- return teamColorsSync(league, teams, o).map((c) => c ?? null);
72
- }
73
-
74
- export { aspect, axisLetter, axisPlacements, colorList, embedSources, imageSources, markPlacements };
75
- //# sourceMappingURL=chunk-SEBO35DV.js.map
76
- //# sourceMappingURL=chunk-SEBO35DV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/_web.ts"],"names":[],"mappings":"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","file":"chunk-SEBO35DV.js","sourcesContent":["/** What the spec adapters (Plotly, Vega-Lite, ECharts) share: image sources, aspect ratios, row access, team colours. */\nimport { teamColorsSync } from \"./colors.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 } from \"./resolve.js\";\nimport type { IdSystem, League, MarkType, SeasonInput, Variant } 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"]}
@@ -1,105 +0,0 @@
1
- import { onColor, contrast } from './chunk-J6R2LEJ7.js';
2
- import { teamColorPairSync } from './chunk-TAXO3VXH.js';
3
- import { InputError } from './chunk-E7G7VSLV.js';
4
- import { surface, UnknownDisplayRangeError, BASKETBALL_DISPLAY_RANGES, FOOTBALL_DISPLAY_RANGES, HOCKEY_DISPLAY_RANGES } from '@sportsdataverse/sporty';
5
-
6
- var SURFACES = {
7
- nfl: ["football", "nfl"],
8
- aaf: ["football", "nfl"],
9
- ufl: ["football", "nfl"],
10
- usfl: ["football", "nfl"],
11
- xfl: ["football", "nfl"],
12
- cfb: ["football", "ncaa"],
13
- nba: ["basketball", "nba"],
14
- nbagl: ["basketball", "nba g league"],
15
- wnba: ["basketball", "wnba"],
16
- mbb: ["basketball", "ncaa"],
17
- wbb: ["basketball", "ncaa"],
18
- nhl: ["hockey", "nhl"],
19
- whl: ["hockey", "nhl"],
20
- pwhl: ["hockey", "pwhl"],
21
- // divergence: Python maps pwhl to NHLRink (sportypy has no PWHL rink); sporty ships a pwhl spec
22
- ahl: ["hockey", "ahl"],
23
- echl: ["hockey", "echl"],
24
- ohl: ["hockey", "ohl"],
25
- qmjhl: ["hockey", "qmjhl"],
26
- ushl: ["hockey", "ushl"],
27
- phf: ["hockey", "phf"],
28
- ncaa_mhockey: ["hockey", "ncaa"],
29
- ncaa_whockey: ["hockey", "ncaa"]
30
- };
31
- var SURFACE_BASE = { basketball: "#d2ab6f", football: "#196f0c", hockey: "#ffffff" };
32
- function colorUpdates(sport, primary, secondary) {
33
- if (sport === "basketball") {
34
- const ink = onColor(primary);
35
- return {
36
- painted_area: primary,
37
- court_apron: primary,
38
- restricted_arc: ink,
39
- free_throw_circle_dash: ink,
40
- baseline_lower_defensive_box: ink,
41
- lane_lower_defensive_box: ink
42
- };
43
- }
44
- if (sport === "football")
45
- return { offensive_endzone: primary, defensive_endzone: primary };
46
- const ice = SURFACE_BASE.hockey;
47
- const readable = secondary !== void 0 && contrast(primary, ice) < 3 && contrast(secondary, ice) >= 3;
48
- const accent = readable ? secondary : primary;
49
- return {
50
- center_line: accent,
51
- center_faceoff_circle: accent,
52
- center_faceoff_spot: accent,
53
- boards: primary
54
- };
55
- }
56
- var isIn = (list, v) => list.includes(v);
57
- function pickRange(list, v) {
58
- if (v === void 0 || isIn(list, v)) return v;
59
- throw new UnknownDisplayRangeError(`unknown displayRange '${v}'; expected one of: ${list.join(", ")}`);
60
- }
61
- function surfaceScene(league, o = {}) {
62
- const entry = SURFACES[league];
63
- if (!entry)
64
- throw new InputError(
65
- `no surface for league '${league}'; supported: ${Object.keys(SURFACES).sort().join(", ")}`
66
- );
67
- const [sport, key] = entry;
68
- const { team, season, colorUpdates: user, displayRange, ...rest } = o;
69
- let primary;
70
- let secondary;
71
- if (team !== void 0 && team !== null) {
72
- const at = season !== void 0 ? { season } : {};
73
- ({ primary, secondary } = teamColorPairSync(league, team, at));
74
- }
75
- const dr = (list) => {
76
- const v = pickRange(list, displayRange);
77
- return v === void 0 ? {} : { displayRange: v };
78
- };
79
- if (sport === "basketball") {
80
- const paint2 = primary === void 0 ? {} : colorUpdates("basketball", primary, secondary);
81
- return surface("basketball", key, {
82
- ...rest,
83
- colorUpdates: { ...paint2, ...user },
84
- ...dr(BASKETBALL_DISPLAY_RANGES)
85
- });
86
- }
87
- if (sport === "football") {
88
- const paint2 = primary === void 0 ? {} : colorUpdates("football", primary, secondary);
89
- return surface("football", key, {
90
- ...rest,
91
- colorUpdates: { ...paint2, ...user },
92
- ...dr(FOOTBALL_DISPLAY_RANGES)
93
- });
94
- }
95
- const paint = primary === void 0 ? {} : colorUpdates("hockey", primary, secondary);
96
- return surface("hockey", key, {
97
- ...rest,
98
- colorUpdates: { ...paint, ...user },
99
- ...dr(HOCKEY_DISPLAY_RANGES)
100
- });
101
- }
102
-
103
- export { SURFACES, SURFACE_BASE, colorUpdates, surfaceScene };
104
- //# sourceMappingURL=chunk-TDNBAEQB.js.map
105
- //# sourceMappingURL=chunk-TDNBAEQB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/surfaces.ts"],"names":["paint","sportySurface"],"mappings":"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","file":"chunk-TDNBAEQB.js","sourcesContent":["// Plot-free: sporty CORE only. Internal (not in the core barrel: sporty is an optional peer); reached via ./plot and ./d3.\nimport {\n BASKETBALL_DISPLAY_RANGES,\n type BasketballColorKey,\n type BasketballParamUpdates,\n FOOTBALL_DISPLAY_RANGES,\n type FootballColorKey,\n type FootballParamUpdates,\n HOCKEY_DISPLAY_RANGES,\n type HockeyColorKey,\n type HockeyParamUpdates,\n type Scene,\n UnknownDisplayRangeError,\n surface as sportySurface,\n} from \"@sportsdataverse/sporty\";\nimport type {\n BasketballDisplayRange,\n FootballDisplayRange,\n HockeyDisplayRange,\n} from \"@sportsdataverse/sporty\";\nimport { teamColorPairSync } from \"./colors.js\";\nimport { contrast, onColor } from \"./contrast.js\";\nimport { InputError } from \"./errors.js\";\nimport type { Value } from \"./resolve.js\";\nimport type { League, SeasonInput } from \"./types.js\";\n\nexport type SurfaceSport = \"basketball\" | \"football\" | \"hockey\";\n/** Maps an sdv league to `[sporty sport, sporty league key]`. Baseball and soccer surfaces arrive in Phase 6; Python's team-less `fiba` is omitted (not an sdv League). */\nexport const SURFACES: Readonly<Record<string, readonly [SurfaceSport, string]>> = {\n nfl: [\"football\", \"nfl\"],\n aaf: [\"football\", \"nfl\"],\n ufl: [\"football\", \"nfl\"],\n usfl: [\"football\", \"nfl\"],\n xfl: [\"football\", \"nfl\"],\n cfb: [\"football\", \"ncaa\"],\n nba: [\"basketball\", \"nba\"],\n nbagl: [\"basketball\", \"nba g league\"],\n wnba: [\"basketball\", \"wnba\"],\n mbb: [\"basketball\", \"ncaa\"],\n wbb: [\"basketball\", \"ncaa\"],\n nhl: [\"hockey\", \"nhl\"],\n whl: [\"hockey\", \"nhl\"],\n pwhl: [\"hockey\", \"pwhl\"], // divergence: Python maps pwhl to NHLRink (sportypy has no PWHL rink); sporty ships a pwhl spec\n ahl: [\"hockey\", \"ahl\"],\n echl: [\"hockey\", \"echl\"],\n ohl: [\"hockey\", \"ohl\"],\n qmjhl: [\"hockey\", \"qmjhl\"],\n ushl: [\"hockey\", \"ushl\"],\n phf: [\"hockey\", \"phf\"],\n ncaa_mhockey: [\"hockey\", \"ncaa\"],\n ncaa_whockey: [\"hockey\", \"ncaa\"],\n};\nexport const SURFACE_BASE = { basketball: \"#d2ab6f\", football: \"#196f0c\", hockey: \"#ffffff\" } as const;\n\ntype Paint<K extends string> = Partial<Record<K, string>>;\n/** Port of `_surface.color_updates`: the team colours a sport's surface takes, keyed by sporty colour key. */\nexport function colorUpdates(\n sport: \"basketball\",\n primary: string,\n secondary?: string,\n): Paint<BasketballColorKey>;\nexport function colorUpdates(sport: \"football\", primary: string, secondary?: string): Paint<FootballColorKey>;\nexport function colorUpdates(sport: \"hockey\", primary: string, secondary?: string): Paint<HockeyColorKey>;\nexport function colorUpdates(\n sport: SurfaceSport,\n primary: string,\n secondary?: string,\n): Record<string, string>;\nexport function colorUpdates(\n sport: SurfaceSport,\n primary: string,\n secondary?: string,\n): Record<string, string> {\n if (sport === \"basketball\") {\n const ink = onColor(primary);\n return {\n painted_area: primary,\n court_apron: primary,\n restricted_arc: ink,\n free_throw_circle_dash: ink,\n baseline_lower_defensive_box: ink,\n lane_lower_defensive_box: ink,\n } satisfies Paint<BasketballColorKey>;\n }\n if (sport === \"football\")\n return { offensive_endzone: primary, defensive_endzone: primary } satisfies Paint<FootballColorKey>;\n const ice = SURFACE_BASE.hockey;\n const readable = secondary !== undefined && contrast(primary, ice) < 3 && contrast(secondary, ice) >= 3;\n const accent = readable ? secondary : primary;\n return {\n center_line: accent,\n center_faceoff_circle: accent,\n center_faceoff_spot: accent,\n boards: primary,\n } satisfies Paint<HockeyColorKey>;\n}\n\ntype AnyRange = BasketballDisplayRange | FootballDisplayRange | HockeyDisplayRange;\nexport interface SurfaceSceneOptions {\n team?: Value;\n season?: SeasonInput;\n /** Overrides on top of the team painting, keyed by sporty colour key. */\n colorUpdates?: Paint<BasketballColorKey | FootballColorKey | HockeyColorKey>;\n rotation?: number;\n /** A sporty display range for the league's sport; one the sport does not know throws sporty's UnknownDisplayRangeError. */\n displayRange?: AnyRange;\n xlim?: readonly [number, number];\n ylim?: readonly [number, number];\n units?: \"ft\" | \"m\" | \"yd\" | \"in\" | \"cm\" | \"mm\";\n /** Sporty parameter overrides (intersected across sports so each sport's own keys type-check). */\n updates?: BasketballParamUpdates & FootballParamUpdates & HockeyParamUpdates;\n arcResolution?: number;\n xTrans?: number;\n yTrans?: number;\n}\n\nconst isIn = <const L extends readonly string[]>(list: L, v: string): v is L[number] => list.includes(v);\nfunction pickRange<const L extends readonly string[]>(\n list: L,\n v: AnyRange | undefined,\n): L[number] | undefined {\n if (v === undefined || isIn(list, v)) return v;\n throw new UnknownDisplayRangeError(`unknown displayRange '${v}'; expected one of: ${list.join(\", \")}`);\n}\n\n/**\n * Build the sporty scene for an sdv league, painted in `team`'s colours. Only the league check throws `InputError`;\n * sporty's own errors (unknown displayRange/unit, bad arcResolution) escape unwrapped.\n */\nexport function surfaceScene(league: League, o: SurfaceSceneOptions = {}): Scene {\n const entry = SURFACES[league];\n if (!entry)\n throw new InputError(\n `no surface for league '${league}'; supported: ${Object.keys(SURFACES).sort().join(\", \")}`,\n );\n const [sport, key] = entry;\n const { team, season, colorUpdates: user, displayRange, ...rest } = o;\n let primary: string | undefined;\n let secondary: string | undefined;\n if (team !== undefined && team !== null) {\n const at = season !== undefined ? { season } : {};\n ({ primary, secondary } = teamColorPairSync(league, team, at));\n }\n const dr = <const L extends readonly string[]>(list: L) => {\n const v = pickRange(list, displayRange);\n return v === undefined ? {} : { displayRange: v };\n };\n if (sport === \"basketball\") {\n const paint = primary === undefined ? {} : colorUpdates(\"basketball\", primary, secondary);\n return sportySurface(\"basketball\", key, {\n ...rest,\n colorUpdates: { ...paint, ...user },\n ...dr(BASKETBALL_DISPLAY_RANGES),\n });\n }\n if (sport === \"football\") {\n const paint = primary === undefined ? {} : colorUpdates(\"football\", primary, secondary);\n return sportySurface(\"football\", key, {\n ...rest,\n colorUpdates: { ...paint, ...user },\n ...dr(FOOTBALL_DISPLAY_RANGES),\n });\n }\n const paint = primary === undefined ? {} : colorUpdates(\"hockey\", primary, secondary);\n return sportySurface(\"hockey\", key, {\n ...rest,\n colorUpdates: { ...paint, ...user },\n ...dr(HOCKEY_DISPLAY_RANGES),\n });\n}\n"]}
@@ -1,38 +0,0 @@
1
- import { BasketballColorKey, FootballColorKey, HockeyColorKey, BasketballDisplayRange, FootballDisplayRange, HockeyDisplayRange, BasketballParamUpdates, FootballParamUpdates, HockeyParamUpdates } from '@sportsdataverse/sporty';
2
- import { V as Value } from './resolve-CQW-jzvr.js';
3
- import { S as SeasonInput } from './types-C7n6gJF3.js';
4
-
5
- type SurfaceSport = "basketball" | "football" | "hockey";
6
- /** Maps an sdv league to `[sporty sport, sporty league key]`. Baseball and soccer surfaces arrive in Phase 6; Python's team-less `fiba` is omitted (not an sdv League). */
7
- declare const SURFACES: Readonly<Record<string, readonly [SurfaceSport, string]>>;
8
- declare const SURFACE_BASE: {
9
- readonly basketball: "#d2ab6f";
10
- readonly football: "#196f0c";
11
- readonly hockey: "#ffffff";
12
- };
13
- type Paint<K extends string> = Partial<Record<K, string>>;
14
- /** Port of `_surface.color_updates`: the team colours a sport's surface takes, keyed by sporty colour key. */
15
- declare function colorUpdates(sport: "basketball", primary: string, secondary?: string): Paint<BasketballColorKey>;
16
- declare function colorUpdates(sport: "football", primary: string, secondary?: string): Paint<FootballColorKey>;
17
- declare function colorUpdates(sport: "hockey", primary: string, secondary?: string): Paint<HockeyColorKey>;
18
- declare function colorUpdates(sport: SurfaceSport, primary: string, secondary?: string): Record<string, string>;
19
- type AnyRange = BasketballDisplayRange | FootballDisplayRange | HockeyDisplayRange;
20
- interface SurfaceSceneOptions {
21
- team?: Value;
22
- season?: SeasonInput;
23
- /** Overrides on top of the team painting, keyed by sporty colour key. */
24
- colorUpdates?: Paint<BasketballColorKey | FootballColorKey | HockeyColorKey>;
25
- rotation?: number;
26
- /** A sporty display range for the league's sport; one the sport does not know throws sporty's UnknownDisplayRangeError. */
27
- displayRange?: AnyRange;
28
- xlim?: readonly [number, number];
29
- ylim?: readonly [number, number];
30
- units?: "ft" | "m" | "yd" | "in" | "cm" | "mm";
31
- /** Sporty parameter overrides (intersected across sports so each sport's own keys type-check). */
32
- updates?: BasketballParamUpdates & FootballParamUpdates & HockeyParamUpdates;
33
- arcResolution?: number;
34
- xTrans?: number;
35
- yTrans?: number;
36
- }
37
-
38
- export { type SurfaceSceneOptions as S, SURFACES as a, SURFACE_BASE as b, colorUpdates as c };