@johnmorrisdotca/kyogijo-stadiums 0.22.0 → 0.23.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/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ All notable changes to this project are written here. The format follows
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.23.0] - 2026-10-20
11
+
12
+ ### Added
13
+
14
+ - **The professional wrestling ring** (`sport: "prowrestling"`, [the combat sports page](./docs/combat.md)): the boxing ring's engine with three ropes that are not tied together, a canvas with an apron of a foot, a platform of 40 inches, four padded posts and steel steps at two corners. No rulebook gives a wrestling ring's figures, so every one is typical and says so: most rings are 14 to 20 feet a side between the ropes, 20 feet drawn (`budo.size`, 4.27 m to 6.10 m); the ropes are at about 1, 3 and 5 feet; the platform (`budo.height`) is 0 to 6 feet. The sources (English Wikipedia's "Wrestling ring", Dimensions.com and a 2012 description of a large promotion's ring) differ, the page says where, and the figures that cannot be right (an 8 foot top rope, posts of 9 to 10 feet) are not used. The league is `pro-ring`, the looks are the boxing ring's, `RANGES.prowrestling` has `ropes` and `half`, and in 3D the ring stands as the boxing ring does with three ropes and no ties. It is the forty-third sport.
15
+ - **A figure of a ring is now the league's:** `RingFigures` carries whether the ropes are tied and whether the corners are the boxers' (a boxing ring's are, a wrestling ring's are not), and the number of sets of steps.
16
+ - **The demo** has the ring in its sport picker, with its looks, the score and the 3D view.
17
+
18
+
10
19
  ## [0.22.0] - 2026-10-20
11
20
 
12
21
  ### Added
package/NOTICE.md CHANGED
@@ -35,7 +35,7 @@ picture or code of the sources is copied; each source is named here so that the
35
35
  | `leagues`: the skating rinks | The International Skating Union's Sports Rules - Speed Skating (Special Regulations and Technical Rules, Rules 203 to 206, 226 to 228 and 253 to 257, and "H. Track", effective 12 June 2026), Special Regulations and Technical Rules Short Track Speed Skating (Rule 280 and the diagram of the tracks, 2024) and Sports Rules - Figure Skating (Rule 342, effective 12 June 2026) | Facts; no text or drawing copied |
36
36
  | `leagues` and `halls`: the budō surfaces | The International Judo Federation's Sport and Organisation Rules (version of 21 January 2026, 8.7, Article 9, B1.8; and the June 2020 version, 18.1) and its Kata Commission's Tournament Handbook (2024) and Criteria for the Evaluation (January 2025); the All Japan Judo Federation's 大会運営ガイドブック2023; the World Karate Federation's Kumite and Kata Competition Rules (2026); the International Kendo Federation's Regulations of Kendo Shiai and Shinpan (Article 2 and Figure 1); the Japan Sumo Association's 相撲規則 土俵規定 第一条 and 大相撲クイズ, as the Sasakawa Sports Foundation and ozumo.jp quote them; the All Nippon Kyudo Federation's 弓道競技運営要領 (2016) and the National Sports Festival 2015's rules for kinteki and enteki; the tatami sizes of English and Japanese Wikipedia; the Kodokan's 施設のご案内, the Nippon Budokan's 日本武道館建物等概要 (October 2021), and English and Japanese Wikipedia and Wikidata on the five halls and the kimarite | Facts |
37
37
  | `frames`: the soccer providers' coordinates | StatsBomb's Open Data Events specification (Appendix 2), the Wyscout and Impect glossaries, the Metrica Sports and SkillCorner open-data READMEs; for Opta, Tracab and Second Spectrum, whose specifications are not public, the figures of mplsoccer, ggsoccer, kloppy and floodlight (docs/sources.md) | Facts; no text, table or code copied |
38
- | `leagues`: the MMA cage, the boxing ring and the wrestling mats | The Nevada Rules of Unarmed Combat (NRUC 5.010, the file of 20 November 2024), Oregon Administrative Rule 230-070-0025, the IMMAF's Unified Rules for amateur, junior and senior competition (January 2021), Wisconsin's SPS 192.38, the UWW's Wrestling Rules (January 2026), the NCAA's Wrestling Rules (2025-26 and 2026-27), the NFHS's mat rules as the KHSAA, Resilite and the NJSIAA quote them, the WBC Amateur competition rules (2026), Ontario's Amateur combative sport rules: Boxing (Part II), and the English Wikipedia articles "Mixed martial arts cage" (revision 1377260922), "Mixed martial arts" (revision 1381048799) and "Boxing ring" (revision 1370389178), for the sizes that are typical | Facts, CC BY-SA 4.0 for the Wikipedia text read |
38
+ | `leagues`: the MMA cage, the boxing ring the wrestling mats and the professional wrestling ring | The Nevada Rules of Unarmed Combat (NRUC 5.010, the file of 20 November 2024), Oregon Administrative Rule 230-070-0025, the IMMAF's Unified Rules for amateur, junior and senior competition (January 2021), Wisconsin's SPS 192.38, the UWW's Wrestling Rules (January 2026), the NCAA's Wrestling Rules (2025-26 and 2026-27), the NFHS's mat rules as the KHSAA, Resilite and the NJSIAA quote them, the WBC Amateur competition rules (2026), Ontario's Amateur combative sport rules: Boxing (Part II), Dimensions.com's professional wrestling ring page, a 2012 blog's description of a large promotion's ring, and the English Wikipedia articles "Wrestling ring" (revision 1379090810), "Mixed martial arts cage" (revision 1377260922), "Mixed martial arts" (revision 1381048799) and "Boxing ring" (revision 1370389178), for the sizes that are typical | Facts, CC BY-SA 4.0 for the Wikipedia text read |
39
39
  | `parks`: the fence of each ballpark, current and past, and the seasons of a past park | The distances (and, for a park whose fence moved, the years an article dates them) published in the English and Japanese Wikipedia article of each park, at the revision cited below; the seasons a club played there from the same article's list of tenants | Facts. The articles are CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/); none of their text, tables or images is used, and the angles between the distances are our own reading |
40
40
  | `parks`: the Wikidata item of each ballpark (`wikidata`) | The item (`Q49136`) that each cited article is linked to, read with the MediaWiki API (`pageprops`, `wikibase_item`) and checked against the item's label | Wikidata's data is CC0 (https://creativecommons.org/publicdomain/zero/1.0/) |
41
41
  | `parks` and `grounds`: the names (`name`, `nameJa`, `readingJa`, `localName`, `aliases`) | The names are facts. Each alias says where it was read (`source`): the title of the English or Japanese Wikipedia article a place cites (with its revision), a name the infobox or the opening text of the same revision gives (a former or sponsor's name with the years it dates, a nickname, the name in Japanese and its reading), or Wikidata's labels, aliases and properties "official name" (P1448), "nickname" (P1449), "name" (P2561), "short name" (P1813), read with the Wikidata API by `scripts/fetch-names.mjs` into `scripts/names.wikidata.json` | Facts; Wikidata's data is CC0 (https://creativecommons.org/publicdomain/zero/1.0/), and the articles are CC BY-SA 4.0 as above, none of their text copied. Which name is the everyday one is our reading, in docs/references.md ("Names") |
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <h1 align="center">Kyogijo Stadiums <sub>競技場</sub></h1>
2
2
 
3
3
  <p align="center"><strong>Sports surfaces as SVG, drawn to scale, with the score on them.</strong><br>
4
- The surfaces of forty-two sports, from football and curling to the budō and the combat sports, each drawn from its rulebook or its published distances, with each team's name and logo on its side and the score in the middle, a lineup, stands and a crowd, a pageant of flags and a 3D view. Wide or tall, light or dark, a badge for a list, a helper for React, a custom element and a frame for a page that runs no script. One function, no dependencies.</p>
4
+ The surfaces of forty-three sports, from football and curling to the budō and the combat sports, each drawn from its rulebook or its published distances, with each team's name and logo on its side and the score in the middle, a lineup, stands and a crowd, a pageant of flags and a 3D view. Wide or tall, light or dark, a badge for a list, a helper for React, a custom element and a frame for a page that runs no script. One function, no dependencies.</p>
5
5
 
6
6
  <p align="center">
7
7
  <a href="https://github.com/johnmorrisdotca/kyogijo-stadiums/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/johnmorrisdotca/kyogijo-stadiums/actions/workflows/ci.yml/badge.svg"></a>
@@ -72,7 +72,7 @@ console.log(svg.startsWith("<svg"), svg.includes("USA 3, Canada 2"));
72
72
 
73
73
  ## Features
74
74
 
75
- - **Forty-two surfaces, to scale.** The NFL, CFL and IFAF fields, the NHL rink, the NBA court, the soccer pitch and futsal court, the baseball field, the curling sheet, twelve net and racket sports, the pools, the athletics stadium, the skating rinks, seven field sports, the budō, the MMA cage, the boxing ring and the wrestling mats. Every figure is cited in [sources](./docs/sources.md). [The surfaces](./docs/surfaces.md).
75
+ - **Forty-three surfaces, to scale.** The NFL, CFL and IFAF fields, the NHL rink, the NBA court, the soccer pitch and futsal court, the baseball field, the curling sheet, twelve net and racket sports, the pools, the athletics stadium, the skating rinks, seven field sports, the budō, the MMA cage, the rings and the wrestling mats. Every figure is cited in [sources](./docs/sources.md). [The surfaces](./docs/surfaces.md).
76
76
  - **Each league's rulebook.** `league: "fiba"` draws a court as FIBA marks it: 48 variants, from the WNBA, the NCAA and the IIHF to Little League, PONY, softball, Curling Canada, FIVB's beach volleyball, rugby league and the NLL's box lacrosse, each cited. [League variants](./docs/variants.md).
77
77
  - **A realistic basketball floor.** `court: { hardwood: true }` draws maple boards that run the length of the court with staggered ends, grain, stained keys, the baskets and stanchions with soft shadows, a coaching box and benches, and a satin sheen, in every league and renderer. The clean floor stays the default. [Hardwood](./docs/hardwood.md).
78
78
  - **The stands and the crowd.** `crowd: true` draws the seating round any surface that has spectators: a bowl, two sides, a horseshoe, courtside rows or a ballpark's grandstands, with the people as seeded heads and shoulders in the home colours and the empty seats showing (`density`, or `attendance` over `capacity`). [The crowd](./docs/crowd.md).
@@ -98,15 +98,15 @@ console.log(svg.startsWith("<svg"), svg.includes("USA 3, Canada 2"));
98
98
  - **Zoom to a part of a surface.** `range: "offensive-zone"` crops a drawing to a rink's zone, a half court, the paint, the red zone, a soccer half, third or penalty area, the infield, a curling house, or a box of your own in any frame, with its data, heat, labels and score following. [Display ranges](./docs/ranges.md).
99
99
  - **Wide, tall or fit the box.** Every surface lies wide or tall: tall turns it a quarter, keeps every word upright and puts the teams top and bottom. With `orientation: "auto"` the browser helpers follow the box.
100
100
  - **Where a point lies, by the rules, and a click as a place.** `zoneAt("nhl", [69, 22], { frame: "nhl-api" })` names the zone and the area in it from the surface's own figures, with `isThreePointer`, `inSlot`, `isFair`, `isHomeRun` and the like; `clientPointToField(svg, x, y, { provider })` is a pointer's place in any of the frames, with the zone. [Zones](./docs/zones.md), [pointing](./docs/pointer.md).
101
- - **Goals, the strike zone and the stumps, end-on.** A goal mouth for six sports with the shots laid on it and its zones, the catcher's view of the strike zone with its pitches numbered, and the wicket from the bowler's end with its line and length zones. [Targets](./docs/targets.md).
102
- - **Data on the surface.** Points, lines, arrows, text, heat maps, hexagons, zone charts and density contours over any surface, in its feet or a data provider's frame, cut to its outline, with a table for each layer; ready-made shot and pass charts. [Data layers](./docs/layers.md), [charts](./docs/charts.md).
103
- - **Small multiples and backgrounds.** `drawGrid` puts many drawings in one SVG, under a title and a subtitle, over a credit line, with a key they share, in a size for a social card, a square post or a phone; `background` lays a quiet pattern (felt, grass, wood, ice, paper, a grid, dots) or a photograph behind a drawing or a grid. [Layouts and backgrounds](./docs/layouts.md).
104
- - **Tournament layouts.** Several surfaces laid out together for one large event, to scale, on one floor, as one SVG: thirteen presets from table tennis, pickleball, curling, judo, karate, badminton and tennis, each with its rule and sources, whether it fits a hall, and a real stadium round it. [Tournament layouts](./docs/multi.md).
101
+ - **Goals, the strike zone and the stumps, end-on.** A goal mouth for six sports with the shots laid on it, the catcher's view of the strike zone with its pitches numbered, and the wicket from the bowler's end with its zones. [Targets](./docs/targets.md).
102
+ - **Data on the surface.** Points, lines, arrows, text, heat maps, hexagons, zone charts and density contours over any surface, in its own feet or a provider's frame; ready-made shot and pass charts. [Data layers](./docs/layers.md), [charts](./docs/charts.md).
103
+ - **Small multiples and backgrounds.** `drawGrid` puts many drawings in one SVG, under a title and a subtitle, over a credit line, with a key they share, in a size for a card or a phone; `background` lays a quiet pattern or a photograph behind a drawing or a grid. [Layouts and backgrounds](./docs/layouts.md).
104
+ - **Tournament layouts.** Several surfaces laid out together for one large event, to scale, on one floor, as one SVG: thirteen presets from table tennis, pickleball, curling, judo, karate, badminton and tennis, each with its rule and sources, and a stadium round it. [Tournament layouts](./docs/multi.md).
105
105
  - **Judging assignments.** Who judges where. [Judging](./docs/judging.md).
106
- - **Replay.** Tracking data played on any surface: the players with their numbers, the ball and its trail, and the passes, shots and goals as they happen, with controls, the keyboard and a live region, steps for a reader who prefers reduced motion, and a pause when the page is hidden. [Replay](./docs/replay.md).
107
- - **A 3D view.** Any surface as a floor that turns by mouse, touch, wheel or keys, with four viewpoints (overhead, broadcast, end-on, low corner), and what the rulebook stands on it at its height (nets, baskets, rink boards and glass, goals, a ballpark's fence, a pool's blocks, a table tennis area's surrounds) and the venue round it (raked stands, roofs, a dojo's walls). Plain DOM and CSS. [The 3D view](./docs/turn.md).
108
- - **Renderers.** The same drawing as plain data (a scene), on a canvas (a browser's or a Node canvas), in a d3 selection, as a mark of an Observable Plot, as GeoJSON and as a PNG in Node, each an entry of its own that imports nothing from outside the package. [Renderers](./docs/renderers.md).
109
- - **Units and frames.** Each surface in its rulebook's unit and any other, and 48 coordinate frames (ten soccer providers, the NHL API, HockeyTech, NBA stats, NFL tracking, MLBAM, Retrosheet, and a place from the net, the centre or the middle of the water of each other surface) to move a provider's points onto a surface. [Units](./docs/units.md), [coordinate frames](./docs/frames.md).
106
+ - **Replay.** Tracking data played on any surface: the players, the ball and its trail, and the passes, shots and goals as they happen, with controls, the keyboard and a live region, and steps for a reader who prefers reduced motion. [Replay](./docs/replay.md).
107
+ - **A 3D view.** Any surface as a floor that turns by mouse, touch, wheel or keys, with four viewpoints (overhead, broadcast, end-on, low corner), and what the rulebook stands on it at its height (nets, baskets, boards and glass, goals, a fence, a cage's mesh, a ring's ropes) and the venue round it (raked stands, roofs, a dojo's walls). [The 3D view](./docs/turn.md).
108
+ - **Renderers.** The same drawing as plain data (a scene), on a canvas (a browser's or a Node canvas), in a d3 selection, as a mark of an Observable Plot, as GeoJSON and as a PNG in Node, each an entry of its own. [Renderers](./docs/renderers.md).
109
+ - **Units and frames.** Each surface in its rulebook's unit and any other, and 48 coordinate frames (ten soccer providers, the NHL API, HockeyTech, NBA stats, NFL tracking, MLBAM, Retrosheet, and one for each other surface) to move a provider's points onto a surface. [Units](./docs/units.md), [coordinate frames](./docs/frames.md).
110
110
  - **A compact badge and a compact card.** One strip for a list, or the surface with that strip under it.
111
111
  - **Light and dark**, by the device or the page, and every colour a custom property; eight named looks, colours by feature, line widths and dashes, goal styles and mowing patterns, and arrows, axes and labels for teaching. [Theming](./docs/theming.md), [annotations](./docs/annotations.md).
112
112
  - **Accessible.** Each drawing is an `img` with a title and a description that say the surface and the result, in English or Japanese. [Accessibility](./docs/accessibility.md).
@@ -119,7 +119,7 @@ console.log(svg.startsWith("<svg"), svg.includes("USA 3, Canada 2"));
119
119
  | Part | What it is |
120
120
  | --- | --- |
121
121
  | `drawKyogijo`, `drawSurface`, `drawScore`, `drawBadge` | The drawing, as a string of SVG. |
122
- | `SPORTS`, `PARKS`, `PARK_IDS`, `COURT_THEMES` | The forty-two sports, the 94 ballparks, the court looks. |
122
+ | `SPORTS`, `PARKS`, `PARK_IDS`, `COURT_THEMES` | The forty-three sports, the 94 ballparks, the court looks. |
123
123
  | `SOCCER_PITCHES`, `SOCCER_PROVIDERS`, `rescale`, `soccerSpec` | The soccer pitches, the data providers' coordinate systems and the map between them. |
124
124
  | `GROUNDS`, `groundById` | The 64 soccer grounds, each pitch at its own size. |
125
125
  | `EVENTS`, `eventOptions` | The 18 special games: a rink in a ballpark, a court on a carrier's deck, with `host` and `placement` in the options. |
@@ -233,7 +233,7 @@ console.log(box(wide), box(tall));
233
233
  <br><em>The same game tall: the teams top and bottom, every word upright.</em>
234
234
  </p>
235
235
 
236
- [The surfaces](./docs/surfaces.md) lists the forty-two, with their sizes and what is drawn; [score and layout](./docs/score.md) has the options of a score, a strip and a compact card.
236
+ [The surfaces](./docs/surfaces.md) lists the forty-three, with their sizes and what is drawn; [score and layout](./docs/score.md) has the options of a score, a strip and a compact card.
237
237
 
238
238
  ### A league's rulebook
239
239
 
@@ -615,7 +615,7 @@ A table in the ITTF's playing area, 14 m by 7 m, with surrounds and chairs ([cou
615
615
 
616
616
  ### The combat sports
617
617
 
618
- An MMA cage, a boxing ring and wrestling mats ([the combat sports page](./docs/combat.md)).
618
+ An MMA cage, rings and wrestling mats ([the combat sports page](./docs/combat.md)).
619
619
 
620
620
  <p align="center">
621
621
  <picture>
@@ -649,6 +649,14 @@ An MMA cage, a boxing ring and wrestling mats ([the combat sports page](./docs/c
649
649
  <br><em>The UWW's mat in 3D.</em>
650
650
  </p>
651
651
 
652
+ <p align="center">
653
+ <picture>
654
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/prowrestling-ring-3d-desk-dark.webp">
655
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/prowrestling-ring-3d-desk-light.webp" alt="A professional wrestling ring in 3D with three ropes" width="660">
656
+ </picture>
657
+ <br><em>A wrestling ring in 3D.</em>
658
+ </p>
659
+
652
660
  ### The element in a page
653
661
 
654
662
  ```html
@@ -722,7 +730,7 @@ Nothing is branded. The drawing is coloured by custom properties on its `svg`, w
722
730
 
723
731
  ## Limits
724
732
 
725
- Each is held by a test: forty-two sports, ten soccer pitches and ten providers, 94 ballparks, 64 grounds, six units, forty-eight frames, a drawing of under 22 kB. The table, made from the code, is [limits](./docs/limits.md).
733
+ Each is held by a test: forty-three sports, ten soccer pitches and ten providers, 94 ballparks, 64 grounds, six units, forty-eight frames, a drawing of under 22 kB. The table, made from the code, is [limits](./docs/limits.md).
726
734
 
727
735
  ## Accessibility
728
736
 
@@ -45,6 +45,11 @@ export function budoAbout(o, language, plan = budoPlan(o)) {
45
45
  const platform = L.height > 0.0005 ? fill(words.boxingPlatform, { height: cm(L.height) }) : words.boxingFloor;
46
46
  return fill(words.boxing, { size: trim(L.size), feet: trim(L.size / 0.3048), apron: cm(L.apron), platform });
47
47
  }
48
+ if (plan.prowrestling !== undefined) {
49
+ const L = plan.prowrestling;
50
+ const platform = L.height > 0.0005 ? fill(words.boxingPlatform, { height: cm(L.height) }) : words.boxingFloor;
51
+ return fill(words.prowrestling, { size: trim(L.size), feet: trim(L.size / 0.3048), apron: cm(L.apron), platform });
52
+ }
48
53
  if (plan.wrestling !== undefined) {
49
54
  const L = plan.wrestling;
50
55
  const fig = plan.figures;
@@ -91,6 +96,11 @@ export function budoSentences(o, language, plan = budoPlan(o)) {
91
96
  if (plan.mma.steps.length > 0)
92
97
  out.push(words.mmaSteps);
93
98
  }
99
+ if (plan.prowrestling !== undefined) {
100
+ out.push(words.prowrestlingRopes);
101
+ if (plan.prowrestling.steps.length > 0)
102
+ out.push(words.prowrestlingSteps);
103
+ }
94
104
  if (plan.wrestling !== undefined) {
95
105
  const fig = plan.figures;
96
106
  if (fig.centre !== null && o.budo?.circle !== false)
@@ -32,6 +32,12 @@ const DOJO_ONLY = {
32
32
  "yellow-green": pair({ ...COMMON, surface: "#e8d98e", alt: "#5f9a52", red: "#c8462a" }),
33
33
  "green-orange": pair({ ...COMMON, surface: "#6fa352", alt: "#69a04f", red: "#d4572a" }),
34
34
  };
35
+ /** The ring's canvas over the dark skirt of its platform: a pale canvas with dark red ropes (the default), a blue one and a black one with white ropes. Ours: the rules do not paint a ring. */
36
+ const RING_LOOKS = {
37
+ white: lifted(pair({ ...COMMON, surface: "#e6e3da", alt: "#d4d0c4", red: "#b32a2f", floor: "#2d3a56", rope: "#b32a2f" }), "#3b4a6e"),
38
+ blue: lifted(pair({ ...COMMON, surface: "#3a68ad", alt: "#2b528d", red: "#b32a2f", floor: "#1f3358", rope: "#f4f1e8" }), "#324a78"),
39
+ black: lifted(pair({ ...COMMON, surface: "#2b2e33", alt: "#1f2226", red: "#b32a2f", floor: "#17191c", rope: "#f4f1e8" }), "#3b3f45"),
40
+ };
35
41
  /** The looks of each sport: the names, the default first, and the colours. */
36
42
  export const BUDO_LOOKS = Object.freeze({
37
43
  judo: MATS,
@@ -53,11 +59,8 @@ export const BUDO_LOOKS = Object.freeze({
53
59
  blue: lifted(pair({ ...COMMON, surface: "#3a68ad", alt: "#2b528d", red: "#b32a2f", floor: "#2c3440" }), "#3a4452"),
54
60
  },
55
61
  // The ring's canvas over the dark skirt of its platform: a pale canvas with dark red ropes (the default), a blue one and a black one with white ropes. Ours: the rules do not paint a ring.
56
- boxing: {
57
- white: lifted(pair({ ...COMMON, surface: "#e6e3da", alt: "#d4d0c4", red: "#b32a2f", floor: "#2d3a56", rope: "#b32a2f" }), "#3b4a6e"),
58
- blue: lifted(pair({ ...COMMON, surface: "#3a68ad", alt: "#2b528d", red: "#b32a2f", floor: "#1f3358", rope: "#f4f1e8" }), "#324a78"),
59
- black: lifted(pair({ ...COMMON, surface: "#2b2e33", alt: "#1f2226", red: "#b32a2f", floor: "#17191c", rope: "#f4f1e8" }), "#3b3f45"),
60
- },
62
+ boxing: RING_LOOKS,
63
+ prowrestling: RING_LOOKS,
61
64
  // The wrestling mat's colours: the circle over the border (a UWW mat's protection area is a different colour from the mat, as its rules say), with the passivity band orange in every look. Ours.
62
65
  wrestling: {
63
66
  "blue-red": lifted(pair({ ...COMMON, surface: "#2f6db0", alt: "#c0392b", red: "#f07a1a", floor: "#2e3138" }), "#3b3f48"),
@@ -54,6 +54,7 @@ export interface BudoPlan {
54
54
  mma?: CageLayout;
55
55
  boxing?: RingLayout;
56
56
  wrestling?: MatLayout;
57
+ prowrestling?: RingLayout;
57
58
  }
58
59
  /** The sports of the budō family. */
59
60
  export declare const BUDO_SPORTS: readonly BudoKind[];
package/dist/budo/plan.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { chooseLeague } from "../leagues.js";
2
2
  import { BUDO_LEAGUES, DOJO_LEAGUES, JUDO_LEAGUES, KARATE_LEAGUES, KENDO_LEAGUES, KYUDO_LEAGUES, SUMO_LEAGUES } from "../leagues/budo.js";
3
- import { BOXING_LEAGUES, MMA_LEAGUES, WRESTLING_LEAGUES } from "../leagues/combat.js";
3
+ import { BOXING_LEAGUES, MMA_LEAGUES, PRO_WRESTLING_LEAGUES, WRESTLING_LEAGUES } from "../leagues/combat.js";
4
4
  import { dojoLayout, dojoLeague, dojoSpecOf } from "./dojo.js";
5
5
  import { contestOf, gridOf, judoParts, matOf, safetyOf, snapTo } from "./judo.js";
6
6
  import { karateParts } from "./karate.js";
@@ -21,12 +21,12 @@ export const BUDO_SPORTS = Object.freeze(["judo", "karate", "kendo", "sumo", "ky
21
21
  /** True for a sport of the budō family. */
22
22
  export const isBudoSport = (sport) => BUDO_SPORTS.includes(sport);
23
23
  /** The combat sports the engine of the budō also draws: the MMA cage and the boxing ring. */
24
- export const COMBAT_SPORTS = Object.freeze(["mma", "boxing", "wrestling"]);
24
+ export const COMBAT_SPORTS = Object.freeze(["mma", "boxing", "wrestling", "prowrestling"]);
25
25
  /** True for a combat sport (the MMA cage). */
26
26
  export const isCombatSport = (sport) => COMBAT_SPORTS.includes(sport);
27
27
  /** True for a sport this engine draws: a sport of the budō or a combat sport. */
28
28
  export const isMatSport = (sport) => isBudoSport(sport) || isCombatSport(sport);
29
- const OWN = { judo: JUDO_LEAGUES, karate: KARATE_LEAGUES, kendo: KENDO_LEAGUES, sumo: SUMO_LEAGUES, kyudo: KYUDO_LEAGUES, dojo: DOJO_LEAGUES, mma: MMA_LEAGUES, boxing: BOXING_LEAGUES, wrestling: WRESTLING_LEAGUES };
29
+ const OWN = { judo: JUDO_LEAGUES, karate: KARATE_LEAGUES, kendo: KENDO_LEAGUES, sumo: SUMO_LEAGUES, kyudo: KYUDO_LEAGUES, dojo: DOJO_LEAGUES, mma: MMA_LEAGUES, boxing: BOXING_LEAGUES, wrestling: WRESTLING_LEAGUES, prowrestling: PRO_WRESTLING_LEAGUES };
30
30
  /** What `budo.style` asks of a judo area: true for a kata area, false for a contest area, undefined for neither said. @throws TypeError for a value that is not `shiai` or `kata`. */
31
31
  function kataOf(style) {
32
32
  if (style === undefined)
@@ -141,6 +141,13 @@ export function budoPlan(o) {
141
141
  const ranges = { ...L.ranges, half: halves(L.platform) };
142
142
  return finish({ box: L.platform, extent: L.extent, areas: L.parts.areas, shapes: L.parts.shapes, lineWidth: f.ropes.diameter.drawn, ranges, marks: L.marks, centre: { x: L.centre[0], y: L.centre[1], r: L.size * 0.2 }, boxing: L });
143
143
  }
144
+ case "prowrestling": {
145
+ const f = fig;
146
+ const rule = "what rings are typically made as";
147
+ const L = ringParts(f, { size: ringSize(style.size, f, rule), height: ringHeight(style.height, f, rule), steps: flag(style.steps, true, "budo.steps"), corners: flag(style.corners, true, "budo.corners") });
148
+ const ranges = { ropes: L.ranges.ropes, half: halves(L.platform) };
149
+ return finish({ box: L.platform, extent: L.extent, areas: L.parts.areas, shapes: L.parts.shapes, lineWidth: f.ropes.diameter.drawn, ranges, marks: L.marks, centre: { x: L.centre[0], y: L.centre[1], r: L.size * 0.2 }, prowrestling: L });
150
+ }
144
151
  case "wrestling": {
145
152
  const f = fig;
146
153
  const rule = `the rules of ${league.id === "uww" ? "the UWW" : league.id === "ncaa-wrestling" ? "the NCAA" : "the NFHS"}`;
package/dist/budo/ring.js CHANGED
@@ -45,8 +45,8 @@ export function ringParts(fig, o) {
45
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
46
  }
47
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])
48
+ // The red corner (bottom left), the blue corner (top right) and the neutral corner nearest the table (bottom right); a ring with fewer sets has the first of them.
49
+ for (const corner of [3, 1, 2].slice(0, s.sets))
50
50
  at(corner);
51
51
  }
52
52
  // The ropes seen from above are one line each side; each turns to its post by the extension.
@@ -68,10 +68,13 @@ export function ringParts(fig, o) {
68
68
  { id: "ring-canvas", x: mid - o.size * 0.2, y: mid + o.size * 0.15, side: "bottom" },
69
69
  { id: "ring-ropes", x: ring.x1, y: mid - o.size * 0.2, side: "bottom" },
70
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
71
  { id: "ring-apron", x: mid, y: apron / 2, side: "top" },
74
72
  ];
73
+ // A boxing ring's corners are the two boxers' and two neutral ones; a wrestling ring's are not assigned, and its platform is named instead.
74
+ if (fig.boxerCorners)
75
+ marks.push({ id: "ring-red-corner", x: red.post[0], y: red.post[1], side: "bottom" }, { id: "ring-blue-corner", x: blue.post[0], y: blue.post[1], side: "top" });
76
+ else if (o.height > 0)
77
+ marks.push({ id: "ring-platform", x: platform.x1 - 0.2, y: mid + o.size * 0.3, side: "bottom" });
75
78
  if (steps.length > 0) {
76
79
  const last = steps[steps.length - 1];
77
80
  marks.push({ id: "ring-steps", x: (last.box.x0 + last.box.x1) / 2, y: side + (last.box.y1 - last.box.y0) / 2, side: "bottom" });
@@ -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" | "boxing" | "wrestling";
4
+ export type CombatKind = "mma" | "boxing" | "wrestling" | "prowrestling";
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";
@@ -47,8 +47,8 @@ const RING_CLASSES = `
47
47
  .kyogijo .ky-bud-corner-red{fill:var(--ky-red)}
48
48
  .kyogijo .ky-bud-corner-blue{fill:var(--ky-blue,#2a5db0)}
49
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"];
50
+ const COMBAT = ["mma", "boxing", "prowrestling"];
51
+ const RING = ["boxing", "prowrestling"];
52
52
  /** The rules of a wrestling mat's own class: the green neutral line of a folkstyle mat's starting lines. */
53
53
  const WRESTLING_CLASSES = `.kyogijo .ky-bud-green-fill{fill:#2f9e63}`;
54
54
  const WRESTLING = ["wrestling"];
package/dist/crowd.js CHANGED
@@ -106,6 +106,8 @@ const PROFILES = {
106
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
107
  // A wrestling mat stands in the middle of a hall in the same way.
108
108
  wrestling: { shape: "bowl", side: 36, end: 36, bench: 6, corner: 50, tiers: [lower(60, 3, 24), upper(67, 120, 32, 60)], away: "corner" },
109
+ // A wrestling ring stands in the middle of an arena as a boxing ring does.
110
+ prowrestling: { shape: "bowl", side: 40, end: 40, bench: 0, corner: 56, tiers: [lower(60, 3, 24), upper(67, 120, 32, 60)], away: "corner" },
109
111
  };
110
112
  /** 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. */
111
113
  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", "boxing", "wrestling", "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", "prowrestling", "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 && plan.boxing === undefined && plan.wrestling === undefined ? 12 : 5) : 4));
268
+ return budoSurface(common, plan, common.margin ?? (o.range === undefined ? (plan.mma === undefined && plan.boxing === undefined && plan.wrestling === undefined && plan.prowrestling === 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);
@@ -376,6 +376,7 @@ function buildWhole(o, portrait, id, score, scored, extra) {
376
376
  case "mma":
377
377
  case "boxing":
378
378
  case "wrestling":
379
+ case "prowrestling":
379
380
  return buildBudo({ ...o, sport }, common);
380
381
  default:
381
382
  throw new Error(`Unknown sport "${String(o.sport)}": use one of ${SPORTS.join(", ")}`);
@@ -611,7 +612,7 @@ function leagueAbout(league, year, language, sheet) {
611
612
  const words = KYOGIJO_STRINGS[language].league;
612
613
  if (league.family === "skating")
613
614
  return skatingAbout({ sport: "skating", league: league.id }, language);
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")
615
+ 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" || league.family === "prowrestling")
615
616
  return budoAbout({ sport: league.family, league: league.id }, language);
616
617
  if (league.family === "athletics")
617
618
  return athleticsAbout({ sport: "athletics", league: league.id, athletics: sheet === undefined ? undefined : undefined }, language);
package/dist/features.js CHANGED
@@ -154,6 +154,13 @@ const WRESTLING = [
154
154
  f("centre-circle", "--ky-line", "The circle in the middle of the mat."),
155
155
  f("starting-lines", "--ky-line", "The two starting lines of a folkstyle mat with their green and red ends."),
156
156
  ];
157
+ const PROWRESTLING = [
158
+ f("apron", "--ky-apron", "The floor of the hall round the platform."),
159
+ f("canvas", "--ky-surface", "The canvas of the platform, ring and apron."),
160
+ f("ropes", "--ky-bud-rope", "The three ropes, and their extensions to the posts."),
161
+ f("steps", "--ky-bud-floor", "The steps beside the platform."),
162
+ f("corners", "--ky-ink", "The four corner posts with their pads."),
163
+ ];
157
164
  const KYUDO = [
158
165
  f("apron", "--ky-apron", "The ground round the range."),
159
166
  f("shajo", "--ky-bud-floor", "The floor of the shajō."),
@@ -464,6 +471,7 @@ export const FEATURE_INFO = Object.freeze({
464
471
  mma: MMA,
465
472
  boxing: BOXING,
466
473
  wrestling: WRESTLING,
474
+ prowrestling: PROWRESTLING,
467
475
  });
468
476
  /**
469
477
  * 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.
@@ -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", "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" },
40
+ "budo-areas": { sports: ["judo", "karate", "kendo", "sumo", "kyudo", "dojo", "mma", "boxing", "wrestling", "prowrestling"], 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
@@ -55,6 +55,8 @@ export const HOME_FIRST = Object.freeze({
55
55
  boxing: false,
56
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
57
  wrestling: false,
58
+ // A match has no home side.
59
+ prowrestling: false,
58
60
  });
59
61
  /** The leagues whose convention is not their sport's: the international federation's lacrosse lists the home team first. */
60
62
  export const HOME_FIRST_LEAGUES = Object.freeze({
@@ -79,6 +79,9 @@ export interface RingFigures {
79
79
  fromRopes: number;
80
80
  pad: number;
81
81
  };
82
+ /** Whether two ties hold the ropes of a side in line (a boxing ring's; a wrestling ring's ropes are not tethered together), and whether the corners are the two boxers' (red and blue) and two neutral ones. */
83
+ ties: boolean;
84
+ boxerCorners: boolean;
82
85
  }
83
86
  /** The figures of a boxing ring, in metres. */
84
87
  export interface BoxingFigures extends RingFigures {
@@ -135,9 +138,23 @@ export declare const NCAA_MAT: WrestlingFigures;
135
138
  export declare const NFHS_MAT: WrestlingFigures;
136
139
  /** The wrestling leagues: the UWW's first. */
137
140
  export declare const WRESTLING_LEAGUES: readonly WrestlingLeague[];
141
+ /** The figures of a professional wrestling ring, in metres: the same ring as the boxing ring, with three ropes that are not tied together, posts at the corners and steel steps at ringside. No body's rule gives them: they are what rings are made as. */
142
+ export interface ProWrestlingFigures extends RingFigures {
143
+ kind: "prowrestling";
144
+ }
145
+ /** A professional wrestling league: the ring as rings are made. */
146
+ export type ProWrestlingLeague = LeagueBase<"prowrestling", ProWrestlingFigures>;
147
+ /**
148
+ * The professional wrestling ring as it is typically made (no rulebook gives it: every figure is typical, from the sources that describe one, and they differ): most rings measure 14 to 20 feet a side between the ropes, and 20 feet is
149
+ * the large promotions' size (English Wikipedia, "Wrestling ring"); three ropes of 1 to 1.5 inches at about 1, 3 and 5 feet over the mat; a platform 40 inches (3 to 4.5 feet) over the floor; an apron of 1 foot beyond the ropes
150
+ * (dimensions.com, "Professional Wrestling Ring"; a 2012 description of a large promotion's ring). The posts' height over the mat (ours) is 1.7 m, a little over the top rope.
151
+ */
152
+ export declare const PRO_RING: ProWrestlingFigures;
153
+ /** The professional wrestling league: the ring as it is typically made. */
154
+ export declare const PRO_WRESTLING_LEAGUES: readonly ProWrestlingLeague[];
138
155
  /** The figures of a combat league. */
139
- export type CombatFigures = MmaFigures | BoxingFigures | WrestlingFigures;
156
+ export type CombatFigures = MmaFigures | BoxingFigures | WrestlingFigures | ProWrestlingFigures;
140
157
  /** A league with a combat surface of its own. */
141
- export type CombatLeague = MmaLeague | BoxingLeague | WrestlingLeague;
158
+ export type CombatLeague = MmaLeague | BoxingLeague | WrestlingLeague | ProWrestlingLeague;
142
159
  /** Every combat league, once each. */
143
160
  export declare const COMBAT_LEAGUES: readonly CombatLeague[];
@@ -33,6 +33,8 @@ export const NRUC_RING = {
33
33
  foam: span(1 * IN, 1.5 * IN, 1 * IN),
34
34
  ropes: { count: 4, heights: [18 * IN, 30 * IN, 42 * IN, 54 * IN], diameter: span(1 * IN, 2 * IN, 1 * IN) },
35
35
  post: { height: 58 * IN, diameter: 3 * IN, fromRopes: 18 * IN, pad: 0.3 },
36
+ ties: true,
37
+ boxerCorners: true,
36
38
  };
37
39
  /** 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
40
  export const WISCONSIN_RING = {
@@ -43,6 +45,8 @@ export const WISCONSIN_RING = {
43
45
  foam: span(1 * IN, 1 * IN, 1 * IN),
44
46
  ropes: { count: 4, heights: [18 * IN, 30 * IN, 42 * IN, 54 * IN], diameter: span(1 * IN, 2 * IN, 1 * IN) },
45
47
  post: { height: 58 * IN, diameter: 3 * IN, fromRopes: 18 * IN, pad: 0.3 },
48
+ ties: true,
49
+ boxerCorners: true,
46
50
  };
47
51
  /** 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
52
  export const WBC_AMATEUR_RING = {
@@ -53,6 +57,8 @@ export const WBC_AMATEUR_RING = {
53
57
  foam: span(0.01, 0.025, 0.02),
54
58
  ropes: { count: 4, heights: [0.41, 0.71, 1.02, 1.32], diameter: span(0.03, 0.05, 0.04) },
55
59
  post: { height: 1.5, diameter: 0.076, fromRopes: 0.45, pad: 0.3 },
60
+ ties: true,
61
+ boxerCorners: true,
56
62
  };
57
63
  /** The boxing leagues: the Nevada commission's first. */
58
64
  export const BOXING_LEAGUES = [
@@ -99,5 +105,25 @@ export const WRESTLING_LEAGUES = [
99
105
  { id: "ncaa-wrestling", family: "wrestling", name: { en: "Wrestling mat, NCAA folkstyle", ja: "レスリングのマット(NCAA:フォークスタイル)" }, unit: "ft", figuresUnit: "m", dimensions: NCAA_MAT, sources: ["ncaa-wrestling"] },
100
106
  { 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
107
  ];
108
+ /**
109
+ * The professional wrestling ring as it is typically made (no rulebook gives it: every figure is typical, from the sources that describe one, and they differ): most rings measure 14 to 20 feet a side between the ropes, and 20 feet is
110
+ * the large promotions' size (English Wikipedia, "Wrestling ring"); three ropes of 1 to 1.5 inches at about 1, 3 and 5 feet over the mat; a platform 40 inches (3 to 4.5 feet) over the floor; an apron of 1 foot beyond the ropes
111
+ * (dimensions.com, "Professional Wrestling Ring"; a 2012 description of a large promotion's ring). The posts' height over the mat (ours) is 1.7 m, a little over the top rope.
112
+ */
113
+ export const PRO_RING = {
114
+ kind: "prowrestling",
115
+ size: span(14 * FT, 20 * FT, 20 * FT),
116
+ platform: { height: span(0, 6 * FT, 40 * IN), steps: { sets: 2, treads: 3, tread: 0.3, width: 1 } },
117
+ apron: span(1 * FT, 3 * FT, 1 * FT),
118
+ foam: span(1 * IN, 2 * IN, 1 * IN),
119
+ ropes: { count: 3, heights: [1 * FT, 3 * FT, 5 * FT], diameter: span(1 * IN, 1.5 * IN, 1.25 * IN) },
120
+ post: { height: 1.7, diameter: 0.15, fromRopes: 0.12, pad: 0.26 },
121
+ ties: false,
122
+ boxerCorners: false,
123
+ };
124
+ /** The professional wrestling league: the ring as it is typically made. */
125
+ export const PRO_WRESTLING_LEAGUES = [
126
+ { id: "pro-ring", family: "prowrestling", name: { en: "Professional wrestling ring, as rings are typically made", ja: "プロレスのリング(一般的な寸法)" }, unit: "ft", figuresUnit: "m", dimensions: PRO_RING, sources: ["wp-wrestling-ring", "dimensions-pro-ring", "wwe-ring-2012", "wp-boxing-ring"], builtIn: true },
127
+ ];
102
128
  /** Every combat league, once each. */
103
- export const COMBAT_LEAGUES = Object.freeze([...MMA_LEAGUES, ...BOXING_LEAGUES, ...WRESTLING_LEAGUES]);
129
+ export const COMBAT_LEAGUES = Object.freeze([...MMA_LEAGUES, ...BOXING_LEAGUES, ...WRESTLING_LEAGUES, ...PRO_WRESTLING_LEAGUES]);
@@ -137,6 +137,9 @@ export const LEAGUE_SOURCES = Object.freeze(Object.fromEntries([
137
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
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
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)" }),
140
+ source({ id: "wp-wrestling-ring", title: "Wrestling ring (English Wikipedia): constructed like a boxing ring; three ring ropes (one fewer than a boxing ring) that are not tethered together, held by turnbuckles hung on steel posts; the apron the mat beyond the ropes; steel steps at ringside; most rings 14 to 20 feet on each side, 20 feet for the large promotions and 18 for some others", by: "Wikipedia contributors (CC BY-SA 4.0), read for facts only", edition: "revision 1379090810", url: "https://en.wikipedia.org/w/index.php?title=Wrestling_ring&oldid=1379090810", read: COMBAT_READ, note: "typical, not a rule: the size range, three ropes, no ties, the apron, the steps" }),
141
+ source({ id: "dimensions-pro-ring", title: "Professional Wrestling Ring Dimensions & Drawings: a ring of 20 by 20 feet, the mat 40 inches (1.02 m) over the floor, an apron of 1 foot, ropes of 1 to 1.5 inches, posts 6 inches across", by: "Dimensions.com", edition: "the page as read on the date given (it names no promotion; its figure of an 8 foot top rope is not used)", url: "https://www.dimensions.com/element/professional-wrestling-ring", read: COMBAT_READ, note: "typical, not a rule: the platform's height, the apron, the ropes' thickness" }),
142
+ source({ id: "wwe-ring-2012", title: "WWE Wrestling Ring Dimensions (a blog's description of a large promotion's ring as of 2012: a mat of 20 by 20 feet between the turnbuckles, 21 by 21 feet with the apron, 4 to 6 feet from the floor, three ropes at about 1, 3 and 5 feet over the mat, an apron of 1 foot beyond the ropes)", by: "Abstruse Decapod Games & Fun (a blog)", edition: "posted 15 November 2012", url: "http://abstrusedecapod.blogspot.com/2012/11/wwe-wrestling-ring-dimensions.html", read: COMBAT_READ, note: "typical, not a rule, and the weakest source here: the ropes' heights and the platform's upper range; the blog's own spacing figure is wrong, as a comment on it says, and its post height is not used" }),
140
143
  // Baseball and softball.
141
144
  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" }),
142
145
  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" | "boxing" | "wrestling";
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" | "prowrestling";
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 { 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";
39
+ export { BOXING_LEAGUES, IMMAF_CAGE, MMA_LEAGUES, NRUC_CAGE, NCAA_MAT, NFHS_MAT, NRUC_RING, PRO_RING, PRO_WRESTLING_LEAGUES, 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";
package/dist/leagues.js CHANGED
@@ -15,7 +15,7 @@ import { FIELD_HOCKEY_LEAGUES, fieldHockeyInFeet } from "./leagues/fieldhockey.j
15
15
  import { ATHLETICS_LEAGUES, athleticsInFeet } from "./leagues/athletics.js";
16
16
  import { longOval, outerEdge } from "./skating/track.js";
17
17
  import { SKATING_LEAGUES, skatingInFeet } from "./leagues/skating.js";
18
- import { BOXING_LEAGUES, MMA_LEAGUES, WRESTLING_LEAGUES } from "./leagues/combat.js";
18
+ import { BOXING_LEAGUES, MMA_LEAGUES, PRO_WRESTLING_LEAGUES, WRESTLING_LEAGUES } from "./leagues/combat.js";
19
19
  import { BUDO_LEAGUES, DOJO_LEAGUES, JUDO_LEAGUES, KARATE_LEAGUES, KENDO_LEAGUES, KYUDO_LEAGUES, SUMO_LEAGUES } from "./leagues/budo.js";
20
20
  import { GAELIC_LEAGUES, gaelicInFeet } from "./leagues/gaelic.js";
21
21
  import { HANDBALL_LEAGUES, handballInFeet } from "./leagues/handball.js";
@@ -28,10 +28,10 @@ export { LEAGUE_SOURCES };
28
28
  export { AFL_GROUNDS } from "./leagues/aussie.js";
29
29
  export { WA_STANDARD_TRACK, WA_SHORT_TRACK, WA_STAGGER_TABLE, WA_SHORT_STAGGER_TABLE } from "./leagues/athletics.js";
30
30
  export { ISU_LONG_TRACK, ISU_SHORT_TRACK, ISU_FIGURE_RINK, ISU_LONG_TRACK_TABLE } from "./leagues/skating.js";
31
- 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.js";
31
+ export { BOXING_LEAGUES, IMMAF_CAGE, MMA_LEAGUES, NRUC_CAGE, NCAA_MAT, NFHS_MAT, NRUC_RING, PRO_RING, PRO_WRESTLING_LEAGUES, UWW_MAT, WBC_AMATEUR_RING, WISCONSIN_RING, WRESTLING_LEAGUES } from "./leagues/combat.js";
32
32
  export { AJJF_CONTEST, BUDO_LEAGUES, ENTEKI, FIK_SHIAI_JO, IJF_CONTEST, IJF_KATA, JSA_DOHYO, KINTEKI, WKF_KATA, WKF_KUMITE } from "./leagues/budo.js";
33
33
  /** The family of surface each sport draws; soccer's variants are its pitches (`pitch`), not leagues. */
34
- export const FAMILY_OF = Object.freeze({ nfl: "football", cfl: "football", ifaf: "football", nhl: "hockey", nba: "basketball", mlb: "baseball", soccer: undefined, curling: "curling", tennis: "tennis", volleyball: "volleyball", badminton: "badminton", pickleball: "pickleball", tabletennis: "tabletennis", padel: "padel", squash: "squash", racquetball: "racquetball", sepaktakraw: "sepaktakraw", teqball: "teqball", roundnet: "roundnet", netball: "netball", lacrosse: "lacrosse", rugby: "rugby", afl: "afl", gaelic: "gaelic", cricket: "cricket", fieldhockey: "fieldhockey", handball: "handball", swimming: undefined, waterpolo: undefined, diving: undefined, artisticswimming: undefined, athletics: "athletics", skating: "skating", judo: "judo", karate: "karate", kendo: "kendo", sumo: "sumo", kyudo: "kyudo", dojo: "dojo", mma: "mma", boxing: "boxing", wrestling: "wrestling" });
34
+ export const FAMILY_OF = Object.freeze({ nfl: "football", cfl: "football", ifaf: "football", nhl: "hockey", nba: "basketball", mlb: "baseball", soccer: undefined, curling: "curling", tennis: "tennis", volleyball: "volleyball", badminton: "badminton", pickleball: "pickleball", tabletennis: "tabletennis", padel: "padel", squash: "squash", racquetball: "racquetball", sepaktakraw: "sepaktakraw", teqball: "teqball", roundnet: "roundnet", netball: "netball", lacrosse: "lacrosse", rugby: "rugby", afl: "afl", gaelic: "gaelic", cricket: "cricket", fieldhockey: "fieldhockey", handball: "handball", swimming: undefined, waterpolo: undefined, diving: undefined, artisticswimming: undefined, athletics: "athletics", skating: "skating", judo: "judo", karate: "karate", kendo: "kendo", sumo: "sumo", kyudo: "kyudo", dojo: "dojo", mma: "mma", boxing: "boxing", wrestling: "wrestling", prowrestling: "prowrestling" });
35
35
  /**
36
36
  * The leagues each sport can draw, in the order a menu lists them, the sport's own first (the three football sports share their
37
37
  * list, the football leagues). Soccer and the pools have none.
@@ -80,6 +80,7 @@ export const LEAGUES = Object.freeze({
80
80
  mma: MMA_LEAGUES,
81
81
  boxing: BOXING_LEAGUES,
82
82
  wrestling: WRESTLING_LEAGUES,
83
+ prowrestling: PRO_WRESTLING_LEAGUES,
83
84
  });
84
85
  /** Every league of every family, once each. */
85
86
  export const VARIANTS = Object.freeze([...BASKETBALL_LEAGUES, ...HOCKEY_LEAGUES, ...FOOTBALL_LEAGUES, ...BASEBALL_LEAGUES, ...CURLING_LEAGUES, ...TENNIS_LEAGUES, ...VOLLEYBALL_LEAGUES, ...BADMINTON_LEAGUES, ...PICKLEBALL_LEAGUES, ...TABLE_TENNIS_LEAGUES, ...PADEL_LEAGUES, ...SQUASH_LEAGUES, ...RACQUETBALL_LEAGUES, ...SEPAK_TAKRAW_LEAGUES, ...TEQBALL_LEAGUES, ...ROUNDNET_LEAGUES, ...NETBALL_LEAGUES, ...LACROSSE_LEAGUES, ...RUGBY_LEAGUES, ...AFL_LEAGUES, ...GAELIC_LEAGUES, ...CRICKET_LEAGUES, ...FIELD_HOCKEY_LEAGUES, ...HANDBALL_LEAGUES, ...ATHLETICS_LEAGUES, ...BUDO_LEAGUES]);
@@ -335,6 +336,13 @@ export function leagueSize(sport, id, unit) {
335
336
  feet = { length: convertLength(length, "m", "ft"), width: convertLength(frontage, "m", "ft") };
336
337
  break;
337
338
  }
339
+ case "prowrestling": {
340
+ // The platform: the ring at the size drawn, with its apron.
341
+ const d = league.dimensions;
342
+ const m = d.size.drawn + 2 * Math.max(d.apron.drawn, d.post.fromRopes + d.post.pad / 2 + 0.02);
343
+ feet = { length: convertLength(m, "m", "ft"), width: convertLength(m, "m", "ft") };
344
+ break;
345
+ }
338
346
  case "wrestling": {
339
347
  // The mat's square: the circle with the matted area round it.
340
348
  const d = league.dimensions;
@@ -710,6 +718,16 @@ export function leagueFigures(league) {
710
718
  ["shajō", `${f.hall.depth} m deep, ${f.hall.side} m from the end shooters to the walls, ceiling ${f.ceiling} m`],
711
719
  ];
712
720
  }
721
+ case "prowrestling": {
722
+ const f = league.dimensions;
723
+ const ft = (m) => `${Math.round((m / 0.3048) * 100) / 100} ft`;
724
+ return [
725
+ ["ring", `${ft(f.size.min)} to ${ft(f.size.max)} square between the ropes (typical)`],
726
+ ["platform", `${ft(f.platform.height.drawn)} drawn, up to ${ft(f.platform.height.max)}`],
727
+ ["ropes", `${f.ropes.count} at ${f.ropes.heights.map((h) => ft(h)).join(", ")}, not tied together`],
728
+ ["apron", `${ft(f.apron.drawn)} beyond the ropes`],
729
+ ];
730
+ }
713
731
  case "wrestling": {
714
732
  const f = league.dimensions;
715
733
  const ft = (m) => `${Math.round((m / 0.3048) * 100) / 100} ft`;
package/dist/outline.js CHANGED
@@ -138,6 +138,7 @@ export function outlineOf(o) {
138
138
  case "mma":
139
139
  case "boxing":
140
140
  case "wrestling":
141
+ case "prowrestling":
141
142
  case "dojo": {
142
143
  const plan = budoPlan({ ...o, sport, detail: o.detail });
143
144
  const k = 1 / 0.3048;
@@ -80,6 +80,7 @@ export const RANGES = Object.freeze({
80
80
  dojo: Object.freeze([range("kamiza"), range("half", "left")]),
81
81
  mma: Object.freeze([range("cage"), range("gate"), range("half", "left")]),
82
82
  boxing: Object.freeze([range("ropes"), range("corner"), range("half", "left")]),
83
+ prowrestling: Object.freeze([range("ropes"), range("half", "left")]),
83
84
  wrestling: Object.freeze([range("start"), range("passivity", undefined, ["uww"]), range("half", "left")]),
84
85
  });
85
86
  const isNumber = (value) => typeof value === "number" && Number.isFinite(value);
package/dist/score.js CHANGED
@@ -218,6 +218,9 @@ export function glyph(sport) {
218
218
  case "dojo":
219
219
  // A dojo: a floor of mats laid so that no four corners meet.
220
220
  return "M-14 -10H14V10H-14ZM-14 0H14M-5 -10V0M5 0V10";
221
+ case "prowrestling":
222
+ // A ring: the platform's square, the three ropes and the four posts.
223
+ return "M-10 -10H10V10H-10ZM-6 -6H6V6H-6ZM-5 -5H5V5H-5ZM-8 -8L-6 -6M8 -8L6 -6M-8 8L-6 6M8 8L6 6";
221
224
  case "wrestling":
222
225
  // A mat: the square, the circle, the passivity band and the circle in the middle.
223
226
  return "M-10 -10H10V10H-10ZM-8 0A8 8 0 1 0 8 0A8 8 0 1 0 -8 0M-5.5 0A5.5 5.5 0 1 0 5.5 0A5.5 5.5 0 1 0 -5.5 0M-1 0A1 1 0 1 0 1 0A1 1 0 1 0 -1 0";
package/dist/strings.d.ts CHANGED
@@ -459,6 +459,10 @@ export interface KyogijoWords {
459
459
  wrestlingFloor: string;
460
460
  wrestlingCentre: string;
461
461
  wrestlingLines: string;
462
+ /** A professional wrestling ring: the sentence ({size}, {feet}, {apron}, {platform}; the platform parts are the boxing ring's), and the sentences about its ropes and its steps. */
463
+ prowrestling: string;
464
+ prowrestlingRopes: string;
465
+ prowrestlingSteps: string;
462
466
  /** The scoreboards: the heads and the sentences that say what each side scored. */
463
467
  board: {
464
468
  ippon: string;
package/dist/strings.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /** The words of the package, by language. */
2
2
  export const KYOGIJO_STRINGS = {
3
3
  en: {
4
- surface: { skating: "Skating rink", nfl: "NFL football field", cfl: "CFL football field", ifaf: "IFAF football field", nhl: "NHL hockey rink", nba: "NBA basketball court", mlb: "Baseball field", soccer: "Soccer pitch", curling: "Curling sheet", tennis: "Tennis court", volleyball: "Volleyball court", badminton: "Badminton court", pickleball: "Pickleball court", tabletennis: "Table tennis table", padel: "Padel court", squash: "Squash court", racquetball: "Racquetball court", sepaktakraw: "Sepak takraw court", teqball: "Teqball court", roundnet: "Roundnet court", netball: "Netball court", lacrosse: "Lacrosse field", rugby: "Rugby union field", afl: "Australian football ground", gaelic: "Gaelic football field", cricket: "Cricket ground", fieldhockey: "Field hockey pitch", handball: "Handball court", swimming: "Swimming pool", waterpolo: "Water polo field", diving: "Diving well", artisticswimming: "Artistic swimming pool", athletics: "Athletics track", judo: "Judo contest area", karate: "Karate competition area", kendo: "Kendo shiai-jo", sumo: "Sumo dohyō", kyudo: "Kyūdō range", dojo: "Dojo", mma: "MMA cage", boxing: "Boxing ring", wrestling: "Wrestling mat" },
4
+ surface: { skating: "Skating rink", nfl: "NFL football field", cfl: "CFL football field", ifaf: "IFAF football field", nhl: "NHL hockey rink", nba: "NBA basketball court", mlb: "Baseball field", soccer: "Soccer pitch", curling: "Curling sheet", tennis: "Tennis court", volleyball: "Volleyball court", badminton: "Badminton court", pickleball: "Pickleball court", tabletennis: "Table tennis table", padel: "Padel court", squash: "Squash court", racquetball: "Racquetball court", sepaktakraw: "Sepak takraw court", teqball: "Teqball court", roundnet: "Roundnet court", netball: "Netball court", lacrosse: "Lacrosse field", rugby: "Rugby union field", afl: "Australian football ground", gaelic: "Gaelic football field", cricket: "Cricket ground", fieldhockey: "Field hockey pitch", handball: "Handball court", swimming: "Swimming pool", waterpolo: "Water polo field", diving: "Diving well", artisticswimming: "Artistic swimming pool", athletics: "Athletics track", judo: "Judo contest area", karate: "Karate competition area", kendo: "Kendo shiai-jo", sumo: "Sumo dohyō", kyudo: "Kyūdō range", dojo: "Dojo", mma: "MMA cage", boxing: "Boxing ring", wrestling: "Wrestling mat", prowrestling: "Professional wrestling ring" },
5
5
  about: {
6
6
  nfl: "an American football field, 120 by 53 and a third yards with its end zones, with a yard line every 5 yards, hash marks, numbers and goal posts",
7
7
  cfl: "a Canadian football field, 150 by 65 yards with its 20-yard end zones, with a yard line every 5 yards, hash marks, numbers and goal posts on the goal lines",
@@ -45,6 +45,7 @@ export const KYOGIJO_STRINGS = {
45
45
  mma: "an MMA cage: an eight-sided fenced area 9.14 metres (30 feet) across, on a platform 122 centimetres high",
46
46
  boxing: "a boxing ring: a square of 6.1 metres (20 feet) inside the ropes, on a platform 122 centimetres high",
47
47
  wrestling: "a wrestling mat of the UWW: a circle 9 metres across in a protection area 1.5 metres wide, with an orange passivity band inside the circle, on a platform 1 metre high",
48
+ prowrestling: "a professional wrestling ring: a square of 6.1 metres (20 feet) inside three ropes, on a platform 102 centimetres high",
48
49
  },
49
50
  status: { final: "Final", "final-ot": "Final/OT", "final-so": "Final/SO", "final-aet": "Final/AET", "final-pens": "Final/Pens", live: "Live", half: "Halftime", "extra-time": "Extra time", "extra-end": "Extra end", penalties: "Penalties", postponed: "Postponed", tiebreak: "Tiebreak", "match-tiebreak": "Match tiebreak", retired: "Retired", walkover: "Walkover" },
50
51
  endStatus: "End {n}",
@@ -245,6 +246,9 @@ export const KYOGIJO_STRINGS = {
245
246
  wrestlingFloor: "on the floor of the hall",
246
247
  wrestlingCentre: "A circle {d} metres across marks the middle.",
247
248
  wrestlingLines: "Two parallel starting lines at the middle are closed at their ends by a green line and a red line.",
249
+ prowrestling: "a professional wrestling ring: a square of {size} metres ({feet} feet) inside three ropes, on a canvas with an apron {apron} centimetres wide beyond them and a padded post in each corner, {platform}",
250
+ prowrestlingRopes: "The three ropes are not tied together.",
251
+ prowrestlingSteps: "Steel steps stand beside the platform at two corners.",
248
252
  board: {
249
253
  ippon: "Ippon", wazaari: "Waza-ari", yuko: "Yuko", shido: "Shido", senshu: "Senshu", chui: "Chui", points: "Points", kimarite: "Kimarite",
250
254
  techniques: { men: "Men", kote: "Kote", do: "Dō", tsuki: "Tsuki", hansoku: "Hansoku" },
@@ -306,7 +310,7 @@ export const KYOGIJO_STRINGS = {
306
310
  results: { touchdown: "touchdown", "field-goal": "field goal", "missed-field-goal": "missed field goal", punt: "punt", turnover: "turnover", interception: "interception", fumble: "fumble", downs: "turnover on downs", safety: "safety", "end-of-half": "end of the half" },
307
311
  },
308
312
  special: {
309
- guest: { skating: "rink", nfl: "football field", cfl: "football field", ifaf: "football field", nhl: "rink", nba: "court", mlb: "baseball field", soccer: "pitch", curling: "sheet", tennis: "court", volleyball: "court", badminton: "court", pickleball: "court", tabletennis: "table", padel: "court", squash: "court", racquetball: "court", sepaktakraw: "court", teqball: "court", roundnet: "court", netball: "court", lacrosse: "field", rugby: "field", afl: "ground", gaelic: "field", cricket: "ground", fieldhockey: "pitch", handball: "court", swimming: "pool", waterpolo: "pool", diving: "well", artisticswimming: "pool", athletics: "track", judo: "contest area", karate: "competition area", kendo: "shiai-jo", sumo: "dohyō", kyudo: "range", dojo: "dojo", mma: "cage", boxing: "ring", wrestling: "mat" },
313
+ guest: { skating: "rink", nfl: "football field", cfl: "football field", ifaf: "football field", nhl: "rink", nba: "court", mlb: "baseball field", soccer: "pitch", curling: "sheet", tennis: "court", volleyball: "court", badminton: "court", pickleball: "court", tabletennis: "table", padel: "court", squash: "court", racquetball: "court", sepaktakraw: "court", teqball: "court", roundnet: "court", netball: "court", lacrosse: "field", rugby: "field", afl: "ground", gaelic: "field", cricket: "ground", fieldhockey: "pitch", handball: "court", swimming: "pool", waterpolo: "pool", diving: "well", artisticswimming: "pool", athletics: "track", judo: "contest area", karate: "competition area", kendo: "shiai-jo", sumo: "dohyō", kyudo: "range", dojo: "dojo", mma: "cage", boxing: "ring", wrestling: "mat", prowrestling: "ring" },
310
314
  title: "{guest} in {host}",
311
315
  game: "{event}, {date}.",
312
316
  inside: "The {guest} lies wholly inside the outline of {host}.",
@@ -401,7 +405,7 @@ export const KYOGIJO_STRINGS = {
401
405
  boundary: "Boundary", pitch: "Pitch", "bowling-crease": "Bowling crease", "popping-crease": "Popping crease", "return-crease": "Return crease", wicket: "Wicket", "thirty-yard-circle": "30-yard circle",
402
406
  "twenty-three-line": "23-metre line", "shooting-circle": "Shooting circle", "penalty-spot": "Penalty spot", "broken-circle-line": "Broken line round the circle", "goal-area-line": "Goal-area line",
403
407
  "finish-line": "Finish line", kerb: "Kerb", "lane-lines": "Lane lines", bend: "Bend", straight: "Straight", "infield-pitch": "Soccer pitch", "start-line": "Start line", breakline: "Breakline", "water-jump": "Water jump", "exchange-zone": "Takeover zone",
404
- "referee-position": "Referee's place", "shiai-jo": "Shiai-jo", floorboard: "Floorboard", heri: "Heri, the mat's edge", "contest-area": "Contest area", "safety-area": "Safety area", "danger-zone": "Danger zone", "start-mark": "Start mark", "common-safe-zone": "Common safe zone", "free-zone": "Free zone", platform: "Platform", "technical-table": "Technical table", "centre-tape": "Centre tape", "kata-judges": "Judges, shomen side", "coach-chair": "Coach's chair", "kata-entry": "Entry and exit, opposite shomen", arena: "Arena floor", "competition-area": "Competition area", "boundary-band": "Boundary band", "start-mat": "Start mat", judge: "Judge", "between-areas": "Between the areas", "centre-cross": "Centre cross", "kaishi-sen": "Kaishi-sen", "outer-boundary": "Outer boundary", dohyo: "Dohyō", ring: "Ring", tawara: "Tawara", tokudawara: "Tokudawara", "shikiri-sen": "Shikiri-sen", "jano-me": "Jano-me", shajo: "Shajō", "shooting-position": "Shooting position", honza: "Honza", yamichi: "Yamichi", "yatori-michi": "Path for the arrows", azuchi: "Azuchi", mato: "Target", kamiza: "Kamiza", "cage-canvas": "Canvas", "cage-fence": "Fence", "cage-post": "Padded post", "cage-gate": "Gate", "cage-steps": "Steps", "cage-platform": "Platform", "ring-canvas": "Canvas", "ring-ropes": "Ropes", "ring-post": "Corner post", "ring-red-corner": "Red corner", "ring-blue-corner": "Blue corner", "ring-apron": "Apron", "ring-steps": "Steps", "mat-circle": "Wrestling area", "mat-central": "Central surface", "mat-border": "Border of the mat", "mat-passivity": "Passivity zone", "mat-centre-circle": "Centre circle", "mat-starting-lines": "Starting lines", "mat-platform": "Platform", shimoza: "Shimoza", shinzen: "Shinzen", dais: "Dais, the seat of honour", banner: "Banner", entrance: "Entrance", window: "Window", tatami: "Tatami", wall: "Wall", "inner-lane": "Inner lane", "outer-lane": "Outer lane", "crossing-straight": "Crossing straight", "warm-up-lane": "Warm-up lane", padding: "Padding", infield: "Infield", "coaches-area": "Coaches' area", blocks: "Blocks", "track-line": "Line of the track", "start-lines": "Starting lines", ice: "Ice", "technical-panel": "Technical panel", referee: "Referee", "kiss-and-cry": "Kiss and cry", judges: "Judges", runway: "Runway", "take-off-board": "Take-off board", "landing-area": "Landing area", "throwing-circle": "Throwing circle", sector: "Landing sector", "stop-board": "Stop board", cage: "Cage", "throwing-arc": "Throwing arc", crossbar: "Crossbar", "landing-mat": "Landing mat", "run-up": "Run-up", "zero-line": "Zero line", box: "Box",
408
+ "referee-position": "Referee's place", "shiai-jo": "Shiai-jo", floorboard: "Floorboard", heri: "Heri, the mat's edge", "contest-area": "Contest area", "safety-area": "Safety area", "danger-zone": "Danger zone", "start-mark": "Start mark", "common-safe-zone": "Common safe zone", "free-zone": "Free zone", platform: "Platform", "technical-table": "Technical table", "centre-tape": "Centre tape", "kata-judges": "Judges, shomen side", "coach-chair": "Coach's chair", "kata-entry": "Entry and exit, opposite shomen", arena: "Arena floor", "competition-area": "Competition area", "boundary-band": "Boundary band", "start-mat": "Start mat", judge: "Judge", "between-areas": "Between the areas", "centre-cross": "Centre cross", "kaishi-sen": "Kaishi-sen", "outer-boundary": "Outer boundary", dohyo: "Dohyō", ring: "Ring", tawara: "Tawara", tokudawara: "Tokudawara", "shikiri-sen": "Shikiri-sen", "jano-me": "Jano-me", shajo: "Shajō", "shooting-position": "Shooting position", honza: "Honza", yamichi: "Yamichi", "yatori-michi": "Path for the arrows", azuchi: "Azuchi", mato: "Target", kamiza: "Kamiza", "cage-canvas": "Canvas", "cage-fence": "Fence", "cage-post": "Padded post", "cage-gate": "Gate", "cage-steps": "Steps", "cage-platform": "Platform", "ring-canvas": "Canvas", "ring-ropes": "Ropes", "ring-post": "Corner post", "ring-red-corner": "Red corner", "ring-blue-corner": "Blue corner", "ring-apron": "Apron", "ring-steps": "Steps", "ring-platform": "Platform", "mat-circle": "Wrestling area", "mat-central": "Central surface", "mat-border": "Border of the mat", "mat-passivity": "Passivity zone", "mat-centre-circle": "Centre circle", "mat-starting-lines": "Starting lines", "mat-platform": "Platform", shimoza: "Shimoza", shinzen: "Shinzen", dais: "Dais, the seat of honour", banner: "Banner", entrance: "Entrance", window: "Window", tatami: "Tatami", wall: "Wall", "inner-lane": "Inner lane", "outer-lane": "Outer lane", "crossing-straight": "Crossing straight", "warm-up-lane": "Warm-up lane", padding: "Padding", infield: "Infield", "coaches-area": "Coaches' area", blocks: "Blocks", "track-line": "Line of the track", "start-lines": "Starting lines", ice: "Ice", "technical-panel": "Technical panel", referee: "Referee", "kiss-and-cry": "Kiss and cry", judges: "Judges", runway: "Runway", "take-off-board": "Take-off board", "landing-area": "Landing area", "throwing-circle": "Throwing circle", sector: "Landing sector", "stop-board": "Stop board", cage: "Cage", "throwing-arc": "Throwing arc", crossbar: "Crossbar", "landing-mat": "Landing mat", "run-up": "Run-up", "zero-line": "Zero line", box: "Box",
405
409
  "seven-metre-line": "7-metre line", "four-metre-line": "4-metre line", "throw-off-area": "Throw-off area", "restraining-line": "Restraining line", "wing-line": "Wing line", "marking-area": "Marking area", "two-point-arc": "Two-point arc",
406
410
  "lane-rope": "Lane rope", "lane-line": "Lane marking on the floor", "lane-end-cross": "Cross line at the end of the lane marking", "fifteen-metre-mark": "15 m mark", "touch-pad": "Touch panel", "starting-block": "Starting block", "backstroke-flags": "Backstroke flags", "false-start-rope": "False start rope", gutter: "Gutter",
407
411
  "two-metre-line": "2 m line", "five-metre-mark": "5 m mark", "six-metre-line": "6 m line", "half-distance-line": "Half distance line", "re-entry-area": "Re-entry area", "referee-platform": "Referee platform", "official-table": "Official table", "substitution-area": "Substitution area",
@@ -546,7 +550,7 @@ export const KYOGIJO_STRINGS = {
546
550
  // (ISU Rule 281.1a; the JOC's usage). Television's インコース, アウトコース, バックストレート and ホームストレート are aliases in docs/skating.md. No rule book words were found for the figure skating
547
551
  // furniture (ジャッジ席, テクニカルパネル, レフェリー, キス・アンド・クライ): they are the usual words.
548
552
  ja: {
549
- surface: { skating: "スケートリンク", nfl: "NFLのフィールド", cfl: "CFLのフィールド", ifaf: "IFAFのフィールド", nhl: "NHLのアイスホッケーリンク", nba: "NBAのバスケットボールコート", mlb: "野球場", soccer: "サッカーのピッチ", curling: "カーリングのシート", tennis: "テニスコート", volleyball: "バレーボールコート", badminton: "バドミントンコート", pickleball: "ピックルボールコート", tabletennis: "卓球台", padel: "パデルコート", squash: "スカッシュコート", racquetball: "ラケットボールコート", sepaktakraw: "セパタクローコート", teqball: "テックボールコート", roundnet: "ラウンドネットコート", netball: "ネットボールコート", lacrosse: "ラクロスのフィールド", rugby: "ラグビーユニオンのグラウンド", afl: "オーストラリアンフットボールのグラウンド", gaelic: "ゲーリック・フットボールのフィールド", cricket: "クリケットのグラウンド", fieldhockey: "フィールドホッケーのピッチ", handball: "ハンドボールのコート", swimming: "競泳プール", waterpolo: "水球のフィールド", diving: "飛込プール", artisticswimming: "アーティスティックスイミングのプール", athletics: "陸上競技のトラック", judo: "柔道の試合場", karate: "空手道の試合場", kendo: "剣道の試合場", sumo: "相撲の土俵", kyudo: "弓道場", dojo: "道場", mma: "総合格闘技のケージ", boxing: "ボクシングのリング", wrestling: "レスリングのマット" },
553
+ surface: { skating: "スケートリンク", nfl: "NFLのフィールド", cfl: "CFLのフィールド", ifaf: "IFAFのフィールド", nhl: "NHLのアイスホッケーリンク", nba: "NBAのバスケットボールコート", mlb: "野球場", soccer: "サッカーのピッチ", curling: "カーリングのシート", tennis: "テニスコート", volleyball: "バレーボールコート", badminton: "バドミントンコート", pickleball: "ピックルボールコート", tabletennis: "卓球台", padel: "パデルコート", squash: "スカッシュコート", racquetball: "ラケットボールコート", sepaktakraw: "セパタクローコート", teqball: "テックボールコート", roundnet: "ラウンドネットコート", netball: "ネットボールコート", lacrosse: "ラクロスのフィールド", rugby: "ラグビーユニオンのグラウンド", afl: "オーストラリアンフットボールのグラウンド", gaelic: "ゲーリック・フットボールのフィールド", cricket: "クリケットのグラウンド", fieldhockey: "フィールドホッケーのピッチ", handball: "ハンドボールのコート", swimming: "競泳プール", waterpolo: "水球のフィールド", diving: "飛込プール", artisticswimming: "アーティスティックスイミングのプール", athletics: "陸上競技のトラック", judo: "柔道の試合場", karate: "空手道の試合場", kendo: "剣道の試合場", sumo: "相撲の土俵", kyudo: "弓道場", dojo: "道場", mma: "総合格闘技のケージ", boxing: "ボクシングのリング", wrestling: "レスリングのマット", prowrestling: "プロレスのリング" },
550
554
  about: {
551
555
  nfl: "アメリカンフットボールのフィールド。エンドゾーンを含めて120×53⅓ヤードで、5ヤードごとのヤードライン、ハッシュマーク、ヤードナンバー、ゴールポストがあります",
552
556
  cfl: "カナディアンフットボールのフィールド。20ヤードのエンドゾーンを含めて150×65ヤードで、5ヤードごとのヤードライン、ハッシュマーク、ヤードナンバー、ゴールライン上のゴールポストがあります",
@@ -590,6 +594,7 @@ export const KYOGIJO_STRINGS = {
590
594
  mma: "総合格闘技のケージ。金網で囲まれた、対辺間の距離が30フィート(約9.1m)の八角形で、高さ122cmの台の上にあります",
591
595
  boxing: "ボクシングのリング。ロープの内側は一辺20フィート(約6.1m)の正方形で、リングは高さ122cmの台の上にあります",
592
596
  wrestling: "UWWのレスリングマット。直径9mの円の外側に幅1.5mのプロテクションエリアがあり、円の内側にオレンジ色のパッシビティゾーンがあります。マットは高さ1mの台の上にあります",
597
+ prowrestling: "プロレスのリング。ロープの内側は一辺20フィート(約6.1m)の正方形で、リングは高さ102cmの台の上にあります",
593
598
  },
594
599
  status: { final: "試合終了", "final-ot": "試合終了(延長)", "final-so": "試合終了(SO)", "final-aet": "試合終了(延長戦)", "final-pens": "試合終了(PK戦)", live: "試合中", half: "ハーフタイム", "extra-time": "延長戦", "extra-end": "エキストラエンド", penalties: "PK戦", postponed: "延期", tiebreak: "タイブレーク", "match-tiebreak": "マッチタイブレーク", retired: "途中棄権", walkover: "不戦勝" },
595
600
  endStatus: "第{n}エンド",
@@ -789,7 +794,7 @@ export const KYOGIJO_STRINGS = {
789
794
  mmaFloor: "ケージは床と同じ高さにあります",
790
795
  mmaGates: "出入口は向かい合う2か所にあります。",
791
796
  mmaSteps: "各出入口に、台へ上がる階段があります。",
792
- boxing: "ボクシングのリング。キャンバスを張った床は、ロープの内側が一辺{feet}フィート(約{size}m)の正方形で、4本のロープで囲まれています。ロープの外側には幅{apron}cmのエプロンが続き、四隅にパッド付きのコーナーポストがあります。{platform}",
797
+ boxing: "ボクシングのリング。キャンバスを張った床は、ロープの内側が一辺{feet}フィート(約{size}m)の正方形で、各辺に4本のロープが張られています。ロープの外側には幅{apron}cmのエプロンが続き、四隅にパッド付きのコーナーポストがあります。{platform}",
793
798
  boxingPlatform: "リングは高さ{height}cmの台の上にあります",
794
799
  boxingFloor: "リングは床と同じ高さにあります",
795
800
  boxingCorners: "コーナーの色は、ボクサー用が赤と青、中立コーナーが白です。",
@@ -800,6 +805,9 @@ export const KYOGIJO_STRINGS = {
800
805
  wrestlingFloor: "マットは会場の床に敷かれています",
801
806
  wrestlingCentre: "中央には直径{d}mの円があります。",
802
807
  wrestlingLines: "中央の平行な2本のスタートラインは、一方の端が緑の線、もう一方の端が赤の線で閉じられています。",
808
+ prowrestling: "プロレスのリング。キャンバスを張った床は、ロープの内側が一辺{feet}フィート(約{size}m)の正方形で、各辺に3本のロープが張られています。ロープの外側には幅{apron}cmのエプロンが続き、四隅にパッド付きのコーナーポストがあります。{platform}",
809
+ prowrestlingRopes: "各辺の3本のロープは、互いにつながっていません。",
810
+ prowrestlingSteps: "台の脇、2つのコーナーのそばに、鉄製の階段があります。",
803
811
  board: {
804
812
  ippon: "一本", wazaari: "技あり", yuko: "有効", shido: "指導", senshu: "先取", chui: "注意", points: "ポイント", kimarite: "決まり手",
805
813
  techniques: { men: "面", kote: "小手", do: "胴", tsuki: "突き", hansoku: "反則" },
@@ -861,7 +869,7 @@ export const KYOGIJO_STRINGS = {
861
869
  results: { touchdown: "タッチダウン", "field-goal": "フィールドゴール", "missed-field-goal": "フィールドゴール失敗", punt: "パント", turnover: "ターンオーバー", interception: "インターセプト", fumble: "ファンブル", downs: "ダウン更新失敗によるターンオーバー", safety: "セーフティ", "end-of-half": "ハーフ終了" },
862
870
  },
863
871
  special: {
864
- guest: { skating: "リンク", nfl: "アメリカンフットボールのフィールド", cfl: "カナディアンフットボールのフィールド", ifaf: "アメリカンフットボールのフィールド", nhl: "リンク", nba: "コート", mlb: "野球のグラウンド", soccer: "ピッチ", curling: "シート", tennis: "コート", volleyball: "コート", badminton: "コート", pickleball: "コート", tabletennis: "卓球台", padel: "コート", squash: "コート", racquetball: "コート", sepaktakraw: "コート", teqball: "コート", roundnet: "コート", netball: "コート", lacrosse: "フィールド", rugby: "グラウンド", afl: "グラウンド", gaelic: "フィールド", cricket: "グラウンド", fieldhockey: "ピッチ", handball: "コート", swimming: "プール", waterpolo: "プール", diving: "プール", artisticswimming: "プール", athletics: "トラック", judo: "試合場", karate: "試合場", kendo: "試合場", sumo: "土俵", kyudo: "弓道場", dojo: "道場", mma: "ケージ", boxing: "リング", wrestling: "マット" },
872
+ guest: { skating: "リンク", nfl: "アメリカンフットボールのフィールド", cfl: "カナディアンフットボールのフィールド", ifaf: "アメリカンフットボールのフィールド", nhl: "リンク", nba: "コート", mlb: "野球のグラウンド", soccer: "ピッチ", curling: "シート", tennis: "コート", volleyball: "コート", badminton: "コート", pickleball: "コート", tabletennis: "卓球台", padel: "コート", squash: "コート", racquetball: "コート", sepaktakraw: "コート", teqball: "コート", roundnet: "コート", netball: "コート", lacrosse: "フィールド", rugby: "グラウンド", afl: "グラウンド", gaelic: "フィールド", cricket: "グラウンド", fieldhockey: "ピッチ", handball: "コート", swimming: "プール", waterpolo: "プール", diving: "プール", artisticswimming: "プール", athletics: "トラック", judo: "試合場", karate: "試合場", kendo: "試合場", sumo: "土俵", kyudo: "弓道場", dojo: "道場", mma: "ケージ", boxing: "リング", wrestling: "マット", prowrestling: "リング" },
865
873
  title: "{host}の中の{guest}",
866
874
  game: "{event}、{date}。",
867
875
  inside: "{guest}全体が{host}の輪郭の内側に収まっています。",
@@ -955,7 +963,7 @@ export const KYOGIJO_STRINGS = {
955
963
  "distance-line": "距離を示すライン", "large-rectangle": "大きい長方形", "small-rectangle": "小さい長方形", "thirteen-metre-arc": "13メートルアーク", "forty-metre-arc": "40メートルアーク", "penalty-point": "ペナルティーマーク",
956
964
  boundary: "バウンダリー", pitch: "ピッチ", "bowling-crease": "ボウリングクリース", "popping-crease": "ポッピングクリース", "return-crease": "リターンクリース", wicket: "ウィケット", "thirty-yard-circle": "30ヤードサークル",
957
965
  "twenty-three-line": "23メートルライン", "shooting-circle": "シューティングサークル", "penalty-spot": "ペナルティースポット", "broken-circle-line": "サークルを囲む破線", "goal-area-line": "ゴールエリアライン",
958
- "referee-position": "主審の位置", "shiai-jo": "試合場", floorboard: "床板", heri: "畳縁", "contest-area": "試合場内", "safety-area": "安全地帯", "danger-zone": "危険地帯", "start-mark": "開始線", "common-safe-zone": "共通の安全地帯", "free-zone": "フリーゾーン", platform: "畳の台", "technical-table": "係員席", "centre-tape": "中央のテープ", "kata-judges": "審判員席(正面側)", "coach-chair": "コーチ席", "kata-entry": "入退場口(正面の反対側)", arena: "アリーナの床", "competition-area": "試合場", "boundary-band": "境界の帯", "start-mat": "開始位置のマット", judge: "副審", "between-areas": "試合場の間", "centre-cross": "中央の×印", "kaishi-sen": "開始線", "outer-boundary": "場外の余地", dohyo: "土俵", ring: "土俵の円", tawara: "俵", tokudawara: "徳俵", "shikiri-sen": "仕切り線", "jano-me": "蛇の目", shajo: "射場", "shooting-position": "射位", honza: "本座", yamichi: "矢道", "yatori-michi": "矢取道", azuchi: "安土", mato: "的", kamiza: "上座", "cage-canvas": "キャンバス", "cage-fence": "金網", "cage-post": "パッド付き支柱", "cage-gate": "出入口", "cage-steps": "階段", "cage-platform": "台", "ring-canvas": "キャンバス", "ring-ropes": "ロープ", "ring-post": "コーナーポスト", "ring-red-corner": "赤コーナー", "ring-blue-corner": "青コーナー", "ring-apron": "エプロン", "ring-steps": "階段", "mat-circle": "レスリングエリア", "mat-central": "中央の競技面", "mat-border": "マットの外周部", "mat-passivity": "パッシビティゾーン", "mat-centre-circle": "センターサークル", "mat-starting-lines": "スタートライン", "mat-platform": "台", shimoza: "下座", shinzen: "神棚", dais: "上座の台", banner: "垂れ幕", entrance: "入口", window: "窓", tatami: "畳", wall: "壁", "inner-lane": "インレーン", "outer-lane": "アウトレーン", "crossing-straight": "交差ストレート", "warm-up-lane": "ウォームアップレーン", padding: "防護マット", infield: "インフィールド", "coaches-area": "コーチエリア", blocks: "ブロック", "track-line": "トラックのライン", "start-lines": "スタートライン", ice: "氷面", "technical-panel": "テクニカルパネル", referee: "レフェリー", "kiss-and-cry": "キス・アンド・クライ", judges: "ジャッジ席", runway: "助走路", "take-off-board": "踏切板", "landing-area": "砂場", "throwing-circle": "投てきサークル", sector: "着地場所", "stop-board": "足留材", cage: "囲い", "throwing-arc": "スターティング・ライン", crossbar: "バー", "landing-mat": "着地マット", "run-up": "助走路", "zero-line": "ゼロライン", box: "ボックス",
966
+ "referee-position": "主審の位置", "shiai-jo": "試合場", floorboard: "床板", heri: "畳縁", "contest-area": "試合場内", "safety-area": "安全地帯", "danger-zone": "危険地帯", "start-mark": "開始線", "common-safe-zone": "共通の安全地帯", "free-zone": "フリーゾーン", platform: "畳の台", "technical-table": "係員席", "centre-tape": "中央のテープ", "kata-judges": "審判員席(正面側)", "coach-chair": "コーチ席", "kata-entry": "入退場口(正面の反対側)", arena: "アリーナの床", "competition-area": "試合場", "boundary-band": "境界の帯", "start-mat": "開始位置のマット", judge: "副審", "between-areas": "試合場の間", "centre-cross": "中央の×印", "kaishi-sen": "開始線", "outer-boundary": "場外の余地", dohyo: "土俵", ring: "土俵の円", tawara: "俵", tokudawara: "徳俵", "shikiri-sen": "仕切り線", "jano-me": "蛇の目", shajo: "射場", "shooting-position": "射位", honza: "本座", yamichi: "矢道", "yatori-michi": "矢取道", azuchi: "安土", mato: "的", kamiza: "上座", "cage-canvas": "キャンバス", "cage-fence": "金網", "cage-post": "パッド付き支柱", "cage-gate": "出入口", "cage-steps": "階段", "cage-platform": "台", "ring-canvas": "キャンバス", "ring-ropes": "ロープ", "ring-post": "コーナーポスト", "ring-red-corner": "赤コーナー", "ring-blue-corner": "青コーナー", "ring-apron": "エプロン", "ring-steps": "階段", "ring-platform": "台", "mat-circle": "レスリングエリア", "mat-central": "中央の競技面", "mat-border": "マットの外周部", "mat-passivity": "パッシビティゾーン", "mat-centre-circle": "センターサークル", "mat-starting-lines": "スタートライン", "mat-platform": "台", shimoza: "下座", shinzen: "神棚", dais: "上座の台", banner: "垂れ幕", entrance: "入口", window: "窓", tatami: "畳", wall: "壁", "inner-lane": "インレーン", "outer-lane": "アウトレーン", "crossing-straight": "交差ストレート", "warm-up-lane": "ウォームアップレーン", padding: "防護マット", infield: "インフィールド", "coaches-area": "コーチエリア", blocks: "ブロック", "track-line": "トラックのライン", "start-lines": "スタートライン", ice: "氷面", "technical-panel": "テクニカルパネル", referee: "レフェリー", "kiss-and-cry": "キス・アンド・クライ", judges: "ジャッジ席", runway: "助走路", "take-off-board": "踏切板", "landing-area": "砂場", "throwing-circle": "投てきサークル", sector: "着地場所", "stop-board": "足留材", cage: "囲い", "throwing-arc": "スターティング・ライン", crossbar: "バー", "landing-mat": "着地マット", "run-up": "助走路", "zero-line": "ゼロライン", box: "ボックス",
959
967
  "finish-line": "フィニッシュライン", kerb: "縁石", "lane-lines": "レーンライン", bend: "曲走路", straight: "直走路", "infield-pitch": "サッカーのピッチ", "start-line": "スタートライン", breakline: "ブレイクライン", "water-jump": "水濠", "exchange-zone": "テークオーバーゾーン",
960
968
  "seven-metre-line": "7mスローライン", "four-metre-line": "4mライン", "throw-off-area": "スローオフエリア", "restraining-line": "リストレイニングライン", "wing-line": "ウイングライン", "marking-area": "マーキングエリア", "two-point-arc": "2ポイントアーク",
961
969
  "lane-rope": "レーンロープ", "lane-line": "床面のレーンライン", "lane-end-cross": "クロスライン", "fifteen-metre-mark": "15mマーク", "touch-pad": "タッチ板", "starting-block": "スタート台", "backstroke-flags": "背泳ぎ用フラッグ", "false-start-rope": "フォルススタートロープ", gutter: "ガター",
package/dist/types.d.ts CHANGED
@@ -17,7 +17,7 @@ export type { PoolSport, PoolStyle };
17
17
  /** The budō: the contest areas of judo and karate, the kendo shiai-jo, the sumo dohyō, the kyūdōjō, and a dojo of tatami. */
18
18
  export type BudoSport = "judo" | "karate" | "kendo" | "sumo" | "kyudo" | "dojo";
19
19
  /** The combat sports' rings, cages and mats, drawn by the same engine as the budō: the MMA cage (eight-sided, as a generic cage), and as they are added the boxing ring, the wrestling mats and the professional wrestling ring. */
20
- export type CombatSport = "mma" | "boxing" | "wrestling";
20
+ export type CombatSport = "mma" | "boxing" | "wrestling" | "prowrestling";
21
21
  export type { BudoStyle, DojoSpec, BudoScore };
22
22
  /** The surfaces: three football fields, a rink, a court, a ballpark, a soccer pitch, a curling sheet, twelve net, racket and court sports (tennis, volleyball, badminton, pickleball, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet and netball), four pools (swimming, water polo, diving and artistic swimming), seven field sports (lacrosse, rugby, Australian football, Gaelic football and hurling, cricket, field hockey and handball) and the athletics stadium (the 400 m track with its infield, and the covered 200 m track). */
23
23
  export type Sport = "nfl" | "cfl" | "ifaf" | "nhl" | "nba" | "mlb" | "soccer" | "curling" | "tennis" | "volleyball" | "badminton" | "pickleball" | "tabletennis" | "padel" | "squash" | "racquetball" | "sepaktakraw" | "teqball" | "roundnet" | "netball" | PoolSport | FieldSport | "athletics" | "skating" | BudoSport | CombatSport;
package/dist/units.js CHANGED
@@ -62,6 +62,8 @@ export const SURFACE_UNITS = Object.freeze({
62
62
  boxing: "ft",
63
63
  // The mat: the UWW's rules are in metres (the folkstyle leagues' in feet, in their own league).
64
64
  wrestling: "m",
65
+ // The ring: the sources give its figures in feet and inches.
66
+ prowrestling: "ft",
65
67
  });
66
68
  /** True when `unit` is one of the six. */
67
69
  export const isUnit = (unit) => typeof unit === "string" && Object.prototype.hasOwnProperty.call(FEET_PER, unit);
@@ -72,6 +72,8 @@ export function budoUprights(o, thin) {
72
72
  items.push(...cageUprights(plan, at, thin));
73
73
  if (plan.boxing !== undefined)
74
74
  items.push(...ringUprights(plan, plan.boxing, at));
75
+ if (plan.prowrestling !== undefined)
76
+ items.push(...ringUprights(plan, plan.prowrestling, at));
75
77
  // A wrestling mat that stands on a platform (the UWW's at the great events) is a solid block with the mat as its top; on the floor nothing stands.
76
78
  if (plan.wrestling?.platform !== undefined) {
77
79
  const h = plan.wrestling.height * K;
@@ -100,5 +102,5 @@ export function budoUprights(o, thin) {
100
102
  });
101
103
  items.push({ id: "walls", kind: "walls", at: centre, height: h, planes });
102
104
  }
103
- return { items, lift, area, whole: plan.sumo !== undefined || plan.mma !== undefined || plan.boxing !== undefined || plan.wrestling?.platform !== undefined };
105
+ return { items, lift, area, whole: plan.sumo !== undefined || plan.mma !== undefined || plan.boxing !== undefined || plan.prowrestling !== undefined || plan.wrestling?.platform !== undefined };
104
106
  }
package/dist/uprights.js CHANGED
@@ -32,7 +32,7 @@ import { NO_VENUE, standsVenue } from "./venue.js";
32
32
  /** All the planes of all the things. */
33
33
  export const planesOf = (u) => u.items.flatMap((item) => item.planes);
34
34
  /** The unit each sport's rulebook gives its heights in, when the options name none. */
35
- const RULEBOOK_UNIT = { volleyball: "m", badminton: "m", tabletennis: "m", padel: "m", squash: "m", athletics: "m", skating: "m", judo: "m", karate: "m", kendo: "m", sumo: "m", kyudo: "m", dojo: "m", mma: "ft", boxing: "ft", wrestling: "m", swimming: "m", waterpolo: "m", diving: "m", artisticswimming: "m", sepaktakraw: "m", teqball: "m", roundnet: "m", netball: "m", soccer: "m", handball: "m", fieldhockey: "m", rugby: "m", afl: "m", gaelic: "m" };
35
+ const RULEBOOK_UNIT = { volleyball: "m", badminton: "m", tabletennis: "m", padel: "m", squash: "m", athletics: "m", skating: "m", judo: "m", karate: "m", kendo: "m", sumo: "m", kyudo: "m", dojo: "m", mma: "ft", boxing: "ft", wrestling: "m", prowrestling: "ft", swimming: "m", waterpolo: "m", diving: "m", artisticswimming: "m", sepaktakraw: "m", teqball: "m", roundnet: "m", netball: "m", soccer: "m", handball: "m", fieldhockey: "m", rugby: "m", afl: "m", gaelic: "m" };
36
36
  /** What stands on the surface the options draw: nothing on a curling sheet, which is flat. */
37
37
  export function uprightsFor(o, settings = {}) {
38
38
  const { sport, league } = chooseLeague(o);
@@ -61,7 +61,8 @@ export function ringUprights(plan, L, at) {
61
61
  const hi = h0 + fig.ropes.heights[fig.ropes.heights.length - 1] * K;
62
62
  const ties = [];
63
63
  const sq = L.corners.map((c) => at(c.rope[0], c.rope[1]));
64
- for (let i = 0; i < 4; i += 1) {
64
+ const sides = plan.figures.ties ? 4 : 0;
65
+ for (let i = 0; i < sides; i += 1) {
65
66
  const a = sq[i];
66
67
  const b = sq[(i + 1) % 4];
67
68
  for (const t of [1 / 3, 2 / 3]) {
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** The package's version: the same as package.json's, and a test holds them to each other. */
2
- export declare const VERSION = "0.22.0";
2
+ export declare const VERSION = "0.23.0";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  /** The package's version: the same as package.json's, and a test holds them to each other. */
2
- export const VERSION = "0.22.0";
2
+ export const VERSION = "0.23.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@johnmorrisdotca/kyogijo-stadiums",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "Kyogijo Stadiums 競技場, 40 sports' surfaces as SVG, drawn to scale from the rulebooks: NFL, CFL and IFAF football fields, an NHL rink, an NBA court, MLB ballparks, soccer pitches, curling sheets, athletics stadiums, speed skating, short track and figure skating rinks, swimming pools, water polo fields, diving wells, artistic swimming areas, and the courts and fields of tennis, volleyball (indoor, beach and sitting), badminton, pickleball, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet, netball, lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball, and the budo of judo, karate, kendo, sumo and kyudo with a dojo of tatami laid as real units, the MMA cage, with each team's name and logo on its side and the score in the middle, stands and a crowd, a pageant of flags, and a 3D view. Light and dark, accessible, a compact badge for lists, a helper for React and a custom element. Zero dependencies.",
5
5
  "keywords": [
6
6
  "sports",