@pitchkit/react 0.1.0 → 0.3.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/README.md +173 -0
- package/bin/install-skill.mjs +223 -0
- package/bin/pitchkit.mjs +15 -0
- package/dist/index.d.ts +52 -19
- package/dist/index.js +97 -15
- package/dist/index.js.map +1 -1
- package/package.json +29 -2
- package/skills/pitchkit/SKILL.md +384 -0
- package/skills/pitchkit/references/api.md +235 -0
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { createContext, useState, useId, useRef, useEffect, useContext } from 'react';
|
|
3
|
-
import { getPitchDimensions, createPixelTransform, computePitchGeometry, resolve, computeArrowHeadCorners, computeCometQuad,
|
|
3
|
+
import { getPitchDimensions, createPixelTransform, computePitchGeometry, resolve, computeArrowHeadCorners, computeCometQuad, computePolygonCentroid, computeConvexHull, computeVoronoiCells, selectGoal, computeFlowBins, createColorScale, renderDensityLayersToCanvas, resolveStripeCount, computeStripeBands, goalBoxDepth, computeGoalBox, partStyle, arcSweepFlag, arcPathData } from '@pitchkit/core';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
// src/Pitch.tsx
|
|
@@ -30,18 +30,38 @@ function parseStyleString(css) {
|
|
|
30
30
|
}
|
|
31
31
|
return style;
|
|
32
32
|
}
|
|
33
|
-
function PitchGeometryShapes({
|
|
33
|
+
function PitchGeometryShapes(props) {
|
|
34
|
+
return /* @__PURE__ */ jsxs("g", { "data-pitchkit-layer": "pitch", children: [
|
|
35
|
+
/* @__PURE__ */ jsx(PitchSurface, { ...props }),
|
|
36
|
+
/* @__PURE__ */ jsx(PitchMarkings, { ...props })
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
function PitchSurfaceShapes(props) {
|
|
40
|
+
return /* @__PURE__ */ jsx("g", { "data-pitchkit-layer": "pitch", children: /* @__PURE__ */ jsx(PitchSurface, { ...props }) });
|
|
41
|
+
}
|
|
42
|
+
function PitchMarkingShapes(props) {
|
|
43
|
+
return /* @__PURE__ */ jsx("g", { "data-pitchkit-layer": "pitch-markings", children: /* @__PURE__ */ jsx(PitchMarkings, { ...props }) });
|
|
44
|
+
}
|
|
45
|
+
function PitchSurface({
|
|
34
46
|
geometry,
|
|
35
47
|
transform,
|
|
36
|
-
dimensions,
|
|
37
48
|
appearance = {}
|
|
38
49
|
}) {
|
|
39
50
|
const stripeCount = resolveStripeCount(appearance.stripes);
|
|
51
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
52
|
+
/* @__PURE__ */ jsx(RectShape, { rect: geometry.outline, transform, part: "surface" }),
|
|
53
|
+
computeStripeBands(geometry.outline, stripeCount).map((band, i) => /* @__PURE__ */ jsx(RectShape, { rect: band, transform, part: "stripe" }, i))
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
56
|
+
function PitchMarkings({
|
|
57
|
+
geometry,
|
|
58
|
+
transform,
|
|
59
|
+
dimensions,
|
|
60
|
+
appearance = {}
|
|
61
|
+
}) {
|
|
40
62
|
const depth = goalBoxDepth(dimensions.markings.cornerArcRadius);
|
|
41
63
|
const goalType = appearance.goalType ?? "line";
|
|
42
|
-
return /* @__PURE__ */ jsxs(
|
|
43
|
-
/* @__PURE__ */ jsx(RectShape, { rect: geometry.outline, transform, part: "surface" }),
|
|
44
|
-
computeStripeBands(geometry.outline, stripeCount).map((band, i) => /* @__PURE__ */ jsx(RectShape, { rect: band, transform, part: "stripe" }, i)),
|
|
64
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
45
65
|
/* @__PURE__ */ jsx(LineShape, { line: geometry.halfwayLine, transform, part: "halfway-line" }),
|
|
46
66
|
/* @__PURE__ */ jsx(CircleShape, { circle: geometry.centerCircle, transform, part: "center-circle" }),
|
|
47
67
|
/* @__PURE__ */ jsx(PointShape, { point: geometry.centerSpot, transform, part: "center-spot" }),
|
|
@@ -222,6 +242,7 @@ function Pitch({
|
|
|
222
242
|
const pitchAspect = orientation === "vertical" ? cropExtentY / cropExtentX : cropExtentX / cropExtentY;
|
|
223
243
|
const fallbackSize = { width: NOMINAL_WIDTH, height: Math.round(NOMINAL_WIDTH / pitchAspect) };
|
|
224
244
|
const size = isExplicitSize ? { width: explicitWidth, height: explicitHeight } : measuredSize ?? fallbackSize;
|
|
245
|
+
const linesOnTop = appearance?.linesOnTop ?? false;
|
|
225
246
|
const viewport = { width: size.width, height: size.height, orientation, crop, padding };
|
|
226
247
|
const transform = createPixelTransform(dimensions, viewport);
|
|
227
248
|
const geometry = computePitchGeometry(dimensions);
|
|
@@ -246,7 +267,14 @@ function Pitch({
|
|
|
246
267
|
viewBox: `0 0 ${viewport.width} ${viewport.height}`,
|
|
247
268
|
style: { display: "block" },
|
|
248
269
|
children: [
|
|
249
|
-
/* @__PURE__ */ jsx(
|
|
270
|
+
linesOnTop ? /* @__PURE__ */ jsx(
|
|
271
|
+
PitchSurfaceShapes,
|
|
272
|
+
{
|
|
273
|
+
geometry,
|
|
274
|
+
transform,
|
|
275
|
+
appearance
|
|
276
|
+
}
|
|
277
|
+
) : /* @__PURE__ */ jsx(
|
|
250
278
|
PitchGeometryShapes,
|
|
251
279
|
{
|
|
252
280
|
geometry,
|
|
@@ -255,7 +283,16 @@ function Pitch({
|
|
|
255
283
|
appearance
|
|
256
284
|
}
|
|
257
285
|
),
|
|
258
|
-
/* @__PURE__ */ jsx(PitchContext.Provider, { value: { dimensions, viewport, transform, setTooltip }, children })
|
|
286
|
+
/* @__PURE__ */ jsx(PitchContext.Provider, { value: { dimensions, viewport, transform, setTooltip }, children }),
|
|
287
|
+
linesOnTop && /* @__PURE__ */ jsx(
|
|
288
|
+
PitchMarkingShapes,
|
|
289
|
+
{
|
|
290
|
+
geometry,
|
|
291
|
+
transform,
|
|
292
|
+
dimensions,
|
|
293
|
+
appearance
|
|
294
|
+
}
|
|
295
|
+
)
|
|
259
296
|
]
|
|
260
297
|
}
|
|
261
298
|
),
|
|
@@ -468,27 +505,72 @@ function Comet({
|
|
|
468
505
|
);
|
|
469
506
|
}) });
|
|
470
507
|
}
|
|
471
|
-
function
|
|
508
|
+
function DensityCanvas({ layer, name, className, style }) {
|
|
472
509
|
const { dimensions, viewport } = usePitchContext();
|
|
473
510
|
const canvasRef = useRef(null);
|
|
474
511
|
useEffect(() => {
|
|
475
512
|
const canvas = canvasRef.current;
|
|
476
513
|
if (!canvas) return;
|
|
477
|
-
|
|
478
|
-
{ dimensions, viewport, layers: [{ type: "heatmap", ...layerProps }] },
|
|
479
|
-
canvas
|
|
480
|
-
);
|
|
514
|
+
renderDensityLayersToCanvas({ dimensions, viewport, layers: [layer] }, canvas);
|
|
481
515
|
});
|
|
482
516
|
return /* @__PURE__ */ jsx("foreignObject", { x: 0, y: 0, width: viewport.width, height: viewport.height, children: /* @__PURE__ */ jsx(
|
|
483
517
|
"canvas",
|
|
484
518
|
{
|
|
485
519
|
ref: canvasRef,
|
|
486
|
-
"data-pitchkit-layer":
|
|
520
|
+
"data-pitchkit-layer": name,
|
|
487
521
|
className,
|
|
488
522
|
style: { width: "100%", height: "100%", display: "block", ...style }
|
|
489
523
|
}
|
|
490
524
|
) });
|
|
491
525
|
}
|
|
526
|
+
function Heatmap({ className, style, ...layerProps }) {
|
|
527
|
+
return /* @__PURE__ */ jsx(
|
|
528
|
+
DensityCanvas,
|
|
529
|
+
{
|
|
530
|
+
layer: { type: "heatmap", ...layerProps },
|
|
531
|
+
name: "heatmap",
|
|
532
|
+
className,
|
|
533
|
+
style
|
|
534
|
+
}
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
function PositionalHeatmap({
|
|
538
|
+
className,
|
|
539
|
+
style,
|
|
540
|
+
...layerProps
|
|
541
|
+
}) {
|
|
542
|
+
return /* @__PURE__ */ jsx(
|
|
543
|
+
DensityCanvas,
|
|
544
|
+
{
|
|
545
|
+
layer: { type: "positionalHeatmap", ...layerProps },
|
|
546
|
+
name: "positional-heatmap",
|
|
547
|
+
className,
|
|
548
|
+
style
|
|
549
|
+
}
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
function Hexbin({ className, style, ...layerProps }) {
|
|
553
|
+
return /* @__PURE__ */ jsx(
|
|
554
|
+
DensityCanvas,
|
|
555
|
+
{
|
|
556
|
+
layer: { type: "hexbin", ...layerProps },
|
|
557
|
+
name: "hexbin",
|
|
558
|
+
className,
|
|
559
|
+
style
|
|
560
|
+
}
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
function KDE({ className, style, ...layerProps }) {
|
|
564
|
+
return /* @__PURE__ */ jsx(
|
|
565
|
+
DensityCanvas,
|
|
566
|
+
{
|
|
567
|
+
layer: { type: "kde", ...layerProps },
|
|
568
|
+
name: "kde",
|
|
569
|
+
className,
|
|
570
|
+
style
|
|
571
|
+
}
|
|
572
|
+
);
|
|
573
|
+
}
|
|
492
574
|
var DEFAULT_FILL3 = "var(--pitch-marker-primary, #3b82f6)";
|
|
493
575
|
var DEFAULT_FILL_OPACITY = 0.35;
|
|
494
576
|
function Polygon({
|
|
@@ -733,6 +815,6 @@ function usePitch() {
|
|
|
733
815
|
return { dimensions, viewport, transform };
|
|
734
816
|
}
|
|
735
817
|
|
|
736
|
-
export { Annotate, Arrows, Comet, ConvexHull, Flow, GoalAngle, Heatmap, Pitch, Polygon, Scatter, VerticalPitch, Voronoi, usePitch };
|
|
818
|
+
export { Annotate, Arrows, Comet, ConvexHull, Flow, GoalAngle, Heatmap, Hexbin, KDE, Pitch, Polygon, PositionalHeatmap, Scatter, VerticalPitch, Voronoi, usePitch };
|
|
737
819
|
//# sourceMappingURL=index.js.map
|
|
738
820
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts","../src/style-string.ts","../src/pitch-geometry.tsx","../src/TooltipOverlay.tsx","../src/use-resize-observer.ts","../src/Pitch.tsx","../src/VerticalPitch.tsx","../src/Scatter.tsx","../src/Annotate.tsx","../src/Arrows.tsx","../src/Comet.tsx","../src/Heatmap.tsx","../src/Polygon.tsx","../src/ConvexHull.tsx","../src/Voronoi.tsx","../src/GoalAngle.tsx","../src/Flow.tsx","../src/use-pitch.ts"],"names":["jsx","useState","jsxs","DEFAULT_FILL","resolve","useRef","useEffect","DEFAULT_FILL_OPACITY","computePolygonCentroid","DEFAULT_STROKE","computePitchGeometry","DEFAULT_HEAD_SIZE","computeArrowHeadCorners"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { PitchDimensions, PixelTransform, Viewport } from \"@pitchkit/core\";\n\nexport interface TooltipState {\n readonly content: ReactNode;\n /** Pixel position within the <Pitch> wrapper, not the viewport. */\n readonly x: number;\n readonly y: number;\n}\n\nexport interface PitchContextValue {\n readonly dimensions: PitchDimensions;\n readonly viewport: Viewport;\n readonly transform: PixelTransform;\n readonly setTooltip: (tooltip: TooltipState | null) => void;\n}\n\nexport const PitchContext = createContext<PitchContextValue | null>(null);\n\n/**\n * Internal: every layer component (Scatter/Annotate/Arrows/Comet) reads the\n * scene's transform through this. Throws with a specific message rather\n * than silently rendering nothing, since \"layer outside <Pitch>\" is a\n * usage error a consumer should see immediately, not debug from a blank\n * pitch.\n */\nexport function usePitchContext(): PitchContextValue {\n const ctx = useContext(PitchContext);\n if (!ctx) {\n throw new Error(\n \"@pitchkit/react: this component must be rendered inside <Pitch> or <VerticalPitch>.\",\n );\n }\n return ctx;\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Converts a `\"prop: value; prop2: value2;\"` CSS string (core's\n * `partStyle()` format, used as-is by the DOM renderer's\n * `setAttribute(\"style\", ...)`) into the camelCase object React's `style`\n * prop requires. React DOM rejects a raw string for `style` — this is the\n * one place that difference has to be bridged, so both renderers can keep\n * consuming the exact same `partStyle()` string without core's API\n * changing shape for React's sake.\n *\n * Only handles simple `prop: value` declarations (no nested at-rules,\n * comments, or `!important`) — that's all `partStyle()` ever produces.\n */\nexport function parseStyleString(css: string): CSSProperties {\n const style: Record<string, string> = {};\n for (const declaration of css.split(\";\")) {\n const trimmed = declaration.trim();\n if (!trimmed) continue;\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) continue;\n const prop = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n const camelProp = prop.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n style[camelProp] = value;\n }\n return style as CSSProperties;\n}\n","import {\n arcPathData,\n arcSweepFlag,\n computeGoalBox,\n computeStripeBands,\n goalBoxDepth,\n partStyle,\n resolveStripeCount,\n} from \"@pitchkit/core\";\nimport type {\n Arc,\n Circle,\n Line,\n PitchAppearance,\n PitchDimensions,\n PitchGeometry,\n Point,\n PixelTransform,\n Rect,\n} from \"@pitchkit/core\";\nimport { parseStyleString } from \"./style-string.js\";\n\n/**\n * Emits a PitchGeometry as JSX, one element per shape — the React\n * equivalent of core's `paintPitchGeometry` (`render/svg/paint-pitch.ts`).\n * Deliberately re-emits rather than reusing core's DOM painter: JSX is\n * what makes this SSR-able and lets marks attach native React event\n * handlers. Every piece of *logic* (styling, stripe/goal-box geometry, arc\n * sweep math) is imported from core, not reimplemented — only the\n * DOM-vs-JSX element-emission layer differs, so the two renderers cannot\n * drift on anything but syntax.\n */\nexport function PitchGeometryShapes({\n geometry,\n transform,\n dimensions,\n appearance = {},\n}: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n dimensions: PitchDimensions;\n appearance?: PitchAppearance;\n}) {\n const stripeCount = resolveStripeCount(appearance.stripes);\n const depth = goalBoxDepth(dimensions.markings.cornerArcRadius);\n const goalType = appearance.goalType ?? \"line\";\n\n return (\n <g data-pitchkit-layer=\"pitch\">\n <RectShape rect={geometry.outline} transform={transform} part=\"surface\" />\n {computeStripeBands(geometry.outline, stripeCount).map((band, i) => (\n <RectShape key={i} rect={band} transform={transform} part=\"stripe\" />\n ))}\n\n <LineShape line={geometry.halfwayLine} transform={transform} part=\"halfway-line\" />\n <CircleShape circle={geometry.centerCircle} transform={transform} part=\"center-circle\" />\n <PointShape point={geometry.centerSpot} transform={transform} part=\"center-spot\" />\n\n {geometry.penaltyAreas.map((rect, i) => (\n <RectShape key={i} rect={rect} transform={transform} part=\"penalty-area\" />\n ))}\n {geometry.sixYardBoxes.map((rect, i) => (\n <RectShape key={i} rect={rect} transform={transform} part=\"six-yard-box\" />\n ))}\n {geometry.penaltySpots.map((point, i) => (\n <PointShape key={i} point={point} transform={transform} part=\"penalty-spot\" />\n ))}\n {geometry.penaltyArcs.map((arc, i) => (\n <ArcShape key={i} arc={arc} transform={transform} part=\"penalty-arc\" />\n ))}\n {geometry.cornerArcs.map((arc, i) => (\n <ArcShape key={i} arc={arc} transform={transform} part=\"corner-arc\" />\n ))}\n\n {goalType === \"box\" ? (\n <>\n <RectShape\n rect={computeGoalBox(geometry.goals[0], true, depth)}\n transform={transform}\n part=\"goal-box\"\n />\n <RectShape\n rect={computeGoalBox(geometry.goals[1], false, depth)}\n transform={transform}\n part=\"goal-box\"\n />\n </>\n ) : (\n geometry.goals.map((line, i) => (\n <LineShape key={i} line={line} transform={transform} part=\"goal\" />\n ))\n )}\n\n {/* The stroke-only border paints last: SVG strokes are centered on the\n path, so the inner half of an earlier-painted border would be masked\n by opaque stripes (issue #14). */}\n <RectShape rect={geometry.outline} transform={transform} part=\"outline\" />\n </g>\n );\n}\n\nfunction RectShape({\n rect,\n transform,\n part,\n}: {\n rect: Rect;\n transform: PixelTransform;\n part: string;\n}) {\n const cornerA = transform.toPixel([rect.x, rect.y]);\n const cornerB = transform.toPixel([rect.x + rect.width, rect.y + rect.height]);\n const x = Math.min(cornerA[0], cornerB[0]);\n const y = Math.min(cornerA[1], cornerB[1]);\n\n return (\n <rect\n x={x}\n y={y}\n width={Math.abs(cornerB[0] - cornerA[0])}\n height={Math.abs(cornerB[1] - cornerA[1])}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction LineShape({\n line,\n transform,\n part,\n}: {\n line: Line;\n transform: PixelTransform;\n part: string;\n}) {\n const [x1, y1] = transform.toPixel(line.from);\n const [x2, y2] = transform.toPixel(line.to);\n\n return (\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction CircleShape({\n circle,\n transform,\n part,\n}: {\n circle: Circle;\n transform: PixelTransform;\n part: string;\n}) {\n const [cx, cy] = transform.toPixel(circle.center);\n\n return (\n <circle\n cx={cx}\n cy={cy}\n r={circle.radius * transform.scale}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction PointShape({\n point,\n transform,\n part,\n}: {\n point: Point;\n transform: PixelTransform;\n part: string;\n}) {\n const [cx, cy] = transform.toPixel(point);\n\n return (\n <circle\n cx={cx}\n cy={cy}\n r={2}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction ArcShape({ arc, transform, part }: { arc: Arc; transform: PixelTransform; part: string }) {\n const center = transform.toPixel(arc.center);\n const start = transform.toPixel(arc.start);\n const end = transform.toPixel(arc.end);\n const radius = arc.radius * transform.scale;\n const sweep = arcSweepFlag(center, start, end);\n\n return (\n <path\n d={arcPathData(radius, start, end, sweep)}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n","import type { TooltipState } from \"./context.js\";\n\n/**\n * Positioned absolutely within `<Pitch>`'s wrapper, offset above the\n * hovered mark. Desktop hover only for this first pass — the PRD's full\n * touch-vs-hover interaction model (§8.6) is deferred scope.\n */\nexport function TooltipOverlay({ tooltip }: { tooltip: TooltipState }) {\n return (\n <div\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n left: tooltip.x,\n top: tooltip.y,\n transform: \"translate(-50%, -100%)\",\n pointerEvents: \"none\",\n background: \"var(--pitch-tooltip-bg, rgba(17, 17, 17, 0.92))\",\n color: \"var(--pitch-tooltip-color, #fff)\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 12,\n whiteSpace: \"nowrap\",\n zIndex: 10,\n }}\n >\n {tooltip.content}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface Size {\n readonly width: number;\n readonly height: number;\n}\n\n/**\n * Measures a ref'd element's content box, updating on resize via\n * ResizeObserver. This is the mechanism behind <Pitch>'s \"responsive by\n * default\" behaviour (PRD §8.6) — no `responsive` prop, just no\n * width/height.\n *\n * Returns `null` until the first measurement (SSR, or before mount) —\n * callers render a fallback (or nothing) until a size is available.\n */\nexport function useResizeObserver<T extends Element>(): [RefObject<T | null>, Size | null] {\n const ref = useRef<T | null>(null);\n const [size, setSize] = useState<Size | null>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const { width, height } = entry.contentRect;\n setSize({ width, height });\n });\n observer.observe(el);\n\n return () => observer.disconnect();\n }, []);\n\n return [ref, size];\n}\n","import { useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { computePitchGeometry, createPixelTransform, getPitchDimensions } from \"@pitchkit/core\";\nimport type {\n CropWindow,\n Orientation,\n PitchAppearance,\n PitchTypeId,\n Viewport,\n ViewportPadding,\n} from \"@pitchkit/core\";\nimport { PitchContext } from \"./context.js\";\nimport type { TooltipState } from \"./context.js\";\nimport { PitchGeometryShapes } from \"./pitch-geometry.js\";\nimport { TooltipOverlay } from \"./TooltipOverlay.js\";\nimport { useResizeObserver } from \"./use-resize-observer.js\";\n\nexport interface PitchProps {\n type: PitchTypeId;\n /** @default \"horizontal\" */\n orientation?: Orientation;\n /** Fixed pixel size — the opt-out from the responsive default. Provide both, or neither. */\n width?: number;\n height?: number;\n crop?: CropWindow;\n padding?: ViewportPadding;\n appearance?: PitchAppearance;\n className?: string;\n style?: CSSProperties;\n children?: ReactNode;\n}\n\n// A nominal size (matching the pitch's own aspect ratio) used only for the\n// very first render, before ResizeObserver has measured the real\n// container — SSR included, since there's no DOM to measure server-side.\n// Picking a fallback with the *correct aspect ratio* means the SVG content\n// is never distorted, even though its absolute pixel scale may be off\n// until the first client measurement (PRD §8.6's \"explicit aspect ratio on\n// first paint, ResizeObserver refine after hydration\").\nconst NOMINAL_WIDTH = 600;\n\n/**\n * The root pitch component: owns the coordinate system, is responsive by\n * default (fills its container via ResizeObserver — explicit width/height\n * is the opt-out), and provides the pixel transform to layer-component\n * children via context.\n */\nexport function Pitch({\n type,\n orientation = \"horizontal\",\n width: explicitWidth,\n height: explicitHeight,\n crop,\n padding,\n appearance,\n className,\n style,\n children,\n}: PitchProps) {\n const dimensions = getPitchDimensions(type);\n const [containerRef, measuredSize] = useResizeObserver<HTMLDivElement>();\n const [tooltip, setTooltip] = useState<TooltipState | null>(null);\n\n const isExplicitSize = explicitWidth !== undefined && explicitHeight !== undefined;\n\n // The container's aspect ratio must match what's actually being shown —\n // the cropped extent, not the full pitch — otherwise a half-pitch crop\n // renders inside a box sized for the whole pitch, leaving room for the\n // other half's markings (which the transform maps just outside the\n // crop, but not outside the oversized container) to bleed into view.\n // `crop`'s x0/x1/y0/y1 are already in the provider's own units (same\n // space as `dimensions.length`/`width`), and x never gets axis-swapped\n // by yDirection (see `canonical.ts`), so a plain abs-difference gives\n // the right extent without needing the canonical-frame conversion.\n const cropExtentX = crop ? Math.abs(crop.x1 - crop.x0) : dimensions.length;\n const cropExtentY = crop ? Math.abs(crop.y1 - crop.y0) : dimensions.width;\n const pitchAspect = orientation === \"vertical\" ? cropExtentY / cropExtentX : cropExtentX / cropExtentY;\n const fallbackSize = { width: NOMINAL_WIDTH, height: Math.round(NOMINAL_WIDTH / pitchAspect) };\n\n const size = isExplicitSize\n ? { width: explicitWidth, height: explicitHeight }\n : (measuredSize ?? fallbackSize);\n\n const viewport: Viewport = { width: size.width, height: size.height, orientation, crop, padding };\n const transform = createPixelTransform(dimensions, viewport);\n const geometry = computePitchGeometry(dimensions);\n\n return (\n <div\n ref={isExplicitSize ? undefined : containerRef}\n className={className}\n style={{\n position: \"relative\",\n width: isExplicitSize ? explicitWidth : \"100%\",\n height: isExplicitSize ? explicitHeight : undefined,\n aspectRatio: isExplicitSize ? undefined : pitchAspect,\n ...style,\n }}\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${viewport.width} ${viewport.height}`}\n style={{ display: \"block\" }}\n >\n <PitchGeometryShapes\n geometry={geometry}\n transform={transform}\n dimensions={dimensions}\n appearance={appearance}\n />\n <PitchContext.Provider value={{ dimensions, viewport, transform, setTooltip }}>\n {children}\n </PitchContext.Provider>\n </svg>\n {tooltip && <TooltipOverlay tooltip={tooltip} />}\n </div>\n );\n}\n","import { Pitch } from \"./Pitch.js\";\nimport type { PitchProps } from \"./Pitch.js\";\n\n/**\n * `<Pitch orientation=\"vertical\">`, named to match mplsoccer's\n * `VerticalPitch` for familiarity. Core has no separate vertical pitch\n * concept (orientation is a `Viewport` field, not a distinct coordinate\n * system) — this is purely a naming/ergonomics convenience at the\n * component-API layer.\n */\nexport function VerticalPitch(props: Omit<PitchProps, \"orientation\">) {\n return <Pitch {...props} orientation=\"vertical\" />;\n}\n","import type { ReactNode } from \"react\";\nimport { resolve } from \"@pitchkit/core\";\nimport type { ScatterLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ScatterProps<T> extends Omit<ScatterLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_RADIUS = 4;\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\n\n/** One `<circle>` per datum — the JSX equivalent of core's `paintScatterLayer`. */\nexport function Scatter<T>({\n data,\n x,\n y,\n r,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: ScatterProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"scatter\">\n {data.map((d, i) => {\n const [cx, cy] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const radius = resolve(r ?? DEFAULT_RADIUS, d, i);\n // `fill`/`stroke` are the only two visual props with a themed\n // fallback rather than \"just leave it unset\" — and that fallback is\n // an inline style, which always beats a `className` utility class\n // (`fill-emerald-400`, say) at the same CSS property, opt-in or\n // not. So the fallback only applies when `className` is absent;\n // passing `className` hands color ownership to it, same as passing\n // `fill`/`stroke` explicitly still does either way.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : \"none\";\n const fillOpacityValue = fillOpacity !== undefined ? resolve(fillOpacity, d, i) : undefined;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <circle\n key={i}\n cx={cx}\n cy={cy}\n r={radius}\n data-pitchkit-mark=\"scatter\"\n className={className}\n style={{\n fill: fillValue,\n stroke: strokeValue,\n fillOpacity: fillOpacityValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: cx, y: cy }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { resolve } from \"@pitchkit/core\";\nimport type { AnnotateLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface AnnotateProps<T> extends Omit<AnnotateLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst TEXT_BASE_STYLE: CSSProperties = { fontSize: 10, textAnchor: \"middle\" };\nconst DEFAULT_FILL = \"var(--pitch-lines, rgba(255, 255, 255, 0.8))\";\n\n/** One `<text>` per datum — the JSX equivalent of core's `paintAnnotateLayer`. */\nexport function Annotate<T>({\n data,\n x,\n y,\n label,\n offsetX,\n offsetY,\n className,\n tooltip,\n}: AnnotateProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n // The themed default fill is only applied when `className` is absent —\n // it's set as inline style, which always beats a class at the same\n // property, so a consumer's `fill-*` utility needs the default to back\n // off rather than losing to it. See Scatter.tsx's equivalent comment.\n const textStyle: CSSProperties = className ? TEXT_BASE_STYLE : { ...TEXT_BASE_STYLE, fill: DEFAULT_FILL };\n\n return (\n <g data-pitchkit-layer=\"annotate\">\n {data.map((d, i) => {\n const [px, py] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const dx = offsetX !== undefined ? resolve(offsetX, d, i) : 0;\n const dy = offsetY !== undefined ? resolve(offsetY, d, i) : 0;\n const tx = px + dx;\n const ty = py + dy;\n\n return (\n <text\n key={i}\n x={tx}\n y={ty}\n data-pitchkit-mark=\"annotate\"\n style={textStyle}\n className={className}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n {resolve(label, d, i)}\n </text>\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeArrowHeadCorners, resolve } from \"@pitchkit/core\";\nimport type { ArrowsLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ArrowsProps<T> extends Omit<ArrowsLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_STROKE = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_STROKE_WIDTH = 1.5;\nconst DEFAULT_HEAD_SIZE = 6;\n\n/**\n * One shaft `<line>` + arrowhead `<polygon>` per datum — the JSX\n * equivalent of core's `paintArrowsLayer`, sharing its `computeArrowHeadCorners`\n * geometry so the head angle can't drift between the two renderers.\n */\nexport function Arrows<T>({\n data,\n x,\n y,\n x2,\n y2,\n stroke,\n strokeWidth,\n strokeOpacity,\n headSize,\n className,\n tooltip,\n}: ArrowsProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"arrows\">\n {data.map((d, i) => {\n const start = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const end = transform.toPixel([resolve(x2, d, i), resolve(y2, d, i)]);\n // See Scatter.tsx's equivalent comment: the themed default falls\n // back to an inline style, which always beats a `className`\n // utility at the same property, so it only applies when\n // `className` is absent.\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : DEFAULT_STROKE;\n const strokeWidthValue = resolve(strokeWidth ?? DEFAULT_STROKE_WIDTH, d, i);\n const opacityValue = strokeOpacity !== undefined ? resolve(strokeOpacity, d, i) : undefined;\n const headSizeValue = resolve(headSize ?? DEFAULT_HEAD_SIZE, d, i);\n const [headA, headB] = computeArrowHeadCorners(start, end, headSizeValue);\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(d, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n <line\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n data-pitchkit-mark=\"arrow-shaft\"\n className={className}\n style={{ stroke: strokeValue, strokeWidth: strokeWidthValue, opacity: opacityValue }}\n />\n <polygon\n points={`${end[0]},${end[1]} ${headA[0]},${headA[1]} ${headB[0]},${headB[1]}`}\n data-pitchkit-mark=\"arrow-head\"\n className={className}\n style={{ fill: strokeValue, opacity: opacityValue }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { computeCometQuad, resolve } from \"@pitchkit/core\";\nimport type { CometLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface CometProps<T> extends Omit<CometLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_COLOR = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_START_WIDTH = 0.5;\nconst DEFAULT_END_WIDTH = 4;\n\n/**\n * One filled quadrilateral per datum — the JSX equivalent of core's\n * `paintCometLayer`, sharing its `computeCometQuad` taper geometry. Gradient\n * ids come from `useId()` (SSR-safe stable id) rather than a module-level\n * counter like core's DOM renderer, since two independent server renders\n * must not produce colliding ids.\n */\nexport function Comet<T>({\n data,\n x,\n y,\n x2,\n y2,\n color,\n startWidth,\n endWidth,\n gradient,\n className,\n tooltip,\n}: CometProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n const baseId = useId();\n\n return (\n <g data-pitchkit-layer=\"comet\">\n {data.map((d, i) => {\n const start = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const end = transform.toPixel([resolve(x2, d, i), resolve(y2, d, i)]);\n // `colorValue` always has a themed default — needed unconditionally\n // for the gradient's `<stop>` colors below, which have no\n // `className`-based equivalent. The *flat* (non-gradient) fill is\n // the one that needs to back off that default when `className` is\n // set, for the same inline-style-beats-class reason as Scatter's\n // fill/stroke.\n const colorValue = resolve(color ?? DEFAULT_COLOR, d, i);\n const startWidthValue = resolve(startWidth ?? DEFAULT_START_WIDTH, d, i);\n const endWidthValue = resolve(endWidth ?? DEFAULT_END_WIDTH, d, i);\n const corners = computeCometQuad(start, end, startWidthValue, endWidthValue);\n const gradientId = `${baseId}-comet-${i}`;\n const flatFillValue = color !== undefined || !className ? colorValue : undefined;\n const fill = gradient ? `url(#${gradientId})` : flatFillValue;\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(d, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n {gradient && (\n <defs>\n <linearGradient\n id={gradientId}\n gradientUnits=\"userSpaceOnUse\"\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n >\n <stop offset=\"0%\" stopColor={colorValue} stopOpacity={0} />\n <stop offset=\"100%\" stopColor={colorValue} stopOpacity={1} />\n </linearGradient>\n </defs>\n )}\n <polygon\n points={corners.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"comet\"\n className={className}\n style={{ fill, stroke: \"none\" }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { renderHeatmapLayersToCanvas } from \"@pitchkit/core\";\nimport type { HeatmapLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface HeatmapProps<T> extends Omit<HeatmapLayer<T>, \"type\"> {\n /**\n * Every bin gets painted (from `colorMin` to `colorMax`, including\n * zero-value bins) rather than leaving low bins transparent, so a\n * heatmap fully covers the pitch underneath by default. Set an opacity\n * here (or a blend mode) to let the pitch show through.\n */\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Client-only `<canvas>` heatmap, painted imperatively via core's\n * `renderHeatmapLayersToCanvas` in an effect. Unlike the SVG layer\n * components, this can't be re-emitted as JSX — Canvas has no declarative\n * JSX equivalent, and dense raster data is exactly the case core's hybrid\n * SVG+Canvas architecture (PRD §8.1) reserves Canvas for. The `<canvas>`\n * itself renders server-side (empty), but its pixels only appear after the\n * client effect runs — a documented client-only boundary.\n *\n * Wrapped in `<foreignObject>` since a raw `<canvas>` can't be a direct\n * child of `<svg>` — this keeps the heatmap inside the same SVG tree as\n * the pitch and every other layer, rather than needing a second,\n * separately-positioned DOM element the way the vanilla-JS core example\n * demo has to (core has no JSX to lean on there).\n *\n * No effect dependency array (runs after every render) rather than\n * enumerating every spread `props` field plus `dimensions`/`viewport` —\n * repainting a canvas is cheap and idempotent, so this avoids a fragile,\n * easily-stale dependency list.\n */\nexport function Heatmap<T>({ className, style, ...layerProps }: HeatmapProps<T>) {\n const { dimensions, viewport } = usePitchContext();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n renderHeatmapLayersToCanvas(\n { dimensions, viewport, layers: [{ type: \"heatmap\", ...layerProps }] },\n canvas,\n );\n });\n\n return (\n <foreignObject x={0} y={0} width={viewport.width} height={viewport.height}>\n <canvas\n ref={canvasRef}\n data-pitchkit-layer=\"heatmap\"\n className={className}\n style={{ width: \"100%\", height: \"100%\", display: \"block\", ...style }}\n />\n </foreignObject>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePolygonCentroid, resolve } from \"@pitchkit/core\";\nimport type { PolygonLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface PolygonProps<T> extends Omit<PolygonLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\n// Area marks default to a partial fill so the pitch surface/markings\n// underneath stay visible, unlike Scatter/Comet's opaque default — those\n// are small marks, this can cover a large fraction of the pitch.\nconst DEFAULT_FILL_OPACITY = 0.35;\n\n/** One `<polygon>` per datum, from an arbitrary list of vertices — mplsoccer's `polygon`. */\nexport function Polygon<T>({\n data,\n points,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: PolygonProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"polygon\">\n {data.map((d, i) => {\n const vertices = resolve(points, d, i).map((p) => transform.toPixel(p));\n const [tx, ty] = computePolygonCentroid(vertices);\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set, since an inline style always beats\n // a `className` utility at the same property.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const strokeValue = stroke !== undefined ? resolve(stroke, d, i) : undefined;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <polygon\n key={i}\n points={vertices.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"polygon\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeConvexHull, computePolygonCentroid, resolve } from \"@pitchkit/core\";\nimport type { ConvexHullLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ConvexHullProps<T> extends Omit<ConvexHullLayer<T>, \"type\"> {\n /** Static — there's exactly one resulting shape for the whole dataset, not one per datum. */\n tooltip?: ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_FILL_OPACITY = 0.35;\n\n/**\n * One filled `<polygon>` for the convex hull of every datum's `(x, y)` —\n * e.g. a player's touch map. Unlike per-datum marks, `fill`/`stroke`/etc.\n * take plain values rather than `Accessor<T, V>`, since there's only ever\n * one shape produced from the whole `data` array.\n */\nexport function ConvexHull<T>({\n data,\n x,\n y,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: ConvexHullProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n const points = data.map((d, i) => transform.toPixel([resolve(x, d, i), resolve(y, d, i)]));\n const hull = computeConvexHull(points);\n const [tx, ty] = computePolygonCentroid(hull);\n\n const fillValue = fill ?? (className ? undefined : DEFAULT_FILL);\n const fillOpacityValue = fillOpacity ?? (className ? undefined : DEFAULT_FILL_OPACITY);\n\n return (\n <g data-pitchkit-layer=\"convex-hull\">\n <polygon\n points={hull.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"convex-hull\"\n className={className}\n style={{ fill: fillValue, fillOpacity: fillOpacityValue, stroke, strokeWidth }}\n onMouseEnter={\n tooltip !== undefined ? () => setTooltip({ content: tooltip, x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip !== undefined ? () => setTooltip(null) : undefined}\n />\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePitchGeometry, computeVoronoiCells, resolve } from \"@pitchkit/core\";\nimport type { VoronoiLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface VoronoiProps<T> extends Omit<VoronoiLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_FILL_OPACITY = 0.2;\nconst DEFAULT_STROKE = \"var(--pitch-lines, rgba(255, 255, 255, 0.8))\";\n\n/**\n * One filled `<polygon>` cell per datum — Voronoi tessellation over every\n * datum's `(x, y)`, clipped to the pitch outline. Cells are computed in\n * provider coordinates (against `computePitchGeometry(dimensions).outline`)\n * and pixel-transformed afterward, the same order `Heatmap`'s binning uses,\n * so the tessellation itself is independent of orientation/crop.\n */\nexport function Voronoi<T>({\n data,\n x,\n y,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: VoronoiProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n\n const sites = data.map((d, i) => [resolve(x, d, i), resolve(y, d, i)] as const);\n const { outline } = computePitchGeometry(dimensions);\n const cells = computeVoronoiCells(sites, outline);\n\n return (\n <g data-pitchkit-layer=\"voronoi\">\n {data.map((d, i) => {\n const cell = (cells[i] ?? []).map((p) => transform.toPixel(p));\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : DEFAULT_STROKE;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : 1;\n\n return (\n <polygon\n key={i}\n points={cell.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"voronoi\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip\n ? () => {\n const [tx, ty] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n setTooltip({ content: tooltip(d, i), x: tx, y: ty });\n }\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePitchGeometry, computePolygonCentroid, resolve, selectGoal } from \"@pitchkit/core\";\nimport type { GoalAngleLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface GoalAngleProps<T> extends Omit<GoalAngleLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-goal, #f97316)\";\nconst DEFAULT_FILL_OPACITY = 0.25;\nconst DEFAULT_GOAL: \"left\" | \"right\" | \"nearest\" = \"nearest\";\n\n/**\n * One triangular `<polygon>` wedge per datum, from the point to both\n * goalposts — the angle subtended at that point by the goal mouth\n * (mplsoccer's `goal_angle`). Goalpost coordinates come from\n * `computePitchGeometry(dimensions).goals`, already computed for the pitch\n * markings themselves; picking which of the two goals uses `selectGoal`.\n */\nexport function GoalAngle<T>({\n data,\n x,\n y,\n goal,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: GoalAngleProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n const { goals } = computePitchGeometry(dimensions);\n\n return (\n <g data-pitchkit-layer=\"goal-angle\">\n {data.map((d, i) => {\n const point = [resolve(x, d, i), resolve(y, d, i)] as const;\n const goalChoice = resolve(goal ?? DEFAULT_GOAL, d, i);\n const goalLine = selectGoal(point, goals, goalChoice);\n const vertices = [point, goalLine.from, goalLine.to].map((p) => transform.toPixel(p));\n const [tx, ty] = computePolygonCentroid(vertices);\n\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeValue = stroke !== undefined ? resolve(stroke, d, i) : undefined;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <polygon\n key={i}\n points={vertices.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"goal-angle\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeArrowHeadCorners, computeFlowBins, createColorScale, resolve } from \"@pitchkit/core\";\nimport type { FlowBin, FlowLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface FlowProps<T> extends Omit<FlowLayer<T>, \"type\"> {\n /** Per-*bin* (not per-datum) — the rendered arrows are aggregates, one per occupied grid cell. */\n tooltip?: (bin: FlowBin, i: number) => ReactNode;\n}\n\nconst DEFAULT_BINS_X = 6;\nconst DEFAULT_BINS_Y = 5;\nconst DEFAULT_COLOR_MIN = \"#93c5fd\";\nconst DEFAULT_COLOR_MAX = \"#1d4ed8\";\nconst DEFAULT_STROKE_WIDTH_MIN = 1;\nconst DEFAULT_STROKE_WIDTH_MAX = 4;\nconst DEFAULT_HEAD_SIZE = 6;\n\n/**\n * Bins pass/movement data by start location (`computeFlowBins`) and draws\n * one arrow per occupied bin, from the bin center toward the mean end\n * point, colored and sized by that bin's volume — mplsoccer's `flow`.\n * Unlike every other layer here, the rendered marks are aggregates rather\n * than one-per-datum, so `tooltip` takes a `FlowBin`, not a `T`.\n */\nexport function Flow<T>({\n data,\n x,\n y,\n x2,\n y2,\n binsX = DEFAULT_BINS_X,\n binsY = DEFAULT_BINS_Y,\n colorMin = DEFAULT_COLOR_MIN,\n colorMax = DEFAULT_COLOR_MAX,\n strokeWidthMin = DEFAULT_STROKE_WIDTH_MIN,\n strokeWidthMax = DEFAULT_STROKE_WIDTH_MAX,\n className,\n tooltip,\n}: FlowProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n\n const vectors = data.map((d, i) => ({\n x: resolve(x, d, i),\n y: resolve(y, d, i),\n x2: resolve(x2, d, i),\n y2: resolve(y2, d, i),\n }));\n const bins = computeFlowBins(vectors, binsX, binsY, dimensions);\n const counts = bins.map((bin) => bin.count);\n const minCount = counts.length > 0 ? Math.min(...counts) : 0;\n const maxCount = counts.length > 0 ? Math.max(...counts) : 0;\n const colorScale = createColorScale(minCount, maxCount, colorMin, colorMax);\n const countRange = maxCount - minCount || 1;\n\n return (\n <g data-pitchkit-layer=\"flow\">\n {bins.map((bin, i) => {\n const start = transform.toPixel([bin.x, bin.y]);\n const end = transform.toPixel([bin.x2, bin.y2]);\n const t = (bin.count - minCount) / countRange;\n const color = colorScale(bin.count);\n const strokeWidthValue = strokeWidthMin + (strokeWidthMax - strokeWidthMin) * t;\n const [headA, headB] = computeArrowHeadCorners(start, end, DEFAULT_HEAD_SIZE);\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(bin, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n <line\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n data-pitchkit-mark=\"flow-shaft\"\n className={className}\n style={{ stroke: color, strokeWidth: strokeWidthValue }}\n />\n <polygon\n points={`${end[0]},${end[1]} ${headA[0]},${headA[1]} ${headB[0]},${headB[1]}`}\n data-pitchkit-mark=\"flow-head\"\n className={className}\n style={{ fill: color }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { usePitchContext } from \"./context.js\";\nimport type { PitchContextValue } from \"./context.js\";\n\n/**\n * Imperative escape hatch: returns the enclosing `<Pitch>`/`<VerticalPitch>`'s\n * dimensions, viewport, and pixel transform. Must be called from a\n * descendant of `<Pitch>` — for advanced cases (custom marks, manual\n * coordinate math) that the built-in layer components don't cover.\n */\nexport function usePitch(): Pick<PitchContextValue, \"dimensions\" | \"viewport\" | \"transform\"> {\n const { dimensions, viewport, transform } = usePitchContext();\n return { dimensions, viewport, transform };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context.ts","../src/style-string.ts","../src/pitch-geometry.tsx","../src/TooltipOverlay.tsx","../src/use-resize-observer.ts","../src/Pitch.tsx","../src/VerticalPitch.tsx","../src/Scatter.tsx","../src/Annotate.tsx","../src/Arrows.tsx","../src/Comet.tsx","../src/density-canvas.tsx","../src/Heatmap.tsx","../src/PositionalHeatmap.tsx","../src/Hexbin.tsx","../src/KDE.tsx","../src/Polygon.tsx","../src/ConvexHull.tsx","../src/Voronoi.tsx","../src/GoalAngle.tsx","../src/Flow.tsx","../src/use-pitch.ts"],"names":["jsx","useState","jsxs","DEFAULT_FILL","resolve","useRef","useEffect","DEFAULT_FILL_OPACITY","computePolygonCentroid","DEFAULT_STROKE","computePitchGeometry","DEFAULT_HEAD_SIZE","computeArrowHeadCorners"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { PitchDimensions, PixelTransform, Viewport } from \"@pitchkit/core\";\n\nexport interface TooltipState {\n readonly content: ReactNode;\n /** Pixel position within the <Pitch> wrapper, not the viewport. */\n readonly x: number;\n readonly y: number;\n}\n\nexport interface PitchContextValue {\n readonly dimensions: PitchDimensions;\n readonly viewport: Viewport;\n readonly transform: PixelTransform;\n readonly setTooltip: (tooltip: TooltipState | null) => void;\n}\n\nexport const PitchContext = createContext<PitchContextValue | null>(null);\n\n/**\n * Internal: every layer component (Scatter/Annotate/Arrows/Comet) reads the\n * scene's transform through this. Throws with a specific message rather\n * than silently rendering nothing, since \"layer outside <Pitch>\" is a\n * usage error a consumer should see immediately, not debug from a blank\n * pitch.\n */\nexport function usePitchContext(): PitchContextValue {\n const ctx = useContext(PitchContext);\n if (!ctx) {\n throw new Error(\n \"@pitchkit/react: this component must be rendered inside <Pitch> or <VerticalPitch>.\",\n );\n }\n return ctx;\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Converts a `\"prop: value; prop2: value2;\"` CSS string (core's\n * `partStyle()` format, used as-is by the DOM renderer's\n * `setAttribute(\"style\", ...)`) into the camelCase object React's `style`\n * prop requires. React DOM rejects a raw string for `style` — this is the\n * one place that difference has to be bridged, so both renderers can keep\n * consuming the exact same `partStyle()` string without core's API\n * changing shape for React's sake.\n *\n * Only handles simple `prop: value` declarations (no nested at-rules,\n * comments, or `!important`) — that's all `partStyle()` ever produces.\n */\nexport function parseStyleString(css: string): CSSProperties {\n const style: Record<string, string> = {};\n for (const declaration of css.split(\";\")) {\n const trimmed = declaration.trim();\n if (!trimmed) continue;\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) continue;\n const prop = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n const camelProp = prop.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n style[camelProp] = value;\n }\n return style as CSSProperties;\n}\n","import {\n arcPathData,\n arcSweepFlag,\n computeGoalBox,\n computeStripeBands,\n goalBoxDepth,\n partStyle,\n resolveStripeCount,\n} from \"@pitchkit/core\";\nimport type {\n Arc,\n Circle,\n Line,\n PitchAppearance,\n PitchDimensions,\n PitchGeometry,\n Point,\n PixelTransform,\n Rect,\n} from \"@pitchkit/core\";\nimport { parseStyleString } from \"./style-string.js\";\n\n/**\n * Emits a PitchGeometry as JSX, one element per shape — the React\n * equivalent of core's `paintPitchGeometry` (`render/svg/paint-pitch.ts`).\n * Deliberately re-emits rather than reusing core's DOM painter: JSX is\n * what makes this SSR-able and lets marks attach native React event\n * handlers. Every piece of *logic* (styling, stripe/goal-box geometry, arc\n * sweep math) is imported from core, not reimplemented — only the\n * DOM-vs-JSX element-emission layer differs, so the two renderers cannot\n * drift on anything but syntax.\n */\nexport function PitchGeometryShapes(props: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n dimensions: PitchDimensions;\n appearance?: PitchAppearance;\n}) {\n return (\n <g data-pitchkit-layer=\"pitch\">\n <PitchSurface {...props} />\n <PitchMarkings {...props} />\n </g>\n );\n}\n\n/**\n * The grass: the surface fill plus its stripe bands. Always painted\n * first, underneath everything — `appearance.linesOnTop` moves the\n * markings, never this.\n */\nexport function PitchSurfaceShapes(props: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n appearance?: PitchAppearance;\n}) {\n return (\n <g data-pitchkit-layer=\"pitch\">\n <PitchSurface {...props} />\n </g>\n );\n}\n\n/**\n * Every painted line: halfway line, circles, boxes, arcs, goals, and the\n * stroke-only outline border. Emitted separately from the surface so\n * `<Pitch appearance={{ linesOnTop: true }}>` can render it *after* the\n * layer children (mplsoccer's `line_zorder`), keeping the markings\n * visible through an opaque density layer.\n */\nexport function PitchMarkingShapes(props: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n dimensions: PitchDimensions;\n appearance?: PitchAppearance;\n}) {\n return (\n <g data-pitchkit-layer=\"pitch-markings\">\n <PitchMarkings {...props} />\n </g>\n );\n}\n\nfunction PitchSurface({\n geometry,\n transform,\n appearance = {},\n}: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n appearance?: PitchAppearance;\n}) {\n const stripeCount = resolveStripeCount(appearance.stripes);\n\n return (\n <>\n <RectShape rect={geometry.outline} transform={transform} part=\"surface\" />\n {computeStripeBands(geometry.outline, stripeCount).map((band, i) => (\n <RectShape key={i} rect={band} transform={transform} part=\"stripe\" />\n ))}\n </>\n );\n}\n\nfunction PitchMarkings({\n geometry,\n transform,\n dimensions,\n appearance = {},\n}: {\n geometry: PitchGeometry;\n transform: PixelTransform;\n dimensions: PitchDimensions;\n appearance?: PitchAppearance;\n}) {\n const depth = goalBoxDepth(dimensions.markings.cornerArcRadius);\n const goalType = appearance.goalType ?? \"line\";\n\n return (\n <>\n <LineShape line={geometry.halfwayLine} transform={transform} part=\"halfway-line\" />\n <CircleShape circle={geometry.centerCircle} transform={transform} part=\"center-circle\" />\n <PointShape point={geometry.centerSpot} transform={transform} part=\"center-spot\" />\n\n {geometry.penaltyAreas.map((rect, i) => (\n <RectShape key={i} rect={rect} transform={transform} part=\"penalty-area\" />\n ))}\n {geometry.sixYardBoxes.map((rect, i) => (\n <RectShape key={i} rect={rect} transform={transform} part=\"six-yard-box\" />\n ))}\n {geometry.penaltySpots.map((point, i) => (\n <PointShape key={i} point={point} transform={transform} part=\"penalty-spot\" />\n ))}\n {geometry.penaltyArcs.map((arc, i) => (\n <ArcShape key={i} arc={arc} transform={transform} part=\"penalty-arc\" />\n ))}\n {geometry.cornerArcs.map((arc, i) => (\n <ArcShape key={i} arc={arc} transform={transform} part=\"corner-arc\" />\n ))}\n\n {goalType === \"box\" ? (\n <>\n <RectShape\n rect={computeGoalBox(geometry.goals[0], true, depth)}\n transform={transform}\n part=\"goal-box\"\n />\n <RectShape\n rect={computeGoalBox(geometry.goals[1], false, depth)}\n transform={transform}\n part=\"goal-box\"\n />\n </>\n ) : (\n geometry.goals.map((line, i) => (\n <LineShape key={i} line={line} transform={transform} part=\"goal\" />\n ))\n )}\n\n {/* The stroke-only border paints last: SVG strokes are centered on the\n path, so the inner half of an earlier-painted border would be masked\n by opaque stripes (issue #14). */}\n <RectShape rect={geometry.outline} transform={transform} part=\"outline\" />\n </>\n );\n}\n\nfunction RectShape({\n rect,\n transform,\n part,\n}: {\n rect: Rect;\n transform: PixelTransform;\n part: string;\n}) {\n const cornerA = transform.toPixel([rect.x, rect.y]);\n const cornerB = transform.toPixel([rect.x + rect.width, rect.y + rect.height]);\n const x = Math.min(cornerA[0], cornerB[0]);\n const y = Math.min(cornerA[1], cornerB[1]);\n\n return (\n <rect\n x={x}\n y={y}\n width={Math.abs(cornerB[0] - cornerA[0])}\n height={Math.abs(cornerB[1] - cornerA[1])}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction LineShape({\n line,\n transform,\n part,\n}: {\n line: Line;\n transform: PixelTransform;\n part: string;\n}) {\n const [x1, y1] = transform.toPixel(line.from);\n const [x2, y2] = transform.toPixel(line.to);\n\n return (\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction CircleShape({\n circle,\n transform,\n part,\n}: {\n circle: Circle;\n transform: PixelTransform;\n part: string;\n}) {\n const [cx, cy] = transform.toPixel(circle.center);\n\n return (\n <circle\n cx={cx}\n cy={cy}\n r={circle.radius * transform.scale}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction PointShape({\n point,\n transform,\n part,\n}: {\n point: Point;\n transform: PixelTransform;\n part: string;\n}) {\n const [cx, cy] = transform.toPixel(point);\n\n return (\n <circle\n cx={cx}\n cy={cy}\n r={2}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n\nfunction ArcShape({ arc, transform, part }: { arc: Arc; transform: PixelTransform; part: string }) {\n const center = transform.toPixel(arc.center);\n const start = transform.toPixel(arc.start);\n const end = transform.toPixel(arc.end);\n const radius = arc.radius * transform.scale;\n const sweep = arcSweepFlag(center, start, end);\n\n return (\n <path\n d={arcPathData(radius, start, end, sweep)}\n data-pitchkit-part={part}\n style={parseStyleString(partStyle(part))}\n />\n );\n}\n","import type { TooltipState } from \"./context.js\";\n\n/**\n * Positioned absolutely within `<Pitch>`'s wrapper, offset above the\n * hovered mark. Desktop hover only for this first pass — the PRD's full\n * touch-vs-hover interaction model (§8.6) is deferred scope.\n */\nexport function TooltipOverlay({ tooltip }: { tooltip: TooltipState }) {\n return (\n <div\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n left: tooltip.x,\n top: tooltip.y,\n transform: \"translate(-50%, -100%)\",\n pointerEvents: \"none\",\n background: \"var(--pitch-tooltip-bg, rgba(17, 17, 17, 0.92))\",\n color: \"var(--pitch-tooltip-color, #fff)\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 12,\n whiteSpace: \"nowrap\",\n zIndex: 10,\n }}\n >\n {tooltip.content}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface Size {\n readonly width: number;\n readonly height: number;\n}\n\n/**\n * Measures a ref'd element's content box, updating on resize via\n * ResizeObserver. This is the mechanism behind <Pitch>'s \"responsive by\n * default\" behaviour (PRD §8.6) — no `responsive` prop, just no\n * width/height.\n *\n * Returns `null` until the first measurement (SSR, or before mount) —\n * callers render a fallback (or nothing) until a size is available.\n */\nexport function useResizeObserver<T extends Element>(): [RefObject<T | null>, Size | null] {\n const ref = useRef<T | null>(null);\n const [size, setSize] = useState<Size | null>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const { width, height } = entry.contentRect;\n setSize({ width, height });\n });\n observer.observe(el);\n\n return () => observer.disconnect();\n }, []);\n\n return [ref, size];\n}\n","import { useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { computePitchGeometry, createPixelTransform, getPitchDimensions } from \"@pitchkit/core\";\nimport type {\n CropWindow,\n Orientation,\n PitchAppearance,\n PitchTypeId,\n Viewport,\n ViewportPadding,\n} from \"@pitchkit/core\";\nimport { PitchContext } from \"./context.js\";\nimport type { TooltipState } from \"./context.js\";\nimport {\n PitchGeometryShapes,\n PitchMarkingShapes,\n PitchSurfaceShapes,\n} from \"./pitch-geometry.js\";\nimport { TooltipOverlay } from \"./TooltipOverlay.js\";\nimport { useResizeObserver } from \"./use-resize-observer.js\";\n\nexport interface PitchProps {\n type: PitchTypeId;\n /** @default \"horizontal\" */\n orientation?: Orientation;\n /** Fixed pixel size — the opt-out from the responsive default. Provide both, or neither. */\n width?: number;\n height?: number;\n crop?: CropWindow;\n padding?: ViewportPadding;\n appearance?: PitchAppearance;\n className?: string;\n style?: CSSProperties;\n children?: ReactNode;\n}\n\n// A nominal size (matching the pitch's own aspect ratio) used only for the\n// very first render, before ResizeObserver has measured the real\n// container — SSR included, since there's no DOM to measure server-side.\n// Picking a fallback with the *correct aspect ratio* means the SVG content\n// is never distorted, even though its absolute pixel scale may be off\n// until the first client measurement (PRD §8.6's \"explicit aspect ratio on\n// first paint, ResizeObserver refine after hydration\").\nconst NOMINAL_WIDTH = 600;\n\n/**\n * The root pitch component: owns the coordinate system, is responsive by\n * default (fills its container via ResizeObserver — explicit width/height\n * is the opt-out), and provides the pixel transform to layer-component\n * children via context.\n */\nexport function Pitch({\n type,\n orientation = \"horizontal\",\n width: explicitWidth,\n height: explicitHeight,\n crop,\n padding,\n appearance,\n className,\n style,\n children,\n}: PitchProps) {\n const dimensions = getPitchDimensions(type);\n const [containerRef, measuredSize] = useResizeObserver<HTMLDivElement>();\n const [tooltip, setTooltip] = useState<TooltipState | null>(null);\n\n const isExplicitSize = explicitWidth !== undefined && explicitHeight !== undefined;\n\n // The container's aspect ratio must match what's actually being shown —\n // the cropped extent, not the full pitch — otherwise a half-pitch crop\n // renders inside a box sized for the whole pitch, leaving room for the\n // other half's markings (which the transform maps just outside the\n // crop, but not outside the oversized container) to bleed into view.\n // `crop`'s x0/x1/y0/y1 are already in the provider's own units (same\n // space as `dimensions.length`/`width`), and x never gets axis-swapped\n // by yDirection (see `canonical.ts`), so a plain abs-difference gives\n // the right extent without needing the canonical-frame conversion.\n const cropExtentX = crop ? Math.abs(crop.x1 - crop.x0) : dimensions.length;\n const cropExtentY = crop ? Math.abs(crop.y1 - crop.y0) : dimensions.width;\n const pitchAspect = orientation === \"vertical\" ? cropExtentY / cropExtentX : cropExtentX / cropExtentY;\n const fallbackSize = { width: NOMINAL_WIDTH, height: Math.round(NOMINAL_WIDTH / pitchAspect) };\n\n const size = isExplicitSize\n ? { width: explicitWidth, height: explicitHeight }\n : (measuredSize ?? fallbackSize);\n\n const linesOnTop = appearance?.linesOnTop ?? false;\n const viewport: Viewport = { width: size.width, height: size.height, orientation, crop, padding };\n const transform = createPixelTransform(dimensions, viewport);\n const geometry = computePitchGeometry(dimensions);\n\n return (\n <div\n ref={isExplicitSize ? undefined : containerRef}\n className={className}\n style={{\n position: \"relative\",\n width: isExplicitSize ? explicitWidth : \"100%\",\n height: isExplicitSize ? explicitHeight : undefined,\n aspectRatio: isExplicitSize ? undefined : pitchAspect,\n ...style,\n }}\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${viewport.width} ${viewport.height}`}\n style={{ display: \"block\" }}\n >\n {/* With `linesOnTop` the markings are emitted *after* the children\n so an opaque density layer can't hide them; the grass surface\n stays underneath either way. Default keeps the single combined\n group, so nothing about the existing DOM changes. */}\n {linesOnTop ? (\n <PitchSurfaceShapes\n geometry={geometry}\n transform={transform}\n appearance={appearance}\n />\n ) : (\n <PitchGeometryShapes\n geometry={geometry}\n transform={transform}\n dimensions={dimensions}\n appearance={appearance}\n />\n )}\n <PitchContext.Provider value={{ dimensions, viewport, transform, setTooltip }}>\n {children}\n </PitchContext.Provider>\n {linesOnTop && (\n <PitchMarkingShapes\n geometry={geometry}\n transform={transform}\n dimensions={dimensions}\n appearance={appearance}\n />\n )}\n </svg>\n {tooltip && <TooltipOverlay tooltip={tooltip} />}\n </div>\n );\n}\n","import { Pitch } from \"./Pitch.js\";\nimport type { PitchProps } from \"./Pitch.js\";\n\n/**\n * `<Pitch orientation=\"vertical\">`, named to match mplsoccer's\n * `VerticalPitch` for familiarity. Core has no separate vertical pitch\n * concept (orientation is a `Viewport` field, not a distinct coordinate\n * system) — this is purely a naming/ergonomics convenience at the\n * component-API layer.\n */\nexport function VerticalPitch(props: Omit<PitchProps, \"orientation\">) {\n return <Pitch {...props} orientation=\"vertical\" />;\n}\n","import type { ReactNode } from \"react\";\nimport { resolve } from \"@pitchkit/core\";\nimport type { ScatterLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ScatterProps<T> extends Omit<ScatterLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_RADIUS = 4;\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\n\n/** One `<circle>` per datum — the JSX equivalent of core's `paintScatterLayer`. */\nexport function Scatter<T>({\n data,\n x,\n y,\n r,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: ScatterProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"scatter\">\n {data.map((d, i) => {\n const [cx, cy] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const radius = resolve(r ?? DEFAULT_RADIUS, d, i);\n // `fill`/`stroke` are the only two visual props with a themed\n // fallback rather than \"just leave it unset\" — and that fallback is\n // an inline style, which always beats a `className` utility class\n // (`fill-emerald-400`, say) at the same CSS property, opt-in or\n // not. So the fallback only applies when `className` is absent;\n // passing `className` hands color ownership to it, same as passing\n // `fill`/`stroke` explicitly still does either way.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : \"none\";\n const fillOpacityValue = fillOpacity !== undefined ? resolve(fillOpacity, d, i) : undefined;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <circle\n key={i}\n cx={cx}\n cy={cy}\n r={radius}\n data-pitchkit-mark=\"scatter\"\n className={className}\n style={{\n fill: fillValue,\n stroke: strokeValue,\n fillOpacity: fillOpacityValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: cx, y: cy }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { resolve } from \"@pitchkit/core\";\nimport type { AnnotateLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface AnnotateProps<T> extends Omit<AnnotateLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst TEXT_BASE_STYLE: CSSProperties = { fontSize: 10, textAnchor: \"middle\" };\nconst DEFAULT_FILL = \"var(--pitch-lines, rgba(255, 255, 255, 0.8))\";\n\n/** One `<text>` per datum — the JSX equivalent of core's `paintAnnotateLayer`. */\nexport function Annotate<T>({\n data,\n x,\n y,\n label,\n offsetX,\n offsetY,\n className,\n tooltip,\n}: AnnotateProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n // The themed default fill is only applied when `className` is absent —\n // it's set as inline style, which always beats a class at the same\n // property, so a consumer's `fill-*` utility needs the default to back\n // off rather than losing to it. See Scatter.tsx's equivalent comment.\n const textStyle: CSSProperties = className ? TEXT_BASE_STYLE : { ...TEXT_BASE_STYLE, fill: DEFAULT_FILL };\n\n return (\n <g data-pitchkit-layer=\"annotate\">\n {data.map((d, i) => {\n const [px, py] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const dx = offsetX !== undefined ? resolve(offsetX, d, i) : 0;\n const dy = offsetY !== undefined ? resolve(offsetY, d, i) : 0;\n const tx = px + dx;\n const ty = py + dy;\n\n return (\n <text\n key={i}\n x={tx}\n y={ty}\n data-pitchkit-mark=\"annotate\"\n style={textStyle}\n className={className}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n {resolve(label, d, i)}\n </text>\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeArrowHeadCorners, resolve } from \"@pitchkit/core\";\nimport type { ArrowsLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ArrowsProps<T> extends Omit<ArrowsLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_STROKE = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_STROKE_WIDTH = 1.5;\nconst DEFAULT_HEAD_SIZE = 6;\n\n/**\n * One shaft `<line>` + arrowhead `<polygon>` per datum — the JSX\n * equivalent of core's `paintArrowsLayer`, sharing its `computeArrowHeadCorners`\n * geometry so the head angle can't drift between the two renderers.\n */\nexport function Arrows<T>({\n data,\n x,\n y,\n x2,\n y2,\n stroke,\n strokeWidth,\n strokeOpacity,\n headSize,\n className,\n tooltip,\n}: ArrowsProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"arrows\">\n {data.map((d, i) => {\n const start = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const end = transform.toPixel([resolve(x2, d, i), resolve(y2, d, i)]);\n // See Scatter.tsx's equivalent comment: the themed default falls\n // back to an inline style, which always beats a `className`\n // utility at the same property, so it only applies when\n // `className` is absent.\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : DEFAULT_STROKE;\n const strokeWidthValue = resolve(strokeWidth ?? DEFAULT_STROKE_WIDTH, d, i);\n const opacityValue = strokeOpacity !== undefined ? resolve(strokeOpacity, d, i) : undefined;\n const headSizeValue = resolve(headSize ?? DEFAULT_HEAD_SIZE, d, i);\n const [headA, headB] = computeArrowHeadCorners(start, end, headSizeValue);\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(d, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n <line\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n data-pitchkit-mark=\"arrow-shaft\"\n className={className}\n style={{ stroke: strokeValue, strokeWidth: strokeWidthValue, opacity: opacityValue }}\n />\n <polygon\n points={`${end[0]},${end[1]} ${headA[0]},${headA[1]} ${headB[0]},${headB[1]}`}\n data-pitchkit-mark=\"arrow-head\"\n className={className}\n style={{ fill: strokeValue, opacity: opacityValue }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { computeCometQuad, resolve } from \"@pitchkit/core\";\nimport type { CometLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface CometProps<T> extends Omit<CometLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_COLOR = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_START_WIDTH = 0.5;\nconst DEFAULT_END_WIDTH = 4;\n\n/**\n * One filled quadrilateral per datum — the JSX equivalent of core's\n * `paintCometLayer`, sharing its `computeCometQuad` taper geometry. Gradient\n * ids come from `useId()` (SSR-safe stable id) rather than a module-level\n * counter like core's DOM renderer, since two independent server renders\n * must not produce colliding ids.\n */\nexport function Comet<T>({\n data,\n x,\n y,\n x2,\n y2,\n color,\n startWidth,\n endWidth,\n gradient,\n className,\n tooltip,\n}: CometProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n const baseId = useId();\n\n return (\n <g data-pitchkit-layer=\"comet\">\n {data.map((d, i) => {\n const start = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n const end = transform.toPixel([resolve(x2, d, i), resolve(y2, d, i)]);\n // `colorValue` always has a themed default — needed unconditionally\n // for the gradient's `<stop>` colors below, which have no\n // `className`-based equivalent. The *flat* (non-gradient) fill is\n // the one that needs to back off that default when `className` is\n // set, for the same inline-style-beats-class reason as Scatter's\n // fill/stroke.\n const colorValue = resolve(color ?? DEFAULT_COLOR, d, i);\n const startWidthValue = resolve(startWidth ?? DEFAULT_START_WIDTH, d, i);\n const endWidthValue = resolve(endWidth ?? DEFAULT_END_WIDTH, d, i);\n const corners = computeCometQuad(start, end, startWidthValue, endWidthValue);\n const gradientId = `${baseId}-comet-${i}`;\n const flatFillValue = color !== undefined || !className ? colorValue : undefined;\n const fill = gradient ? `url(#${gradientId})` : flatFillValue;\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(d, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n {gradient && (\n <defs>\n <linearGradient\n id={gradientId}\n gradientUnits=\"userSpaceOnUse\"\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n >\n <stop offset=\"0%\" stopColor={colorValue} stopOpacity={0} />\n <stop offset=\"100%\" stopColor={colorValue} stopOpacity={1} />\n </linearGradient>\n </defs>\n )}\n <polygon\n points={corners.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"comet\"\n className={className}\n style={{ fill, stroke: \"none\" }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { renderDensityLayersToCanvas } from \"@pitchkit/core\";\nimport type { Layer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface DensityCanvasProps {\n /** The single density layer to paint — `heatmap`, `positionalHeatmap`, `hexbin` or `kde`. */\n layer: Layer;\n /** Value of the canvas's `data-pitchkit-layer` attribute, so each layer type stays queryable. */\n name: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * The shared `<canvas>`-inside-`<foreignObject>` plumbing behind every\n * Canvas-rendered layer (`<Heatmap>`, `<PositionalHeatmap>`, `<Hexbin>`,\n * `<KDE>`), painted imperatively via core's `renderDensityLayersToCanvas`\n * in an effect.\n *\n * Unlike the SVG layer components, none of these can be re-emitted as JSX\n * — Canvas has no declarative JSX equivalent, and dense raster data is\n * exactly the case core's hybrid SVG+Canvas architecture (PRD §8.1)\n * reserves Canvas for. The `<canvas>` itself renders server-side (empty),\n * but its pixels only appear after the client effect runs — a documented\n * client-only boundary.\n *\n * Wrapped in `<foreignObject>` since a raw `<canvas>` can't be a direct\n * child of `<svg>` — this keeps the layer inside the same SVG tree as the\n * pitch and every other layer, rather than needing a second,\n * separately-positioned DOM element.\n *\n * No effect dependency array (runs after every render) rather than\n * enumerating every field of a layer object that's rebuilt on each render\n * anyway — repainting a canvas is cheap and idempotent, so this avoids a\n * fragile, easily-stale dependency list.\n */\nexport function DensityCanvas({ layer, name, className, style }: DensityCanvasProps) {\n const { dimensions, viewport } = usePitchContext();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n renderDensityLayersToCanvas({ dimensions, viewport, layers: [layer] }, canvas);\n });\n\n return (\n <foreignObject x={0} y={0} width={viewport.width} height={viewport.height}>\n <canvas\n ref={canvasRef}\n data-pitchkit-layer={name}\n className={className}\n style={{ width: \"100%\", height: \"100%\", display: \"block\", ...style }}\n />\n </foreignObject>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { HeatmapLayer } from \"@pitchkit/core\";\nimport { DensityCanvas } from \"./density-canvas.js\";\n\nexport interface HeatmapProps<T> extends Omit<HeatmapLayer<T>, \"type\"> {\n /**\n * Every bin gets painted (from `colorMin` to `colorMax`, including\n * zero-value bins) rather than leaving low bins transparent, so a\n * heatmap fully covers the pitch underneath by default. Set an opacity\n * here (or a blend mode) to let the pitch show through.\n */\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Client-only `<canvas>` heatmap: bins `data` into a uniform\n * `binsX` x `binsY` grid and colours each cell by count (or summed\n * `weight`). See `DensityCanvas` for why every Canvas layer is painted\n * imperatively rather than re-emitted as JSX.\n */\nexport function Heatmap<T>({ className, style, ...layerProps }: HeatmapProps<T>) {\n return (\n <DensityCanvas\n layer={{ type: \"heatmap\", ...layerProps }}\n name=\"heatmap\"\n className={className}\n style={style}\n />\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { PositionalHeatmapLayer } from \"@pitchkit/core\";\nimport { DensityCanvas } from \"./density-canvas.js\";\n\nexport interface PositionalHeatmapProps<T> extends Omit<PositionalHeatmapLayer<T>, \"type\"> {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Client-only `<canvas>` heatmap binned into Juego de Posición zones —\n * mplsoccer's `bin_statistic_positional` + `heatmap_positional`. Same\n * aggregation as `<Heatmap>`, but the cells come from the pitch markings\n * (penalty areas, six-yard boxes, halfway line) rather than a uniform\n * grid, which is what makes zone-to-zone comparisons meaningful to an\n * analyst reading positional play.\n *\n * Pass `stroke` to outline the zones — off by default, since the\n * boundaries compete with the pitch markings they're derived from.\n */\nexport function PositionalHeatmap<T>({\n className,\n style,\n ...layerProps\n}: PositionalHeatmapProps<T>) {\n return (\n <DensityCanvas\n layer={{ type: \"positionalHeatmap\", ...layerProps }}\n name=\"positional-heatmap\"\n className={className}\n style={style}\n />\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { HexbinLayer } from \"@pitchkit/core\";\nimport { DensityCanvas } from \"./density-canvas.js\";\n\nexport interface HexbinProps<T> extends Omit<HexbinLayer<T>, \"type\"> {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Client-only `<canvas>` hexagonal density — mplsoccer's `hexbin`.\n * Hexagons pack more evenly than squares (every neighbour is equidistant),\n * so dense touch/event data reads with less of the axis-aligned banding a\n * rectangular `<Heatmap>` shows. Empty hexagons aren't drawn at all, so\n * the pitch stays visible wherever there's no data.\n */\nexport function Hexbin<T>({ className, style, ...layerProps }: HexbinProps<T>) {\n return (\n <DensityCanvas\n layer={{ type: \"hexbin\", ...layerProps }}\n name=\"hexbin\"\n className={className}\n style={style}\n />\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { KdeLayer } from \"@pitchkit/core\";\nimport { DensityCanvas } from \"./density-canvas.js\";\n\nexport interface KDEProps<T> extends Omit<KdeLayer<T>, \"type\"> {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Client-only `<canvas>` kernel density estimate — mplsoccer's `kdeplot`.\n * Unlike the binned layers, each point spreads influence over its\n * neighbourhood, so the result is a continuous surface rather than a grid\n * of cells, and low-density areas fade out instead of being filled with\n * `colorMin`.\n *\n * `bandwidth` controls the smoothing radius in provider units; leave it\n * unset to let Silverman's rule of thumb pick one per axis from the data's\n * own spread.\n */\nexport function KDE<T>({ className, style, ...layerProps }: KDEProps<T>) {\n return (\n <DensityCanvas\n layer={{ type: \"kde\", ...layerProps }}\n name=\"kde\"\n className={className}\n style={style}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePolygonCentroid, resolve } from \"@pitchkit/core\";\nimport type { PolygonLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface PolygonProps<T> extends Omit<PolygonLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\n// Area marks default to a partial fill so the pitch surface/markings\n// underneath stay visible, unlike Scatter/Comet's opaque default — those\n// are small marks, this can cover a large fraction of the pitch.\nconst DEFAULT_FILL_OPACITY = 0.35;\n\n/** One `<polygon>` per datum, from an arbitrary list of vertices — mplsoccer's `polygon`. */\nexport function Polygon<T>({\n data,\n points,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: PolygonProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n return (\n <g data-pitchkit-layer=\"polygon\">\n {data.map((d, i) => {\n const vertices = resolve(points, d, i).map((p) => transform.toPixel(p));\n const [tx, ty] = computePolygonCentroid(vertices);\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set, since an inline style always beats\n // a `className` utility at the same property.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const strokeValue = stroke !== undefined ? resolve(stroke, d, i) : undefined;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <polygon\n key={i}\n points={vertices.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"polygon\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeConvexHull, computePolygonCentroid, resolve } from \"@pitchkit/core\";\nimport type { ConvexHullLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface ConvexHullProps<T> extends Omit<ConvexHullLayer<T>, \"type\"> {\n /** Static — there's exactly one resulting shape for the whole dataset, not one per datum. */\n tooltip?: ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_FILL_OPACITY = 0.35;\n\n/**\n * One filled `<polygon>` for the convex hull of every datum's `(x, y)` —\n * e.g. a player's touch map. Unlike per-datum marks, `fill`/`stroke`/etc.\n * take plain values rather than `Accessor<T, V>`, since there's only ever\n * one shape produced from the whole `data` array.\n */\nexport function ConvexHull<T>({\n data,\n x,\n y,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: ConvexHullProps<T>) {\n const { transform, setTooltip } = usePitchContext();\n\n const points = data.map((d, i) => transform.toPixel([resolve(x, d, i), resolve(y, d, i)]));\n const hull = computeConvexHull(points);\n const [tx, ty] = computePolygonCentroid(hull);\n\n const fillValue = fill ?? (className ? undefined : DEFAULT_FILL);\n const fillOpacityValue = fillOpacity ?? (className ? undefined : DEFAULT_FILL_OPACITY);\n\n return (\n <g data-pitchkit-layer=\"convex-hull\">\n <polygon\n points={hull.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"convex-hull\"\n className={className}\n style={{ fill: fillValue, fillOpacity: fillOpacityValue, stroke, strokeWidth }}\n onMouseEnter={\n tooltip !== undefined ? () => setTooltip({ content: tooltip, x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip !== undefined ? () => setTooltip(null) : undefined}\n />\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePitchGeometry, computeVoronoiCells, resolve } from \"@pitchkit/core\";\nimport type { VoronoiLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface VoronoiProps<T> extends Omit<VoronoiLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-primary, #3b82f6)\";\nconst DEFAULT_FILL_OPACITY = 0.2;\nconst DEFAULT_STROKE = \"var(--pitch-lines, rgba(255, 255, 255, 0.8))\";\n\n/**\n * One filled `<polygon>` cell per datum — Voronoi tessellation over every\n * datum's `(x, y)`, clipped to the pitch outline. Cells are computed in\n * provider coordinates (against `computePitchGeometry(dimensions).outline`)\n * and pixel-transformed afterward, the same order `Heatmap`'s binning uses,\n * so the tessellation itself is independent of orientation/crop.\n */\nexport function Voronoi<T>({\n data,\n x,\n y,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: VoronoiProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n\n const sites = data.map((d, i) => [resolve(x, d, i), resolve(y, d, i)] as const);\n const { outline } = computePitchGeometry(dimensions);\n const cells = computeVoronoiCells(sites, outline);\n\n return (\n <g data-pitchkit-layer=\"voronoi\">\n {data.map((d, i) => {\n const cell = (cells[i] ?? []).map((p) => transform.toPixel(p));\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeValue =\n stroke !== undefined ? resolve(stroke, d, i) : className ? undefined : DEFAULT_STROKE;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : 1;\n\n return (\n <polygon\n key={i}\n points={cell.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"voronoi\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip\n ? () => {\n const [tx, ty] = transform.toPixel([resolve(x, d, i), resolve(y, d, i)]);\n setTooltip({ content: tooltip(d, i), x: tx, y: ty });\n }\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computePitchGeometry, computePolygonCentroid, resolve, selectGoal } from \"@pitchkit/core\";\nimport type { GoalAngleLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface GoalAngleProps<T> extends Omit<GoalAngleLayer<T>, \"type\"> {\n tooltip?: (d: T, i: number) => ReactNode;\n}\n\nconst DEFAULT_FILL = \"var(--pitch-marker-goal, #f97316)\";\nconst DEFAULT_FILL_OPACITY = 0.25;\nconst DEFAULT_GOAL: \"left\" | \"right\" | \"nearest\" = \"nearest\";\n\n/**\n * One triangular `<polygon>` wedge per datum, from the point to both\n * goalposts — the angle subtended at that point by the goal mouth\n * (mplsoccer's `goal_angle`). Goalpost coordinates come from\n * `computePitchGeometry(dimensions).goals`, already computed for the pitch\n * markings themselves; picking which of the two goals uses `selectGoal`.\n */\nexport function GoalAngle<T>({\n data,\n x,\n y,\n goal,\n fill,\n fillOpacity,\n stroke,\n strokeWidth,\n className,\n tooltip,\n}: GoalAngleProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n const { goals } = computePitchGeometry(dimensions);\n\n return (\n <g data-pitchkit-layer=\"goal-angle\">\n {data.map((d, i) => {\n const point = [resolve(x, d, i), resolve(y, d, i)] as const;\n const goalChoice = resolve(goal ?? DEFAULT_GOAL, d, i);\n const goalLine = selectGoal(point, goals, goalChoice);\n const vertices = [point, goalLine.from, goalLine.to].map((p) => transform.toPixel(p));\n const [tx, ty] = computePolygonCentroid(vertices);\n\n // See Scatter.tsx's equivalent comment: the themed default backs\n // off when `className` is set.\n const fillValue =\n fill !== undefined ? resolve(fill, d, i) : className ? undefined : DEFAULT_FILL;\n const fillOpacityValue =\n fillOpacity !== undefined\n ? resolve(fillOpacity, d, i)\n : className\n ? undefined\n : DEFAULT_FILL_OPACITY;\n const strokeValue = stroke !== undefined ? resolve(stroke, d, i) : undefined;\n const strokeWidthValue = strokeWidth !== undefined ? resolve(strokeWidth, d, i) : undefined;\n\n return (\n <polygon\n key={i}\n points={vertices.map(([px, py]) => `${px},${py}`).join(\" \")}\n data-pitchkit-mark=\"goal-angle\"\n className={className}\n style={{\n fill: fillValue,\n fillOpacity: fillOpacityValue,\n stroke: strokeValue,\n strokeWidth: strokeWidthValue,\n }}\n onMouseEnter={\n tooltip ? () => setTooltip({ content: tooltip(d, i), x: tx, y: ty }) : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n />\n );\n })}\n </g>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { computeArrowHeadCorners, computeFlowBins, createColorScale, resolve } from \"@pitchkit/core\";\nimport type { FlowBin, FlowLayer } from \"@pitchkit/core\";\nimport { usePitchContext } from \"./context.js\";\n\nexport interface FlowProps<T> extends Omit<FlowLayer<T>, \"type\"> {\n /** Per-*bin* (not per-datum) — the rendered arrows are aggregates, one per occupied grid cell. */\n tooltip?: (bin: FlowBin, i: number) => ReactNode;\n}\n\nconst DEFAULT_BINS_X = 6;\nconst DEFAULT_BINS_Y = 5;\nconst DEFAULT_COLOR_MIN = \"#93c5fd\";\nconst DEFAULT_COLOR_MAX = \"#1d4ed8\";\nconst DEFAULT_STROKE_WIDTH_MIN = 1;\nconst DEFAULT_STROKE_WIDTH_MAX = 4;\nconst DEFAULT_HEAD_SIZE = 6;\n\n/**\n * Bins pass/movement data by start location (`computeFlowBins`) and draws\n * one arrow per occupied bin, from the bin center toward the mean end\n * point, colored and sized by that bin's volume — mplsoccer's `flow`.\n * Unlike every other layer here, the rendered marks are aggregates rather\n * than one-per-datum, so `tooltip` takes a `FlowBin`, not a `T`.\n */\nexport function Flow<T>({\n data,\n x,\n y,\n x2,\n y2,\n binsX = DEFAULT_BINS_X,\n binsY = DEFAULT_BINS_Y,\n colorMin = DEFAULT_COLOR_MIN,\n colorMax = DEFAULT_COLOR_MAX,\n strokeWidthMin = DEFAULT_STROKE_WIDTH_MIN,\n strokeWidthMax = DEFAULT_STROKE_WIDTH_MAX,\n className,\n tooltip,\n}: FlowProps<T>) {\n const { dimensions, transform, setTooltip } = usePitchContext();\n\n const vectors = data.map((d, i) => ({\n x: resolve(x, d, i),\n y: resolve(y, d, i),\n x2: resolve(x2, d, i),\n y2: resolve(y2, d, i),\n }));\n const bins = computeFlowBins(vectors, binsX, binsY, dimensions);\n const counts = bins.map((bin) => bin.count);\n const minCount = counts.length > 0 ? Math.min(...counts) : 0;\n const maxCount = counts.length > 0 ? Math.max(...counts) : 0;\n const colorScale = createColorScale(minCount, maxCount, colorMin, colorMax);\n const countRange = maxCount - minCount || 1;\n\n return (\n <g data-pitchkit-layer=\"flow\">\n {bins.map((bin, i) => {\n const start = transform.toPixel([bin.x, bin.y]);\n const end = transform.toPixel([bin.x2, bin.y2]);\n const t = (bin.count - minCount) / countRange;\n const color = colorScale(bin.count);\n const strokeWidthValue = strokeWidthMin + (strokeWidthMax - strokeWidthMin) * t;\n const [headA, headB] = computeArrowHeadCorners(start, end, DEFAULT_HEAD_SIZE);\n\n return (\n <g\n key={i}\n onMouseEnter={\n tooltip\n ? () => setTooltip({ content: tooltip(bin, i), x: end[0], y: end[1] })\n : undefined\n }\n onMouseLeave={tooltip ? () => setTooltip(null) : undefined}\n >\n <line\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n data-pitchkit-mark=\"flow-shaft\"\n className={className}\n style={{ stroke: color, strokeWidth: strokeWidthValue }}\n />\n <polygon\n points={`${end[0]},${end[1]} ${headA[0]},${headA[1]} ${headB[0]},${headB[1]}`}\n data-pitchkit-mark=\"flow-head\"\n className={className}\n style={{ fill: color }}\n />\n </g>\n );\n })}\n </g>\n );\n}\n","import { usePitchContext } from \"./context.js\";\nimport type { PitchContextValue } from \"./context.js\";\n\n/**\n * Imperative escape hatch: returns the enclosing `<Pitch>`/`<VerticalPitch>`'s\n * dimensions, viewport, and pixel transform. Must be called from a\n * descendant of `<Pitch>` — for advanced cases (custom marks, manual\n * coordinate math) that the built-in layer components don't cover.\n */\nexport function usePitch(): Pick<PitchContextValue, \"dimensions\" | \"viewport\" | \"transform\"> {\n const { dimensions, viewport, transform } = usePitchContext();\n return { dimensions, viewport, transform };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pitchkit/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Thin React bindings for @pitchkit/core: declarative <Pitch> + layer components, responsive by default.",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"author": "Yohahn Ribeiro",
|
|
7
|
+
"homepage": "https://github.com/yribeiro/pitchkit#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/yribeiro/pitchkit.git",
|
|
11
|
+
"directory": "packages/react"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/yribeiro/pitchkit/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"football",
|
|
18
|
+
"soccer",
|
|
19
|
+
"pitch",
|
|
20
|
+
"visualization",
|
|
21
|
+
"dataviz",
|
|
22
|
+
"analytics",
|
|
23
|
+
"mplsoccer",
|
|
24
|
+
"statsbomb",
|
|
25
|
+
"react",
|
|
26
|
+
"nextjs"
|
|
27
|
+
],
|
|
6
28
|
"type": "module",
|
|
7
29
|
"sideEffects": false,
|
|
8
30
|
"exports": {
|
|
@@ -13,8 +35,13 @@
|
|
|
13
35
|
},
|
|
14
36
|
"main": "./dist/index.js",
|
|
15
37
|
"types": "./dist/index.d.ts",
|
|
38
|
+
"bin": {
|
|
39
|
+
"pitchkit": "./bin/pitchkit.mjs"
|
|
40
|
+
},
|
|
16
41
|
"files": [
|
|
17
|
-
"dist"
|
|
42
|
+
"dist",
|
|
43
|
+
"bin",
|
|
44
|
+
"skills"
|
|
18
45
|
],
|
|
19
46
|
"scripts": {
|
|
20
47
|
"build": "tsup && node scripts/add-use-client.mjs",
|