@johnmorrisdotca/kyogijo-stadiums 0.4.0 → 0.5.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 (244) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/NOTICE.md +4 -0
  3. package/README.md +71 -16
  4. package/dist/annotate.js +1 -1
  5. package/dist/athletics/describe.d.ts +8 -0
  6. package/dist/athletics/describe.js +41 -0
  7. package/dist/athletics/events.d.ts +17 -0
  8. package/dist/athletics/events.js +48 -0
  9. package/dist/athletics/facilities.d.ts +80 -0
  10. package/dist/athletics/facilities.js +176 -0
  11. package/dist/athletics/infield.d.ts +79 -0
  12. package/dist/athletics/infield.js +166 -0
  13. package/dist/athletics/layout.d.ts +13 -0
  14. package/dist/athletics/layout.js +98 -0
  15. package/dist/athletics/oval.d.ts +57 -0
  16. package/dist/athletics/oval.js +116 -0
  17. package/dist/athletics/plan.d.ts +97 -0
  18. package/dist/athletics/plan.js +355 -0
  19. package/dist/athletics/races.d.ts +102 -0
  20. package/dist/athletics/races.js +355 -0
  21. package/dist/athletics/steeplechase.d.ts +72 -0
  22. package/dist/athletics/steeplechase.js +196 -0
  23. package/dist/athletics/stencil.d.ts +13 -0
  24. package/dist/athletics/stencil.js +85 -0
  25. package/dist/athletics/track.d.ts +54 -0
  26. package/dist/athletics/track.js +105 -0
  27. package/dist/athletics/types.d.ts +77 -0
  28. package/dist/athletics/types.js +1 -0
  29. package/dist/athletics-entry.d.ts +17 -0
  30. package/dist/athletics-entry.js +11 -0
  31. package/dist/athletics.style.d.ts +16 -0
  32. package/dist/athletics.style.js +51 -0
  33. package/dist/atlas-entry.d.ts +4 -2
  34. package/dist/atlas-entry.js +3 -2
  35. package/dist/atlas.d.ts +83 -7
  36. package/dist/atlas.js +108 -8
  37. package/dist/charts-entry.d.ts +6 -1
  38. package/dist/charts-entry.js +3 -0
  39. package/dist/charts.athletics.d.ts +183 -0
  40. package/dist/charts.athletics.js +455 -0
  41. package/dist/charts.curling.heat.d.ts +24 -0
  42. package/dist/charts.curling.heat.js +116 -0
  43. package/dist/charts.curling.js +14 -3
  44. package/dist/charts.pool.d.ts +67 -0
  45. package/dist/charts.pool.js +76 -0
  46. package/dist/charts.skating.d.ts +204 -0
  47. package/dist/charts.skating.js +426 -0
  48. package/dist/charts.types.d.ts +53 -1
  49. package/dist/court.d.ts +85 -2
  50. package/dist/court.js +102 -7
  51. package/dist/court.more.d.ts +46 -0
  52. package/dist/court.more.js +219 -0
  53. package/dist/courts.style.d.ts +14 -2
  54. package/dist/courts.style.js +51 -4
  55. package/dist/crowd.d.ts +154 -0
  56. package/dist/crowd.draw.d.ts +17 -0
  57. package/dist/crowd.draw.js +198 -0
  58. package/dist/crowd.js +465 -0
  59. package/dist/crowd.park.d.ts +19 -0
  60. package/dist/crowd.park.js +153 -0
  61. package/dist/curling.stats.d.ts +271 -0
  62. package/dist/curling.stats.js +301 -0
  63. package/dist/draw.d.ts +16 -0
  64. package/dist/draw.js +318 -35
  65. package/dist/element-entry.d.ts +1 -1
  66. package/dist/element-entry.js +1 -1
  67. package/dist/element.d.ts +13 -2
  68. package/dist/element.js +77 -3
  69. package/dist/features.js +131 -0
  70. package/dist/fields.kit.d.ts +2 -2
  71. package/dist/fields.types.d.ts +18 -4
  72. package/dist/frames.providers.js +63 -8
  73. package/dist/geojson.js +3 -0
  74. package/dist/geometry-entry.d.ts +2 -1
  75. package/dist/geometry-entry.js +2 -1
  76. package/dist/geometry.d.ts +20 -0
  77. package/dist/geometry.js +78 -1
  78. package/dist/grounds.d.ts +4 -0
  79. package/dist/grounds.data.js +12 -0
  80. package/dist/hardwood.d.ts +31 -0
  81. package/dist/hardwood.js +157 -0
  82. package/dist/heat.js +4 -3
  83. package/dist/heat.types.d.ts +5 -0
  84. package/dist/heat.zones.d.ts +2 -2
  85. package/dist/heat.zones.js +154 -6
  86. package/dist/homeside.js +17 -0
  87. package/dist/index.d.ts +16 -2
  88. package/dist/index.js +10 -1
  89. package/dist/layers.d.ts +1 -1
  90. package/dist/layers.env.d.ts +3 -1
  91. package/dist/layers.env.js +4 -2
  92. package/dist/layers.js +4 -4
  93. package/dist/leagues/athletics.d.ts +63 -0
  94. package/dist/leagues/athletics.js +87 -0
  95. package/dist/leagues/courts.d.ts +269 -4
  96. package/dist/leagues/courts.js +155 -1
  97. package/dist/leagues/skating.d.ts +145 -0
  98. package/dist/leagues/skating.js +73 -0
  99. package/dist/leagues/sources.js +20 -0
  100. package/dist/leagues/types.d.ts +1 -1
  101. package/dist/leagues-entry.d.ts +4 -2
  102. package/dist/leagues-entry.js +2 -1
  103. package/dist/leagues.d.ts +14 -4
  104. package/dist/leagues.js +146 -5
  105. package/dist/look.d.ts +3 -3
  106. package/dist/look.js +39 -6
  107. package/dist/outline.d.ts +1 -1
  108. package/dist/outline.js +30 -2
  109. package/dist/pageant.d.ts +120 -0
  110. package/dist/pageant.draw.d.ts +21 -0
  111. package/dist/pageant.draw.js +171 -0
  112. package/dist/pageant.js +207 -0
  113. package/dist/pageant.style.d.ts +8 -0
  114. package/dist/pageant.style.js +42 -0
  115. package/dist/png.d.ts +8 -1
  116. package/dist/png.js +21 -1
  117. package/dist/pool.d.ts +176 -0
  118. package/dist/pool.figures.d.ts +304 -0
  119. package/dist/pool.figures.js +144 -0
  120. package/dist/pool.js +304 -0
  121. package/dist/pool.kit.d.ts +48 -0
  122. package/dist/pool.kit.js +141 -0
  123. package/dist/pool.labels.d.ts +20 -0
  124. package/dist/pool.labels.js +257 -0
  125. package/dist/pool.race.d.ts +65 -0
  126. package/dist/pool.race.js +140 -0
  127. package/dist/pool.replay.d.ts +46 -0
  128. package/dist/pool.replay.js +127 -0
  129. package/dist/pool.section.d.ts +13 -0
  130. package/dist/pool.section.js +83 -0
  131. package/dist/pool.style.d.ts +20 -0
  132. package/dist/pool.style.js +169 -0
  133. package/dist/pool.types.d.ts +145 -0
  134. package/dist/pool.types.js +3 -0
  135. package/dist/pool.words.d.ts +13 -0
  136. package/dist/pool.words.js +101 -0
  137. package/dist/ranges.names.js +47 -3
  138. package/dist/replay-entry.d.ts +3 -0
  139. package/dist/replay-entry.js +2 -0
  140. package/dist/restyle.js +1 -1
  141. package/dist/score.js +70 -5
  142. package/dist/sheet.d.ts +3 -0
  143. package/dist/sheet.js +7 -3
  144. package/dist/skating/describe.d.ts +7 -0
  145. package/dist/skating/describe.js +44 -0
  146. package/dist/skating/events.d.ts +24 -0
  147. package/dist/skating/events.js +47 -0
  148. package/dist/skating/figure.d.ts +24 -0
  149. package/dist/skating/figure.js +37 -0
  150. package/dist/skating/long.d.ts +54 -0
  151. package/dist/skating/long.js +111 -0
  152. package/dist/skating/parts.d.ts +43 -0
  153. package/dist/skating/parts.js +40 -0
  154. package/dist/skating/plan.d.ts +55 -0
  155. package/dist/skating/plan.js +197 -0
  156. package/dist/skating/short.d.ts +47 -0
  157. package/dist/skating/short.js +89 -0
  158. package/dist/skating/track.d.ts +66 -0
  159. package/dist/skating/track.js +94 -0
  160. package/dist/skating/types.d.ts +57 -0
  161. package/dist/skating/types.js +3 -0
  162. package/dist/skating-entry.d.ts +17 -0
  163. package/dist/skating-entry.js +11 -0
  164. package/dist/skating.style.d.ts +4 -0
  165. package/dist/skating.style.js +24 -0
  166. package/dist/strings.d.ts +296 -0
  167. package/dist/strings.js +328 -11
  168. package/dist/style.d.ts +2 -0
  169. package/dist/style.js +11 -1
  170. package/dist/surfaces/artistic.d.ts +9 -0
  171. package/dist/surfaces/artistic.js +94 -0
  172. package/dist/surfaces/athletics.d.ts +16 -0
  173. package/dist/surfaces/athletics.js +132 -0
  174. package/dist/surfaces/baseball.js +15 -0
  175. package/dist/surfaces/basketball.floor.d.ts +27 -0
  176. package/dist/surfaces/basketball.floor.js +83 -0
  177. package/dist/surfaces/basketball.gear.d.ts +27 -0
  178. package/dist/surfaces/basketball.gear.js +90 -0
  179. package/dist/surfaces/basketball.js +43 -21
  180. package/dist/surfaces/curling.d.ts +16 -0
  181. package/dist/surfaces/curling.fold.d.ts +67 -0
  182. package/dist/surfaces/curling.fold.js +107 -0
  183. package/dist/surfaces/curling.js +37 -3
  184. package/dist/surfaces/dive.d.ts +9 -0
  185. package/dist/surfaces/dive.js +128 -0
  186. package/dist/surfaces/field.d.ts +7 -2
  187. package/dist/surfaces/field.js +15 -9
  188. package/dist/surfaces/hockey.js +1 -0
  189. package/dist/surfaces/net.d.ts +2 -1
  190. package/dist/surfaces/net.js +160 -15
  191. package/dist/surfaces/polo.d.ts +12 -0
  192. package/dist/surfaces/polo.js +159 -0
  193. package/dist/surfaces/pool.d.ts +27 -0
  194. package/dist/surfaces/pool.js +198 -0
  195. package/dist/surfaces/skating.d.ts +6 -0
  196. package/dist/surfaces/skating.js +62 -0
  197. package/dist/surfaces/soccer.js +2 -1
  198. package/dist/surfaces/surface.d.ts +44 -0
  199. package/dist/surfaces/venue.d.ts +15 -0
  200. package/dist/surfaces/venue.js +95 -0
  201. package/dist/tenants.d.ts +77 -0
  202. package/dist/tenants.data.d.ts +8 -0
  203. package/dist/tenants.data.js +945 -0
  204. package/dist/tenants.js +46 -0
  205. package/dist/turn-entry.d.ts +12 -0
  206. package/dist/turn-entry.js +7 -0
  207. package/dist/turn.camera.d.ts +105 -0
  208. package/dist/turn.camera.js +168 -0
  209. package/dist/turn.dom.d.ts +40 -0
  210. package/dist/turn.dom.js +351 -0
  211. package/dist/turn.kit.d.ts +86 -0
  212. package/dist/turn.kit.js +110 -0
  213. package/dist/turn.markup.d.ts +48 -0
  214. package/dist/turn.markup.js +108 -0
  215. package/dist/turn.model.d.ts +78 -0
  216. package/dist/turn.model.js +91 -0
  217. package/dist/turn.style.d.ts +5 -0
  218. package/dist/turn.style.js +55 -0
  219. package/dist/types.d.ts +183 -18
  220. package/dist/units.d.ts +1 -1
  221. package/dist/units.js +15 -1
  222. package/dist/uprights.board.d.ts +17 -0
  223. package/dist/uprights.board.js +59 -0
  224. package/dist/uprights.d.ts +37 -0
  225. package/dist/uprights.fields.d.ts +32 -0
  226. package/dist/uprights.fields.js +172 -0
  227. package/dist/uprights.goal.d.ts +49 -0
  228. package/dist/uprights.goal.js +69 -0
  229. package/dist/uprights.js +160 -0
  230. package/dist/uprights.more.d.ts +7 -0
  231. package/dist/uprights.more.js +183 -0
  232. package/dist/uprights.net.d.ts +12 -0
  233. package/dist/uprights.net.js +109 -0
  234. package/dist/uprights.netkit.d.ts +28 -0
  235. package/dist/uprights.netkit.js +67 -0
  236. package/dist/uprights.pools.d.ts +8 -0
  237. package/dist/uprights.pools.js +190 -0
  238. package/dist/uprights.rinks.d.ts +27 -0
  239. package/dist/uprights.rinks.js +106 -0
  240. package/dist/uprights.track.d.ts +50 -0
  241. package/dist/uprights.track.js +246 -0
  242. package/dist/version.d.ts +1 -1
  243. package/dist/version.js +1 -1
  244. package/package.json +19 -2
package/CHANGELOG.md CHANGED
@@ -7,10 +7,85 @@ All notable changes to this project are written here. The format follows
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.0] - 2026-10-14
11
+
12
+ Thirteen new sports (padel, squash, racquetball, sepak takraw, teqball, roundnet and netball, with sitting volleyball; swimming, water polo, diving and artistic swimming; athletics and skating), which makes 33. A 3D view that stands what a rulebook puts on a surface (nets, posts, goals, walls, blocks, boards, bars, hurdles, boards and platforms) on a floor that turns. A crowd in the stands, and a pageant of flags and crests over the halves. A folded curling sheet, with a heat chart and statistics. A realistic basketball floor. The clubs that played in each ballpark and ground, with their Japanese names as Japanese media say them.
13
+
14
+ ### Added
15
+
16
+ - **Athletics and skating in the 3D view** ([docs/turn.md](./docs/turn.md#what-stands-on-each-surface)). An athletics stadium has the high jump's uprights 4.02 m apart with a bar, the pole vault's 5.20 m apart with a bar, the discus and hammer cage with its netting 4 m high and 6 m at the front of each side (Facilities Manual 2.4.1.3), the hurdles of the races a drawing marks at their heights (1.067, 0.838 and 0.914 m) in every lane, and the steeplechase's five barriers with the water jump's pit; a skating rink has the padding round a long or short track, 0.80 m high (ISU Rule 228.2), or a figure skating rink's boards, which are cut away on the eye's side like a hockey rink's. New upright kinds `hurdles`, `steeplechase`, `high-jump`, `pole-vault`, `cage`, `padding` and `rink-boards`, in English and Japanese. The javelin, the finish posts and the skating blocks have no height among the figures and are not drawn. Athletics gets a crowd profile (an oval bowl) and skating one (an arena's two tiers); both are in the e2e list.
17
+ - **The pools in the 3D view, at the heights of World Aquatics' rules** ([docs/turn.md](./docs/turn.md#what-stands-on-each-surface), [docs/sources.md](./docs/sources.md#heights-in-the-3d-view)). A swimming pool has a numbered starting block 0.7 m high in each lane at each end, a flagged rope 1.8 m above the water 5 m from each wall and the false start rope 1.2 m above it at 15 m; a diving well its springboards (1 m and 3 m) and platforms (5, 7.5 and 10 m, or the ones asked for) on stands and towers; a water polo field a floating goal on each goal line, 3 m wide with the bar's underside 0.9 m over the water; an artistic swimming area the judges' platform (0.6 m) and the starting platform (0.7 m). New upright kinds `starting-blocks`, `backstroke-flags`, `false-start-rope`, `springboards`, `platforms` and `judges-stand`, in English and Japanese (スタート台, 背泳ぎ用フラッグ, フォルススタートロープ, 飛板, 固定台, ジャッジ台). The pools are in the e2e list of surfaces that stand up.
18
+ - **Walls give way to the eye in the 3D view.** The glass and walls of a padel court, the walls of squash and racquetball courts and the boards and glass of a rink are cut away on the side nearest the eye, more the lower the eye is, and are whole again from above or from the far side: `Plane.shy`, `fadeOf` and `Layout.fade` (`/turn`).
19
+ - **A folded curling sheet has no crowd.** Its enlarged houses cover where the stands would be, so `crowd` on a folded sheet draws nothing; the same sheet with a score shows the whole sheet and keeps its stands, with a pageant as well.
20
+ - **A folded curling sheet: `sheet.show: "folded"`** ([docs/curling.md](./docs/curling.md#the-top-end-the-bottom-end-or-both-folded)). The whole sheet as a strip, with its two houses enlarged beside it, so that a sheet 150 feet long and 15 wide fills a roughly square frame. A tall drawing has the top house on the left of the strip and the bottom house on the right; a wide one has the left house above and the right house below (the same drawing turned a quarter). The strip keeps its scale and its numbers, so a data layer lies on it as on a sheet drawn whole; each panel is the same sheet from the hog line to the back line (`sheet.panels: "half"`, the default) or just the house (`"house"`), enlarged until the whole has the shape `sheet.fit` asks (width over height, 0.5 to 2, a square by default; a panel is never longer than the strip), labelled ("Top house", "Bottom house", "Left house", "Right house"; in Japanese too) and joined to the part of the strip it enlarges by a faint fan and a frame. Stones, heat and every other layer are drawn in the strip and again in each panel, at the panel's scale, with the copies hidden from a screen reader and ids of their own. `range: "folded"` says the same (a new name in `RANGES.curling`), the description says what is enlarged and where, a score still shows the whole sheet, and the annotations (`landmarks`, `axes`, `direction`) are not drawn on it. The scene, the canvas, d3, Plot, GeoJSON and PNG read it like any drawing. New: `SheetShow` has `"folded"`, `SheetStyle.panels` and `SheetStyle.fit`, `RangeName` has `"folded"`, and `KYOGIJO_FOLD_STYLE` (written in only by a folded sheet; every other curling drawing is the same text as before).
21
+ - **`top` and `bottom` as names for a tall sheet's ends.** `sheet.end` and `range: { name, end }` take `top` (the left end, the far house of a tall drawing, the default) and `bottom` (the right end) as well as `left` and `right`; the new type is `SheetEnd`. The top end alone and the bottom end alone are `show: "half"` or `"house"` with either, and are documented as the three ways to look closer at a tall sheet.
22
+ - **`curlingHeat`: where the stones of many ends came to rest** (`@johnmorrisdotca/kyogijo-stadiums/charts`, [docs/curling.md](./docs/curling.md#where-the-stones-of-many-ends-came-to-rest)). A chart on the heat layers: stones counted into square cells (a foot by default), hexagons, a density or the zones of the house (the button, the three rings and the free guard zone), or drawn as translucent discs in each team's colour so that stones that fall on each other build up colour. It judges the stones by `curlingScore`'s rules, and keeps one team's stones (`team`), only the free guards or only the stones in the house (`only`); on the half, the house, the whole sheet or the folded sheet (`show`). The totals say how many stones were in play and drawn, the free guards and the stones in the house for each team, and the share in each zone. New: `CurlingHeatOptions`, `CurlingHeatTotals`, the `titleCurlingHeat`, `curlingHeatStat`, `sumCurlingHeat`, `curlingHeatTeam`, `curlingHeatGuards` and `curlingHeatHouse` words of `KYOGIJO_STRINGS[...].charts` (`en` and `ja`; a custom set of words must give them) and `CurlingOptions.show`, so that `curlingStones` can be folded too.
23
+ - **Curling statistics, beside `curlingScore`:** `curlingFreeGuards` (the free guards of a layout: a stone in play between the tee line and the hog line and not touching the house), `curlingInPlay` (the stones in play after each throw, and the most), `curlingHammers` and `curlingEndStats` (each end's record, and for each team its points, hammer efficiency, how often it scored, blanked, was held to one or was stolen from with the hammer, and its steal rate without it), `curlingGuardScores` (the free guard analysis: points against guards, by band, for the team with the hammer and the team without it) and `curlingShotStats` with `curlingIsHit` and `CURLING_HIT_TYPES` (shot percentage, hit rate and the types played). Pure functions of plain data. Written from the rules and from what curlovision and Jordan Myslik's curling analytics describe; nothing of either was copied (see [references](./docs/references.md#curling)), and [Curling](./docs/curling.md#what-other-curling-analyses-offer-and-what-is-here) compares what each offers with what is here.
24
+ - **`HeatLegend.region`** (and the same on a `legend` layer): a heat layer's colour bar is sized and placed against a part of the surface in feet instead of the whole of what is shown, so that it can be read on the half of a sheet or in an enlarged house.
25
+ - The docs' curling gallery has the folded sheet, the top end and the bottom end, the heat chart in each of its views and a game's ends in one picture; the demo has a Show choice for a curling sheet (whole sheet, top end, bottom end, folded) with finger-wide buttons, in English and Japanese, in the address and in the code it writes.
26
+ - **A realistic basketball floor** (`court: { hardwood: true }`, [docs/hardwood.md](./docs/hardwood.md)). The court seen from above as a maple strip floor: boards of one width (2.25 inches by default) running the length of the court, each row ending in different places from the rows next to it, each board with a tone of its own and fine grain along it, all laid from a seed (`seed`, 1 by default) with a generator of our own, so the same options give the same floor in every renderer; the keys, the centre circle and the border are stain, with the wood and the seams showing through (`stain`, 0.82 by default); the strip behind each baseline takes the colour of the team that defends it (`leftColor` and `rightColor`, a team's `color` in a score, or the new `baselineColor`); the baseline words are set in that strip and new `sidelineText` along the sides; `centreLogo` (an image or an SVG document) fills the centre circle; each basket is drawn from above with its backboard, rim, net and padded stanchion and a soft shadow; the coaching box's lines, the scorers' table and the two benches stand along the bottom sideline; and a satin sheen and the shade at the floor's edge are gradients over the paint (`sheen`). Every league of the sport takes it (NBA, WNBA, FIBA, NCAA men's and women's, NFHS, G League), wide and tall, in light and dark, with a score, a `range`, a `host`, and the data layers and charts over it. The detail drops at small sizes: `detail: "auto"` draws the plain floor (broad boards, the stain and the sheen, one shadow, no seams, grain, table or benches) for `detail: "simple"` or a `width` under 480 pixels, and `fine` or `plain` can be asked for. It is made only of patterns, gradients and rectangles, so the scene, the canvas, d3, Plot, GeoJSON and PNG renderers all draw it: the SVG is about 30 kB in the fine detail (the clean court's is about 11 kB) and about 15 kB in the plain, from two tiles of pattern and about 90 more shapes. Off by default, and a drawing without it is the same text as before. New: the options `HardwoodOptions` and `CourtStyle.hardwood`, `CourtStyle.baselineColor` and `CourtStyle.sidelineText`, `KYOGIJO_HARDWOOD_STYLE` (also in `KYOGIJO_STYLE`) and `HARDWOOD_SMALL`.
27
+ - The demo's court controls have a "Real hardwood" chip (a finger wide on a phone, in English and Japanese), and the court cards show the real floor in a club's colours and its plain version for small sizes; the docs gallery has the floor in nine drawings, each made from the code beside it.
28
+ - **Multi-sport places: the clubs that played in each ballpark and ground** ([docs/atlas.md](./docs/atlas.md#tenants)). `Place.tenants` lists the clubs that played their home matches in a place, each with its `club` (and `clubJa`), `league`, `sport`, first and last year (`from`, `to`), Wikidata item and `source` (the Wikidata statement, the article and revision, and which of the two the years were read from): 443 tenants (333 clubs) at 155 of the 158 places, 117 of them still there, among them the BC Lions and the Whitecaps at BC Place, the Expos and the Alouettes at the Olympic Stadium in Montreal, the Blue Jays, the Argonauts and the Raptors (1995 to 1999) at the Rogers Centre, the Giants and the Jets at MetLife Stadium, the Patriots and the Revolution at Gillette Stadium and the Seahawks, the Sounders and the Reign at Lumen Field. The clubs and their leagues are Wikidata's (CC0, the places' occupants P466 and the clubs' home venues P115) and the `tenants` lines of the infoboxes of the places' English Wikipedia articles (CC BY-SA 4.0, at the revision named); the years are Wikidata's where it has them and the article's otherwise, never guessed. `pnpm tenants:fetch` reads them and `pnpm tenants` builds `src/tenants.data.ts`.
29
+ - `tenantsOf(place, { year, league, sport, current })` (`/atlas`): a place's clubs, the current ones first; `placesByClub(name)`: the places a club played in, by its name in English or in Japanese, in full or by a word of it (`Whitecaps`, `ライオンズ`); `surfacesOf(place)`: every surface a place offers, its own first and then one for each sport a tenant plays that the package draws (the CFL's field for BC Place, the NFL's for MetLife Stadium, the NRL's for Stadium Australia); and `surfaceOf(place, sport)`: the surface a place offers for a sport (`surfaceOf(bcPlace, "cfl")` is `{ sport: "cfl" }`, `surfaceOf(fenwayPark, "cfl")` is `undefined`). New: `TENANTS`, the types `Tenant`, `TenantArticle`, `TenantSource`, `TenantSport`, `TenantFilter`, `PlaceSurface` and `SurfaceSport`.
30
+ - The demo's Atlas panel lists the clubs that played in a place with their league and years, offers a button for each other surface a place has (BC Place: the CFL field; the Olympic Stadium: the CFL field, the NFL field and the soccer pitch) that opens the playground on that sport, groups the league filter into the main leagues and tournaments and the rest, and finds a place by a club's name in English or Japanese; English and Japanese words for the new controls and for the leagues that have a Japanese name.
31
+ - **The 3D view hangs the score up as a scoreboard** (`score: "board" | "floor"` in the settings, `board` by default; [docs/turn.md](./docs/turn.md#the-score)). The badge of the score is put on a dark board that turns to face the eye: hung on cables over the middle of a court or a rink, standing on legs behind an end of a field, a pitch, a table or a curling sheet, behind centre field in a ballpark. The floor loses its panel and keeps the teams' names. This needs a new option for every drawing, `plate: false` (`ScoreOptions.plate`), which draws a score with the teams' places and no panel; on by default, and a drawing without it is the same text as before. New: `Plane.billboard`, `facing`, `scoreboard`, `UprightKind` `"scoreboard"`, `UprightOptions.score`, and the `scoreboard` word of `turn.parts`.
32
+ - **A 3D view: `@johnmorrisdotca/kyogijo-stadiums/turn`** ([docs/turn.md](./docs/turn.md)). Any surface as a floor that turns: the flat drawing itself (with its score, data layers and labels) tipped and turned by the mouse, a finger, Ctrl and the wheel or the keys, with four viewpoints (`overhead`, `broadcast`, `end`, `corner`; the broadcast view is turned a little to show the boards, nets and goals their faces, the net sports' is from behind an end line, where a net can be seen, and a curling sheet's is square on) and a reset, in plain DOM and CSS with no dependency. `mountKyogijoTurn(container, options, settings)` mounts it and gives back `view()`, `set()`, `preset()`, `reset()`, `update()`, `svg()` and `destroy()`; `<kyogijo-field turn turn-view="end">` is the element's way (`turn-controls`, `turn-uprights`, `turn-touch`, and `turn` and `turnSettings` properties); `turnMarkup(options, settings)` is the same view as a string, pure, for a server. Every part that stands up is a flat rectangle with a little SVG on it, and every element carries its whole place on the screen in one `matrix3d`, stacked far to near by `z-index`: nothing is nested in 3D (no `preserve-3d`), so Safari on a phone cannot flatten it, and the flat drawing stays where 3D is not available (`turnSupported`), with a sentence that says so. What stands on each surface, at the height the current rulebook gives (each read on 2026-10-13 and cited by rule number in [docs/sources.md](./docs/sources.md#heights-in-the-3d-view), with what is ours said to be): the NHL's glass is 8 ft over the boards at the ends and 6 ft along the sides, the NFL's uprights 45 ft, the CFL's 40 ft and the NCAA's at least 30 ft, rugby league's 16 m, a basket's board lower edge 150 mm under the ring (FIBA 1.1.5) and its stanchion 2 m behind the end line (FIBA 1.4.3). the volleyball net at 2.43 m or 2.24 m (`netHeight: "women"`) with its posts and antennae, the nets and posts of tennis (and singles sticks), badminton, pickleball and table tennis (the table lifted 76 cm on legs), each basket's backboard, rim, net and stanchion, a rink's boards, glass and goals, the goals of soccer (with corner flags), handball, field hockey and lacrosse, the posts and pylons of football, the posts of rugby, Gaelic football and Australian football, a cricket pitch's stumps, and a ballpark's fence (as high as its walls), foul poles and backstop. `uprightsFor` and `describeUprights` give them as planes and as a sentence; the view's description says what stands in it, with its heights in the rulebook's own unit, in English and Japanese. A finger drags sideways to turn the view and leaves a vertical swipe to the page (`touch: "turn"` keeps every touch); the wheel is the page's unless Ctrl is held or the view is focused; the keys are the arrows, plus and minus, 1 to 4 and 0; the buttons are 44 pixels or more; a viewpoint, a reset and the end of a drag are said in a polite live region; with `prefers-reduced-motion` the view jumps instead of gliding. New: `mountKyogijoTurn`, `turnMarkup`, `turnMarkupOf`, `buildTurn`, `layoutOf`, `turnSupported`, `uprightsFor`, `describeUprights`, `planesOf`, `heightUnit`, `TURN_PRESETS`, `NET_PRESETS`, `TURN_PRESET_NAMES`, `KYOGIJO_TURN_STYLE`, the camera's `fit`, `project`, `cameraMatrix`, `clampView`, `drag` and `step`, the types `KyogijoTurn`, `TurnSettings`, `TurnView`, `TurnPreset`, `TurnModel`, `Uprights`, `UprightOptions`, `Plane` and the rest, the `turn` words of `KYOGIJO_STRINGS` (`en` and `ja`; a custom set of words must give them), and `pitchOf` is exported from the drawing's own module for it.
33
+ - The demo's playground has a View switch (Flat, 3D): the surface in 3D with the viewpoint buttons under it, the viewpoint in the address (`view=3d&viewpoint=end`), the 3D code in the code tabs; and `e2e/turn.demo.mjs` plays it in Chromium, on a phone and in WebKit.
34
+ - **Seven more court sports, and sitting volleyball** ([docs/courts.md](./docs/courts.md)), each drawn to scale from its governing body's own current rules, with its named looks (light and dark), a free zone where the rulebook gives one, simple and full detail, wide and tall, an outline, a description and labelled parts in English and Japanese, a frame, ranges, a score and a badge (`SPORTS` is now 27):
35
+ - **`padel`** (the FIP's Rules of Padel, review of 1 January 2026): 20 by 10 m inside its walls, the service lines at 6.95 m, the central service line, the net, and the walls and metal fence of the enclosure.
36
+ - **`squash`** (World Squash's Specifications for Squash Courts, 28 November 2017): the short line, half court line and service boxes of the floor, with the front wall laid flat beside it to show its tin, service line and front wall line; `league: "wsf-doubles"` and `"wsf-doubles-wide"` for the doubles courts.
37
+ - **`racquetball`** (the IRF's Official Rules 2026-2028 and Court Specifications): 40 by 20 feet, the short line, service line, service boxes, drive serve lines and the broken receiving line.
38
+ - **`sepaktakraw`** (the ISTAF's Law of the Game, 2013 edition, the one that could be read): 13.4 by 6.1 m, the centre line, four quarter circles, two service circles, the net.
39
+ - **`teqball`** (the FITEQ's rules, 2026): the 3 by 1.5 m table and its net in the middle of a court of 16 by 12 m, the halfway line, the service lines, the surrounds.
40
+ - **`roundnet`** (the International Roundnet Federation's rules, 2022): the set, the no hit zone line, the serving line and the four service positions, on a square with no out of bounds.
41
+ - **`netball`** (World Netball's Rules of Netball, 2024): 30.5 by 15.25 m, the transverse lines, centre circle, goal circles and goalposts with their rings; scored as a goals sport, with the usual score and the home team on the left.
42
+ - **`league: "wpv-sitting"`** of `volleyball` (World ParaVolley's Official Sitting Volleyball Rules 2025-2028): 10 by 6 m, the attack line at 2 m, a 7 m net 1.15 m high.
43
+ - New zone sets `wall-court` (squash, racquetball) and `roundnet-rings`; `net-court` now covers padel, sepak takraw and teqball, and `field-thirds` netball. 36 coordinate frames (7 more), 7 more `half-court` ranges, and 7 more sports in the demo's picker, its gallery and the docs gallery, with the sources and licence notes in [docs/sources.md](./docs/sources.md) and [docs/references.md](./docs/references.md).
44
+ - The colours follow the rulebooks where they give one: squash's lines are red (a dark red on the light floor, a pale red on the dark one; World Squash's specification asks only that markings contrast, clauses 5.01.01 and 10.13, so the red is ours) on the floor and the front wall, with the wall's lines drawn separately as the specification allows; racquetball's lines are the IRF's recommended bright red (blue on the convertible look) on a floor light enough to read them; padel's, netball's and sitting volleyball's lines are white as their rules prefer or require, and sitting volleyball has the wooden floor only (a light indoor floor, Rule 1.2.2).
45
+ - Footvolley is not drawn: the only rulebook found that gives its dimensions is a European league's, not an international governing body's. Futsal is `pitch: "futsal"` of `soccer`, as before.
46
+ - **The stands and the crowd** (`crowd: true`, [docs/crowd.md](./docs/crowd.md)) on every surface that has spectators. Seating bowls drawn round the surface at the distance a venue of its kind keeps: a bowl, two sides (`sides`), a horseshoe open at an end (`horseshoe`, `open`), an oval round the oval grounds of Australian football and cricket, an arena's courtside rows with a lower and an upper bowl for the rinks and courts, and for a ballpark grandstands along the foul lines and behind home plate with bleachers behind the park's own fence (laid from `fenceOutline`, with a gap at the batter's eye), each stand on a plaza of its own. A soccer pitch in the stadium of an NFL or CFL club (`GRIDIRON_GROUNDS`, or `stadium: "nfl"` or `"cfl"`) keeps the football field's footprint: the stands stand where a football field's stands are and the 360 by 160 foot field is drawn faintly over the pitch (end zones, five-yard lines, dashed outline), so that the gap is seen to scale: the touchlines are 8.5 feet from the front rows, not the 28 to 36 of a ground built for soccer. The people are a seeded tile of 36 seats repeated as an SVG pattern, each seat empty with the probability the density leaves or a dot of shirt (the team's colour in two shades, or a neutral) with a dot of hair over it, so that the stands are a few shapes and a few kB (about 9 kB added to a soccer drawing, 4.5 kB as blocks) however many seats there are: `density` (0 to 1, 0.85 by default), or `attendance` over `capacity` (a ground's own capacity by default for soccer), `seed`, `home` and `away` colours (the teams' colours of a score, else the sides'), the visitors' block at an end or in a corner (`awayEnd`), a card display in stripes or checks behind a goal (`tifo`, `tifoDesign`), and a tunnel, a camera platform, benches and a media row on the bench side (`gaps`). Aisles and the shade of each tier's front wall and roof edge are drawn in the `fine` detail; for `detail: "simple"` or a `width` under 480 pixels (`detail: "auto"`) the stands are blocks of colour with no pattern. The drawing's ground is made as wide as the stands need (a `margin` of your own is kept). It works wide and tall, light and dark (the crowd is dimmer in the dark), as a score with its round marks, with `range` (a crop shows the stands it covers) and with the data layers over it; a special game (`host`) has none. The scene, the canvas, d3, Plot and PNG renderers draw it. `crowdStands(options)` gives the stands as data in feet in the surface's wide frame (rings with their outlines, `from` and `to`, the height of the first and last row, the rake in degrees, the seats; the visitors' and the card display's sectors; the gaps; the footprint; the reach), with `outlinePath` and `outlinePoints`, so that a view that raises the stands (the 3D view of `work/turn`) can use it: a follow-up. Off by default, and a drawing without it is the same text as before. New: `CrowdOptions`, `CrowdShape`, `CrowdStands`, `StandRing`, `StandSector`, `StandGap`, `StandOutline`, `GRIDIRON_GROUNDS` and `KYOGIJO_CROWD_STYLE` (also in `KYOGIJO_STYLE`; `--ky-cr-home` and `--ky-cr-away` are the crowd's colours).
47
+ - **The stands read as seats from above** (polish of the crowd). Row lines every second row follow each tier's curves, with aisles across every tier (square to the front on the sides, fanning round the corners) and every fourth a wider dark vomitory; the visitors' block and a card display are whole sections cut on aisle lines, not wedges (a wedge only round an oval ground); the walk between the tiers is a thin darker band (`concourses`) instead of a wide pale ring, and the roof's edge throws a shade on the upper tier (`roof`, on by default). A soccer pitch's run-off is the 6 metres along the touchlines and 8.5 behind the goal lines that stadium guidance recommends (19.7 and 27.9 feet, 27.7 on the bench side), so that a pitch in a gridiron stadium has the narrower apron at the touchlines (8.5 feet) and a wider one behind the goals (33.8). A ballpark's grandstand edge is a smooth curve with no notches, its bleachers stand 12 feet behind the fence, and where the park has seats on top of a wall (Fenway Park's Green Monster) a band of them runs along the wall at its height (`wallSeats`, `WALL_SEATS`). The stands data gains `aisles` on every ring and `concourses`, a wall's seats are a ring with the tier `wall`, and the tiers of an arena are 7 feet apart.
48
+ - The demo has a "Crowd" chip with a "Card display" chip and a "Seats taken" slider (finger-wide on a phone, in English and Japanese), for every sport, and the docs gallery has the stands in ten drawings (soccer in a bowl, soccer in an NFL stadium, a ballpark, an NHL arena, an NBA arena, curling and more), each made from the code beside it.
49
+ - **The pageant: each team's flag or crest laid large over its half of the surface, and an emblem in the centre** ([docs/pageant.md](./docs/pageant.md)). `pageant: "carpet"`, `"stage"`, `true` (a carpet) or `PageantOptions` on a score drawing, off by default, so a drawing without it is the same text as before. A **carpet** is the flag or logo laid flat over its half, filling the room the half gives it with a margin of about 5% (`fit: "fill"`, the default: its shape may differ from the flag's ratio by up to 1.75 to 1, the art stretched a little and cropped a little; `fit: "ratio"` keeps the flag's own ratio, `Team.logoRatio`, else the `viewBox` of an SVG logo, else 3 to 2), with a border band (`border`: `dark`, `team` or a colour; `borderWidth`), a soft shadow and a gentle fixed wave of light and shade (`fabric`); a **stage** is the crest on a large round disc with a ring (`ring`: `gold`, `team` or a colour), the crest a round mark inside it. A team with no flag or logo is its colours as a carpet of two with its name across a band, or its initials on its colour on a stage. `emblem` (an address, an image `data:` address or an SVG document as text: yours, none is supplied; `emblemShape` `round` or `plain`, `emblemFit`, `emblemName`) goes in the centre circle, centre ice, centre court, the middle of a field or sheet, or on the mound. Every surface has a place for the pictures: the halves, each side of a cricket pitch, a diamond's infield (home) and outfield (visitors), a curling sheet's two houses; each lies wholly inside the surface's outline (a rink's rounded corners, a fence, an oval). Tall and wide drawings lay the halves where the reader sees them and keep every picture upright. The score stays readable by `score`: `centre` (the plate stays, 15% smaller, and the pictures keep clear of it), `strip` (the compact strip under the drawing, carrying each team's round mark) or `auto` (the default: the strip with an emblem or a large board, else whichever leaves the pictures at least 70% of their width). `lines` is `over` (the default), `under` or `through` the pictures; `scale` and `names` size and name them; under 320 pixels wide or with `detail: "simple"` the fabric, hairlines and name pills are left out; dark theme has its own colours (`--ky-pg-border`, `--ky-pg-edge`, `--ky-pg-seam`, `--ky-pg-shadow`, `--ky-pg-disc`, `--ky-pg-groove`, `--ky-pg-light`); a `range` shows the carpet where the range shows it. `animate: "unfurl"` or `"fade"` is an entrance in CSS only, off by default, inside `@media (prefers-reduced-motion: no-preference)`. Every renderer draws it (the scene, canvas, d3, Plot, PNG); `sceneToGeoJSON` leaves it out, since the GeoJSON is of the surface. New: `Surface.pageant` and `centreRadius` (where a builder puts the pictures and its centre circle), `Team.logoRatio`, the `pageant` words of `KYOGIJO_STRINGS` (`en` and `ja`; a custom set of words must give them), `KYOGIJO_PAGEANT_STYLE`, `KYOGIJO_PAGEANT_MOTION`, the types `PageantOptions` and `PageantStyle`, the `pageant` attribute of `<kyogijo-field>`, and the root's `data-pageant`.
50
+ - The demo has "Flags on the halves" under Look: off, carpets or stages, the lines over, under or through, a made-up cup in the centre and the entrance, in English and Japanese, each a finger wide, in the address (`pageant`, `pageantlines`, `emblem`) and in the code it shows; the docs have a page and a gallery of a carpet and a stage on each of the twenty surfaces, the emblem, tall and small, the borders, the lines, a team with no flag, dark and a crop, with made-up nations and flags drawn in code.
51
+
52
+ ### Added
53
+
54
+ - **Swimming, water polo, diving and artistic swimming** (`sport: "swimming"`, `"waterpolo"`, `"diving"`, `"artisticswimming"`; [docs/pools.md](./docs/pools.md)). Four pools, to scale, from World Aquatics' *Competition Regulations* in force as from 25 June 2025 (Part Two Article 16, Part Four Article 13 and Appendix 2, Part Six Article 18 and Appendix 4, Part Seven Article 27; the 2017 and 2021 Facilities Rules' numbers where they differ), each figure cited in [docs/sources.md](./docs/sources.md#the-pools): the swimming pool of 50 or 25 m and one to ten lanes (25 m wide for eight lanes of 2.5 m, ten lanes 0 to 9 with the end lanes 2.4 m, or the 26 m temporary pool) with its ropes (green, blue and yellow, red floats within 5 m of the walls, a distinct run at 15 and 25 m), the lane markings with their cross lines and the cross lines at 15 m, the touch panels and their target lines, the starting blocks with their lane numbers, the backstroke flags at 5 m and the false start rope at 15 m, and a warm-up pool without the competition fixtures; the water polo field of 25 by 20 m with its ropes and referees' platforms in red, yellow and green, the 2, 5 and 6 m lines, the goals, the goal areas, the re-entry areas, the table and the substitution areas; the diving well with the 1 and 3 m springboards and the 5, 7.5 and 10 m platforms (and the 1 and 3 m platforms) at the preferred distances of Appendix 2 from the walls and from each other, and the three lines across the well; the artistic swimming area (30 by 20 m, or 25 by 15 m with its 12 by 12 m deep part) with its floor lines and platforms. A score on any of them; the home team on the left in water polo.
55
+ - **The looks of the water and the deck** (`pool.look`: `flat`, `water`, `tiled`; `pool.deck`: `plain`, `tiled`; `pool.seed`). A flat, clean water by default; a faint net of light on the floor made from a seed (a few soft closed curves in one small repeating tile, the same seed the same light), a gradient across the lanes and, for `tiled`, the floor's tiles, all patterns defined once. Every named look has a palette for the pools, and the stylesheet carries only the rules a drawing uses.
56
+ - **A side section** (`pool.section`): the water and its depth (2.5 m for a 50 m pool, 2 m for a 25 m one, or your own), the blocks and panels, the flags 5 m from each end, the false start rope at 15 m, a lane rope at the surface and the least depth the rules ask near a wall with blocks, the height exaggerated and said so.
57
+ - **The lanes of a race** (`pool.race`): each swimmer in a lane with a name, three letters and a flag (an address, an image or SVG text you pass; the package bundles no flags), and, once the race is swum, places (a gold, silver or bronze disc for the first three, taken from the times when none is given), times, reaction times, splits, records and `dq`, `dns` and `dnf`. Plates at the starting and the turning end, an event title, and a description that says each lane in words, in English and Japanese. `pace` draws **split pace bars**: each lane the whole race laid flat, each split a bar as long as its share, in a colour from the field's slowest pace to its fastest, under a ruler of distances. A tall drawing lays the names and times along the lanes.
58
+ - **`raceTimeline`** (`@johnmorrisdotca/kyogijo-stadiums/replay`): a race replay by lane. The splits of a race become a timeline of the package's replay: each swimmer goes down the first length and back the next at the speed of each split, on the block until the reaction time, with the start, the turns and the finishes as events, in the new `swimming` frame (metres from the middle of the water). `drawFrame`, `mountKyogijo(...).replay` and `<kyogijo-field>` play it. `formatTime` and `parseTime` write and read times as swimming does.
59
+ - **`splitsChart`** (`@johnmorrisdotca/kyogijo-stadiums/charts`, [docs/charts.md](./docs/charts.md#the-splits-of-a-race)): the pace bars with a title, a summary, the numbers (`totals`, with the fastest split of the field) and a table of every split.
60
+ - **A natatorium** (`pool.venue: "natatorium"`, or `{ pools, apart, labels, seating }`): several pools in one hall, to scale, at least 8 m apart (10 m by default, as the rules keep a swimming pool and a diving well, CR 16.2.17), each drawn by its own sport's builder with the deck, the paint and the names once, and seating along the top. `venueLayout` gives the places.
61
+ - Ranges (`pool-end`, `springboards`, `platforms`, `centre-stage`, with `half` and `goal-area`), the zone sets `pool-lanes`, `water-polo-areas` and `pool-thirds`, the four frames, `landmarks` for every pool, features to colour (`water`, `lane-ropes`, `rope-red`, `touch-pads`, `starting-blocks`, `backstroke-flags`, `platforms`, `springboards` and more), `SWIMMING`, `WATER_POLO`, `DIVING` and `ARTISTIC` in `/geometry` (metres, any unit by `dimensionsOf`), and their words in English and Japanese. `Sport` and `SPORTS` grow from 20 to 24; the other twenty draw byte for byte as before.
62
+ - The demo has the four pools in its sport picker with the pool's own controls, a Pools section with a made-up race (nations that do not exist, flags drawn in code in `demo/pool-data.js`), the pace bars, a race replay and the natatorium; the docs have a [Pools](./docs/pools.md) page and a gallery page of them, each picture made from the code beside it.
63
+
64
+ ### Added
65
+
66
+ - **`sport: "athletics"`: the athletics stadium** ([docs/athletics.md](./docs/athletics.md), `@johnmorrisdotca/kyogijo-stadiums/athletics`). The 400 m standard track of World Athletics' Track and Field Facilities Manual (2019) and Technical Rules (in force 1 July 2026): eight lanes of 1.22 m (4 to 9) with the running lines at Rule 14, the finish straight (6 to 10 lanes), the lane numbers, and the start lines of 20 races: the sprints and the hurdles on the straight, the staggers of the 200 m, 400 m, 400 m hurdles, 800 m and the relays, the 800 m's and the 4 x 400 m's breakline, the curved starts of the 1000 m to the 10,000 m and the mile with the group starts, the exchange zones of the 4 x 100 m and 4 x 400 m, and the steeplechase's lap with the water jump inside or outside the second bend. The staggers are worked out from the running lines' radii and the breakline's involute (not copied from the table) and a test holds them to Table 2.2.1.6a (200 m and 400 m within 0.6 mm, 800 m and 4 x 400 m within 2.5 mm). Every field event is in its place in the standard arena (high jump, pole vault, long and triple jump with their boards and pits, shot put, discus and hammer with the cage and the sector of 34.92 degrees, javelin with the 8 m arc and the sector of 28.96 degrees), each switchable with `events`, or alone at a large scale with `layout`. The infield is the soccer pitch (a preset or a size, or a ground's own) or plain grass; the track is red, blue, terracotta or green. `league: "world-athletics-short"` is the covered 200 m banked track of six lanes with a 60 m straight and its own stagger table; a `ground` that has a track draws the stadium with that ground's pitch (six grounds). New: `range: "start"` (a close-up of the start of `athletics.start`, turned so that the athletes run to the right, or up the page in portrait, with stencil lane numbers drawn as paths and lane-sized tags on a bend), `finish`, `bend`, `home-straight`, `back-straight`, `infield`, one range for each field event and `water-jump`; the look `line-drawing` (ink only: black on white with outlines for the track, pits and mats, white on black in dark mode); the frame `athletics` (metres from the middle of the track); the zone set `athletics-track`; the `athletics` words in English and Japanese; `KYOGIJO_ATHLETICS_STYLE` and `KYOGIJO_TRACK_STYLE`.
67
+ - **Athletics data charts** (`@johnmorrisdotca/kyogijo-stadiums/athletics`): `laneDraw` (the names and flags on the lanes of a start, at each lane's stagger, with the flags passed as SVG), `raceResults` (places as medal discs, times, reaction times and splits), `raceReplay` (a timeline for the replay: each runner on the curve of his lane from his lane's start line by his reaction time, splits and finish time) and `fieldMarks` (a throw or jump as a mark where it landed, a foul at the line and the best valid mark picked out). The entry also exports the plan, the track's geometry (`stagger`, `breaklineStagger`, `lap`, `pose`), the races and field events (names in English, Japanese and French) and the figures.
68
+ - **`sport: "skating"`: the skating rinks** ([docs/skating.md](./docs/skating.md), `@johnmorrisdotca/kyogijo-stadiums/skating`). The ISU's standard 400 m speed skating track (`league: "isu-long-track"`, the default): two lanes (the inner 4 m, the outer 4 m or more), the inner curve of 25 m to 26 m and the straight that makes a lap 400 m (113.57 m, 112.00 m, 110.43 m for 25 m, 25.5 m, 26 m, as the ISU's table has them), the warm-up lane, the lanes' fully painted lines, the blocks of the curves (50 cm apart for the first 15 m, 2 m after, a cone at the entrance), the coaches' area on the crossing straight, the padding, the finishing line with its metres and the starting lines of the 500 m to the 10,000 m, the mass start and the team races: each lane's line worked out from the race's distance back from its finish along the skater's own way (the lane changed once a lap, not on the first straight of the 1000 m and the 1500 m) and held to the layout plan's own dimensions (6.32 m, 6.25 m, 7.32 m, 12.57 m). `league: "isu-short-track"` is the oval of 111.12 m on a rink of 60 by 30 m or more with seven blocks in each curve, five or seven tracks with their starting lines, the finishing line and the five starting positions of the 500 m and the 1000 m; `league: "isu-figure"` the rink of 60 by 30 m (56 by 26 m at the least) with the judges' and the referee's seats at the rinkboard, the technical panel and the kiss and cry. `skating` options: `innerRadius`, `laneWidth`, `warmUp`, `infield`, `blocks`, `coaches`, `padding`, `races`, `start`, `tracks`, `rink`, `furniture`. New: the ranges `crossing-straight`, `first-bend`, `second-bend`, `judges` and `kiss-and-cry` (and `home-straight`, `bend`, `finish`, `start`, `infield` and `half` for the rinks that have them), the frame `skating`, the zone set `skating-track`, the `skating` words in English and Japanese, `KYOGIJO_SKATING_STYLE`. The rinks take the hockey rink's colours in every look.
69
+ - **Skating data charts** (`@johnmorrisdotca/kyogijo-stadiums/skating`): `skatingPairs` (a pair's names and flags on the lines of their lanes, the armbands white and red), `skatingGrid` (the starters of a short track race on the five positions), `skatingResults` (medals, times, splits along the lane, lap times in the table), `skatingReplay` (a timeline: each skater on his own way, the lane changed on every crossing) and `figureElements` (a jump, a spin, a step sequence and the other elements of a programme as marks on the ice, the track of a sequence as a line).
70
+ - The docs have a page for the stadium, a gallery of it (52 pictures, each made from the code beside it) and the athletics rows of the sources, references, notice, limits, ranges and frames pages.
71
+
72
+ ### Fixed
73
+
74
+ - **`toPNG` no longer stops the process on a drawing cropped to a range.** resvg (the PNG renderer) panics on a shape with an opacity below 1 that lies wholly outside the viewBox, as the net of a soccer goal does in the `penalty-area` and `defensive-third` ranges: `toPNG` now leaves out the shapes wholly outside the frame (they paint nothing). A test renders every named range of every sport and league, wide and tall, to a PNG.
75
+
10
76
  ### Changed
11
77
 
78
+ - **A club's name in Japanese is the one Japanese media say.** Wikidata's label is a Japanese Wikipedia page title, and for 33 clubs it is a long transliteration of initials or of a formal name (`ブリティッシュ・コロンビア・ライオンズ`, now `BCライオンズ`; `インテルナツィオナーレ・ミラノ`, now `インテル・ミラノ`), a title with a disambiguator or "history of" (`ボルチモア・コルツの歴史`) or the club's name in another period (`OLレイン`). `scripts/tenants.names-ja.json` holds the everyday form of each, with its kind and a source note, and `Tenant.clubJa` is that form; Wikidata's label is kept in the new `Tenant.aliasesJa`, so a search by it still finds the club. `TENANT_JAPANESE_NAMES` and `nameJaOf` (`/atlas`) give the table and the note on a tenant's name.
79
+ - The named looks (`look: "night"` and the others) write one more selector for each sport of the court group into the drawing's style, so a drawing with a look has a longer style text than before; the drawing itself is unchanged.
12
80
  - The name a reader sees is Kyogijo Stadiums (競技場 in Japanese): the demo's title, the docs site, the API page, the README and the package description. Code names (`drawKyogijo`, `<kyogijo-field>`) are unchanged.
81
+ - The indoor volleyball court shows its centre line: it runs under the net (FIVB Rule 1.3.3) and the net was drawn over it, so only a dark bar showed. The line now shows between the net's edges. The court's other lines were already all there (the boundary, both attack lines, the attack lines' extensions and the service zone's marks in the full detail); the beach court has only its four boundary lines, as the beach rules say.
13
82
  - The demo's year switch in the atlas is a finger wide before its words arrive, in WebKit too.
83
+ - The badminton court's labelled parts use the BWF's words: the line inside the back boundary is the "Doubles long service line" (it was "Long service line", which in singles is the back boundary line itself), and the back boundary line says it is the singles long service line (Diagram A). The short service line's label no longer runs into the net's. An audit of every net sport's figures against the current rulebooks (ITF 2026, FIVB 2025-2028, BWF as amended 26 April 2025, USA Pickleball 2026, ITTF 2026) found no figure to change.
84
+
85
+ ### Fixed
86
+
87
+ - **The badge's code and score no longer touch.** A 3-digit score (`101`) in the badge and in the strip of a compact card sat 8 units from the team's code (`101CAL`, `AUR99`). The score is measured with the package's text width, the code and the score keep a gap of 10 (the estimate is widened by a tenth for digits and a fifth for capitals, which is what a bold face draws), the code shrinks first (to 12 at the least), then the score, and the flag is left out when the room still runs out, at any width since the strip scales as one drawing. A short score is laid out as before, and no existing drawing changed.
88
+ - **BC Place read "FIFA World Cup, FIFA Women's World Cup" only, though it is the BC Lions' home (the CFL, since 1983) and the Whitecaps' (MLS, since 2011).** A place was known through one list, with only the tournaments it staged or the club of its park, so a stadium of two sports showed one. `Place.leagues` now has the league of every club that played there, then the tournaments; `placesBy({ league: "CFL" })` finds BC Place and the Rogers Centre, and `placesBy({ text })` finds a place by a club. A drawing of a place that has no other surface, or of a place's own surface, is the same text as before.
14
89
 
15
90
  ## [0.4.0] - 2026-10-14
16
91
 
package/NOTICE.md CHANGED
@@ -28,6 +28,9 @@ picture or code of the sources is copied; each source is named here so that the
28
28
  | `leagues`: the cricket ground | The Laws of Cricket (2017 Code), 4th Edition 2026, MCC (Laws 6 to 8), and the ICC Men's and Women's One-Day International Playing Conditions, effective from October 2026 | Facts |
29
29
  | `leagues`: the field hockey pitch | Rules of Hockey including explanations, International Hockey Federation (FIH), effective from 1 March 2026 (Rule 1 and the Field and Equipment Specifications) | Facts |
30
30
  | `leagues`: the handball court | IX. Rules of the Game for Indoor Handball, International Handball Federation (IHF), edition of 1 July 2025 (Rule 1, Playing Court) | Facts |
31
+ | `geometry`: the swimming pool, the water polo field, the diving well and the artistic swimming area | World Aquatics, Competition Regulations, in force as from 25 June 2025 (Part Two Article 16, Part Four Article 13 and Appendix 2, Part Six Article 18 and Appendices 3 and 4, Part Seven Article 27), and the Facilities Rules 2017-2021 and 2021-2025 (FR 2 to FR 5) | Facts; no text or drawing copied |
32
+ | `leagues`: the athletics track | World Athletics' Track and Field Facilities Manual (2019 edition, Chapters 1 to 3) and its 400 Metre Standard Track Marking Plan (Figure 2.2.1.6a), the Competition and Technical Rules (Books C1.1 and C2.1, in force 1 July 2026) and the Marking Plan for the Standard Short Track (1 January 2026) | Facts; no text or drawing copied |
33
+ | `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 |
31
34
  | `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 |
32
35
  | `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 |
33
36
  | `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/) |
@@ -35,6 +38,7 @@ picture or code of the sources is copied; each source is named here so that the
35
38
  | `grounds`: each soccer ground's pitch, names, years, city and capacity | The infobox and the opening text of the English Wikipedia article of each ground, at the revision cited below (the pitch's length and width where the infobox gives them for football, the names with the years the article dates them, the year it opened and closed, the first capacity); the ground's name in Japanese from its Japanese article | 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 |
36
39
  | `grounds`: the World Cups each ground staged matches of, and where each final was played | The venue section of the English Wikipedia article of each men's and Women's World Cup, at the revision cited below; FIFA's own pages are not used | Facts, CC BY-SA 4.0 articles as above |
37
40
  | `grounds`: the Wikidata item and the coordinates of each ground (`wikidata`, `lat`, `lon`) | The item that each cited article is linked to, its coordinates (P625) and its country (P17), read with the Wikidata API and checked against the item's labels by `scripts/check-grounds.mjs` | Wikidata's data is CC0 (https://creativecommons.org/publicdomain/zero/1.0/) |
41
+ | `atlas`: the clubs that played in each park and ground (`tenants`: the club, its Wikidata item, its league, the years) | The occupants (P466) and home venues (P115) Wikidata lists for each place, with the start (P580) and end (P582) times of each statement, and the clubs' labels in English and Japanese, sports (P641) and leagues (P118), read with the Wikidata API and query service by `scripts/fetch-tenants.mjs` into `scripts/tenants.wikidata.json`; and the `tenants` line of the infobox of each place's English Wikipedia article, at the revision that `source.wikipedia` names for each club (155 articles, read on 2026-10-13) | Facts. Wikidata's data is CC0 (https://creativecommons.org/publicdomain/zero/1.0/), and the articles are CC BY-SA 4.0 as above; the names of clubs and the years are facts, no text, table or image of an article is used. Which clubs are tenants, and the league each is filed under, are our reading, in docs/atlas.md ("Tenants") |
38
42
  | `parks`: the walls, quirks, backstop, warning track, dugouts and extra points of a ballpark (`walls`, `quirks`, `backstop_ft`, `track_ft`, `dugouts`, `labels`) | The infobox and the text of the same English article of each park, at the same revision as its fence (the Japanese article for the heights of the walls of the parks of Japan): the height of the wall along a stretch of the fence and the seasons it stood, the hill, overhang, poles, bullpens, ivy and basket the text describes with figures, the infobox's backstop distance, the warning track's width, the sides of the dugouts, and the further distances the text gives (Wrigley Field's wells, Sportsman's Park's and Milwaukee County Stadium's markers). The stretch each figure covers and the angle of each extra point are our reading of the article's words | 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 |
39
43
  | `parks`: the coordinates of each ballpark (`lat`, `lon`) and the years it opened and closed (`opened`, `closed`) | The item's coordinate location (P625), its date of official opening or inception (P1619, P571) and of official closure or dissolution (P3999, P576), read with the Wikidata API by `scripts/fetch-park-coordinates.mjs` and checked by `scripts/check-parks.mjs` (ES CON Field's opening, 2023, is read from its article) | Wikidata's data is CC0 (https://creativecommons.org/publicdomain/zero/1.0/) |
40
44
  | `events`: the special games, their days, venues, hosts and where a surface stood | The English Wikipedia articles of each game and of its venue, at the revision cited below, and three articles of the press (Sports Video Group, NHL.com, The Boston Globe), named below with their authors and dates; the size of a carrier from the Nimitz class's article | Facts, CC BY-SA 4.0 articles as above; no text copied |
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 NFL, CFL and IFAF football fields, the NHL rink, the NBA court, the soccer pitch and futsal court, and the baseball field of every MLB ballpark, current and past, and every NPB home park, 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. Wide or tall, light or dark, a compact 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 NFL, CFL and IFAF football fields, the NHL rink, the NBA court, the soccer pitch and futsal court, the baseball field of every MLB ballpark, current and past, and every NPB home park, and the surfaces of curling, athletics, speed, short track and figure skating, swimming, water polo, diving, artistic swimming, 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, thirty-three sports in all, 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, with stands and a crowd, a pageant of flags and a 3D view. Wide or tall, light or dark, a compact 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>
@@ -20,14 +20,14 @@ The NFL, CFL and IFAF football fields, the NHL rink, the NBA court, the soccer p
20
20
  <td align="center" valign="top">
21
21
  <picture>
22
22
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-desk-dark.webp">
23
- <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-desk-light.webp" alt="The demo on a desk, in English: the page header with the language chooser, five cloth patches and the Help switch, and an NHL rink drawn wide on green felt, with a made-up game on it, the Northern Owls and their owl emblem on the left, the Lakeshore Anchors and their anchor on the right, and a panel of the score 3 to 2, Final/OT, in the middle. The controls for the sport, the layout and the teams are on the right." width="640">
23
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-desk-light.webp" alt="The demo on a desk, in English: the heading Kyogijo Stadiums with the language chooser, the Docs and API reference links, five cloth patches and the Help switch, and an NHL rink drawn wide on green felt, with a made-up game on it, the Northern Owls and their owl emblem on the left, the Lakeshore Anchors and their anchor on the right, and a panel of the score 3 to 2, Final/OT, in the middle. The controls on the right list the sports, from the NFL and the NHL to handball, and then the layout and the teams." width="640">
24
24
  </picture>
25
25
  <br><em>The demo on a desk: a rink, with the teams on their sides and the score in the middle.</em>
26
26
  </td>
27
27
  <td align="center" valign="top">
28
28
  <picture>
29
29
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-phone-dark.webp">
30
- <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-phone-light.webp" alt="The demo on a phone: a football field turned a quarter to stand tall, the visiting team's blue end zone at the top and the home team's red end zone at the bottom, each with its logo and name written across it, the yard numbers upright, and a score panel at midfield reading 27 to 24, Final." width="240">
30
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/hero-phone-light.webp" alt="The demo on a phone: the heading Kyogijo Stadiums over the page's controls, and under them a football field turned a quarter to stand tall, the visiting team's blue end zone at the top and the home team's red end zone at the bottom, each with its logo and name written across it, the yard numbers upright, and a score panel at midfield reading 27 to 24, Final." width="240">
31
31
  </picture>
32
32
  <br><em>On a phone the same surface stands tall, the words still upright.</em>
33
33
  </td>
@@ -72,11 +72,16 @@ console.log(svg.startsWith("<svg"), svg.includes("Northern Owls 3, Lakeshore Anc
72
72
 
73
73
  ## Features
74
74
 
75
- - **Twenty surfaces, to scale.** The NFL field (360 by 160 feet with its end zones), the CFL field (450 by 195), the IFAF field, the NHL rink (200 by 85 with a 28-foot corner radius), the NBA court (94 by 50), the soccer pitch (105 by 68 metres, in ten sizes and variants), the baseball field, the curling sheet (150 by 15 feet 7 inches) and the courts of tennis, volleyball and beach volleyball, badminton, pickleball and table tennis, and the fields of lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball, with the lines, circles, keys, boxes and goals of each. Every figure is cited in [sources](./docs/sources.md). [The surfaces](./docs/surfaces.md).
75
+ - **Thirty-three surfaces, to scale.** The NFL field (360 by 160 feet with its end zones), the CFL field (450 by 195), the IFAF field, the NHL rink (200 by 85 with a 28-foot corner radius), the NBA court (94 by 50), the soccer pitch (105 by 68 metres, in ten sizes and variants), the baseball field, the curling sheet (150 by 15 feet 7 inches) and the courts of tennis, volleyball (beach and sitting), badminton, pickleball, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet and netball, the pools of swimming, water polo, diving and artistic swimming, the athletics stadium, the skating rinks, and the fields of lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball, with the lines, circles, keys, boxes and goals of each. 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
- - **Curling, from the rule books.** A sheet from World Curling's and Curling Canada's rules, tall by default, with the board and the hammer in a score, and `curlingStones` for the stones of an end, scored by the rules. [Curling](./docs/curling.md).
78
- - **Tennis, volleyball, badminton, pickleball and table tennis, from their rulebooks.** The ITF's court, the FIVB's indoor and beach courts, the BWF's, USA Pickleball's and the ITTF's table, each in its look (hard court, clay, grass, wood, sand), with a board of sets and games and a ball beside the server. [Net sports](./docs/courts.md).
77
+ - **A realistic basketball floor.** `court: { hardwood: true }` draws maple boards that run the length of the court with staggered ends, grain and tone, stained keys, circle and border, a strip behind each baseline in the team's colour, the baskets and stanchions with soft shadows from above, a coaching box and benches, and a satin sheen, in every league and every renderer, with the detail dropping at small sizes. The clean floor stays the default. [Hardwood](./docs/hardwood.md).
78
+ - **The stands and the crowd.** `crowd: true` draws the seating round any surface that has spectators: a bowl, two sides, a horseshoe, an arena's courtside rows, or a ballpark's grandstands and bleachers laid behind the park's own fence, with the people as a seeded pattern of heads and shoulders in the home colours, the visitors at an end, the empty seats showing (`density`, or `attendance` over `capacity`), a card display on request, and a soccer pitch inside a gridiron stadium's footprint, to scale. A few kB of patterns, blocks at small sizes, every renderer, and the stands' rings, heights and rake as data. [The crowd](./docs/crowd.md).
79
+ - **Curling, from the rule books.** A sheet from World Curling's and Curling Canada's rules, tall by default, with the board and the hammer in a score, `curlingStones` for the stones of an end, scored by the rules, `show: "folded"` for the whole sheet with both houses enlarged beside it in a square, and a heat map and statistics (free guards, hammer, steals, shots) for many ends. [Curling](./docs/curling.md).
80
+ - **Net, racket and court sports, from their rulebooks.** The ITF's court, the FIVB's indoor and beach courts, World ParaVolley's sitting volleyball court, the BWF's, USA Pickleball's, the ITTF's table, the FIP's padel court, World Squash's courts (with the front wall laid flat beside the floor), the IRF's racquetball court, the ISTAF's sepak takraw court, the FITEQ's teqball court and table, the Roundnet Federation's court and World Netball's court, each in its look (hard court, clay, grass, wood, sand), with a board of sets and games and a ball beside the server. [Net, racket and court sports](./docs/courts.md).
81
+ - **Swimming, water polo, diving and artistic swimming, from World Aquatics' regulations.** The competition pool of 50 or 25 m and one to ten lanes with its ropes in the rules' colours, floor markings and cross lines, blocks, touch panels, backstroke flags at 5 m and false start rope at 15 m, with a side section and a flat, "water" or tiled look; the water polo field with its ropes, lines, goals and re-entry areas; the diving well with its springboards and platforms at the distances of Appendix 2; the artistic swimming area; several pools in a natatorium. The lanes of a race carry names, flags you pass in, places with medals, times, reaction times and splits, with split pace bars, a race replay by lane (`raceTimeline`) and a `splitsChart`. [Pools](./docs/pools.md).
79
82
  - **Lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball, from their rulebooks.** The fields and floors of World Lacrosse, the NCAA, the PLL and the NLL; World Rugby's union and the NRL's and IRL's league; the AFL's oval at the size of a named ground; the GAA's field for football and hurling; a cricket ground with a boundary of your own and the 30-yard circle; the FIH's pitch and the IHF's court. A score is goals and behinds (10.12 (72)), goals and points (2-14 (20)) or a board of runs, wickets and overs. [Field sports](./docs/field-sports.md).
83
+ - **The athletics stadium, from World Athletics' rules.** The 400 m track with its lanes, the staggers worked out from the running lines (the 200 m and 400 m to the millimetre of the Manual's table, the 800 m and 4 x 400 m from the breakline's own construction), curved and relay starts, hurdles, the steeplechase with the water jump inside or outside, every field event in its place or alone at a large scale, a close-up of each start with stencil lane numbers, the covered 200 m track, an ink-only `line-drawing` look, and lane draws, results, a race replay and the marks of throws and jumps. [The athletics stadium](./docs/athletics.md).
84
+ - **The skating rinks, from the ISU's rules.** The standard 400 m speed skating track with its two lanes, warm-up lane, blocks and coaches' area, and the starting and finishing lines of every race worked out lane by lane from the track's measurements (held to the layout plan's own dimensions); the short track's oval of 111.12 m with its seven blocks in each curve, five or seven tracks and starting positions; the figure skating rink of 60 by 30 m with its judges' seats; and pairs, results, a race replay and the elements of a programme on the ice. [The skating rinks](./docs/skating.md).
80
85
  - **Soccer, to the Laws.** A pitch from Law 1 of the IFAB Laws of the Game of any size, with presets (international, UEFA, MLS, NCAA, the FA's 9-, 7- and 5-a-side, FIFA's futsal), half pitches, five mowing patterns, four goal styles, penalties and extra time in a score. [Soccer](./docs/soccer.md).
81
86
  - **Every ballpark.** The 30 current MLB parks and 44 that MLB clubs have left (the Polo Grounds, Ebbets Field, the Astrodome and more), and the 12 home parks of Nippon Professional Baseball with eight other NPB grounds, each with its fence drawn from the distances published for it; a past park whose fence moved is drawn as it stood in a season. [Ballparks](./docs/ballparks.md).
82
87
  - **Soccer grounds and an atlas.** 64 soccer grounds, each pitch at its published size, and every park and ground on a map, by sport, league, country and year, each found by any name it has in English, Japanese or its own language (`Koshien Stadium` is also `甲子園`, `San Siro` is `サン・シーロ`). [The grounds](./docs/grounds.md), [the atlas](./docs/atlas.md), [names](./docs/ballparks.md#names).
@@ -84,15 +89,17 @@ console.log(svg.startsWith("<svg"), svg.includes("Northern Owls 3, Lakeshore Anc
84
89
  - **Special games.** A surface set inside another, to scale: an NHL rink on a ballpark's infield or a football stadium's field (the Winter Classic, the Stadium Series, the Heritage Classic), a college basketball court on the deck of a carrier, a baseball field laid over a London stadium's pitch. 18 games, each with its day, its venue and its sources, and the place of the rink cited where a source gives it and marked as a convention where none does. [Special games](./docs/special-games.md).
85
90
  - **Surfaces through the years.** `year: 1975` draws a surface as its league's rules marked it that season, each change cited. [Surfaces through the years](./docs/eras.md).
86
91
  - **Score mode.** Each team's name and logo on its side (the end zones of a football field, the ends of the ice, the halves of the court, the dugouts of a ballpark) and the score large in the middle, with the competition, the status and the date, and the winner emphasised; a flag or a crest can be round, in a circle with a ring (`markShape: "round"`). [Score and layout](./docs/score.md#round-marks).
92
+ - **A pageant.** Each team's flag or crest laid large over its half of the surface, as a stadium lays giant flags and crests for a final: `pageant: "carpet"` (a flag at its own ratio with a border and a gentle fabric) or `"stage"` (a crest on a round disc with a gold ring), an emblem or a trophy of your own in the centre circle, the score in the middle or in the strip, upright wide and tall, in light and dark, with an entrance in CSS for readers who have not asked for less motion. [The pageant](./docs/pageant.md).
87
93
  - **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).
88
94
  - **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.
89
95
  - **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, and the road to a tournament's final (`roadToFinal`: the two finalists' matches as round flags with the scores, in four sizes). [Data layers](./docs/layers.md), [charts](./docs/charts.md).
90
96
  - **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).
91
97
  - **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).
98
+ - **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 a reset, and what the rulebook stands on it at its height: the net and antennae of volleyball, the nets of tennis, badminton, pickleball and table tennis, baskets and stanchions, rink boards and glass, goals, the posts of football, rugby, Gaelic and Australian football, stumps, a ballpark's fence, the walls of padel, squash and racquetball (cut away on the side nearest the eye), a swimming pool's blocks and flags, a diving well's boards and platforms, a water polo goal, a jump's uprights and bar, a throwing cage, the hurdles, and the padding of a skating track. Plain DOM and CSS over the same SVG, flat where 3D is not drawn. [The 3D view](./docs/turn.md).
92
99
  - **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).
93
- - **Units and frames.** Each surface in its rulebook's unit and any other, and 29 coordinate frames (ten soccer providers, the NHL API, HockeyTech, NBA stats, NFL tracking, MLBAM, Retrosheet, a curling stone's place from the button, a place from the net in each net sport, the centre of each field sport's surface) to move a provider's points onto a surface. [Units](./docs/units.md), [coordinate frames](./docs/frames.md).
100
+ - **Units and frames.** Each surface in its rulebook's unit and any other, and 42 coordinate frames (ten soccer providers, the NHL API, HockeyTech, NBA stats, NFL tracking, MLBAM, Retrosheet, a curling stone's place from the button, a place from the net in each net sport (from the centre of the court in squash, racquetball, roundnet and netball), the centre of each field sport's surface, the middle of the water of each pool, the middle of the athletics stadium and of each skating rink) to move a provider's points onto a surface. [Units](./docs/units.md), [coordinate frames](./docs/frames.md).
94
101
  - **A compact badge and a compact card.** One strip for a list, or the surface with that strip under it.
95
- - **Light and dark**, by the device or the page, and every colour a custom property; seven 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).
102
+ - **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).
96
103
  - **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).
97
104
  - **Four ways in.** A function that returns SVG text; a helper that draws into a container; a standard custom element; a frame for pages that run no script. A React helper that does not import React.
98
105
  - **No dependencies**, no network requests, nothing stored. Text, colours and logo addresses that come from outside are made safe before they are drawn.
@@ -103,12 +110,15 @@ console.log(svg.startsWith("<svg"), svg.includes("Northern Owls 3, Lakeshore Anc
103
110
  | Part | What it is |
104
111
  | --- | --- |
105
112
  | `drawKyogijo`, `drawSurface`, `drawScore`, `drawBadge` | The drawing, as a string of SVG. |
106
- | `SPORTS`, `PARKS`, `PARK_IDS`, `COURT_THEMES` | The twenty sports, the 94 ballparks, the court looks. |
113
+ | `SPORTS`, `PARKS`, `PARK_IDS`, `COURT_THEMES` | The thirty-three sports, the 94 ballparks, the court looks. |
107
114
  | `SOCCER_PITCHES`, `SOCCER_PROVIDERS`, `rescale`, `soccerSpec` | The soccer pitches, the data providers' coordinate systems and the map between them. |
108
115
  | `GROUNDS`, `groundById` | The 64 soccer grounds, each pitch at its own size. |
109
116
  | `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. |
110
117
  | `./geometry`, `./frames`, `./layers`, `./charts`, `./replay` | The dimensions in any unit; the providers' frames; data layers; ready-made charts; tracking data played on a surface. |
118
+ | `./athletics` | The athletics stadium: the plan, the track's geometry (the stagger of any lane), the races and field events, and the lane draw, results, race replay and field marks charts. |
119
+ | `./skating` | The skating rinks: the plan, the long track's geometry (a skater's way round it, the start of a race), the races, and the pairs, starting positions, results, race replay and programme elements charts. |
111
120
  | `./parks`, `./grounds`, `./atlas`, `./eras`, `./leagues`, `./events` | The ballparks, the grounds, every place, the markings of a season, each league's rulebook, the special games. |
121
+ | `./turn` | A surface as a 3D view that turns, with the net, basket, goal or posts standing on it. |
112
122
  | `./scene`, `./canvas`, `./d3`, `./plot`, `./geojson`, `./png` | The drawing as data; on a canvas; in a d3 selection; as an Observable Plot mark; as GeoJSON; as a PNG (the optional peer `@resvg/resvg-js`). |
113
123
  | `./layouts` | `drawGrid` and `GRID_PRESETS`: small multiples with a title, a subtitle, a key and a credit line; the grounds behind a drawing or a grid. |
114
124
  | `./mount`, `./react`, `./element`, `./element/define` | Draw into a container; React props; the `<kyogijo-field>` element and its registration. |
@@ -189,7 +199,7 @@ console.log(box(wide), box(tall));
189
199
  <br><em>The same game tall: the teams top and bottom, every word upright.</em>
190
200
  </p>
191
201
 
192
- [The surfaces](./docs/surfaces.md) lists the twenty, 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.
202
+ [The surfaces](./docs/surfaces.md) lists the thirty-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.
193
203
 
194
204
  ### A league's rulebook
195
205
 
@@ -304,7 +314,51 @@ console.log(svg.includes("--ky-key:#1e4f8f"), svg.includes("METRO BOLTS"));
304
314
  <br><em>A court in a look of its own: the paint, the border and the words on the baselines are options.</em>
305
315
  </p>
306
316
 
307
- The five court looks, the seven looks of every sport and every colour property are in [theming](./docs/theming.md).
317
+ The five court looks, the eight looks of every sport and every colour property are in [theming](./docs/theming.md).
318
+
319
+ ### Turn it, and see the net
320
+
321
+ ```ts no-run
322
+ import { mountKyogijoTurn } from "@johnmorrisdotca/kyogijo-stadiums/turn";
323
+
324
+ const view = mountKyogijoTurn(document.querySelector("#court")!, { sport: "volleyball", status: "live" }, { preset: "end" });
325
+ view.preset("corner");
326
+ ```
327
+
328
+ ```ts
329
+ import { turnMarkup, uprightsFor } from "@johnmorrisdotca/kyogijo-stadiums/turn";
330
+
331
+ const { items } = uprightsFor({ sport: "volleyball" }, { netHeight: "women" });
332
+ const html = turnMarkup({ sport: "volleyball" }, { preset: "end" });
333
+ console.log(items.map((item) => item.kind).join(), html.includes("preserve-3d"));
334
+ // net,netposts,antennae false
335
+ ```
336
+
337
+ The flat drawing is the floor, turned by a drag, a swipe, the keys or four viewpoints (overhead, broadcast, end-on, low corner), and what the rulebook stands on the surface is built up on it at its height. Each part is a flat rectangle placed by one `matrix3d`, so there is no 3D context for a phone to lose; where 3D is not drawn the flat drawing stays. In the element it is `<kyogijo-field sport="nhl" turn turn-view="broadcast">`. [The 3D view](./docs/turn.md).
338
+
339
+ <p align="center">
340
+ <picture>
341
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-volleyball-desk-dark.webp">
342
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-volleyball-desk-light.webp" alt="A volleyball court from behind an end line, turned in the demo: the net at 2.43 metres on its posts with the red and white antennae, and under it the buttons for the four viewpoints, turning, raising, zooming and resetting." width="640">
343
+ </picture>
344
+ <br><em>A volleyball net at its rulebook height, with its posts and antennae.</em>
345
+ </p>
346
+
347
+ <p align="center">
348
+ <picture>
349
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-rink-desk-dark.webp">
350
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-rink-desk-light.webp" alt="An ice rink from a low corner, turned in the demo: the boards with their glass round the ice, a goal at each end, and the score on the ice." width="640">
351
+ </picture>
352
+ <br><em>A rink with its boards, glass and goals.</em>
353
+ </p>
354
+
355
+ <p align="center">
356
+ <picture>
357
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-court-desk-dark.webp">
358
+ <img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turn-court-desk-light.webp" alt="A basketball court from the main camera, turned in the demo: a basket on its backboard and padded stanchion at each end of the floor." width="640">
359
+ </picture>
360
+ <br><em>A court with a basket at each end, the rim at 10 feet.</em>
361
+ </p>
308
362
 
309
363
  ### A shoot-out, and a famous ground
310
364
 
@@ -469,7 +523,7 @@ A page that moves (`mountKyogijo`), a file written on a server and a frame for a
469
523
 
470
524
  ## API
471
525
 
472
- The [API reference](https://johnmorrisdotca.github.io/kyogijo-stadiums/api.html) lists every export of every entry point with its signature and its doc comment. It is made from the source by `pnpm site`, so it cannot fall behind the code. [Entry points](./docs/entry-points.md) says what each of the 15 holds: the main one draws; `/geometry`, `/frames`, `/layers`, `/charts`, `/replay`, `/parks`, `/eras`, `/leagues`, `/grounds` and `/atlas` stand apart and need nothing else; `/mount`, `/react`, `/element` and `/element/define` put a drawing in a page.
526
+ The [API reference](https://johnmorrisdotca.github.io/kyogijo-stadiums/api.html) lists every export of every entry point with its signature and its doc comment. It is made from the source by `pnpm site`, so it cannot fall behind the code. [Entry points](./docs/entry-points.md) says what each of the 15 holds: the main one draws; `/geometry`, `/frames`, `/layers`, `/charts`, `/replay`, `/parks`, `/eras`, `/leagues`, `/grounds` and `/atlas` stand apart and need nothing else; `/mount`, `/turn`, `/react`, `/element` and `/element/define` put a drawing in a page.
473
527
 
474
528
  Every function is pure: it returns new values and never changes what it was given.
475
529
 
@@ -479,7 +533,7 @@ Nothing is branded. The drawing is coloured by custom properties on its `svg`, w
479
533
 
480
534
  ## Limits
481
535
 
482
- Each is held by a test: twenty sports, ten soccer pitches and ten providers, 94 ballparks, 64 grounds, six units, twenty-nine frames, a drawing of under 22 kB. The table, made from the code, is [limits](./docs/limits.md).
536
+ Each is held by a test: thirty-three sports, ten soccer pitches and ten providers, 94 ballparks, 64 grounds, six units, forty-two frames, a drawing of under 22 kB. The table, made from the code, is [limits](./docs/limits.md).
483
537
 
484
538
  ## Accessibility
485
539
 
@@ -532,7 +586,7 @@ Using Kyogijo Stadiums in something? Open an *Add my project* issue and we will
532
586
  ### The family
533
587
 
534
588
  <!-- family:start (made by scripts/family-readme.mjs from scripts/family-template.mjs; change those, not this) -->
535
- Kyogijo is one of twenty-five packages, each made for the same site, each at
589
+ Kyogijo Stadiums is one of twenty-six packages, each made for the same site, each at
536
590
  [github.com/johnmorrisdotca](https://github.com/johnmorrisdotca). The code of every one is MIT.
537
591
 
538
592
  - [Korokoro](https://github.com/johnmorrisdotca/korokoro) (コロコロ): dice, with notation, exact odds, real sounds and the dice of many games. [Demo](https://johnmorrisdotca.github.io/korokoro/).
@@ -559,9 +613,10 @@ Kyogijo is one of twenty-five packages, each made for the same site, each at
559
613
  - [Gunjin](https://github.com/johnmorrisdotca/gunjin) (軍人): five hidden-rank strategy games with pass-the-device play. [Demo](https://johnmorrisdotca.github.io/gunjin/).
560
614
  - [Karakuri](https://github.com/johnmorrisdotca/karakuri) (からくり): eight hyper-casual puzzle games, some of them physics: draw a shield, pull pins, cut ropes, slide blocks, pour tubes. [Demo](https://johnmorrisdotca.github.io/karakuri/).
561
615
  - [Houseki](https://github.com/johnmorrisdotca/houseki) (宝石): gem and stone matching puzzles: falling triplets, stone collapse, colour chains and gem swap. [Demo](https://johnmorrisdotca.github.io/houseki/).
562
- - [Kyogijo](https://github.com/johnmorrisdotca/kyogijo-stadiums) (競技場): sports fields, rinks, courts and ballparks drawn to scale as SVG, with each team and the score on them. [Demo](https://johnmorrisdotca.github.io/kyogijo-stadiums/).
616
+ - [Kyogijo Stadiums](https://github.com/johnmorrisdotca/kyogijo-stadiums) (競技場): sports fields, rinks, courts and ballparks drawn to scale as SVG, with each team and the score on them. [Demo](https://johnmorrisdotca.github.io/kyogijo-stadiums/).
617
+ - [Taisen Brackets](https://github.com/johnmorrisdotca/taisen-brackets) (対戦): a sport-agnostic tournament bracket, drawn as SVG, from a list of ties. [Demo](https://johnmorrisdotca.github.io/taisen-brackets/).
563
618
 
564
- **This package is Kyogijo.** The demos of all twenty-five share one header and footer, so each links the rest.
619
+ **This package is Kyogijo Stadiums.** The demos of all twenty-six share one header and footer, so each links the rest.
565
620
  <!-- family:end -->
566
621
 
567
622
  ## Development
package/dist/annotate.js CHANGED
@@ -10,7 +10,7 @@ import { textWidth } from "./text.js";
10
10
  import { textOn } from "./surfaces/surface.js";
11
11
  import { FEET_PER, SURFACE_UNITS, isUnit } from "./units.js";
12
12
  /** The margin each surface has when the options give none (the builders' own defaults), in feet. */
13
- export const DEFAULT_MARGIN = { nfl: 12, cfl: 12, ifaf: 12, nhl: 8, nba: 7, mlb: 14, soccer: 15, curling: 3, lacrosse: 16, rugby: 16, afl: 16, gaelic: 16, cricket: 9, fieldhockey: 16, handball: 10 };
13
+ export const DEFAULT_MARGIN = { nfl: 12, cfl: 12, ifaf: 12, nhl: 8, nba: 7, mlb: 14, soccer: 15, curling: 3, swimming: 8.2, waterpolo: 9.8, diving: 8.2, artisticswimming: 9.8, lacrosse: 16, rugby: 16, afl: 16, gaelic: 16, cricket: 9, fieldhockey: 16, handball: 10 };
14
14
  const NONE = { svg: "", summaries: [], need: 0, reach: { top: 0, bottom: 0 } };
15
15
  /** The surface's wide frame view: the drawing's viewBox as the surface lies wide, which for a turned surface is found again from its turn. */
16
16
  export function wideView(surface) {
@@ -0,0 +1,8 @@
1
+ import type { Language, SurfaceOptions } from "../types.ts";
2
+ /** The words of a race or a field event in a language. */
3
+ export declare const raceName: (id: string, language: Language) => string;
4
+ export declare const fieldEventName: (id: string, language: Language) => string;
5
+ /** The sentence about the track, as a fragment: "an athletics track of 400 metres with 8 lanes...". */
6
+ export declare function athleticsAbout(o: Pick<SurfaceOptions, "sport" | "league" | "athletics">, language: Language): string;
7
+ /** The sentences that follow it: the infield, the events and the races marked, the close-up and the layout. Each starts after a gap. */
8
+ export declare function athleticsSentences(o: Pick<SurfaceOptions, "sport" | "league" | "athletics" | "range">, language: Language): string;
@@ -0,0 +1,41 @@
1
+ // What an athletics drawing says of itself: its sentence about the track, and what the options mark on it. Cheap (it reads the options, not the plan), so that a title and a description cost nothing.
2
+ import { fill, KYOGIJO_STRINGS } from "../strings.js";
3
+ import { fieldEventById, raceById } from "./events.js";
4
+ import { athleticsLanes, athleticsLeague, eventsOf, racesOf } from "./plan.js";
5
+ /** The words of a race or a field event in a language. */
6
+ export const raceName = (id, language) => raceById(id)?.name[language] ?? id;
7
+ export const fieldEventName = (id, language) => fieldEventById(id)?.name[language] ?? id;
8
+ /** The sentence about the track, as a fragment: "an athletics track of 400 metres with 8 lanes...". */
9
+ export function athleticsAbout(o, language) {
10
+ const words = KYOGIJO_STRINGS[language].athletics;
11
+ const league = athleticsLeague(o);
12
+ return fill(league.dimensions.banking === null ? words.track400 : words.track200, { lanes: athleticsLanes(o) });
13
+ }
14
+ /** The sentences that follow it: the infield, the events and the races marked, the close-up and the layout. Each starts after a gap. */
15
+ export function athleticsSentences(o, language) {
16
+ const words = KYOGIJO_STRINGS[language].athletics;
17
+ const { gap } = KYOGIJO_STRINGS[language].said;
18
+ const sep = KYOGIJO_STRINGS[language].layers.listSep;
19
+ const style = o.athletics;
20
+ const league = athleticsLeague(o);
21
+ const indoor = league.dimensions.banking !== null;
22
+ const out = [];
23
+ if (style?.layout !== undefined)
24
+ return `${gap}${fill(words.layout, { event: fieldEventName(style.layout, language) })}`;
25
+ const infield = style?.infield ?? (indoor ? "none" : "pitch");
26
+ out.push(infield === "pitch" ? words.infieldPitch : infield === "grass" ? words.infieldGrass : words.infieldNone);
27
+ if (!indoor) {
28
+ const events = eventsOf(style);
29
+ if (events.length > 0)
30
+ out.push(fill(words.events, { list: events.map((e) => fieldEventName(e, language)).join(sep) }));
31
+ }
32
+ const races = racesOf(style, indoor);
33
+ if (races.length > 0)
34
+ out.push(fill(words.races, { list: races.map((r) => r.name[language]).join(sep) }));
35
+ const range = typeof o.range === "string" ? o.range : typeof o.range === "object" && o.range !== null && "name" in o.range ? o.range.name : undefined;
36
+ if (range === "start")
37
+ out.push(fill(words.start, { race: raceName(style?.start ?? "400m", language) }));
38
+ if (range === "finish")
39
+ out.push(words.finish);
40
+ return out.map((t) => `${gap}${t}`).join("");
41
+ }
@@ -0,0 +1,17 @@
1
+ import type { AthleticsFieldEvent, AthleticsRace, FieldEventInfo, RaceInfo } from "./types.ts";
2
+ /**
3
+ * The races, in the order a menu lists them. `kind` says how the start is made: `straight` (the sprints and the sprint hurdles, on the finish straight), `stagger` (the lanes' staggers of Table
4
+ * 2.2.1.6a: `bends` half-turns in lanes), `curved` (a curved start line, the waterfall, for a race run without lanes) and `steeplechase` (the water jump's lap). The breakline (Rule 17.5.1) is the
5
+ * 800 m's and the 4 x 400 m's; the group starts (Rule 17.5.2) are those of the races over 1000 m.
6
+ */
7
+ export declare const RACES: readonly RaceInfo[];
8
+ /** The ids of the races. */
9
+ export declare const RACE_IDS: readonly AthleticsRace[];
10
+ /** A race by its id, or `undefined`. */
11
+ export declare const raceById: (id: unknown) => RaceInfo | undefined;
12
+ /** The field events, in the order a menu lists them: the jumps and then the throws. */
13
+ export declare const FIELD_EVENTS: readonly FieldEventInfo[];
14
+ /** The ids of the field events. */
15
+ export declare const FIELD_EVENT_IDS: readonly AthleticsFieldEvent[];
16
+ /** A field event by its id, or `undefined`. */
17
+ export declare const fieldEventById: (id: unknown) => FieldEventInfo | undefined;
@@ -0,0 +1,48 @@
1
+ const race = (r) => Object.freeze(r);
2
+ /**
3
+ * The races, in the order a menu lists them. `kind` says how the start is made: `straight` (the sprints and the sprint hurdles, on the finish straight), `stagger` (the lanes' staggers of Table
4
+ * 2.2.1.6a: `bends` half-turns in lanes), `curved` (a curved start line, the waterfall, for a race run without lanes) and `steeplechase` (the water jump's lap). The breakline (Rule 17.5.1) is the
5
+ * 800 m's and the 4 x 400 m's; the group starts (Rule 17.5.2) are those of the races over 1000 m.
6
+ */
7
+ export const RACES = Object.freeze([
8
+ race({ id: "60m", distance: 60, kind: "straight", indoor: true, name: { en: "60 m", ja: "60m", fr: "60\u00a0m" } }),
9
+ race({ id: "60m-hurdles", distance: 60, kind: "straight", hurdles: true, indoor: true, name: { en: "60 m hurdles", ja: "60mハードル", fr: "60\u00a0m haies" } }),
10
+ race({ id: "100m", distance: 100, kind: "straight", name: { en: "100 m", ja: "100m", fr: "100\u00a0m" } }),
11
+ race({ id: "100m-hurdles", distance: 100, kind: "straight", hurdles: true, name: { en: "100 m hurdles", ja: "100mハードル", fr: "100\u00a0m haies" } }),
12
+ race({ id: "110m-hurdles", distance: 110, kind: "straight", hurdles: true, name: { en: "110 m hurdles", ja: "110mハードル", fr: "110\u00a0m haies" } }),
13
+ race({ id: "200m", distance: 200, kind: "stagger", bends: 1, name: { en: "200 m", ja: "200m", fr: "200\u00a0m" } }),
14
+ race({ id: "400m", distance: 400, kind: "stagger", bends: 2, name: { en: "400 m", ja: "400m", fr: "400\u00a0m" } }),
15
+ race({ id: "400m-hurdles", distance: 400, kind: "stagger", bends: 2, hurdles: true, name: { en: "400 m hurdles", ja: "400mハードル", fr: "400\u00a0m haies" } }),
16
+ race({ id: "800m", distance: 800, kind: "stagger", bends: 1, breakline: true, name: { en: "800 m", ja: "800m", fr: "800\u00a0m" } }),
17
+ race({ id: "1000m", distance: 1000, kind: "curved", group: true, name: { en: "1000 m", ja: "1000m", fr: "1000\u00a0m" } }),
18
+ race({ id: "1500m", distance: 1500, kind: "curved", name: { en: "1500 m", ja: "1500m", fr: "1500\u00a0m" } }),
19
+ race({ id: "mile", distance: 1609.344, kind: "curved", name: { en: "Mile", ja: "1マイル", fr: "Mile" } }),
20
+ race({ id: "2000m", distance: 2000, kind: "curved", group: true, name: { en: "2000 m", ja: "2000m", fr: "2000\u00a0m" } }),
21
+ race({ id: "3000m", distance: 3000, kind: "curved", group: true, name: { en: "3000 m", ja: "3000m", fr: "3000\u00a0m" } }),
22
+ race({ id: "5000m", distance: 5000, kind: "curved", group: true, name: { en: "5000 m", ja: "5000m", fr: "5000\u00a0m" } }),
23
+ race({ id: "10000m", distance: 10000, kind: "curved", group: true, name: { en: "10,000 m", ja: "10000m", fr: "10\u00a0000\u00a0m" } }),
24
+ race({ id: "2000m-steeplechase", distance: 2000, kind: "steeplechase", name: { en: "2000 m steeplechase", ja: "2000m障害物競走", fr: "2000\u00a0m steeple" } }),
25
+ race({ id: "3000m-steeplechase", distance: 3000, kind: "steeplechase", group: true, name: { en: "3000 m steeplechase", ja: "3000m障害物競走", fr: "3000\u00a0m steeple" } }),
26
+ race({ id: "4x100m", distance: 400, kind: "stagger", bends: 2, legs: [100, 100, 100, 100], name: { en: "4 x 100 m relay", ja: "4×100mリレー", fr: "Relais 4\u00a0×\u00a0100\u00a0m" } }),
27
+ race({ id: "4x400m", distance: 1600, kind: "stagger", bends: 3, breakline: true, legs: [400, 400, 400, 400], name: { en: "4 x 400 m relay", ja: "4×400mリレー", fr: "Relais 4\u00a0×\u00a0400\u00a0m" } }),
28
+ ]);
29
+ /** The ids of the races. */
30
+ export const RACE_IDS = Object.freeze(RACES.map((r) => r.id));
31
+ /** A race by its id, or `undefined`. */
32
+ export const raceById = (id) => RACES.find((r) => r.id === id);
33
+ const field = (f) => Object.freeze(f);
34
+ /** The field events, in the order a menu lists them: the jumps and then the throws. */
35
+ export const FIELD_EVENTS = Object.freeze([
36
+ field({ id: "high-jump", name: { en: "High jump", ja: "走高跳", fr: "Saut en hauteur" } }),
37
+ field({ id: "pole-vault", name: { en: "Pole vault", ja: "棒高跳", fr: "Saut à la perche" } }),
38
+ field({ id: "long-jump", name: { en: "Long jump", ja: "走幅跳", fr: "Saut en longueur" } }),
39
+ field({ id: "triple-jump", name: { en: "Triple jump", ja: "三段跳", fr: "Triple saut" } }),
40
+ field({ id: "shot-put", name: { en: "Shot put", ja: "砲丸投", fr: "Lancer du poids" } }),
41
+ field({ id: "discus-throw", name: { en: "Discus throw", ja: "円盤投", fr: "Lancer du disque" } }),
42
+ field({ id: "hammer-throw", name: { en: "Hammer throw", ja: "ハンマー投", fr: "Lancer du marteau" } }),
43
+ field({ id: "javelin-throw", name: { en: "Javelin throw", ja: "やり投", fr: "Lancer du javelot" } }),
44
+ ]);
45
+ /** The ids of the field events. */
46
+ export const FIELD_EVENT_IDS = Object.freeze(FIELD_EVENTS.map((f) => f.id));
47
+ /** A field event by its id, or `undefined`. */
48
+ export const fieldEventById = (id) => FIELD_EVENTS.find((f) => f.id === id);