@johnmorrisdotca/kyogijo-stadiums 0.20.0 → 0.22.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.
@@ -0,0 +1,80 @@
1
+ // A ring: the raised square platform with its canvas, the ropes held by a post at each corner (with the corner pads in the boxers' colours and two neutral ones), the apron beyond the ropes and the steps up to it, from the
2
+ // rules a commission or a federation writes (the Nevada Rules of Unarmed Combat 2.050, Wisconsin's SPS 192.38, the WBC Amateur rules, Ontario's amateur rules). Boxing draws it with its own figures, and the professional
3
+ // wrestling ring will with its own. In metres, the origin at the top left of the platform, north at the top. Nothing here draws SVG.
4
+ import { box, line } from "../fields.kit.js";
5
+ import { rectArea, within } from "./kit.js";
6
+ import { emptyParts, grow, union } from "./parts.js";
7
+ /** The size the options ask for, held to what the rules allow. */
8
+ export const ringSize = (asked, fig, rule) => (asked === undefined ? fig.size.drawn : within(asked, fig.size.min, fig.size.max, "The ring", rule));
9
+ /** The platform's height the options ask for, held to what the rules allow. */
10
+ export const ringHeight = (asked, fig, rule) => (asked === undefined ? fig.platform.height.drawn : within(asked, 0, fig.platform.height.max, "The ring's platform", rule));
11
+ /** The colours of the four corners, clockwise from the top left: neutral, blue, neutral, red (the red corner at the left and near the table). */
12
+ const COLOURS = ["white", "blue", "white", "red"];
13
+ const rd = (v) => Math.round(v * 1000) / 1000;
14
+ /** The plan of the ring the options ask for. */
15
+ export function ringParts(fig, o) {
16
+ const out = fig.post.fromRopes;
17
+ // The apron reaches at least to the far side of the posts and their pads.
18
+ const apron = Math.max(fig.apron.drawn, out + fig.post.pad / 2 + 0.02);
19
+ const side = o.size + 2 * apron;
20
+ const platform = { x0: 0, y0: 0, x1: side, y1: side };
21
+ const ring = { x0: apron, y0: apron, x1: apron + o.size, y1: apron + o.size };
22
+ const parts = emptyParts();
23
+ parts.areas.push(rectArea("platform", "canvas", "ky-bud-t1", platform));
24
+ const rope = (i) => [i === 0 || i === 3 ? ring.x0 : ring.x1, i === 0 || i === 1 ? ring.y0 : ring.y1];
25
+ const corners = [0, 1, 2, 3].map((i) => {
26
+ const [rx, ry] = rope(i);
27
+ const sx = i === 0 || i === 3 ? -1 : 1;
28
+ const sy = i === 0 || i === 1 ? -1 : 1;
29
+ return { index: i, colour: COLOURS[i], post: [rd(rx + sx * out), rd(ry + sy * out)], rope: [rx, ry] };
30
+ });
31
+ // The steps: one in each boxer's corner (the red and the blue) and one in a neutral corner, on the apron's edge beside the corner.
32
+ const steps = [];
33
+ const s = fig.platform.steps;
34
+ if (o.steps && o.height > 0) {
35
+ const depth = s.treads * s.tread;
36
+ const at = (corner) => {
37
+ const c = corners[corner];
38
+ const north = corner === 0 || corner === 1;
39
+ // Beside the post, a metre and a half along the edge from the corner, towards the middle.
40
+ const cx = c.post[0] < side / 2 ? c.post[0] + 1.3 : c.post[0] - 1.3;
41
+ const b = north ? { x0: cx - s.width / 2, y0: -depth, x1: cx + s.width / 2, y1: 0 } : { x0: cx - s.width / 2, y0: side, x1: cx + s.width / 2, y1: side + depth };
42
+ steps.push({ edge: north ? "north" : "south", corner, box: b });
43
+ for (let t = 0; t < s.treads; t += 1) {
44
+ const y0 = north ? -depth + t * s.tread : side + t * s.tread;
45
+ parts.areas.push(rectArea(`step-${corner}-${t + 1}`, "steps", "ky-bud-step", { x0: b.x0, y0, x1: b.x1, y1: y0 + s.tread }));
46
+ }
47
+ };
48
+ // The red corner (bottom left), the blue corner (top right) and the neutral corner nearest the table (bottom right).
49
+ for (const corner of [3, 1, 2])
50
+ at(corner);
51
+ }
52
+ // The ropes seen from above are one line each side; each turns to its post by the extension.
53
+ const w = Math.max(fig.ropes.diameter.drawn, 0.03);
54
+ parts.shapes.push(box("ropes", "ropes", ring.x0, ring.y0, ring.x1, ring.y1, { w, cls: "ky-bud-rope", least: w }));
55
+ for (const c of corners)
56
+ parts.shapes.push(line(`rope-extension-${c.index + 1}`, "ropes", c.rope[0], c.rope[1], c.post[0], c.post[1], { w, cls: "ky-bud-rope", least: w }));
57
+ // The posts with their pads, in the corner colours (or plain when the corners are not coloured).
58
+ for (const c of corners) {
59
+ const pad = fig.post.pad;
60
+ parts.areas.push(rectArea(`corner-${c.index + 1}`, "corners", o.corners ? `ky-bud-corner-${c.colour}` : "ky-bud-pad", { x0: c.post[0] - pad / 2, y0: c.post[1] - pad / 2, x1: c.post[0] + pad / 2, y1: c.post[1] + pad / 2 }));
61
+ }
62
+ const extent = grow(union([platform, ...steps.map((x) => x.box)]), 0.6);
63
+ const mid = side / 2;
64
+ const ranges = { ropes: grow(ring, 0.3), corner: { x0: -0.4, y0: side - apron - 2.4, x1: apron + 3, y1: side + 0.6 } };
65
+ const red = corners[3];
66
+ const blue = corners[1];
67
+ const marks = [
68
+ { id: "ring-canvas", x: mid - o.size * 0.2, y: mid + o.size * 0.15, side: "bottom" },
69
+ { id: "ring-ropes", x: ring.x1, y: mid - o.size * 0.2, side: "bottom" },
70
+ { id: "ring-post", x: corners[0].post[0], y: corners[0].post[1], side: "top" },
71
+ { id: "ring-red-corner", x: red.post[0], y: red.post[1], side: "bottom" },
72
+ { id: "ring-blue-corner", x: blue.post[0], y: blue.post[1], side: "top" },
73
+ { id: "ring-apron", x: mid, y: apron / 2, side: "top" },
74
+ ];
75
+ if (steps.length > 0) {
76
+ const last = steps[steps.length - 1];
77
+ marks.push({ id: "ring-steps", x: (last.box.x0 + last.box.x1) / 2, y: side + (last.box.y1 - last.box.y0) / 2, side: "bottom" });
78
+ }
79
+ return { parts, platform, extent, centre: [mid, mid], ring, size: o.size, apron, corners, steps, height: o.height, marks, ranges };
80
+ }
@@ -1,7 +1,7 @@
1
1
  /** The sports of the budō family. */
2
2
  export type BudoKind = "judo" | "karate" | "kendo" | "sumo" | "kyudo" | "dojo" | CombatKind;
3
3
  /** The combat sports the engine of the budō also draws: the MMA cage. */
4
- export type CombatKind = "mma";
4
+ export type CombatKind = "mma" | "boxing" | "wrestling";
5
5
  /** The sides of a hall, as a plan has them: north is the top of the drawing. `top`, `bottom`, `left` and `right` say the same. */
6
6
  export type Compass = "north" | "south" | "east" | "west";
7
7
  export type Side4 = Compass | "top" | "bottom" | "left" | "right";
@@ -21,13 +21,13 @@ export interface BudoStyle {
21
21
  hall?: "budokan";
22
22
  /** Judo: `shiai` (the contest area, the default) or `kata` (the IJF's kata area, `league: "ijf-kata"`: a centre tape, two white tapes 3 m from it either side, a safety area of 2 m; with `officials`, the five judges' seats on the shomen side and the coach's chair opposite). */
23
23
  style?: "shiai" | "kata";
24
- /** Judo: the contest area's side, 8 m to 10 m. Kendo: the shiai-jo's side, 9 m to 11 m. MMA cage: the width across the flats, 6.096 m to 9.754 m (20 to 32 feet), 9.144 m (30 feet) by default; 7.62 m is the smaller cage of 25 feet. In metres. */
24
+ /** Judo: the contest area's side, 8 m to 10 m. Kendo: the shiai-jo's side, 9 m to 11 m. MMA cage: the width across the flats, 6.096 m to 9.754 m (20 to 32 feet), 9.144 m (30 feet) by default; 7.62 m is the smaller cage of 25 feet. Boxing ring: the side inside the ropes, within what the league allows (20 feet for the Nevada rule, 16 to 20 feet for Wisconsin, 4.5 to 6.1 m for the WBC Amateur rules). Wrestling: the diameter of the wrestling area (9 m for the UWW, 32 to 42 feet for the NCAA, at least 28 feet for the NFHS). In metres. */
25
25
  size?: number;
26
26
  /** Judo: the width of the safety area, 3 m or more (4 m by default). In metres. */
27
27
  safety?: number;
28
28
  /** Judo: the tatami's size. `2x1` (the IJF's, 2 m by 1 m, the default of an IJF area), `1x1` (the half tatami) or `182x91` (the AJJF's own, the default of an AJJF area). */
29
29
  tatami?: "2x1" | "1x1" | "182x91";
30
- /** Judo: the tape that marks where the contestants start. On by default for the AJJF's area and the kata area, and for the IJF's (the 2020 rules' blue and white tape). */
30
+ /** Wrestling: the starting lines of a folkstyle mat (the UWW's mat has none). On by default. Judo: the tape that marks where the contestants start. On by default for the AJJF's area and the kata area, and for the IJF's (the 2020 rules' blue and white tape). */
31
31
  start?: boolean;
32
32
  /** Judo: a solid platform under the tatami, one metre wider and longer than it. Off by default. */
33
33
  platform?: boolean;
@@ -39,7 +39,7 @@ export interface BudoStyle {
39
39
  texture?: "weave" | "none";
40
40
  /** Karate: the referee's and the judges' places. On by default. */
41
41
  judges?: boolean;
42
- /** Sumo: the height of the clay square in metres, 0.34 to 0.60. 0.55 by default. MMA cage: the platform's height over the floor of the building, 0 to 1.219 m (4 feet), 1.219 m by default. Seen in 3D. */
42
+ /** Sumo: the height of the clay square in metres, 0.34 to 0.60. 0.55 by default. MMA cage: the platform's height over the floor of the building, 0 to 1.219 m (4 feet), 1.219 m by default. Boxing ring: the same, 0 to what the league allows (5 feet in Nevada, 4 feet in Wisconsin, 1.2 m for the amateurs). Wrestling: the platform the mat stands on, none or 0.80 to 1.10 m for the UWW's mat (1 m drawn) and 0 to 1.10 m for the others (none drawn). Seen in 3D. */
43
43
  height?: number;
44
44
  /** Sumo: the four tassels of the roof, in the colours of the four quarters (green east, red south, white west, black north). Off by default. */
45
45
  tassels?: boolean;
@@ -49,8 +49,12 @@ export interface BudoStyle {
49
49
  fence?: number;
50
50
  /** MMA cage: the two gates, opposite each other (the fence is whole without them). On by default. */
51
51
  gates?: boolean;
52
- /** MMA cage: the steps up to the platform at each gate, three treads. On by default. */
52
+ /** MMA cage: the steps up to the platform at each gate, three treads. Boxing ring: the three sets of steps, one in each boxer's corner and one in a neutral corner. On by default. */
53
53
  steps?: boolean;
54
+ /** Wrestling: the circle in the middle of the mat (the UWW's central circle, the NFHS's circle of 10 feet; the NCAA has none). On by default. */
55
+ circle?: boolean;
56
+ /** Boxing ring: the posts and their pads in the corner colours (the red and the blue corner of the boxers, two neutral ones in white). On by default. */
57
+ corners?: boolean;
54
58
  /** Kyūdō: the number of shooters in a line, 1 to 12 (5 by default). */
55
59
  shooters?: number;
56
60
  /** Kyūdō: the kind of range, `kinteki` (28 m, the default) or `enteki` (60 m); `league` says it too. */
@@ -41,9 +41,19 @@ const CLASSES = `
41
41
  const COMBAT_CLASSES = `
42
42
  .kyogijo .ky-bud-step{fill:color-mix(in srgb,var(--ky-bud-floor,#43484e) 76%,#fff);stroke:var(--ky-ink);stroke-opacity:.35;stroke-width:.03}
43
43
  .kyogijo .ky-bud-pad{fill:var(--ky-ink);fill-opacity:.82}`.trim();
44
- const COMBAT = ["mma"];
44
+ /** The rules of a ring's own classes: the ropes and the corner pads in the boxers' colours. */
45
+ const RING_CLASSES = `
46
+ .kyogijo .ky-bud-rope{stroke:var(--ky-bud-rope,#f4f1e8);fill:none;stroke-linecap:round}
47
+ .kyogijo .ky-bud-corner-red{fill:var(--ky-red)}
48
+ .kyogijo .ky-bud-corner-blue{fill:var(--ky-blue,#2a5db0)}
49
+ .kyogijo .ky-bud-corner-white{fill:#f4f1e8;stroke:var(--ky-ink);stroke-opacity:.45;stroke-width:.03}`.trim();
50
+ const COMBAT = ["mma", "boxing"];
51
+ const RING = ["boxing"];
52
+ /** The rules of a wrestling mat's own class: the green neutral line of a folkstyle mat's starting lines. */
53
+ const WRESTLING_CLASSES = `.kyogijo .ky-bud-green-fill{fill:#2f9e63}`;
54
+ const WRESTLING = ["wrestling"];
45
55
  /** The custom properties of a look. */
46
- const vars = (l) => `--ky-surface:${l.surface};--ky-surface-alt:${l.alt};--ky-red:${l.red};--ky-apron:${l.apron};--ky-free:${l.free};--ky-bud-floor:${l.floor};--ky-boards:${l.boards}${l.dirt === undefined ? "" : `;--ky-dirt:${l.dirt}`}${l.sand === undefined ? "" : `;--ky-sand:${l.sand}`}${l.straw === undefined ? "" : `;--ky-bud-straw:${l.straw}`}`;
56
+ const vars = (l) => `--ky-surface:${l.surface};--ky-surface-alt:${l.alt};--ky-red:${l.red};--ky-apron:${l.apron};--ky-free:${l.free};--ky-bud-floor:${l.floor};--ky-boards:${l.boards}${l.dirt === undefined ? "" : `;--ky-dirt:${l.dirt}`}${l.sand === undefined ? "" : `;--ky-sand:${l.sand}`}${l.straw === undefined ? "" : `;--ky-bud-straw:${l.straw}`}${l.rope === undefined ? "" : `;--ky-bud-rope:${l.rope}`}`;
47
57
  /** The three rules of one look: light, dark by the device's setting, and dark by the page's `data-theme`. */
48
58
  function lookRules(sport, name) {
49
59
  const pair = BUDO_LOOKS[sport][name];
@@ -69,7 +79,7 @@ export function budoStyle(sport, look) {
69
79
  const kind = sport;
70
80
  if (BUDO_LOOKS[kind] === undefined)
71
81
  return "";
72
- return `${CLASSES}${COMBAT.includes(sport) ? `\n${COMBAT_CLASSES}` : ""}\n${look === undefined ? lookRules(kind, Object.keys(BUDO_LOOKS[kind])[0]) : lookRules(kind, look)}`;
82
+ return `${CLASSES}${COMBAT.includes(sport) ? `\n${COMBAT_CLASSES}` : ""}${RING.includes(sport) ? `\n${RING_CLASSES}` : ""}${WRESTLING.includes(sport) ? `\n${WRESTLING_CLASSES}` : ""}\n${look === undefined ? lookRules(kind, Object.keys(BUDO_LOOKS[kind])[0]) : lookRules(kind, look)}`;
73
83
  }
74
84
  /** Every budō sport's rules and every look, for a page that draws with `style: "none"` and supplies the stylesheet itself. */
75
- export const KYOGIJO_BUDO_STYLE = `${CLASSES}\n${COMBAT_CLASSES}${KYOGIJO_BUDO_GALLERY_STYLE}\n${Object.keys(BUDO_LOOKS).flatMap((sport) => Object.keys(BUDO_LOOKS[sport]).map((name) => lookRules(sport, name))).join("\n")}`;
85
+ export const KYOGIJO_BUDO_STYLE = `${CLASSES}\n${COMBAT_CLASSES}\n${RING_CLASSES}\n${WRESTLING_CLASSES}${KYOGIJO_BUDO_GALLERY_STYLE}\n${Object.keys(BUDO_LOOKS).flatMap((sport) => Object.keys(BUDO_LOOKS[sport]).map((name) => lookRules(sport, name))).join("\n")}`;
package/dist/crowd.js CHANGED
@@ -102,6 +102,10 @@ const PROFILES = {
102
102
  dojo: { shape: "bowl", side: 5, end: 5, bench: 0, corner: 8, tiers: [lower(26, 2, 14), upper(32, 58, 20, 36)], away: "corner" },
103
103
  // An MMA cage stands in the middle of an arena, with the seats rising from the ring of the floor.
104
104
  mma: { shape: "bowl", side: 40, end: 40, bench: 0, corner: 56, tiers: [lower(60, 3, 24), upper(67, 120, 32, 60)], away: "corner" },
105
+ // A boxing ring stands in the middle of an arena in the same way.
106
+ boxing: { shape: "bowl", side: 40, end: 40, bench: 0, corner: 56, tiers: [lower(60, 3, 24), upper(67, 120, 32, 60)], away: "corner" },
107
+ // A wrestling mat stands in the middle of a hall in the same way.
108
+ wrestling: { shape: "bowl", side: 36, end: 36, bench: 6, corner: 50, tiers: [lower(60, 3, 24), upper(67, 120, 32, 60)], away: "corner" },
105
109
  };
106
110
  /** The grounds of the package that are the home of an NFL or a CFL club, where a soccer pitch stands inside a gridiron's stands. From each ground's article. */
107
111
  export const GRIDIRON_GROUNDS = Object.freeze({
package/dist/draw.js CHANGED
@@ -91,7 +91,7 @@ import { abbreviate, capitals } from "./text.js";
91
91
  import { VERSION } from "./version.js";
92
92
  export { isPortrait };
93
93
  /** The sports that can be drawn, in the order a menu lists them. */
94
- export const SPORTS = ["nfl", "cfl", "ifaf", "nhl", "nba", "mlb", "soccer", "curling", "tennis", "volleyball", "badminton", "pickleball", "tabletennis", "padel", "squash", "racquetball", "sepaktakraw", "teqball", "roundnet", "netball", "swimming", "waterpolo", "diving", "artisticswimming", "athletics", "skating", "judo", "karate", "kendo", "sumo", "kyudo", "dojo", "mma", "lacrosse", "rugby", "afl", "gaelic", "cricket", "fieldhockey", "handball"];
94
+ export const SPORTS = ["nfl", "cfl", "ifaf", "nhl", "nba", "mlb", "soccer", "curling", "tennis", "volleyball", "badminton", "pickleball", "tabletennis", "padel", "squash", "racquetball", "sepaktakraw", "teqball", "roundnet", "netball", "swimming", "waterpolo", "diving", "artisticswimming", "athletics", "skating", "judo", "karate", "kendo", "sumo", "kyudo", "dojo", "mma", "boxing", "wrestling", "lacrosse", "rugby", "afl", "gaelic", "cricket", "fieldhockey", "handball"];
95
95
  /** The CSS custom property each colour of `Colors` sets. */
96
96
  export const COLOR_PROPERTIES = {
97
97
  apron: "--ky-apron",
@@ -265,7 +265,7 @@ function buildSkating(o, common) {
265
265
  /** The budō surface: its plan, drawn as it lies. A hall, a kyūdōjō and a range of mats have little ground round them. */
266
266
  function buildBudo(o, common) {
267
267
  const plan = budoPlan({ ...o, detail: common.detail });
268
- return budoSurface(common, plan, common.margin ?? (o.range === undefined ? (plan.mma === undefined ? 12 : 5) : 4));
268
+ return budoSurface(common, plan, common.margin ?? (o.range === undefined ? (plan.mma === undefined && plan.boxing === undefined && plan.wrestling === undefined ? 12 : 5) : 4));
269
269
  }
270
270
  /** One text for both ends or sides, or a pair of them. */
271
271
  const pair = (text) => (text === undefined ? undefined : typeof text === "string" ? [text, text] : text);
@@ -374,6 +374,8 @@ function buildWhole(o, portrait, id, score, scored, extra) {
374
374
  case "kyudo":
375
375
  case "dojo":
376
376
  case "mma":
377
+ case "boxing":
378
+ case "wrestling":
377
379
  return buildBudo({ ...o, sport }, common);
378
380
  default:
379
381
  throw new Error(`Unknown sport "${String(o.sport)}": use one of ${SPORTS.join(", ")}`);
@@ -609,7 +611,7 @@ function leagueAbout(league, year, language, sheet) {
609
611
  const words = KYOGIJO_STRINGS[language].league;
610
612
  if (league.family === "skating")
611
613
  return skatingAbout({ sport: "skating", league: league.id }, language);
612
- if (league.family === "judo" || league.family === "karate" || league.family === "kendo" || league.family === "sumo" || league.family === "kyudo" || league.family === "dojo" || league.family === "mma")
614
+ if (league.family === "judo" || league.family === "karate" || league.family === "kendo" || league.family === "sumo" || league.family === "kyudo" || league.family === "dojo" || league.family === "mma" || league.family === "boxing" || league.family === "wrestling")
613
615
  return budoAbout({ sport: league.family, league: league.id }, language);
614
616
  if (league.family === "athletics")
615
617
  return athleticsAbout({ sport: "athletics", league: league.id, athletics: sheet === undefined ? undefined : undefined }, language);
package/dist/features.js CHANGED
@@ -137,6 +137,23 @@ const MMA = [
137
137
  f("gates", "--ky-ink", "The swing of the two gates."),
138
138
  f("posts", "--ky-ink", "The eight padded posts."),
139
139
  ];
140
+ const BOXING = [
141
+ f("apron", "--ky-apron", "The floor of the hall round the platform."),
142
+ f("canvas", "--ky-surface", "The canvas of the platform, ring and apron."),
143
+ f("ropes", "--ky-bud-rope", "The ropes, and their extensions to the posts."),
144
+ f("steps", "--ky-bud-floor", "The steps up to the platform."),
145
+ f("corners", "--ky-ink", "The four corner posts with their pads."),
146
+ ];
147
+ const WRESTLING = [
148
+ f("apron", "--ky-apron", "The floor of the hall round the mat."),
149
+ f("platform", "--ky-bud-floor", "The platform the mat stands on."),
150
+ f("border", "--ky-surface-alt", "The matted area round the circle (the UWW's protection area)."),
151
+ f("circle", "--ky-surface", "The wrestling area, inside the circle."),
152
+ f("passivity", "--ky-red", "The orange passivity band of the UWW's mat."),
153
+ f("rim", "--ky-line", "The line that outlines a folkstyle circle."),
154
+ f("centre-circle", "--ky-line", "The circle in the middle of the mat."),
155
+ f("starting-lines", "--ky-line", "The two starting lines of a folkstyle mat with their green and red ends."),
156
+ ];
140
157
  const KYUDO = [
141
158
  f("apron", "--ky-apron", "The ground round the range."),
142
159
  f("shajo", "--ky-bud-floor", "The floor of the shajō."),
@@ -445,6 +462,8 @@ export const FEATURE_INFO = Object.freeze({
445
462
  kyudo: KYUDO,
446
463
  dojo: DOJO,
447
464
  mma: MMA,
465
+ boxing: BOXING,
466
+ wrestling: WRESTLING,
448
467
  });
449
468
  /**
450
469
  * The names of the features of each sport: the keys `featureColors` takes. Football's three fields have the same, and so have the five net sports.
@@ -24,8 +24,8 @@ export type AthleticsMark = "ky-ath-y" | "ky-ath-b" | "ky-ath-g" | "ky-ath-k" |
24
24
  export type SkatingMark = "ky-ska-b" | "ky-ska-r" | "ky-ska-k" | "ky-ska-blocks";
25
25
  /** The coloured marks of a budō surface: the white line, the blue, white and red tape, the seam between mats. */
26
26
  /** The fills of a budō surface's tape: blue, white, red and ink. */
27
- export type BudoFill = "ky-bud-blue-fill" | "ky-bud-white-fill" | "ky-bud-red-fill" | "ky-bud-ink-fill";
28
- export type BudoMark = "ky-bud-line" | "ky-bud-blue" | "ky-bud-white" | "ky-bud-red" | "ky-bud-seam" | "ky-bud-ink";
27
+ export type BudoFill = "ky-bud-blue-fill" | "ky-bud-white-fill" | "ky-bud-red-fill" | "ky-bud-ink-fill" | "ky-bud-green-fill";
28
+ export type BudoMark = "ky-bud-line" | "ky-bud-blue" | "ky-bud-white" | "ky-bud-red" | "ky-bud-seam" | "ky-bud-ink" | "ky-bud-rope";
29
29
  /** A line from one point to another. */
30
30
  export interface LineShape extends Stroked {
31
31
  kind: "line";
@@ -95,7 +95,7 @@ export type Shape = LineShape | ArcShape | RingShape | BoxShape | PolyShape | Do
95
95
  /** The areas of a skating rink: the ice, the floor of the infield, the warm-up lane, the padding and the furniture. */
96
96
  export type SkatingArea = "ky-ska-ice" | "ky-ska-floor" | "ky-ska-warm" | "ky-ska-pad" | "ky-ska-desk" | "ky-ska-kiss";
97
97
  /** The areas of a budō surface: the mats in three tones, the heri of a mat, the floor, the walls, the platform and the furniture, the clay and the sand and the straw of a dohyō, the azuchi and the yamichi. */
98
- export type BudoArea = "ky-bud-t1" | "ky-bud-t2" | "ky-bud-t3" | "ky-bud-heri" | "ky-bud-floor" | "ky-bud-wall" | "ky-bud-window" | "ky-bud-door" | "ky-bud-platform" | "ky-bud-free" | "ky-bud-desk" | "ky-bud-clay" | "ky-bud-sand" | "ky-bud-tawara" | "ky-bud-azuchi" | "ky-bud-roof" | "ky-bud-yamichi" | "ky-bud-shrine" | "ky-bud-dais" | "ky-bud-banner" | "ky-bud-lane" | "ky-bud-mato" | "ky-bud-tassel-e" | "ky-bud-tassel-s" | "ky-bud-tassel-w" | "ky-bud-tassel-n" | "ky-bud-seat" | "ky-bud-step" | "ky-bud-pad";
98
+ export type BudoArea = "ky-bud-t1" | "ky-bud-t2" | "ky-bud-t3" | "ky-bud-heri" | "ky-bud-floor" | "ky-bud-wall" | "ky-bud-window" | "ky-bud-door" | "ky-bud-platform" | "ky-bud-free" | "ky-bud-desk" | "ky-bud-clay" | "ky-bud-sand" | "ky-bud-tawara" | "ky-bud-azuchi" | "ky-bud-roof" | "ky-bud-yamichi" | "ky-bud-shrine" | "ky-bud-dais" | "ky-bud-banner" | "ky-bud-lane" | "ky-bud-mato" | "ky-bud-tassel-e" | "ky-bud-tassel-s" | "ky-bud-tassel-w" | "ky-bud-tassel-n" | "ky-bud-seat" | "ky-bud-step" | "ky-bud-pad" | "ky-bud-corner-red" | "ky-bud-corner-blue" | "ky-bud-corner-white";
99
99
  export type AthleticsArea = "ky-ath-track" | "ky-ath-grass" | "ky-ath-sand" | "ky-ath-mat" | "ky-ath-water" | "ky-ath-concrete" | "ky-ath-pad" | "ky-ath-board" | "ky-ath-bank";
100
100
  /** A painted area, under the lines: a rectangle or an ellipse filled with a class of the stylesheet (`ky-area`, the tint of a goal area, or `ky-zone`). */
101
101
  export interface Area extends Named {
@@ -37,7 +37,7 @@ export const ZONE_SETS = Object.freeze({
37
37
  "pool-lanes": { sports: ["swimming"], title: "Lanes: each lane of the pool, the whole length of it", source: "docs/sources.md#zone-sets" },
38
38
  "water-polo-areas": { sports: ["waterpolo"], title: "The goal area, the ground from 2 to 6 m, and the rest of the field, at each end", source: "docs/sources.md#zone-sets" },
39
39
  "pool-thirds": { sports: ["diving", "artisticswimming"], title: "Thirds along the pool, from the wall the boards or the judges stand at", source: "docs/sources.md#zone-sets" },
40
- "budo-areas": { sports: ["judo", "karate", "kendo", "sumo", "kyudo", "dojo", "mma"], title: "The surface in its areas: the contest and the safety areas, the boundary band, the clay and the ring of a dohyō, the shajō, the yamichi and the azuchi, a dojo's floor", source: "docs/sources.md#zone-sets" },
40
+ "budo-areas": { sports: ["judo", "karate", "kendo", "sumo", "kyudo", "dojo", "mma", "boxing", "wrestling"], title: "The surface in its areas: the contest and the safety areas, the boundary band, the clay and the ring of a dohyō, the shajō, the yamichi and the azuchi, a dojo's floor", source: "docs/sources.md#zone-sets" },
41
41
  "field-thirds": { sports: ["lacrosse", "rugby", "afl", "gaelic", "fieldhockey", "handball", "netball"], title: "Thirds: defensive, middle and attacking", source: "docs/sources.md#zone-sets" },
42
42
  "skating-track": { sports: ["skating"], title: "The rink in parts: the finish straight, the first curve, the crossing straight, the second curve and the infield (a figure skating rink in thirds)", source: "docs/sources.md#zone-sets" },
43
43
  "athletics-track": { sports: ["athletics"], title: "The track in parts: the finish straight, the first bend, the back straight, the second bend, and the infield", source: "docs/sources.md#zone-sets" },
package/dist/homeside.js CHANGED
@@ -51,6 +51,10 @@ export const HOME_FIRST = Object.freeze({
51
51
  dojo: false,
52
52
  // A cage fight is between a red corner and a blue corner: no home side.
53
53
  mma: false,
54
+ // A bout is between a red corner and a blue corner: no home side.
55
+ boxing: false,
56
+ // A bout is between a red wrestler and a blue one (the UWW) or a green and a red one (folkstyle): no home side.
57
+ wrestling: false,
54
58
  });
55
59
  /** The leagues whose convention is not their sport's: the international federation's lacrosse lists the home team first. */
56
60
  export const HOME_FIRST_LEAGUES = Object.freeze({
@@ -46,9 +46,98 @@ export declare const NRUC_CAGE: MmaFigures;
46
46
  export declare const IMMAF_CAGE: MmaFigures;
47
47
  /** The leagues of each combat sport: for each the rulebook's own first. */
48
48
  export declare const MMA_LEAGUES: readonly MmaLeague[];
49
+ /**
50
+ * The figures of a ring, in metres: the boxing ring and, with its own figures, the professional wrestling ring. A ring is a raised square platform whose canvas is bounded by ropes held by a post at each corner, with the apron
51
+ * beyond the ropes and steps up to it.
52
+ */
53
+ export interface RingFigures {
54
+ /** The ring, a square, measured inside the ropes. */
55
+ size: Span;
56
+ /** The platform: the most it may stand over the floor of the building, and the least it is drawn (0 puts the ring on the floor). */
57
+ platform: {
58
+ height: Span;
59
+ steps: {
60
+ sets: number;
61
+ treads: number;
62
+ tread: number;
63
+ width: number;
64
+ };
65
+ };
66
+ /** The apron, the canvas beyond the ropes: the least the rules ask (the drawn width is the least unless said), and the thickness of the padding under the canvas. */
67
+ apron: Span;
68
+ foam: Span;
69
+ /** The ropes: how many, their heights over the ring floor, and their thickness. */
70
+ ropes: {
71
+ count: number;
72
+ heights: readonly number[];
73
+ diameter: Span;
74
+ };
75
+ /** The corner posts: their height over the ring floor, their thickness, and how far each stands from the ropes (the ropes reach it by an extension). */
76
+ post: {
77
+ height: number;
78
+ diameter: number;
79
+ fromRopes: number;
80
+ pad: number;
81
+ };
82
+ }
83
+ /** The figures of a boxing ring, in metres. */
84
+ export interface BoxingFigures extends RingFigures {
85
+ kind: "boxing";
86
+ }
87
+ /** A boxing league: a regulation's ring. */
88
+ export type BoxingLeague = LeagueBase<"boxing", BoxingFigures>;
89
+ /** The ring of the Nevada Rules of Unarmed Combat (NRUC 2.050): 20 feet within the ropes, a floor 18 inches beyond them, a platform of at most 5 feet, posts of 58 inches over the ring floor at least 18 inches from the ropes, at least four ropes of at least 1 inch, the lowest 18 inches up. */
90
+ export declare const NRUC_RING: BoxingFigures;
91
+ /** The ring of Wisconsin's rule (SPS 192.38): 16 to 20 feet within the ropes, an apron of at least 18 inches, a platform of at most 4 feet with three sets of steps, ropes at 18, 30, 42 and 54 inches, posts at least 3 inches across and 58 inches high. */
92
+ export declare const WISCONSIN_RING: BoxingFigures;
93
+ /** The amateur ring of the WBC Amateur rules (Rule 1, 2026): 4.50 to 6.10 m within the ropes, a platform of 0.90 to 1.20 m, an apron of at least 0.50 m, ropes of 3 to 5 cm at 41, 71, 102 and 132 cm, three sets of steps. Ontario's amateur rules agree (4.9 to 6.1 m, ropes at 40, 70, 100 and 130 cm, an apron of at least 45 cm, a platform of at most 1.2 m). */
94
+ export declare const WBC_AMATEUR_RING: BoxingFigures;
95
+ /** The boxing leagues: the Nevada commission's first. */
96
+ export declare const BOXING_LEAGUES: readonly BoxingLeague[];
97
+ /**
98
+ * The figures of a wrestling mat, in metres. The UWW's mat (freestyle and Greco-Roman, which are wrestled on the same one) is a circle of 9 m with a central circle, an orange passivity band 1 m wide inside the circle and a
99
+ * protection area 1.5 m wide round it, on a platform at the great events; the folkstyle mats of the NCAA and the high schools (NFHS) are a competition circle with a matted area round it and two parallel starting lines at the middle.
100
+ */
101
+ export interface WrestlingFigures {
102
+ kind: "wrestling";
103
+ /** The wrestling area: the circle's diameter (the UWW's is fixed at 9 m; the NCAA's is 32 to 42 feet; the NFHS's is at least 28 feet). */
104
+ circle: Span;
105
+ /** The matted area round the circle (the UWW's protection area 1.5 m; the NCAA's at least 5 feet; the NFHS's about 5 feet). */
106
+ border: Span;
107
+ /** The orange passivity band inside the circle, 1 m wide (the UWW's only), and the line that outlines the circle (the NCAA's 2 inch line, which is in bounds). */
108
+ passivity: number;
109
+ rim: number;
110
+ /** The circle in the middle: the UWW's central circle of 1 m inside with a band of 10 cm; the NFHS's optional circle of 10 feet; none for the NCAA. */
111
+ centre: {
112
+ diameter: number;
113
+ band: number;
114
+ } | null;
115
+ /** The starting lines: two parallel lines of `width` and `length`, `apart` between them, closed at the ends by a green and a red line (folkstyle); null for the UWW. */
116
+ lines: {
117
+ length: number;
118
+ width: number;
119
+ apart: number;
120
+ } | null;
121
+ /** The platform the mat is installed on at the great events (the UWW: 0.80 m to 1.10 m, and at least 1 m round each side of the mat; a mat on the floor is also allowed, at the other events); the folkstyle rules give none (ours: 0 drawn, up to the UWW's greatest). `least` is the lowest a platform may be when there is one. */
122
+ platform: {
123
+ height: Span;
124
+ around: number;
125
+ least: number;
126
+ };
127
+ }
128
+ /** A wrestling league: a rule's mat. */
129
+ export type WrestlingLeague = LeagueBase<"wrestling", WrestlingFigures>;
130
+ /** The UWW's mat (Wrestling Rules, Article 4, January 2026), for freestyle, Greco-Roman and women's wrestling alike: 9 m, a 1.50 m border, an orange band of 1 m, a central circle of 1 m with a band of 10 cm, a platform of 0.80 to 1.10 m. */
131
+ export declare const UWW_MAT: WrestlingFigures;
132
+ /** The NCAA's mat (Wrestling Rules 2025-26 and 2026-27, Rule 1, Section 1): a competition circle of 32 to 42 feet, a matted area of at least 5 feet round it, the circle's edge a 2 inch line in bounds, two down-position starting lines of 1 inch, 3 feet long and 10 inches apart, closed by a green and a red neutral line. */
133
+ export declare const NCAA_MAT: WrestlingFigures;
134
+ /** The high schools' mat (NFHS Rule 2-1): a wrestling area of at least 28 feet, a safety mat of about 5 feet round it, a 10 foot circle (optional from 2024-25) and the two starting lines of 1 inch, 3 feet long and 12 inches outside to outside, closed by a green and a red line. */
135
+ export declare const NFHS_MAT: WrestlingFigures;
136
+ /** The wrestling leagues: the UWW's first. */
137
+ export declare const WRESTLING_LEAGUES: readonly WrestlingLeague[];
49
138
  /** The figures of a combat league. */
50
- export type CombatFigures = MmaFigures;
139
+ export type CombatFigures = MmaFigures | BoxingFigures | WrestlingFigures;
51
140
  /** A league with a combat surface of its own. */
52
- export type CombatLeague = MmaLeague;
141
+ export type CombatLeague = MmaLeague | BoxingLeague | WrestlingLeague;
53
142
  /** Every combat league, once each. */
54
143
  export declare const COMBAT_LEAGUES: readonly CombatLeague[];
@@ -23,5 +23,81 @@ export const MMA_LEAGUES = [
23
23
  { id: "nruc", family: "mma", name: { en: "MMA cage, Nevada Rules of Unarmed Combat", ja: "総合格闘技のケージ(ネバダ州の規則)" }, unit: "ft", figuresUnit: "m", dimensions: NRUC_CAGE, sources: ["nruc", "oar-230-070-0025", "wp-mma-cage"], builtIn: true },
24
24
  { id: "immaf", family: "mma", name: { en: "MMA cage, IMMAF amateur rules", ja: "総合格闘技のケージ(IMMAFのアマチュア規則)" }, unit: "ft", figuresUnit: "m", dimensions: IMMAF_CAGE, sources: ["immaf-amateur", "nruc"] },
25
25
  ];
26
+ const STEPS = { sets: 3, treads: 3, tread: 0.3, width: 1.2 };
27
+ /** The ring of the Nevada Rules of Unarmed Combat (NRUC 2.050): 20 feet within the ropes, a floor 18 inches beyond them, a platform of at most 5 feet, posts of 58 inches over the ring floor at least 18 inches from the ropes, at least four ropes of at least 1 inch, the lowest 18 inches up. */
28
+ export const NRUC_RING = {
29
+ kind: "boxing",
30
+ size: span(20 * FT, 20 * FT, 20 * FT),
31
+ platform: { height: span(0, 5 * FT, 4 * FT), steps: STEPS },
32
+ apron: span(18 * IN, 4 * FT, 2 * FT),
33
+ foam: span(1 * IN, 1.5 * IN, 1 * IN),
34
+ ropes: { count: 4, heights: [18 * IN, 30 * IN, 42 * IN, 54 * IN], diameter: span(1 * IN, 2 * IN, 1 * IN) },
35
+ post: { height: 58 * IN, diameter: 3 * IN, fromRopes: 18 * IN, pad: 0.3 },
36
+ };
37
+ /** The ring of Wisconsin's rule (SPS 192.38): 16 to 20 feet within the ropes, an apron of at least 18 inches, a platform of at most 4 feet with three sets of steps, ropes at 18, 30, 42 and 54 inches, posts at least 3 inches across and 58 inches high. */
38
+ export const WISCONSIN_RING = {
39
+ kind: "boxing",
40
+ size: span(16 * FT, 20 * FT, 20 * FT),
41
+ platform: { height: span(0, 4 * FT, 4 * FT), steps: STEPS },
42
+ apron: span(18 * IN, 4 * FT, 2 * FT),
43
+ foam: span(1 * IN, 1 * IN, 1 * IN),
44
+ ropes: { count: 4, heights: [18 * IN, 30 * IN, 42 * IN, 54 * IN], diameter: span(1 * IN, 2 * IN, 1 * IN) },
45
+ post: { height: 58 * IN, diameter: 3 * IN, fromRopes: 18 * IN, pad: 0.3 },
46
+ };
47
+ /** The amateur ring of the WBC Amateur rules (Rule 1, 2026): 4.50 to 6.10 m within the ropes, a platform of 0.90 to 1.20 m, an apron of at least 0.50 m, ropes of 3 to 5 cm at 41, 71, 102 and 132 cm, three sets of steps. Ontario's amateur rules agree (4.9 to 6.1 m, ropes at 40, 70, 100 and 130 cm, an apron of at least 45 cm, a platform of at most 1.2 m). */
48
+ export const WBC_AMATEUR_RING = {
49
+ kind: "boxing",
50
+ size: span(4.5, 6.1, 6.1),
51
+ platform: { height: span(0.9, 1.2, 1.2), steps: STEPS },
52
+ apron: span(0.5, 1.5, 0.5),
53
+ foam: span(0.01, 0.025, 0.02),
54
+ ropes: { count: 4, heights: [0.41, 0.71, 1.02, 1.32], diameter: span(0.03, 0.05, 0.04) },
55
+ post: { height: 1.5, diameter: 0.076, fromRopes: 0.45, pad: 0.3 },
56
+ };
57
+ /** The boxing leagues: the Nevada commission's first. */
58
+ export const BOXING_LEAGUES = [
59
+ { id: "nruc-ring", family: "boxing", name: { en: "Boxing ring, Nevada Rules of Unarmed Combat", ja: "ボクシングのリング(ネバダ州の規則)" }, unit: "ft", figuresUnit: "m", dimensions: NRUC_RING, sources: ["nruc", "wp-boxing-ring"], builtIn: true },
60
+ { id: "wisconsin", family: "boxing", name: { en: "Boxing ring, Wisconsin", ja: "ボクシングのリング(ウィスコンシン州の規則)" }, unit: "ft", figuresUnit: "m", dimensions: WISCONSIN_RING, sources: ["wi-sps-192", "wp-boxing-ring"] },
61
+ { id: "wbc-amateur", family: "boxing", name: { en: "Boxing ring, WBC Amateur rules", ja: "ボクシングのリング(WBCアマチュア規則)" }, unit: "m", dimensions: WBC_AMATEUR_RING, sources: ["wbc-amateur", "ontario-amateur-boxing"] },
62
+ ];
63
+ /** The UWW's mat (Wrestling Rules, Article 4, January 2026), for freestyle, Greco-Roman and women's wrestling alike: 9 m, a 1.50 m border, an orange band of 1 m, a central circle of 1 m with a band of 10 cm, a platform of 0.80 to 1.10 m. */
64
+ export const UWW_MAT = {
65
+ kind: "wrestling",
66
+ circle: span(9, 9, 9),
67
+ border: span(1.5, 1.5, 1.5),
68
+ passivity: 1,
69
+ rim: 0,
70
+ centre: { diameter: 1, band: 0.1 },
71
+ lines: null,
72
+ platform: { height: span(0, 1.1, 1), around: 1, least: 0.8 },
73
+ };
74
+ /** The NCAA's mat (Wrestling Rules 2025-26 and 2026-27, Rule 1, Section 1): a competition circle of 32 to 42 feet, a matted area of at least 5 feet round it, the circle's edge a 2 inch line in bounds, two down-position starting lines of 1 inch, 3 feet long and 10 inches apart, closed by a green and a red neutral line. */
75
+ export const NCAA_MAT = {
76
+ kind: "wrestling",
77
+ circle: span(32 * FT, 42 * FT, 32 * FT),
78
+ border: span(5 * FT, 10 * FT, 5 * FT),
79
+ passivity: 0,
80
+ rim: 2 * IN,
81
+ centre: null,
82
+ lines: { length: 3 * FT, width: 1 * IN, apart: 10 * IN },
83
+ platform: { height: span(0, 1.1, 0), around: 1, least: 0 },
84
+ };
85
+ /** The high schools' mat (NFHS Rule 2-1): a wrestling area of at least 28 feet, a safety mat of about 5 feet round it, a 10 foot circle (optional from 2024-25) and the two starting lines of 1 inch, 3 feet long and 12 inches outside to outside, closed by a green and a red line. */
86
+ export const NFHS_MAT = {
87
+ kind: "wrestling",
88
+ circle: span(28 * FT, 42 * FT, 28 * FT),
89
+ border: span(5 * FT, 10 * FT, 5 * FT),
90
+ passivity: 0,
91
+ rim: 2 * IN,
92
+ centre: { diameter: 10 * FT, band: 2 * IN },
93
+ lines: { length: 3 * FT, width: 1 * IN, apart: 10 * IN },
94
+ platform: { height: span(0, 1.1, 0), around: 1, least: 0 },
95
+ };
96
+ /** The wrestling leagues: the UWW's first. */
97
+ export const WRESTLING_LEAGUES = [
98
+ { id: "uww", family: "wrestling", name: { en: "Wrestling mat, UWW (freestyle and Greco-Roman)", ja: "レスリングのマット(UWW:フリースタイルとグレコローマン)" }, unit: "m", dimensions: UWW_MAT, sources: ["uww-wrestling-rules"], builtIn: true },
99
+ { id: "ncaa-wrestling", family: "wrestling", name: { en: "Wrestling mat, NCAA folkstyle", ja: "レスリングのマット(NCAA:フォークスタイル)" }, unit: "ft", figuresUnit: "m", dimensions: NCAA_MAT, sources: ["ncaa-wrestling"] },
100
+ { id: "nfhs-wrestling", family: "wrestling", name: { en: "Wrestling mat, high school folkstyle (NFHS)", ja: "レスリングのマット(NFHS:アメリカの高校のフォークスタイル)" }, unit: "ft", figuresUnit: "m", dimensions: NFHS_MAT, sources: ["nfhs-wrestling-mat", "ncaa-wrestling"] },
101
+ ];
26
102
  /** Every combat league, once each. */
27
- export const COMBAT_LEAGUES = Object.freeze([...MMA_LEAGUES]);
103
+ export const COMBAT_LEAGUES = Object.freeze([...MMA_LEAGUES, ...BOXING_LEAGUES, ...WRESTLING_LEAGUES]);
@@ -130,6 +130,13 @@ export const LEAGUE_SOURCES = Object.freeze(Object.fromEntries([
130
130
  source({ id: "oar-230-070-0025", title: "Oregon Administrative Rule 230-070-0025, Mixed Martial Arts Fenced Area or Ring", by: "Oregon Department of Consumer and Business Services", edition: "the rule as read on the date given", url: "https://oregon.public.law/rules/oar_230-070-0025", read: COMBAT_READ, note: "the fenced area is round or has at least six equal sides, 18 to 32 feet wide, a platform of at most 4 feet, at least six posts of 6 to 7 feet, at least two entrances; a second commission's rule beside Nevada's, which is the one drawn" }),
131
131
  source({ id: "immaf-amateur", title: "IMMAF Mixed Martial Arts Unified Rules for amateur, junior and senior competition: the fighting area and the fence", by: "International Mixed Martial Arts Federation", edition: "January 2021", url: "https://immaf.org/wp-content/uploads/2025/11/MMA-UNIFIED-RULES-FOR-AMATEUR-JUNIOR-SENIOR-January-2021.pdf", read: COMBAT_READ, note: "a fighting area circular or with equal sides, 20 by 20 to 32 by 32 feet, at least 40 mm of high-density foam under a vinyl cover, two gated entrances that open outward, on opposite sides if possible" }),
132
132
  source({ id: "wp-mma-cage", title: "Mixed martial arts cage (English Wikipedia), and Mixed martial arts, Fighting area: the cage called a cage or an eight-sided cage; the larger cage of 30 feet across with a 6 foot fence on a 4 foot platform, the smaller of 25 feet, foam padding along the top of the fence and between its eight sections, two gates opposite each other", by: "Wikipedia contributors (CC BY-SA 4.0), read for facts only", edition: "revision 1377260922 (Mixed martial arts cage) and revision 1381048799 (Mixed martial arts)", url: "https://en.wikipedia.org/w/index.php?title=Mixed_martial_arts_cage&oldid=1377260922", read: COMBAT_READ, note: "what is typical and not a rule: 30 feet and 25 feet across, a 6 foot fence, a 4 foot platform, eight sides, two gates opposite each other; the article says the name of one promotion's cage is a trademark, so the package names the cage for what it is" }),
133
+ source({ id: "wi-sps-192", title: "Wisconsin Administrative Code SPS 192.38, Ring (a square of 16 to 20 feet within the ropes, an apron of at least 18 inches, a platform of at most 4 feet with three sets of steps, ropes at 18, 30, 42 and 54 inches held by two spacer ties a side, posts at least 3 inches across and 58 inches over the ring floor, the ropes reaching them by an extension of at least 18 inches, a floor of 1 inch of padding under canvas)", by: "Wisconsin Department of Safety and Professional Services", edition: "SPS 192 as in force (history CR 17-016, Register No. 743, effective 1 December 2017)", url: "https://docs.legis.wisconsin.gov/document/administrativecode/SPS%20192.38", read: COMBAT_READ, note: "the ring's size range, the apron, the platform, the steps, the ropes' heights, the posts" }),
134
+ source({ id: "wbc-amateur", title: "WBC Amateur competition rules, Rule 1, The Ring (4.50 to 6.10 m inside the ropes, a platform of 0.90 to 1.20 m, an apron of at least 0.50 m, ropes of 3 to 5 cm at 41, 71, 102 and 132 cm, three sets of steps, corner colours)", by: "World Boxing Council Amateur", edition: "updated 2026 (the file of October 2025)", url: "https://wbcboxing.com/amateur/esp/wp-content/uploads/2025/10/WBC-AMATEUR-RULES-UPDATED-2026.pdf", read: COMBAT_READ, note: "the amateur ring's figures; the corner colours (red and blue for the boxers, white neutral) are its alternative colours" }),
135
+ source({ id: "ontario-amateur-boxing", title: "Amateur combative sport rules: Boxing, Part II: Competitive field of play, 1.1 to 1.1.6 (4.9 to 6.1 m inside the ropes, a platform of at most 1.2 m, an apron of at least 45 cm, ropes of 2 to 5 cm at 40, 70, 100 and 130 cm, padding of 2.5 to 3.75 cm under a canvas, the red corner on the left nearest the jury table)", by: "Ontario Ministry of Sport", edition: "published 17 December 2024, updated 22 May 2025", url: "https://www.ontario.ca/document/amateur-combative-sport-rules-boxing/part-ii-competitive-field-play", read: COMBAT_READ, note: "a second amateur rule beside the WBC's; the red corner at the left" }),
136
+ source({ id: "wp-boxing-ring", title: "Boxing ring (English Wikipedia): a square raised platform with a post at each corner, four ropes, a red corner and a blue corner; a standard ring 16 to 24 feet a side between the ropes with 2 feet outside, a platform 3 to 4 feet from the ground, ropes at 18, 30, 42 and 54 inches", by: "Wikipedia contributors (CC BY-SA 4.0), read for facts only", edition: "revision 1370389178", url: "https://en.wikipedia.org/w/index.php?title=Boxing_ring&oldid=1370389178", read: COMBAT_READ, note: "what is typical and not a rule: the 2 foot apron, the 4 foot platform, the heights of the ropes, the red and blue corners" }),
137
+ source({ id: "uww-wrestling-rules", title: "Wrestling Rules, Article 4 The Mat (a 9 m mat with a 1.50 m border of the same thickness; an orange band of 1 m inside the 9 m circle; the central circle of 1 m with a band of 10 cm; the central surface of 7 m; the platform of 0.80 to 1.10 m with at least 1 m round the mat) and Article 45 Passivity Zone", by: "United World Wrestling", edition: "January 2026", url: "https://cdn.uww.org/2026-01/wrestling_rules.pdf", read: COMBAT_READ, note: "the one mat of freestyle, Greco-Roman and women's wrestling; the wrestlers' places (red left, blue right) are not drawn" }),
138
+ source({ id: "ncaa-wrestling", title: "NCAA Wrestling Rules 2025-26 and 2026-27, Rule 1, Section 1 Mats (Art. 1 mat specifications: a competition circle of 32 to 42 feet, a matted area of at least 5 feet round it, the circle's edge a 2 inch line in bounds; Art. 3 mat markings: two 1 inch down-position starting lines 3 feet long and 10 inches apart, closed by a green and a red neutral line) and Diagram 1", by: "NCAA, Men's Wrestling Rules Committee", edition: "August 2025", url: "https://ncaaorg.s3.amazonaws.com/championships/sports/wrestling/rules/PRMWR_RulesBook.pdf", read: COMBAT_READ, note: "the college mat; the NFHS's starting lines are the same size" }),
139
+ source({ id: "nfhs-wrestling-mat", title: "Required Wrestling Mat Area (quoting NFHS Wrestling Rule 2-1-2: a wrestling area of a minimum of 28 feet in diameter with a safety mat area of approximately 5 feet wide round it)", by: "Kentucky High School Athletic Association, notice of 21 November 2014", edition: "2014 notice of the NFHS rule", url: "https://khsaa.org/?p=14520", read: COMBAT_READ, note: "the high school mat's size; the starting lines (1 inch, 3 feet long, 12 inches outside to outside, closed by a red and a green line, front line on the diameter of the 10 foot circle) are quoted from NFHS Rule 2-1-4 on https://info.resilite.com/knowledge/why-are-my-referee-/-starting-lines-not-centered, and the circle of 10 feet became optional in 2024-25 (NFHS 2-1-3 and 2-1-4: NJSIAA, Wrestling Rule Changes 2024-2025, https://njsiaa.org/sites/default/files/documents/2024-10/wrestling-rule-changes-2024-2025.pdf)" }),
133
140
  // Baseball and softball.
134
141
  source({ id: "obr-2026", title: "Official Baseball Rules, 2.01, 2.03 and 2.04 (the rules Minor League Baseball plays under)", by: "Major League Baseball", edition: "2026", url: "https://mktg.mlbstatic.com/mlb/official-information/2026-official-baseball-rules.pdf", read: READ, note: "bases 18 inches (2.03), the fence at least 325 and 400 feet (2.01 note); Minor League Baseball's own facility standards are not public" }),
135
142
  source({ id: "ncaa-baseball", title: "NCAA Baseball Rules, Rule 1, and the field diagram", by: "NCAA", edition: "2027 and 2028 rules book (printed October 2026)", url: "https://ncaaorg.s3.amazonaws.com/championships/sports/baseball/rules/PRMBA_RulesBook.pdf", read: READ, note: "90-foot square (1-2-a), recommended fence 330, 375 and 400 feet (1-2-b), boxes 4 by 6 feet (1-3-a), backstop 45 feet (1-5-b); diagram: PRMBA_Re-imagedFieldDiagrams.pdf" }),
@@ -5,7 +5,7 @@ export interface Named {
5
5
  ja: string;
6
6
  }
7
7
  /** The families of surface a league is a variant of. */
8
- export type Family = "basketball" | "hockey" | "football" | "baseball" | "curling" | "tennis" | "volleyball" | "badminton" | "pickleball" | "tabletennis" | "padel" | "squash" | "racquetball" | "sepaktakraw" | "teqball" | "roundnet" | "netball" | "lacrosse" | "rugby" | "afl" | "gaelic" | "cricket" | "fieldhockey" | "handball" | "athletics" | "skating" | "judo" | "karate" | "kendo" | "sumo" | "kyudo" | "dojo" | "mma";
8
+ export type Family = "basketball" | "hockey" | "football" | "baseball" | "curling" | "tennis" | "volleyball" | "badminton" | "pickleball" | "tabletennis" | "padel" | "squash" | "racquetball" | "sepaktakraw" | "teqball" | "roundnet" | "netball" | "lacrosse" | "rugby" | "afl" | "gaelic" | "cricket" | "fieldhockey" | "handball" | "athletics" | "skating" | "judo" | "karate" | "kendo" | "sumo" | "kyudo" | "dojo" | "mma" | "boxing" | "wrestling";
9
9
  /** The state of one marking from a season on, in a league's own history: the season it began, what it was, and its sources. */
10
10
  export interface LeagueSpan<T> {
11
11
  /** The first season it was in force, or `null` for the state before the first change that is cited. */
package/dist/leagues.d.ts CHANGED
@@ -36,7 +36,7 @@ export { WA_STANDARD_TRACK, WA_SHORT_TRACK, WA_STAGGER_TABLE, WA_SHORT_STAGGER_T
36
36
  export type { SkatingFigures, SkatingLeague, LongTrackFigures, ShortTrackFigures, FigureRinkFigures } from "./leagues/skating.ts";
37
37
  export { ISU_LONG_TRACK, ISU_SHORT_TRACK, ISU_FIGURE_RINK, ISU_LONG_TRACK_TABLE } from "./leagues/skating.ts";
38
38
  export type { BudoFigures, BudoLeague, DojoFigures, DojoLeague, JudoFigures, JudoLeague, KarateFigures, KarateLeague, KendoFigures, KendoLeague, KyudoFigures, KyudoLeague, Mat, SumoFigures, SumoLeague } from "./leagues/budo.ts";
39
- export { IMMAF_CAGE, MMA_LEAGUES, NRUC_CAGE } from "./leagues/combat.ts";
39
+ export { BOXING_LEAGUES, IMMAF_CAGE, MMA_LEAGUES, NRUC_CAGE, NCAA_MAT, NFHS_MAT, NRUC_RING, UWW_MAT, WBC_AMATEUR_RING, WISCONSIN_RING, WRESTLING_LEAGUES } from "./leagues/combat.ts";
40
40
  export { AJJF_CONTEST, BUDO_LEAGUES, ENTEKI, FIK_SHIAI_JO, IJF_CONTEST, IJF_KATA, JSA_DOHYO, KINTEKI, WKF_KATA, WKF_KUMITE } from "./leagues/budo.ts";
41
41
  export type { BadmintonFigures, BadmintonLeague, FreeZone, FreeZones, NetFigures, NetLeague, NetSport, NetballFigures, NetballLeague, PadelFigures, PadelLeague, PickleballFigures, PickleballLeague, RacquetballFigures, RacquetballLeague, RoundnetFigures, RoundnetLeague, SepakTakrawFigures, SepakTakrawLeague, SquashFigures, SquashLeague, TableTennisFigures, TableTennisLeague, TennisFigures, TennisLeague, TeqballFigures, TeqballLeague, VolleyballFigures, VolleyballLeague } from "./leagues/courts.ts";
42
42
  export type { CourtFigures, CourtMarks } from "./leagues/basketball.ts";