@johnmorrisdotca/kyogijo-stadiums 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/NOTICE.md +179 -3
  3. package/README.md +43 -11
  4. package/dist/arenas-entry.d.ts +4 -0
  5. package/dist/arenas-entry.js +3 -0
  6. package/dist/arenas.d.ts +125 -0
  7. package/dist/arenas.data.d.ts +2 -0
  8. package/dist/arenas.data.js +3763 -0
  9. package/dist/arenas.js +72 -0
  10. package/dist/atlas-entry.d.ts +3 -1
  11. package/dist/atlas-entry.js +3 -2
  12. package/dist/atlas.d.ts +37 -19
  13. package/dist/atlas.js +92 -7
  14. package/dist/background.js +2 -1
  15. package/dist/budo/describe.d.ts +13 -0
  16. package/dist/budo/describe.js +120 -0
  17. package/dist/budo/dojo.api.d.ts +64 -0
  18. package/dist/budo/dojo.api.js +46 -0
  19. package/dist/budo/dojo.d.ts +72 -0
  20. package/dist/budo/dojo.js +300 -0
  21. package/dist/budo/judo.d.ts +61 -0
  22. package/dist/budo/judo.js +109 -0
  23. package/dist/budo/karate.d.ts +29 -0
  24. package/dist/budo/karate.js +80 -0
  25. package/dist/budo/kendo.d.ts +18 -0
  26. package/dist/budo/kendo.js +44 -0
  27. package/dist/budo/kimarite.d.ts +19 -0
  28. package/dist/budo/kimarite.js +33 -0
  29. package/dist/budo/kit.d.ts +16 -0
  30. package/dist/budo/kit.js +24 -0
  31. package/dist/budo/kyudo.d.ts +28 -0
  32. package/dist/budo/kyudo.js +66 -0
  33. package/dist/budo/looks.d.ts +28 -0
  34. package/dist/budo/looks.js +58 -0
  35. package/dist/budo/parts.d.ts +32 -0
  36. package/dist/budo/parts.js +10 -0
  37. package/dist/budo/plan.d.ts +64 -0
  38. package/dist/budo/plan.js +139 -0
  39. package/dist/budo/room.d.ts +133 -0
  40. package/dist/budo/room.js +111 -0
  41. package/dist/budo/sumo.d.ts +31 -0
  42. package/dist/budo/sumo.js +71 -0
  43. package/dist/budo/tatami.d.ts +55 -0
  44. package/dist/budo/tatami.js +156 -0
  45. package/dist/budo/types.d.ts +192 -0
  46. package/dist/budo/types.js +2 -0
  47. package/dist/budo-entry.d.ts +22 -0
  48. package/dist/budo-entry.js +13 -0
  49. package/dist/budo.board.d.ts +28 -0
  50. package/dist/budo.board.js +81 -0
  51. package/dist/budo.score.d.ts +18 -0
  52. package/dist/budo.score.js +52 -0
  53. package/dist/budo.style.d.ts +6 -0
  54. package/dist/budo.style.js +67 -0
  55. package/dist/charts.baseball.js +1 -1
  56. package/dist/charts.js +4 -4
  57. package/dist/charts.soccer.js +3 -3
  58. package/dist/charts.types.d.ts +10 -0
  59. package/dist/colour.d.ts +4 -4
  60. package/dist/colour.js +4 -4
  61. package/dist/crowd.d.ts +11 -1
  62. package/dist/crowd.draw.js +15 -9
  63. package/dist/crowd.js +17 -2
  64. package/dist/draw.js +156 -31
  65. package/dist/element-entry.d.ts +2 -0
  66. package/dist/element-entry.js +1 -0
  67. package/dist/element.d.ts +2 -2
  68. package/dist/element.js +2 -1
  69. package/dist/emblems-source.d.ts +50 -0
  70. package/dist/emblems-source.js +56 -0
  71. package/dist/eras.d.ts +3 -1
  72. package/dist/eras.js +8 -3
  73. package/dist/features.js +73 -0
  74. package/dist/field.data.d.ts +16 -0
  75. package/dist/field.data.js +50 -0
  76. package/dist/fields.kit.d.ts +2 -2
  77. package/dist/fields.types.d.ts +9 -3
  78. package/dist/formations.js +18 -7
  79. package/dist/formations.sports.d.ts +8 -0
  80. package/dist/formations.sports.js +251 -0
  81. package/dist/frames.providers.js +9 -1
  82. package/dist/halls.d.ts +65 -0
  83. package/dist/halls.js +122 -0
  84. package/dist/heat.js +17 -10
  85. package/dist/heat.zones.d.ts +4 -2
  86. package/dist/heat.zones.js +55 -3
  87. package/dist/homeside.js +7 -0
  88. package/dist/index.d.ts +15 -3
  89. package/dist/index.js +8 -1
  90. package/dist/layers-entry.d.ts +2 -1
  91. package/dist/layers-entry.js +1 -0
  92. package/dist/layers.d.ts +2 -1
  93. package/dist/layers.env.d.ts +10 -1
  94. package/dist/layers.env.js +33 -3
  95. package/dist/layers.js +30 -11
  96. package/dist/layers.types.d.ts +9 -2
  97. package/dist/leagues/budo.d.ts +196 -0
  98. package/dist/leagues/budo.js +105 -0
  99. package/dist/leagues/hockey.js +41 -19
  100. package/dist/leagues/sources.js +21 -0
  101. package/dist/leagues/types.d.ts +1 -1
  102. package/dist/leagues.d.ts +4 -1
  103. package/dist/leagues.js +102 -2
  104. package/dist/lineup.codes.d.ts +23 -0
  105. package/dist/lineup.codes.js +122 -0
  106. package/dist/logo.d.ts +25 -0
  107. package/dist/logo.js +47 -0
  108. package/dist/outline.d.ts +1 -1
  109. package/dist/outline.js +17 -3
  110. package/dist/pageant.js +7 -3
  111. package/dist/pointer-entry.d.ts +2 -0
  112. package/dist/pointer-entry.js +2 -0
  113. package/dist/pointer.d.ts +113 -0
  114. package/dist/pointer.js +151 -0
  115. package/dist/pool.d.ts +7 -7
  116. package/dist/pool.figures.d.ts +57 -55
  117. package/dist/pool.figures.js +59 -55
  118. package/dist/pool.js +7 -7
  119. package/dist/pool.labels.js +2 -1
  120. package/dist/ranges.names.js +6 -0
  121. package/dist/road.draw.js +3 -2
  122. package/dist/road.js +2 -1
  123. package/dist/road.types.d.ts +3 -0
  124. package/dist/rules.d.ts +138 -0
  125. package/dist/rules.js +511 -0
  126. package/dist/rules.types.d.ts +4 -0
  127. package/dist/rules.types.js +64 -0
  128. package/dist/score.d.ts +3 -0
  129. package/dist/score.js +23 -1
  130. package/dist/situation.d.ts +135 -0
  131. package/dist/situation.draw.d.ts +34 -0
  132. package/dist/situation.draw.js +202 -0
  133. package/dist/situation.js +337 -0
  134. package/dist/situation.style.d.ts +2 -0
  135. package/dist/situation.style.js +45 -0
  136. package/dist/situation.types.d.ts +77 -0
  137. package/dist/situation.types.js +3 -0
  138. package/dist/situation.widgets.d.ts +39 -0
  139. package/dist/situation.widgets.js +129 -0
  140. package/dist/strings.d.ts +175 -1
  141. package/dist/strings.js +364 -20
  142. package/dist/style.js +9 -2
  143. package/dist/surfaces/artistic.d.ts +3 -3
  144. package/dist/surfaces/artistic.js +3 -3
  145. package/dist/surfaces/baseball.js +2 -0
  146. package/dist/surfaces/basketball.js +1 -1
  147. package/dist/surfaces/budo.d.ts +6 -0
  148. package/dist/surfaces/budo.js +104 -0
  149. package/dist/surfaces/dive.d.ts +3 -3
  150. package/dist/surfaces/dive.js +3 -3
  151. package/dist/surfaces/football.js +7 -0
  152. package/dist/surfaces/hockey.js +3 -2
  153. package/dist/surfaces/polo.d.ts +4 -4
  154. package/dist/surfaces/polo.js +5 -5
  155. package/dist/surfaces/pool.d.ts +1 -1
  156. package/dist/surfaces/pool.js +3 -3
  157. package/dist/surfaces/surface.d.ts +32 -0
  158. package/dist/surfaces/venue.d.ts +1 -1
  159. package/dist/surfaces/venue.js +1 -1
  160. package/dist/target-entry.d.ts +2 -0
  161. package/dist/target-entry.js +2 -0
  162. package/dist/target.d.ts +200 -0
  163. package/dist/target.js +525 -0
  164. package/dist/team.common.d.ts +1 -1
  165. package/dist/team.common.js +3 -3
  166. package/dist/team.formation.d.ts +3 -1
  167. package/dist/team.formation.js +3 -3
  168. package/dist/team.layers.d.ts +2 -2
  169. package/dist/team.layers.js +4 -1
  170. package/dist/team.lineup.d.ts +27 -0
  171. package/dist/team.lineup.js +207 -0
  172. package/dist/team.network.js +6 -5
  173. package/dist/team.shape.js +5 -5
  174. package/dist/team.types.d.ts +40 -1
  175. package/dist/tenants.data.js +848 -0
  176. package/dist/turn-entry.d.ts +2 -2
  177. package/dist/turn-entry.js +1 -1
  178. package/dist/turn.camera.d.ts +12 -1
  179. package/dist/turn.camera.js +18 -2
  180. package/dist/turn.dom.js +11 -9
  181. package/dist/turn.kit.d.ts +2 -2
  182. package/dist/turn.style.js +4 -3
  183. package/dist/types.d.ts +43 -7
  184. package/dist/units.js +7 -0
  185. package/dist/uprights.budo.d.ts +17 -0
  186. package/dist/uprights.budo.js +87 -0
  187. package/dist/uprights.js +10 -1
  188. package/dist/uprights.pools.js +4 -4
  189. package/dist/version.d.ts +1 -1
  190. package/dist/version.js +1 -1
  191. package/dist/zones-entry.d.ts +2 -0
  192. package/dist/zones-entry.js +2 -0
  193. package/package.json +39 -3
@@ -0,0 +1,196 @@
1
+ import { type Span } from "./fields.ts";
2
+ import type { LeagueBase } from "./types.ts";
3
+ /** A mat: its length and width in metres. */
4
+ export interface Mat {
5
+ length: number;
6
+ width: number;
7
+ }
8
+ /** The figures of a judo contest area (a competition tatami), in metres. */
9
+ export interface JudoFigures {
10
+ kind: "judo";
11
+ /** The contest area, a square: 8 m to 10 m a side (IJF SOR 8.7); 10 m at the Olympic Games, the World Championships and the Masters, which is the size drawn. */
12
+ contest: Span;
13
+ /** The safety area round it: at least 3 m (SOR 8.7). At the Games it is 4 m (the common and the exterior one); that is drawn. The rules give no greatest, so the drawing allows up to 6 m (ours). */
14
+ safety: Span;
15
+ /** The distance between two adjoining contest areas: a common safe zone of at least 4 m may serve (SOR 8.7). */
16
+ common: number;
17
+ /** The free zone kept round the whole competition area: at least 0.5 m (SOR 8.7). */
18
+ freeZone: number;
19
+ /** The tatami: 1 m by 2 m by 5 cm of pressed foam (SOR 8.7); the AJJF's own is 182 cm by 91 cm, 5 or 6 cm thick (guidebook 2-1). */
20
+ tatami: Mat & {
21
+ thickness: number;
22
+ };
23
+ /** A solid platform under the tatami is one metre wider and longer than the tatami (SOR 8.7), with an exterior safety area of 4 m. */
24
+ platform: number;
25
+ /** The tape that marks where the contestants start: 10 cm by 50 cm (SOR 2020 18.1), and how far each is from the centre. */
26
+ marks: {
27
+ width: number;
28
+ length: number;
29
+ fromCentre: number;
30
+ } | null;
31
+ /** The domestic red tatami of the danger zone, as wide as one tatami, inside the contest area; none in an IJF contest area (the guidebook 2-3 allows it at events other than the Games, the Worlds and the Masters). */
32
+ danger: boolean;
33
+ /** A kata area: two white tapes 5 cm by 50 cm, 3 m from the centre either side, and a safety area of 2 m (SOR B1.8). */
34
+ kata: boolean;
35
+ }
36
+ /** The figures of a karate competition area, in metres. */
37
+ export interface KarateFigures {
38
+ kind: "karate";
39
+ /** The matted square, 8 m a side measured from the outside (WKF Kumite 1.1, Kata 1.1). */
40
+ area: number;
41
+ /** Kumite: the outer 1 m of the square is in another colour, marking the boundary (1.1). None for kata. */
42
+ band: number;
43
+ /** The safety area round the square: 2 m (1.1). */
44
+ safety: number;
45
+ /** The least distance between two competition areas: 2 m (1.2). */
46
+ between: number;
47
+ /** Kumite: the two mats turned over, red side up, 1 m from the centre (1.5). The mat's size is not in the rules: 1 m by 1 m (ours, the size of a WKF-approved mat). */
48
+ startMats: {
49
+ size: number;
50
+ fromCentre: number;
51
+ } | null;
52
+ /** The referee stands at the middle, 2 m from the boundary (1.6); each judge sits about 1.5 m off a corner in the safety area (1.6). */
53
+ referee: number;
54
+ judges: number;
55
+ }
56
+ /** The figures of a kendo shiai-jo, in metres. */
57
+ export interface KendoFigures {
58
+ kind: "kendo";
59
+ /** A square or a rectangle of 9 m to 11 m a side, inclusive of the width of the line (Article 2). 10 m is drawn: the middle (ours). */
60
+ side: Span;
61
+ /** The lines are 5 cm to 10 cm wide and white as a rule (Subsidiary Rules, Article 1). */
62
+ lineWidth: Span;
63
+ /** The cross at the centre: 30 cm to 40 cm (Figure 1). */
64
+ cross: Span;
65
+ /** The two kaishi-sen, each 50 cm long and 1.4 m from the centre (Figure 1). */
66
+ startLine: {
67
+ length: number;
68
+ fromCentre: number;
69
+ };
70
+ /** A space of at least 1.5 m is kept outside the shiai-jo (Subsidiary Rules, Article 1). */
71
+ outside: number;
72
+ }
73
+ /** The figures of a sumo dohyō, in metres. */
74
+ export interface SumoFigures {
75
+ kind: "sumo";
76
+ /** The clay square: 6.7 m a side (Sumo Rules, Dohyō Regulations, Article 1). */
77
+ platform: number;
78
+ /** Its height: 34 cm to 60 cm for a public dohyō (Article 1); 55 cm is drawn (ours). */
79
+ height: Span;
80
+ /** The circle of tawara: 4.55 m, 15 shaku (Article 1). Taken as the inside of the ring, where the wrestlers stand (ours: the rule does not say which edge). */
81
+ circle: number;
82
+ /** The tawara of the circle: 20, which are 4 tokudawara and 4 between each of them (Quiz No. 355). */
83
+ tawara: {
84
+ count: number;
85
+ tokuda: number;
86
+ between: number;
87
+ };
88
+ /** The shikiri-sen: two white lines 90 cm long, 6 cm wide and 70 cm apart (Quiz No. 1091). */
89
+ shikiri: {
90
+ length: number;
91
+ width: number;
92
+ apart: number;
93
+ };
94
+ /** The width of a tawara's cross-section and how far a tokudawara stands out from the circle: the rules give neither (ours). */
95
+ bale: {
96
+ width: number;
97
+ out: number;
98
+ };
99
+ /** The band of sand, the jano-me, outside the tawara: the rules give no width (ours). */
100
+ jano: number;
101
+ }
102
+ /** The figures of a kyūdōjō, in metres. */
103
+ export interface KyudoFigures {
104
+ kind: "kyudo";
105
+ /** The distance from the shooting position (射位) to the face of the target: 28 m (kinteki) or 60 m (enteki) (Wakayama 2015; ANKF manual 4). */
106
+ distance: number;
107
+ /** The target: 36 cm across (a kasumi-mato) for kinteki, 100 cm for enteki; its centre 27 cm above the azuchi's base and tilted 5 degrees, or 97 cm above the ground and tilted 15 degrees. */
108
+ target: {
109
+ diameter: number;
110
+ centre: number;
111
+ tilt: number;
112
+ };
113
+ /** The shooters' places: 1.8 m apart (1.6 m to 2.0 m) for kinteki and 1.6 m (1.4 m to 1.8 m) for enteki, a line of 5 (ANKF manual 6). */
114
+ step: Span;
115
+ count: number;
116
+ /** The distance from the shooting position back to the honza (本座): 2.0 m for kinteki and 1.1 m for enteki (ANKF manual 6). */
117
+ honza: number;
118
+ /** The ceiling of the shajō: 4.0 m, at least 3.8 m (ANKF manual 6). */
119
+ ceiling: number;
120
+ /** The shooters stand to one side or the other of the door: the distance to the wall behind the last shooter, at least 1.4 m, and the least distance from the honza to the officials' seats behind (3.0 m for kinteki, 4.0 m for enteki). */
121
+ behind: {
122
+ wall: number;
123
+ officials: number;
124
+ };
125
+ /**
126
+ * The shajō in the manual's figures (Figures II-1 and II-3): 9.0 m from the front edge to the row of the officials' seats, with the shooting positions 2.1 m behind the front edge; 2.7 m (kinteki) or 2.2 m (enteki) from the first and the
127
+ * last shooter to the side walls, so that the frontage of 5 shooters is 12.6 m or 10.8 m; 3.6 m more for the judges' side. How far the back wall stands beyond the officials' row is not given: 1.5 m (ours).
128
+ */
129
+ hall: {
130
+ front: number;
131
+ depth: number;
132
+ side: number;
133
+ judges: number;
134
+ rear: number;
135
+ };
136
+ /** The distance from the honza back to the row of the officials' seats: 4.9 m (kinteki) and 5.8 m (enteki), Figures II-1 and II-3. */
137
+ row: number;
138
+ /** The width of the yamichi beyond the line of targets on each side, and the depth, the height and the margin of the azuchi: the rules give none (ours). */
139
+ yamichi: {
140
+ margin: number;
141
+ };
142
+ azuchi: {
143
+ depth: number;
144
+ height: number;
145
+ margin: number;
146
+ };
147
+ }
148
+ /** The figures of a dojo's mat: one tatami of a region. */
149
+ export interface DojoFigures {
150
+ kind: "dojo";
151
+ /** One mat, a jō (畳), twice as long as it is wide. */
152
+ mat: Mat;
153
+ /** Where the standard is used. */
154
+ region: {
155
+ en: string;
156
+ ja: string;
157
+ };
158
+ }
159
+ /** The figures of a budō league. */
160
+ export type BudoFigures = JudoFigures | KarateFigures | KendoFigures | SumoFigures | KyudoFigures | DojoFigures;
161
+ /** The leagues of each budō sport. */
162
+ export type JudoLeague = LeagueBase<"judo", JudoFigures>;
163
+ export type KarateLeague = LeagueBase<"karate", KarateFigures>;
164
+ export type KendoLeague = LeagueBase<"kendo", KendoFigures>;
165
+ export type SumoLeague = LeagueBase<"sumo", SumoFigures>;
166
+ export type KyudoLeague = LeagueBase<"kyudo", KyudoFigures>;
167
+ export type DojoLeague = LeagueBase<"dojo", DojoFigures>;
168
+ /** A league with a budō surface of its own. */
169
+ export type BudoLeague = JudoLeague | KarateLeague | KendoLeague | SumoLeague | KyudoLeague | DojoLeague;
170
+ /** The IJF's contest area (Sport and Organisation Rules 8.7, version of 21 January 2026) as drawn for the Games, the Worlds and the Masters. */
171
+ export declare const IJF_CONTEST: JudoFigures;
172
+ /** The All Japan Judo Federation's: the tatami of 182 cm by 91 cm, the red tatami of the danger zone, and the red and white tape 4 m (2 ken) apart (Tournament Management Guidebook 2023, 2-1, 2-3, 2-4). */
173
+ export declare const AJJF_CONTEST: JudoFigures;
174
+ /** The kata area (SOR B1.8): 10 m for the World Championships and 8 m for other events, a safety area of 2 m, two white tapes of 5 cm by 50 cm, 3 m from the centre. */
175
+ export declare const IJF_KATA: JudoFigures;
176
+ /** The WKF's kumite area (Kumite Competition Rules 2026.01, Article 1). */
177
+ export declare const WKF_KUMITE: KarateFigures;
178
+ /** The WKF's kata area (Kata Competition Rules 2026, Article 1): the same square, with no band and no start mats. */
179
+ export declare const WKF_KATA: KarateFigures;
180
+ /** The kendo shiai-jo (FIK Regulations, Article 2, the Subsidiary Rules' Article 1 and Figure 1). */
181
+ export declare const FIK_SHIAI_JO: KendoFigures;
182
+ /** The dohyō of the Japan Sumo Association (Sumo Rules, Dohyō Regulations, Article 1, and the Association's quizzes). */
183
+ export declare const JSA_DOHYO: SumoFigures;
184
+ /** The kyūdōjō for kinteki (近的), the 28 m range of a competition (ANKF competition manual 6 and the National Sports Festival's rules). */
185
+ export declare const KINTEKI: KyudoFigures;
186
+ /** The kyūdōjō for enteki (遠的), 60 m, with the target of 1 m. */
187
+ export declare const ENTEKI: KyudoFigures;
188
+ /** The budō leagues: for each sport the rulebook's own first. */
189
+ export declare const JUDO_LEAGUES: readonly JudoLeague[];
190
+ export declare const KARATE_LEAGUES: readonly KarateLeague[];
191
+ export declare const KENDO_LEAGUES: readonly KendoLeague[];
192
+ export declare const SUMO_LEAGUES: readonly SumoLeague[];
193
+ export declare const KYUDO_LEAGUES: readonly KyudoLeague[];
194
+ export declare const DOJO_LEAGUES: readonly DojoLeague[];
195
+ /** Every budō league, once each. */
196
+ export declare const BUDO_LEAGUES: readonly BudoLeague[];
@@ -0,0 +1,105 @@
1
+ // The surfaces of the budō (武道): the contest areas of judo and karate, the shiai-jo of kendo, the dohyō of sumo, the kyūdōjō, and the tatami of a dojo, each from the rulebook or the
2
+ // federation's own page it was read in, with every figure in metres. A figure that no rule gives is said so in its comment (ours). Nothing here draws.
3
+ import { span } from "./fields.js";
4
+ /** The IJF's contest area (Sport and Organisation Rules 8.7, version of 21 January 2026) as drawn for the Games, the Worlds and the Masters. */
5
+ export const IJF_CONTEST = {
6
+ kind: "judo",
7
+ contest: span(8, 10, 10),
8
+ safety: span(3, 6, 4),
9
+ common: 4,
10
+ freeZone: 0.5,
11
+ tatami: { length: 2, width: 1, thickness: 0.05 },
12
+ platform: 1,
13
+ marks: { width: 0.1, length: 0.5, fromCentre: 2 },
14
+ danger: false,
15
+ kata: false,
16
+ };
17
+ /** The All Japan Judo Federation's: the tatami of 182 cm by 91 cm, the red tatami of the danger zone, and the red and white tape 4 m (2 ken) apart (Tournament Management Guidebook 2023, 2-1, 2-3, 2-4). */
18
+ export const AJJF_CONTEST = {
19
+ ...IJF_CONTEST,
20
+ contest: span(8, 10, 8),
21
+ safety: span(3, 6, 3),
22
+ tatami: { length: 1.82, width: 0.91, thickness: 0.06 },
23
+ danger: true,
24
+ };
25
+ /** The kata area (SOR B1.8): 10 m for the World Championships and 8 m for other events, a safety area of 2 m, two white tapes of 5 cm by 50 cm, 3 m from the centre. */
26
+ export const IJF_KATA = {
27
+ ...IJF_CONTEST,
28
+ contest: span(8, 10, 10),
29
+ safety: span(2, 6, 2),
30
+ marks: { width: 0.05, length: 0.5, fromCentre: 3 },
31
+ kata: true,
32
+ };
33
+ /** The WKF's kumite area (Kumite Competition Rules 2026.01, Article 1). */
34
+ export const WKF_KUMITE = { kind: "karate", area: 8, band: 1, safety: 2, between: 2, startMats: { size: 1, fromCentre: 1 }, referee: 2, judges: 1.5 };
35
+ /** The WKF's kata area (Kata Competition Rules 2026, Article 1): the same square, with no band and no start mats. */
36
+ export const WKF_KATA = { kind: "karate", area: 8, band: 0, safety: 2, between: 2, startMats: null, referee: 2, judges: 1.5 };
37
+ /** The kendo shiai-jo (FIK Regulations, Article 2, the Subsidiary Rules' Article 1 and Figure 1). */
38
+ export const FIK_SHIAI_JO = { kind: "kendo", side: span(9, 11, 10), lineWidth: span(0.05, 0.1, 0.05), cross: span(0.3, 0.4, 0.35), startLine: { length: 0.5, fromCentre: 1.4 }, outside: 1.5 };
39
+ /** The dohyō of the Japan Sumo Association (Sumo Rules, Dohyō Regulations, Article 1, and the Association's quizzes). */
40
+ export const JSA_DOHYO = {
41
+ kind: "sumo",
42
+ platform: 6.7,
43
+ height: span(0.34, 0.6, 0.55),
44
+ circle: 4.55,
45
+ tawara: { count: 20, tokuda: 4, between: 4 },
46
+ shikiri: { length: 0.9, width: 0.06, apart: 0.7 },
47
+ bale: { width: 0.2, out: 0.2 },
48
+ jano: 0.5,
49
+ };
50
+ /** The kyūdōjō for kinteki (近的), the 28 m range of a competition (ANKF competition manual 6 and the National Sports Festival's rules). */
51
+ export const KINTEKI = {
52
+ kind: "kyudo",
53
+ distance: 28,
54
+ target: { diameter: 0.36, centre: 0.27, tilt: 5 },
55
+ step: span(1.6, 2, 1.8),
56
+ count: 5,
57
+ honza: 2,
58
+ ceiling: 4,
59
+ behind: { wall: 1.4, officials: 3 },
60
+ hall: { front: 2.1, depth: 9, side: 2.7, judges: 3.6, rear: 1.5 },
61
+ row: 4.9,
62
+ yamichi: { margin: 1.2 },
63
+ azuchi: { depth: 2.4, height: 1.5, margin: 1.8 },
64
+ };
65
+ /** The kyūdōjō for enteki (遠的), 60 m, with the target of 1 m. */
66
+ export const ENTEKI = {
67
+ kind: "kyudo",
68
+ distance: 60,
69
+ target: { diameter: 1, centre: 0.97, tilt: 15 },
70
+ step: span(1.4, 1.8, 1.6),
71
+ count: 5,
72
+ honza: 1.1,
73
+ ceiling: 4,
74
+ behind: { wall: 1.4, officials: 4 },
75
+ hall: { front: 2.1, depth: 9, side: 2.2, judges: 3.6, rear: 1.5 },
76
+ row: 5.8,
77
+ yamichi: { margin: 1.6 },
78
+ azuchi: { depth: 3, height: 1.8, margin: 2.4 },
79
+ };
80
+ const mat = (length, width, en, ja) => ({ kind: "dojo", mat: { length, width }, region: { en, ja } });
81
+ /** The budō leagues: for each sport the rulebook's own first. */
82
+ export const JUDO_LEAGUES = [
83
+ { id: "ijf", family: "judo", name: { en: "IJF contest area", ja: "国際柔道連盟の試合場" }, unit: "m", dimensions: IJF_CONTEST, sources: ["ijf-sor", "ijf-sor-2020"], builtIn: true },
84
+ { id: "ajjf", family: "judo", name: { en: "AJJF contest area", ja: "全日本柔道連盟の試合場" }, unit: "m", dimensions: AJJF_CONTEST, sources: ["ajjf-guide", "ijf-sor"] },
85
+ { id: "ijf-kata", family: "judo", name: { en: "IJF kata area", ja: "国際柔道連盟の形の試合場" }, unit: "m", dimensions: IJF_KATA, sources: ["ijf-sor"] },
86
+ ];
87
+ export const KARATE_LEAGUES = [
88
+ { id: "wkf-kumite", family: "karate", name: { en: "WKF kumite area", ja: "世界空手連盟の組手の試合場" }, unit: "m", dimensions: WKF_KUMITE, sources: ["wkf-kumite"], builtIn: true },
89
+ { id: "wkf-kata", family: "karate", name: { en: "WKF kata area", ja: "世界空手連盟の形の試合場" }, unit: "m", dimensions: WKF_KATA, sources: ["wkf-kata"] },
90
+ ];
91
+ export const KENDO_LEAGUES = [{ id: "fik", family: "kendo", name: { en: "FIK shiai-jo", ja: "国際剣道連盟の試合場" }, unit: "m", dimensions: FIK_SHIAI_JO, sources: ["fik-regulations"], builtIn: true }];
92
+ export const SUMO_LEAGUES = [{ id: "jsa", family: "sumo", name: { en: "Japan Sumo Association dohyō", ja: "日本相撲協会の土俵" }, unit: "m", dimensions: JSA_DOHYO, sources: ["jsa-dohyo", "jsa-quiz", "wikipedia-dohyo"], builtIn: true }];
93
+ export const KYUDO_LEAGUES = [
94
+ { id: "kinteki", family: "kyudo", name: { en: "Kyūdōjō for kinteki, 28 m", ja: "近的の弓道場(28m)" }, unit: "m", dimensions: KINTEKI, sources: ["znkr-unei", "wakayama-kyudo-2015"], builtIn: true },
95
+ { id: "enteki", family: "kyudo", name: { en: "Kyūdōjō for enteki, 60 m", ja: "遠的の弓道場(60m)" }, unit: "m", dimensions: ENTEKI, sources: ["znkr-unei", "wakayama-kyudo-2015"] },
96
+ ];
97
+ export const DOJO_LEAGUES = [
98
+ { id: "chukyoma", family: "dojo", name: { en: "Chūkyōma tatami, 1820 by 910 mm", ja: "中京間の畳(1820×910mm)" }, unit: "m", dimensions: mat(1.82, 0.91, "Nagoya and the Chūbu region", "名古屋・中部"), sources: ["tatami-sizes", "ajjf-guide"], builtIn: true },
99
+ { id: "kyoma", family: "dojo", name: { en: "Kyōma tatami, 1910 by 955 mm", ja: "京間の畳(1910×955mm)" }, unit: "m", dimensions: mat(1.91, 0.955, "Kyoto and the Kansai region", "京都・関西"), sources: ["tatami-sizes"] },
100
+ { id: "edoma", family: "dojo", name: { en: "Edoma tatami, 1760 by 880 mm", ja: "江戸間の畳(1760×880mm)" }, unit: "m", dimensions: mat(1.76, 0.88, "Edo (Tokyo) and the Kantō region", "江戸・関東"), sources: ["tatami-sizes"] },
101
+ { id: "danchima", family: "dojo", name: { en: "Danchima tatami, 1700 by 850 mm", ja: "団地間の畳(1700×850mm)" }, unit: "m", dimensions: mat(1.7, 0.85, "housing complexes", "団地"), sources: ["tatami-sizes"] },
102
+ { id: "judo-2x1", family: "dojo", name: { en: "Judo tatami, 2 m by 1 m", ja: "柔道畳(2m×1m)" }, unit: "m", dimensions: mat(2, 1, "the IJF's standard", "国際柔道連盟の標準"), sources: ["ijf-sor", "ajjf-guide"] },
103
+ ];
104
+ /** Every budō league, once each. */
105
+ export const BUDO_LEAGUES = Object.freeze([...JUDO_LEAGUES, ...KARATE_LEAGUES, ...KENDO_LEAGUES, ...SUMO_LEAGUES, ...KYUDO_LEAGUES, ...DOJO_LEAGUES]);
@@ -24,6 +24,28 @@ export const NHL_RINK = {
24
24
  refereeCrease: NHL.refereeCrease,
25
25
  lineWidths: { goal: NHL.goalLineWidth, major: NHL.lineWidth, minor: 1 / 6 },
26
26
  };
27
+ /**
28
+ * The IIHF rink, Rules 1.2 to 1.9 and Appendix VI of the IIHF Official Rule Book 2025/26, in metres. The rules give a range for the width (26 to 30 m) and the corner radius (7 to 8.5 m): the largest of each is drawn.
29
+ */
30
+ const IIHF_RINK = {
31
+ length: 60,
32
+ width: 30,
33
+ cornerRadius: 8.5,
34
+ goalLine: 4,
35
+ blueLine: 22.5,
36
+ circleRadius: 4.5,
37
+ endSpotFromGoalLine: 6,
38
+ spotOffset: 7,
39
+ spotRadius: 0.3,
40
+ neutralSpotFromBlue: 1.5,
41
+ centreSpotRadius: 0.15,
42
+ hash: { length: 0.6, apart: 1.7 },
43
+ crease: { radius: 1.83, depth: 1.36, halfWidth: 1.225, mark: null },
44
+ net: { width: 1.83, depth: 1 },
45
+ trapezoid: { atBoards: 8.6, atGoalLine: 6.8 },
46
+ refereeCrease: 3,
47
+ lineWidths: { goal: 0.05, major: 0.3, minor: 0.05 },
48
+ };
27
49
  /** The NHL's rink with other markings laid over it: most leagues' Rule 1 is the NHL's, nearly word for word. */
28
50
  const rink = (over) => ({ ...NHL_RINK, ...over });
29
51
  /** Hash marks beside an end-zone circle, as the NCAA prints them: 2 feet long, 5 ft 7 in apart (the NHL's Rule 1.9 says the same, and `NHL_RINK` has it). */
@@ -39,25 +61,7 @@ export const HOCKEY_LEAGUES = [
39
61
  name: { en: "IIHF ice hockey rink", ja: "IIHF(国際アイスホッケー連盟)のアイスホッケーリンク" },
40
62
  unit: "m",
41
63
  // Rules 1.2 to 1.9 and Appendix VI of the IIHF Official Rule Book 2025/26 (the 2026/27 edition is the same), in metres. The rules give a range for the width (26 to 30 m) and the corner radius (7 to 8.5 m): the largest of each is drawn. The spots' places and the crease are read from the diagram; the goal's depth is the rules' none.
42
- dimensions: {
43
- length: 60,
44
- width: 30,
45
- cornerRadius: 8.5,
46
- goalLine: 4,
47
- blueLine: 22.5,
48
- circleRadius: 4.5,
49
- endSpotFromGoalLine: 6,
50
- spotOffset: 7,
51
- spotRadius: 0.3,
52
- neutralSpotFromBlue: 1.5,
53
- centreSpotRadius: 0.15,
54
- hash: { length: 0.6, apart: 1.7 },
55
- crease: { radius: 1.83, depth: 1.36, halfWidth: 1.225, mark: null },
56
- net: { width: 1.83, depth: 1 },
57
- trapezoid: { atBoards: 8.6, atGoalLine: 6.8 },
58
- refereeCrease: 3,
59
- lineWidths: { goal: 0.05, major: 0.3, minor: 0.05 },
60
- },
64
+ dimensions: IIHF_RINK,
61
65
  sources: ["iihf-2025"],
62
66
  history: {
63
67
  blueLine: [
@@ -163,4 +167,22 @@ export const HOCKEY_LEAGUES = [
163
167
  dimensions: rink({ trapezoid: null }),
164
168
  sources: ["pwhl-2025"],
165
169
  },
170
+ {
171
+ id: "olympic",
172
+ family: "hockey",
173
+ name: { en: "Olympic ice hockey rink (60 by 26 m)", ja: "オリンピックのアイスホッケーリンク(60×26m)" },
174
+ unit: "m",
175
+ // The IIHF rink at the narrowest width its rules allow (Rule 1.2: 26 to 30 m). The IIHF's statement of 9 December 2025 gives the ice of Milano Cortina 2026 as 60.0 by 26.0 m, "the rink size used at the Beijing 2022 Olympic Winter Games", and "fully consistent with" the NHL's Global Series arena specifications; it says nothing of the markings, which are the IIHF's own (the corner radius and the rest are the IIHF rink's).
176
+ dimensions: { ...IIHF_RINK, width: 26 },
177
+ sources: ["iihf-milan-2025", "iihf-2025"],
178
+ },
179
+ {
180
+ id: "boston-garden",
181
+ family: "hockey",
182
+ name: { en: "Boston Garden hockey rink", ja: "ボストン・ガーデンのアイスホッケーリンク" },
183
+ unit: "ft",
184
+ // Boston Garden (1928 to 1995, the Bruins' home) had an ice surface of 58.2 by 25.3 m (191 by 83 feet), "some nine feet shorter and two feet narrower than standard". Only the size is published; every other figure is the NHL rink's (the boards' corners, the lines and the circles are those of today's Rule 1), which is how it is drawn.
185
+ dimensions: rink({ length: 58.2 / 0.3048, width: 25.3 / 0.3048 }),
186
+ sources: ["wp-boston-garden"],
187
+ },
166
188
  ];
@@ -2,6 +2,7 @@
2
2
  // each figure. A rulebook's text is not copied; only its dimensions, which are facts.
3
3
  const source = (s) => [s.id, Object.freeze(s)];
4
4
  const READ = "2026-10-13";
5
+ const BUDO_READ = "2026-10-14";
5
6
  /** Every document a league's figures were read from, by id. */
6
7
  export const LEAGUE_SOURCES = Object.freeze(Object.fromEntries([
7
8
  // The leagues the package started with.
@@ -27,6 +28,8 @@ export const LEAGUE_SOURCES = Object.freeze(Object.fromEntries([
27
28
  source({ id: "usa-hockey-junior", title: "Official Rules of Ice Hockey, Junior Hockey Edition, Rules 101 to 105 and the rink diagrams", by: "USA Hockey", edition: "2025-29 (adopted 19 January 2025)", url: "https://cdn3.sportngin.com/attachments/document/e6a1-3442852/2025-29_USAH_Playing_Rules_-_Junior.pdf", read: READ, note: "the rink the USHL's own rules send its clubs to" }),
28
29
  source({ id: "ushl-2021", title: "USHL Rules and Regulations, 9.2", by: "United States Hockey League", edition: "2021-22 (the only USHL document found)", url: "https://cdn1.sportngin.com/attachments/document/69ff-2563252/USHL_Rules_and_Regulations_2021-22.pdf", read: READ, note: "rinks must comply with the USA Hockey Junior rulebook" }),
29
30
  source({ id: "pwhl-2025", title: "PWHL Official Rulebook, Rule 1, 1.8 and 27.8", by: "Professional Women's Hockey League", edition: "2025-26", url: "https://assets.contentstack.io/v3/assets/bltebdb4296e05d53db/bltb8440fe08a5e6dc5/69178cd0a582d7db321ad107/2025-2026_PWHL_Rulebook.pdf", read: READ, note: "the NHL's Rule 1 with no restricted area for goalkeepers" }),
31
+ source({ id: "iihf-milan-2025", title: "IIHF Issues Statement on Controversial Olympic Hockey Rink (the IIHF's statement of the ice of Milano Cortina 2026: 60.0 by 26.0 metres, the Beijing 2022 size, consistent with the NHL's Global Series arena specifications)", by: "Sports Illustrated, Seth Dowdle, 9 December 2025, quoting the IIHF", edition: "2026 Olympic Winter Games", url: "https://www.si.com/onsi/breakaway/iihf-issues-statement-controversial-olympic-hockey-rink", read: "2026-10-14", note: "the size of the Olympic rink (60.0 by 26.0 m) and that it matches Beijing 2022; no markings are given" }),
32
+ source({ id: "wp-boston-garden", title: "Boston Garden", by: "Wikipedia (CC BY-SA 4.0), revision 1379921964, read for facts only", edition: "revision 1379921964", url: "https://en.wikipedia.org/w/index.php?title=Boston_Garden&oldid=1379921964", read: "2026-10-14", note: "the Garden's hockey rink, 58.2 by 25.3 m, nine feet shorter and two feet narrower than the NHL's 200 by 85; no other figure of it is published there" }),
30
33
  // Basketball.
31
34
  source({ id: "wnba-rules", title: "Official Rules of the WNBA, Rule No. 1, Section I and diagram A", by: "WNBA", edition: "2026", url: "https://cdn.wnba.com/sites/4/2026/05/2026-WNBA-Official-Rule-Book.pdf", read: READ, note: "the WNBA court: three-point 22 ft 1¾ in, parallel lines 36 in from the sidelines, lane 16 feet, restricted area 4 feet" }),
32
35
  source({ id: "seattle-times-2003", title: "WNBA to have wider lane, extended three-point line", by: "The Seattle Times, 18 December 2003", edition: "2004 season", url: "https://archive.seattletimes.com/archive/20031218/digs18/wnba-to-have-wider-lane-extended-three-point-line", read: READ, note: "the lane widened from 12 to 16 feet for 2004" }),
@@ -100,6 +103,24 @@ export const LEAGUE_SOURCES = Object.freeze(Object.fromEntries([
100
103
  source({ id: "isu-speed-skating-rules", title: "Sports Rules - Speed Skating: Special Regulations and Technical Rules, Rules 203 to 206, 226 to 228 and 253 to 257, and H. Track (the layout plan and the measurements of standard 400m tracks)", by: "International Skating Union", edition: "effective 12 June 2026 (dated 1 June 2026)", url: "https://www.isu.org/en/figure-skating-rules/speed-skating-rules", read: READ, note: "the standard 400 m track: two lanes, the inner curve of 25 m to 26 m, the track measured 0.5 m outside the inner edge, a lap made of two straights, an inner and an outer curve and the crossing, the lines of each distance, the blocks, the coaches' area, the padding" }),
101
104
  source({ id: "isu-short-track-rules", title: "Special Regulations and Technical Rules Short Track Speed Skating, Rule 280 and the diagram of the tracks", by: "International Skating Union", edition: "2024 (accepted by the 59th ISU Ordinary Congress, June 2024)", url: "https://knsb.nl/documents/558/2024_Special_Regulations_Technical_Rules_Short_Track.pdf", read: READ, note: "the 111.12 m oval on a rink of 60 by 30 m at least: S = 28.85 m, C = R8.50 m, seven blocks in each curve, five or seven tracks, the starting positions of the 500 m and the 1000 m, the laps of each distance; a copy kept by the Dutch federation, the ISU's own page lists the file" }),
102
105
  source({ id: "isu-figure-skating-rules", title: "Sports Rules - Figure Skating (Single and Pair Skating and Ice Dance): Rule 342 Required rinks", by: "International Skating Union", edition: "effective 12 June 2026 (dated 10 June 2026)", url: "https://www.isu.org/en/figure-skating-rules/figure-skating-rules", read: READ, note: "the skating area of 60 m by 30 m if possible, not larger and not less than 56 m by 26 m; the judges and the referee at the rinkboard, the technical panel in an elevated position if possible" }),
106
+ // Budō: judo, karate, kendo, sumo, kyudo and the tatami of a dojo.
107
+ source({ id: "ijf-sor", title: "Sport and Organisation Rules of the International Judo Federation, 8.7 Field of Play and Competition Area, Article 9 and B1.8 (the kata area)", by: "International Judo Federation", edition: "version of 21 January 2026", url: "https://78884ca60822a34fb0e6-082b8fd5551e97bc65e327988b444396.ssl.cf3.rackcdn.com/up/2026/01/IJF_Sport_and_Organisation_Rul-1769443746.pdf", read: BUDO_READ, note: "the contest and safety areas, the common safe zone, the free zone, the tatami of 1 m by 2 m and its two official colours, the platform; the kata area and its marks" }),
108
+ source({ id: "ijf-sor-2020", title: "Sports and Organization Rules of the International Judo Federation, 18.1 Competition Area", by: "International Judo Federation", edition: "2020 (the version of June 2020)", url: "https://78884ca60822a34fb0e6-082b8fd5551e97bc65e327988b444396.ssl.cf3.rackcdn.com/up/2020/06/IJF_Sport_and_Organisation_Rul-1592329624.pdf", read: BUDO_READ, note: "the blue and the white tape, 10 cm by 50 cm, 4 m apart at the centre of the contest area, the blue to the referee's right (the 2026 version no longer marks them)" }),
109
+ source({ id: "ajjf-guide", title: "大会運営ガイドブック2023 (Tournament Management Guidebook 2023), 2-1 畳, 2-3 試合場 and 2-4 開始線と選手の位置", by: "公益財団法人全日本柔道連盟 (All Japan Judo Federation)", edition: "2023, as of 2023-12-15", url: "https://www.judo.or.jp/cms/wp-content/uploads/2021/03/%E5%A4%A7%E4%BC%9A%E9%81%8B%E5%96%B6%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF2023_20240229.pdf", read: BUDO_READ, note: "the domestic tatami of 182 cm by 91 cm (and the international 200 by 100 cm, and their halves), 5 or 6 cm thick; the red tatami of the danger zone; the red and white tape 4 m (2 ken) apart" }),
110
+ source({ id: "wkf-kumite", title: "WKF Kumite Competition Rules, Article 1: Kumite Competition Area, and 8.6 (the scale of points)", by: "World Karate Federation", edition: "Rules version 2026.01", url: "https://www.wkf.net/files/pdf/documents/WKF_2026_Kumite_Competition_Rules_MASTER_COPY_V13FINAL.pdf", read: BUDO_READ, note: "the matted square of 8 m measured from the outside, its outer 1 m in another colour, the 2 m safety area, 2 m between areas, the two inverted mats 1 m from the centre, the referee and the judges; yuko 1, waza-ari 2, ippon 3" }),
111
+ source({ id: "wkf-kata", title: "WKF Kata Competition Rules, Article 1: Kata Competition Area", by: "World Karate Federation", edition: "valid from 1 January 2026", url: "https://www.wkf.net/files/pdf/documents/WKF%20Kata%20Competition%20Rules%202026%20MASTER%20COPY_V2.pdf", read: BUDO_READ, note: "the matted square of 8 m measured from the outside and the safety area of 2 m" }),
112
+ source({ id: "fik-regulations", title: "Regulations of Kendo Shiai and Shinpan, Article 2 (Shiai-jo), the Subsidiary Rules' Article 1 and Figure 1", by: "International Kendo Federation, with the All Japan Kendo Federation", edition: "the bilingual text of July 2021, as the Kendo Association of Serbia publishes it", url: "https://kendo.rs/files/202107-Regulations-of-Kendo-Shiai-and-Shinpan.pdf", read: BUDO_READ, note: "a wooden floor of 9 m to 11 m a side, lines 5 cm to 10 cm and white, the cross of 30 cm to 40 cm, two kaishi-sen each 50 cm long and 1.4 m from the centre, 1.5 m kept outside" }),
113
+ source({ id: "jsa-dohyo", title: "相撲規則 土俵規定 第一条 (Sumo Rules, Dohyō Regulations, Article 1), as 笹川スポーツ財団 (Sasakawa Sports Foundation) quotes it: 高さ34から60センチ, 一辺6メートル70, 円の直径4メートル55, 二十俵", by: "日本相撲協会 (Japan Sumo Association), read in the Sasakawa Sports Foundation's sports dictionary", edition: "the page as read on the date given", url: "https://www.ssf.or.jp/knowledge/dictionary/sumo.html", read: BUDO_READ, note: "the height of 34 cm to 60 cm, the square of 6.7 m, the circle of 4.55 m of 20 tawara" }),
114
+ source({ id: "jsa-quiz", title: "大相撲クイズ No.355 (the 20 tawara of the circle: 4 tokudawara and 4 between each) and No.1091 (the shikiri-sen: 6 cm wide, 90 cm long, 70 cm apart), as ozumo.jp sets them out", by: "日本相撲協会 (Japan Sumo Association), read on ozumo.jp", edition: "the page as read on the date given", url: "https://ozumo.jp/dohyo-size/", read: BUDO_READ, note: "the tawara of the circle and the starting lines" }),
115
+ source({ id: "wikipedia-dohyo", title: "Dohyō (English Wikipedia): the ring of 15 shaku, the square platform, the tokudawara, the shikiri-sen and the four tassels of the roof", by: "Wikipedia contributors (CC BY-SA 4.0)", edition: "the article as read on the date given", url: "https://en.wikipedia.org/wiki/Dohy%C5%8D", read: BUDO_READ, note: "the colours and the quarters of the four tassels (green east, red south, white west, black north); no text is copied" }),
116
+ source({ id: "znkr-unei", title: "弓道競技運営要領 (運営マニュアル), 第6条 射場の設営 and the figures of the appendix", by: "公益財団法人全日本弓道連盟 (All Nippon Kyudo Federation)", edition: "revised 1 April 2016 (平成28年4月1日改訂)", url: "https://www.kyudo.jp/pdf/documents/play_direction_manual.pdf", read: BUDO_READ, note: "the ceiling of 4.0 m, 1.8 m between shooters (1.6 m to 2.0 m), 2.0 m from the shooting position to the honza, 5 shooters in a line; a hall of 28 m and one of 60 m" }),
117
+ source({ id: "wakayama-kyudo-2015", title: "国民体育大会 弓道競技実施要項 (Wakayama 2015), 競技種目: 近的競技 (射距離28m, 36cm霞的, 標的の中心は安土敷より27cm, 傾斜5度), 遠的競技 (射距離60m, 100cm得点的, 標的の中心は地上97cm, 傾斜15度)", by: "和歌山県 (Wakayama Prefecture), applying the 全日本弓道連盟 rules", edition: "2015", url: "https://www.pref.wakayama.lg.jp/prefg/wakayama2015/kokutai/files/2015/03/edf0b88c95044b1a821a6040e786c4b1.pdf", read: BUDO_READ, note: "the distances, the targets, their height and their tilt" }),
118
+ source({ id: "tatami-sizes", title: "Tatami (English Wikipedia) and 畳 (Japanese Wikipedia): the sizes of Kyōma 1910 by 955 mm, Chūkyōma 1820 by 910 mm, Edoma 1760 by 880 mm and Danchima 1700 by 850 mm, and the layouts in which four mats never meet at a corner", by: "Wikipedia contributors (CC BY-SA 4.0)", edition: "the articles as read on the date given", url: "https://ja.wikipedia.org/wiki/%E7%95%B3", read: BUDO_READ, note: "the sizes; shūgi-jiki (the lay in which no four corners meet); no text is copied" }),
119
+ source({ id: "kodokan-facilities", title: "施設のご案内 (Facilities): the International Judo Center (the new building) and its dojos in jō, and 所在地", by: "講道館 (Kodokan)", edition: "the page as read on the date given", url: "https://kdkjudo.org/%e6%96%bd%e8%a8%ad%e3%81%ae%e3%81%94%e6%a1%88%e5%86%85/", read: BUDO_READ, note: "the main dojo of 420 jō on the 7th floor, the school dojo (240) and the international dojo (192) on the 6th, the women's (240) and the boys' (114) on the 5th; completed in 1984" }),
120
+ source({ id: "wikipedia-kodokan", title: "Kodokan Judo Institute (English Wikipedia): the main dojo on the seventh floor, 420 mats, four official contests at the same time, about 900 spectators on the eighth floor; 1,206 mats across the five main dojos", by: "Wikipedia contributors (CC BY-SA 4.0)", edition: "the article as read on the date given", url: "https://en.wikipedia.org/wiki/Kodokan_Judo_Institute", read: BUDO_READ, note: "the 420 mats, four contests at once, the gallery of about 900 and the total of 1,206; it gives no date for the colours of the mats" }),
121
+ source({ id: "budokan-overview", title: "日本武道館建物等概要 (Nippon Budokan: buildings and seats), the arena plan: a regular octagon of 55 m across, 60 m corner to corner, 23 m a side, 2,513 m²", by: "公益財団法人日本武道館 (Nippon Budokan)", edition: "the leaflet of October 2021", url: "https://www.nipponbudokan.or.jp/pdf/202110.pdf", read: BUDO_READ, note: "opened 3 October 1964; at most 14,501; the arena as an octagon" }),
122
+ source({ id: "butokuden-ja", title: "旧武徳殿 (Japanese Wikipedia): built in 1899 by the Dai Nippon Butokukai, designed by Matsumuro Shigemitsu, an Important Cultural Property since 1996, 1,200 seats", by: "Wikipedia contributors (CC BY-SA 4.0)", edition: "the article as read on the date given", url: "https://ja.wikipedia.org/wiki/%E6%97%A7%E6%AD%A6%E5%BE%B3%E6%AE%BF", read: BUDO_READ, note: "the dates, the address and the seats; no mat count was found" }),
123
+ source({ id: "wikipedia-halls", title: "Wikipedia and Wikidata on the halls: Nippon Budokan, Ryōgoku Kokugikan, Kodokan, Butokuden and the Budokwai (their capacities, opening dates, coordinates and the events held in them)", by: "Wikipedia contributors (CC BY-SA 4.0) and Wikidata (CC0)", edition: "the articles and items as read on the date given", url: "https://www.wikidata.org/wiki/Q386246", read: BUDO_READ, note: "capacity 11,098 (Wikidata P1083 and English Wikipedia) for the Kokugikan; 14,471 for the Budokan; the items Q1165384, Q386246, Q176821, Q1017987 and Q3646473; no text is copied" }),
103
124
  // Baseball and softball.
104
125
  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" }),
105
126
  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";
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";
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
@@ -9,6 +9,7 @@ import { type CricketLeague, type CricketSpec } from "./leagues/cricket.ts";
9
9
  import { type FieldHockeyLeague, type FieldHockeySpec } from "./leagues/fieldhockey.ts";
10
10
  import { type AthleticsFigures, type AthleticsLeague } from "./leagues/athletics.ts";
11
11
  import { type SkatingFigures, type SkatingLeague } from "./leagues/skating.ts";
12
+ import { type BudoLeague } from "./leagues/budo.ts";
12
13
  import { type GaelicLeague, type GaelicSpec } from "./leagues/gaelic.ts";
13
14
  import { type HandballLeague, type HandballSpec } from "./leagues/handball.ts";
14
15
  import { type LacrosseLeague, type LacrosseSpec } from "./leagues/lacrosse.ts";
@@ -34,6 +35,8 @@ export type { AthleticsFigures, AthleticsLeague } from "./leagues/athletics.ts";
34
35
  export { WA_STANDARD_TRACK, WA_SHORT_TRACK, WA_STAGGER_TABLE, WA_SHORT_STAGGER_TABLE } from "./leagues/athletics.ts";
35
36
  export type { SkatingFigures, SkatingLeague, LongTrackFigures, ShortTrackFigures, FigureRinkFigures } from "./leagues/skating.ts";
36
37
  export { ISU_LONG_TRACK, ISU_SHORT_TRACK, ISU_FIGURE_RINK, ISU_LONG_TRACK_TABLE } from "./leagues/skating.ts";
38
+ export type { BudoFigures, BudoLeague, DojoFigures, DojoLeague, JudoFigures, JudoLeague, KarateFigures, KarateLeague, KendoFigures, KendoLeague, KyudoFigures, KyudoLeague, Mat, SumoFigures, SumoLeague } from "./leagues/budo.ts";
39
+ export { AJJF_CONTEST, BUDO_LEAGUES, ENTEKI, FIK_SHIAI_JO, IJF_CONTEST, IJF_KATA, JSA_DOHYO, KINTEKI, WKF_KATA, WKF_KUMITE } from "./leagues/budo.ts";
37
40
  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";
38
41
  export type { CourtFigures, CourtMarks } from "./leagues/basketball.ts";
39
42
  export type { RinkFigures } from "./leagues/hockey.ts";
@@ -41,7 +44,7 @@ export type { SheetFigures } from "./leagues/curling.ts";
41
44
  export type { DiamondFigures } from "./leagues/baseball.ts";
42
45
  export type { Family, LeagueSpan, Named } from "./leagues/types.ts";
43
46
  /** A league: a variant of a family of surface. */
44
- export type League = BasketballLeague | HockeyLeague | FootballLeague | BaseballLeague | CurlingLeague | NetLeague | LacrosseLeague | RugbyLeague | AflLeague | GaelicLeague | CricketLeague | FieldHockeyLeague | HandballLeague | AthleticsLeague | SkatingLeague;
47
+ export type League = BasketballLeague | HockeyLeague | FootballLeague | BaseballLeague | CurlingLeague | NetLeague | LacrosseLeague | RugbyLeague | AflLeague | GaelicLeague | CricketLeague | FieldHockeyLeague | HandballLeague | AthleticsLeague | SkatingLeague | BudoLeague;
45
48
  /** The family of surface each sport draws; soccer's variants are its pitches (`pitch`), not leagues. */
46
49
  export declare const FAMILY_OF: Readonly<Record<Sport, Family | undefined>>;
47
50
  /**
package/dist/leagues.js CHANGED
@@ -15,6 +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 { BUDO_LEAGUES, DOJO_LEAGUES, JUDO_LEAGUES, KARATE_LEAGUES, KENDO_LEAGUES, KYUDO_LEAGUES, SUMO_LEAGUES } from "./leagues/budo.js";
18
19
  import { GAELIC_LEAGUES, gaelicInFeet } from "./leagues/gaelic.js";
19
20
  import { HANDBALL_LEAGUES, handballInFeet } from "./leagues/handball.js";
20
21
  import { LACROSSE_LEAGUES, lacrosseInFeet } from "./leagues/lacrosse.js";
@@ -26,8 +27,9 @@ export { LEAGUE_SOURCES };
26
27
  export { AFL_GROUNDS } from "./leagues/aussie.js";
27
28
  export { WA_STANDARD_TRACK, WA_SHORT_TRACK, WA_STAGGER_TABLE, WA_SHORT_STAGGER_TABLE } from "./leagues/athletics.js";
28
29
  export { ISU_LONG_TRACK, ISU_SHORT_TRACK, ISU_FIGURE_RINK, ISU_LONG_TRACK_TABLE } from "./leagues/skating.js";
30
+ export { AJJF_CONTEST, BUDO_LEAGUES, ENTEKI, FIK_SHIAI_JO, IJF_CONTEST, IJF_KATA, JSA_DOHYO, KINTEKI, WKF_KATA, WKF_KUMITE } from "./leagues/budo.js";
29
31
  /** The family of surface each sport draws; soccer's variants are its pitches (`pitch`), not leagues. */
30
- 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" });
32
+ 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" });
31
33
  /**
32
34
  * The leagues each sport can draw, in the order a menu lists them, the sport's own first (the three football sports share their
33
35
  * list, the football leagues). Soccer and the pools have none.
@@ -67,9 +69,15 @@ export const LEAGUES = Object.freeze({
67
69
  artisticswimming: [],
68
70
  athletics: ATHLETICS_LEAGUES,
69
71
  skating: SKATING_LEAGUES,
72
+ judo: JUDO_LEAGUES,
73
+ karate: KARATE_LEAGUES,
74
+ kendo: KENDO_LEAGUES,
75
+ sumo: SUMO_LEAGUES,
76
+ kyudo: KYUDO_LEAGUES,
77
+ dojo: DOJO_LEAGUES,
70
78
  });
71
79
  /** Every league of every family, once each. */
72
- 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]);
80
+ 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]);
73
81
  /** The ids of a sport's leagues. */
74
82
  export const leagueIds = (sport) => LEAGUES[sport].map((league) => league.id);
75
83
  /** A league by its sport and id, or `undefined`. */
@@ -289,6 +297,43 @@ export function leagueSize(sport, id, unit) {
289
297
  feet = { length: convertLength(m.length, league.unit, "ft"), width: convertLength(m.width, league.unit, "ft") };
290
298
  break;
291
299
  }
300
+ case "judo": {
301
+ // The contest area with its safety area all round it, in metres.
302
+ const d = league.dimensions;
303
+ const m = d.contest.drawn + 2 * d.safety.drawn;
304
+ feet = { length: convertLength(m, "m", "ft"), width: convertLength(m, "m", "ft") };
305
+ break;
306
+ }
307
+ case "karate": {
308
+ const d = league.dimensions;
309
+ const m = d.area + 2 * d.safety;
310
+ feet = { length: convertLength(m, "m", "ft"), width: convertLength(m, "m", "ft") };
311
+ break;
312
+ }
313
+ case "kendo": {
314
+ const m = league.dimensions.side.drawn;
315
+ feet = { length: convertLength(m, "m", "ft"), width: convertLength(m, "m", "ft") };
316
+ break;
317
+ }
318
+ case "sumo": {
319
+ const m = league.dimensions.platform;
320
+ feet = { length: convertLength(m, "m", "ft"), width: convertLength(m, "m", "ft") };
321
+ break;
322
+ }
323
+ case "kyudo": {
324
+ // The shajō from its back wall to the back of the azuchi, and the width of its frontage with the judges' side.
325
+ const d = league.dimensions;
326
+ const frontage = (d.count - 1) * d.step.drawn + 2 * d.hall.side + d.hall.judges;
327
+ const length = d.hall.rear + d.hall.depth - d.hall.front + d.distance - 1 + d.azuchi.depth;
328
+ feet = { length: convertLength(length, "m", "ft"), width: convertLength(frontage, "m", "ft") };
329
+ break;
330
+ }
331
+ case "dojo": {
332
+ // The usual 20 jō: 5 mats' widths across and 8 along.
333
+ const d = league.dimensions;
334
+ feet = { length: convertLength(8 * d.mat.width, "m", "ft"), width: convertLength(5 * d.mat.width, "m", "ft") };
335
+ break;
336
+ }
292
337
  default:
293
338
  throw new Error(`No fixed size for the ${league.family} league "${id}": a diamond's size is its fence`);
294
339
  }
@@ -589,6 +634,61 @@ export function leagueFigures(league) {
589
634
  ["goal", `${w(f.goalWidth)} wide and ${w(f.goalHeight)} high`],
590
635
  ];
591
636
  }
637
+ case "judo": {
638
+ const f = league.dimensions;
639
+ return [
640
+ ["contest area", `${w(convertLength(f.contest.min, "m", "ft"))} to ${w(convertLength(f.contest.max, "m", "ft"))} square (${f.contest.drawn} m drawn)`],
641
+ ["safety area", `at least ${w(convertLength(f.safety.min, "m", "ft"))} wide; at least ${w(convertLength(f.common, "m", "ft"))} between two areas`],
642
+ ["tatami", `${f.tatami.length} m by ${f.tatami.width} m by ${f.tatami.thickness * 100} cm`],
643
+ ["free zone", `at least ${f.freeZone * 100} cm round the competition area`],
644
+ ["platform", `${f.platform} m wider and longer than the tatami`],
645
+ ["start tape", f.marks === null ? "none" : `${f.marks.width * 100} cm by ${f.marks.length * 100} cm, ${f.marks.fromCentre} m from the centre`],
646
+ ];
647
+ }
648
+ case "karate": {
649
+ const f = league.dimensions;
650
+ return [
651
+ ["area", `${f.area} m square, measured from the outside`],
652
+ ["boundary band", f.band === 0 ? "none" : `the outer ${f.band} m in another colour`],
653
+ ["safety area", `${f.safety} m, and ${f.between} m between areas`],
654
+ ["start mats", f.startMats === null ? "none" : `${f.startMats.fromCentre} m from the centre`],
655
+ ["referee", `${f.referee} m from the boundary; each judge ${f.judges} m off a corner`],
656
+ ];
657
+ }
658
+ case "kendo": {
659
+ const f = league.dimensions;
660
+ return [
661
+ ["shiai-jo", `${f.side.min} m to ${f.side.max} m a side, wooden floor`],
662
+ ["lines", `${f.lineWidth.min * 100} cm to ${f.lineWidth.max * 100} cm, white`],
663
+ ["centre cross", `${f.cross.min * 100} cm to ${f.cross.max * 100} cm`],
664
+ ["kaishi-sen", `${f.startLine.length * 100} cm long, ${f.startLine.fromCentre} m from the centre`],
665
+ ["outside", `${f.outside} m kept clear`],
666
+ ];
667
+ }
668
+ case "sumo": {
669
+ const f = league.dimensions;
670
+ return [
671
+ ["platform", `${f.platform} m square, ${f.height.min * 100} cm to ${f.height.max * 100} cm high`],
672
+ ["ring", `${f.circle} m across, ${f.tawara.count} tawara (${f.tawara.tokuda} tokudawara)`],
673
+ ["shikiri-sen", `${f.shikiri.length * 100} cm long, ${f.shikiri.width * 100} cm wide, ${f.shikiri.apart * 100} cm apart`],
674
+ ];
675
+ }
676
+ case "kyudo": {
677
+ const f = league.dimensions;
678
+ return [
679
+ ["distance", `${f.distance} m from the shooting position to the target`],
680
+ ["target", `${f.target.diameter * 100} cm across, its centre ${f.target.centre * 100} cm up, tilted ${f.target.tilt} degrees`],
681
+ ["shooters", `${f.step.drawn} m apart (${f.step.min} m to ${f.step.max} m), ${f.honza} m from the shooting position to the honza`],
682
+ ["shajō", `${f.hall.depth} m deep, ${f.hall.side} m from the end shooters to the walls, ceiling ${f.ceiling} m`],
683
+ ];
684
+ }
685
+ case "dojo": {
686
+ const f = league.dimensions;
687
+ return [
688
+ ["tatami", `${f.mat.length} m by ${f.mat.width} m (${f.region.en})`],
689
+ ["area of a mat", `${Math.round(f.mat.length * f.mat.width * 1000) / 1000} square metres`],
690
+ ];
691
+ }
592
692
  default: {
593
693
  const d = diamondOf(league);
594
694
  const f = d.fence;