@johnmorrisdotca/kyogijo-stadiums 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/NOTICE.md +13 -3
- package/README.md +65 -112
- package/dist/district.d.ts +1 -1
- package/dist/district.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/turn.dom.d.ts +8 -2
- package/dist/turn.dom.js +10 -4
- package/dist/venue.d.ts +2 -0
- package/dist/venue.js +3 -2
- package/dist/venue.real.d.ts +5 -2
- package/dist/venue.real.js +4 -4
- package/dist/venues-entry.d.ts +2 -2
- package/dist/venues-entry.js +1 -1
- package/dist/venues.d.ts +14 -3
- package/dist/venues.data.js +72 -0
- package/dist/venues.geo.d.ts +22 -0
- package/dist/venues.geo.js +28 -0
- package/dist/venues.js +9 -1
- package/dist/venues.osm.data.js +366 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ All notable changes to this project are written here. The format follows
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.29.0] - 2026-10-20
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **The real venues of the Central Division**: the United Center, the Ball Arena, the American Airlines Center, the Grand Casino Arena, the Bridgestone Arena, the Enterprise Center, the Delta Center and the Canada Life Centre, drawn the way the Pacific Division's were: the outline of the building from OpenStreetMap (read on 2026-10-20), a plausible bowl of the seats, tiers and roof the sources give, each fact labelled `documented` or `plausible`. With the Pacific Division that is sixteen arenas, the Western Conference's. The Grand Casino Arena is the first of three seating tiers (its article counts four levels, one of them suites) and its building is a relation of two ways in OpenStreetMap; the Canada Life Centre's lower bowl has the 8,812 of its 15,225 seats its article gives. The rink's orientation is inferred from the main hall for twelve of the sixteen and not known for four (the Ball Arena is the new one); none is mapped. A Wikidata capacity for ice hockey that changed over the years (the Grand Casino Arena's 18,064 from 2000 and 17,954 from 2012) is read as the latest. The Eastern Conference follows.
|
|
15
|
+
- **Divisions and conferences in the data and the API**: every venue has a `division`, `VENUE_DIVISIONS` and `VENUE_CONFERENCES` give the league's order, and `venuesIn`, `venuesInConference` and `conferenceOf` list and place them. The raw reads are kept per division (`data-sources/venues/<date>/wikidata-<division>.json`, `wikipedia-<division>.json`, which now also keeps the infobox's capacity line, and `osm-<arena>.json`; `pnpm venues:fetch <date> <division>`), and `pnpm venues` also writes the table of `NOTICE.md`.
|
|
16
|
+
- **The 3D view's walls and roof apart**: `venue: { walls, roof }` (`walls` follows `roof` when it is left out, so the old `roof: true` is unchanged), and `turn.update(options, { venue })` changes them on a view that is mounted, which goes on turning from where it is.
|
|
17
|
+
- **The demo's venues page by division**, with a conference and division chooser, and **the controls on the view**: the stands, walls, roof, building, markings and labels are buttons beside the view (they never stop or restart the turn: the first three draw the scene again through `update`, the others are a style), flat or 3D, the view's own viewpoints, turn, tilt, zoom and Play under it (the 3D view turns by itself when it opens), a compact scrolling bar on a phone, and the choice in the address (`?stands=0&walls=1&roof=1&building=0&markings=0&labels=0&viewpoint=end&spin=off`; an old `roof=1` still means walls and roof).
|
|
18
|
+
- **The demo's home page leads with a real arena that turns by itself** (Climate Pledge Arena, any of the sixteen from a list), with the same buttons on it, in the address under `f` (`fv`, `fstands`, `froof`...), and links to the venues page, the tournament layouts in 3D and the judging page's broadcast view.
|
|
19
|
+
- **Two moving pictures at the head of the README** (a real arena and a tournament layout turning once round, animated WebP in a light and a dark file, 0.5 to 0.8 MB each) and a "Look at these first" table with one picture of the real venues, the tournament layouts, the judging broadcast view and the combat sports; the other pictures of those sections are on their docs pages. `pnpm screenshots:animation` makes the moving pictures from the demo (`scripts/readme-animation.mjs`, frames from Playwright and the few lines of RIFF in `scripts/webp-animated.mjs`, no other tool). The README lint (`scripts/readme-lint.mjs`) gives a `turning-*` picture a budget of its own and counts a picture a docs page shows as used.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- The fly-through demo page's arena tabs (now the sixteen venues) are one row that scrolls on a phone, so that the view stays in sight.
|
|
24
|
+
|
|
10
25
|
## [0.28.0] - 2026-10-20
|
|
11
26
|
|
|
12
27
|
### Added
|
package/NOTICE.md
CHANGED
|
@@ -43,7 +43,7 @@ picture or code of the sources is copied; each source is named here so that the
|
|
|
43
43
|
| `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 |
|
|
44
44
|
| `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/) |
|
|
45
45
|
| `arenas`: each arena's names, years, city, seats, rink sizes, Wikidata item and coordinates | The infobox and the text of the English Wikipedia article of each arena, at the revision cited below (the names with the years the article dates them, the year it opened, closed and was pulled down, the seats for ice hockey and for basketball, a rink's length and width where the article gives them in a sentence of its own); the name in Japanese from the title of its Japanese article or written for the package; the Wikidata item (CC0) that each article is linked to and its coordinates (P625) | 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 |
|
|
46
|
-
| `venues`: the outline of each NHL arena's building, how its rink lies in it and the building's height (`VENUE_OSM`, `src/venues.osm.data.ts`) | OpenStreetMap, through the Overpass API: the closed way tagged with the venue's Wikidata item (and the ice, where it is mapped), read on 2026-10-20, with the raw answers kept in `data-sources/venues/2026-10-20/`; the outline is simplified to a metre, and the way the rink lies is worked out from it (`coreOf`, `src/venues.geo.ts`) | ODbL 1.0, (c) OpenStreetMap contributors (https://www.openstreetmap.org/copyright): a derived database, kept in its own file and offered under the ODbL; a drawing made from it is a produced work and carries the credit (`VENUE_ATTRIBUTION`) |
|
|
46
|
+
| `venues`: the outline of each NHL arena's building, how its rink lies in it and the building's height (`VENUE_OSM`, `src/venues.osm.data.ts`) | OpenStreetMap, through the Overpass API: the closed way (or the relation of a building drawn in two ways) tagged with the venue's Wikidata item (and the ice, where it is mapped), read on 2026-10-20, with the raw answers kept in `data-sources/venues/2026-10-20/`; the outline is simplified to a metre, and the way the rink lies is worked out from it (`coreOf`, `src/venues.geo.ts`) | ODbL 1.0, (c) OpenStreetMap contributors (https://www.openstreetmap.org/copyright): a derived database, kept in its own file and offered under the ODbL; a drawing made from it is a produced work and carries the credit (`VENUE_ATTRIBUTION`) |
|
|
47
47
|
| `venues`: each venue's seats for ice hockey, number of seating tiers and kind of roof (`VENUE_DATA`, `src/venues.data.ts`) | The item of Wikidata (the capacity P1083 and the sport it applies to P641) and the English Wikipedia article of each arena, at the revision cited below, in `data-sources/venues/2026-10-20/` as read; the facts are numbers and words of our own, with what was read in a few words | Wikidata's data is CC0; the facts read from the articles are facts, with the articles credited here (CC BY-SA 4.0) |
|
|
48
48
|
| `stadiums`: the outline of each stadium's building, the roof OpenStreetMap maps over it (its heights and the opening in it) and how the field lies, worked out from the opening (`STADIUM_OSM`, `src/stadiums.osm.data.ts`) | OpenStreetMap, through the Overpass API: the closed way tagged with the stadium's Wikidata item and the multipolygon of its roof, read on 2026-10-20, with the raw answers kept in `data-sources/stadiums/2026-10-20/`; the outline is simplified to a metre, and the way the field lies is worked out from the opening (`smallestBox`, `src/venues.geo.ts`) | ODbL 1.0, (c) OpenStreetMap contributors (https://www.openstreetmap.org/copyright): a derived database, kept in its own file and offered under the ODbL; a drawing made from it is a produced work and carries the credit (`VENUE_ATTRIBUTION`) |
|
|
49
49
|
| `stadiums`: each stadium's seats for each configuration, number of seating bowls, kind of roof and the size of its opening (`STADIUM_DATA`, `src/stadiums.data.ts`) | The item of Wikidata (the capacity P1083) and the English Wikipedia article of each stadium, at the revision cited below, in `data-sources/stadiums/2026-10-20/` as read; the facts are numbers and words of our own, with what was read in a few words | Wikidata's data is CC0; the facts read from the article are facts, with the article credited here (CC BY-SA 4.0) |
|
|
@@ -411,9 +411,10 @@ The Japanese Wikipedia articles read for the names, with their revisions, are li
|
|
|
411
411
|
|
|
412
412
|
## The venues' sources
|
|
413
413
|
|
|
414
|
-
The
|
|
414
|
+
The arenas of the NHL's Pacific and Central Divisions, read on 2026-10-20 (`pnpm venues:fetch <date> <division>`; the files are in `data-sources/venues/2026-10-20/`: `osm-<arena>.json` as Overpass returned them, and `wikidata-<division>.json` and `wikipedia-<division>.json`). The outline of a building is OpenStreetMap's, ODbL 1.0, (c) OpenStreetMap contributors, and lives in `src/venues.osm.data.ts` alone. The seats, the tiers and the roof are in `src/venues.data.ts`, with what each cites. No seat map of a team, a ticket seller or a venue is read or copied, and no mark of a team or a league is drawn.
|
|
415
415
|
|
|
416
|
-
|
|
416
|
+
<!-- venues-notice -->
|
|
417
|
+
| Arena | Wikidata item | OpenStreetMap element | English article and revision |
|
|
417
418
|
| --- | --- | --- | --- |
|
|
418
419
|
| Honda Center | Q774138 | way/120623151 | Honda Center, 1380000927 |
|
|
419
420
|
| Scotiabank Saddledome | Q1140083 | way/4397328 | Scotiabank Saddledome, 1377341466 |
|
|
@@ -423,6 +424,15 @@ The eight arenas of the NHL's Pacific Division, read on 2026-10-20 (`pnpm venues
|
|
|
423
424
|
| Climate Pledge Arena | Q977529 | way/25123756 | Climate Pledge Arena, 1380851727 |
|
|
424
425
|
| Rogers Arena | Q517318 | way/24705911 | Rogers Arena, 1379918849 |
|
|
425
426
|
| T-Mobile Arena | Q3338973 | way/364489406 | T-Mobile Arena, 1379155307 |
|
|
427
|
+
| United Center | Q639975 | way/205221993 | United Center, 1380672233 |
|
|
428
|
+
| Ball Arena | Q795470 | way/25312645 | Ball Arena, 1379560431 |
|
|
429
|
+
| American Airlines Center | Q463345 | way/25312698 | American Airlines Center, 1379833787 |
|
|
430
|
+
| Grand Casino Arena | Q1421388 | relation/20658401 | Grand Casino Arena, 1379407082 |
|
|
431
|
+
| Bridgestone Arena | Q302869 | way/130905914 | Bridgestone Arena, 1380457078 |
|
|
432
|
+
| Enterprise Center | Q1067700 | way/42369176 | Enterprise Center, 1372086380 |
|
|
433
|
+
| Delta Center | Q82294 | way/23335190 | Delta Center, 1379043310 |
|
|
434
|
+
| Canada Life Centre | Q656928 | way/14869890 | Canada Life Centre, 1379717047 |
|
|
435
|
+
<!-- /venues-notice -->
|
|
426
436
|
|
|
427
437
|
## The stadiums' sources
|
|
428
438
|
|
package/README.md
CHANGED
|
@@ -13,6 +13,25 @@ The surfaces of forty-three sports, from football and curling to the budō and t
|
|
|
13
13
|
|
|
14
14
|
<p align="center"><a href="https://johnmorrisdotca.github.io/kyogijo-stadiums/"><strong>Open the demo →</strong></a> · <a href="https://johnmorrisdotca.github.io/kyogijo-stadiums/docs/">Documentation</a> · <a href="https://johnmorrisdotca.github.io/kyogijo-stadiums/docs/gallery.html">Gallery</a> · <a href="./docs/compare.md">How it compares</a> · <a href="https://johnmorrisdotca.github.io/kyogijo-stadiums/api.html">API reference</a></p>
|
|
15
15
|
|
|
16
|
+
<table align="center">
|
|
17
|
+
<tr>
|
|
18
|
+
<td align="center" valign="top">
|
|
19
|
+
<picture>
|
|
20
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turning-venue-desk-dark.webp">
|
|
21
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turning-venue-desk-light.webp" alt="A real arena turning once round in 3D: Climate Pledge Arena in the outline of its building, two tiers of seats round the rink." width="410">
|
|
22
|
+
</picture>
|
|
23
|
+
<br><em>A real arena, turning: Climate Pledge Arena in the outline of its building (OpenStreetMap).</em>
|
|
24
|
+
</td>
|
|
25
|
+
<td align="center" valign="top">
|
|
26
|
+
<picture>
|
|
27
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turning-hall-desk-dark.webp">
|
|
28
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/turning-hall-desk-light.webp" alt="A tournament layout turning once round in 3D: four table tennis areas on one floor, a surround round each and a scoreboard hung over them." width="410">
|
|
29
|
+
</picture>
|
|
30
|
+
<br><em>A tournament layout, turning: four table tennis areas under one scoreboard.</em>
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
</table>
|
|
34
|
+
|
|
16
35
|
> **Renamed.** Previously `@johnmorrisdotca/kyogijo`; renamed in 0.4.0 to `@johnmorrisdotca/kyogijo-stadiums`. The product is still Kyogijo Stadiums (競技場); only the package and the repository names changed. See the [changelog](./CHANGELOG.md).
|
|
17
36
|
|
|
18
37
|
<table align="center">
|
|
@@ -36,6 +55,43 @@ The surfaces of forty-three sports, from football and curling to the budō and t
|
|
|
36
55
|
|
|
37
56
|
Kyogijo Stadiums draws the places a game is played on, with the score of the game on them: the teams at their ends, the score in the middle, a label for what it was. The surfaces are drawn to scale from the rulebooks: a football field has its hash marks where the rules put them, a ballpark its fence where its published distances put it.
|
|
38
57
|
|
|
58
|
+
## Look at these first
|
|
59
|
+
|
|
60
|
+
<table align="center">
|
|
61
|
+
<tr>
|
|
62
|
+
<td align="center" valign="top">
|
|
63
|
+
<picture>
|
|
64
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/venues-saddledome-3d-desk-dark.webp">
|
|
65
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/venues-saddledome-3d-desk-light.webp" alt="The Scotiabank Saddledome in 3D: two tiers of seats under its saddle roof." width="400">
|
|
66
|
+
</picture>
|
|
67
|
+
<br><strong><a href="./docs/venues.md">Real arenas</a></strong>: the NHL's Western Conference, each in the outline of its building with a plausible bowl of the seats, tiers and roof the sources give; 2D and 3D, with the stands, walls and roof to switch.
|
|
68
|
+
</td>
|
|
69
|
+
<td align="center" valign="top">
|
|
70
|
+
<picture>
|
|
71
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-3d-desk-dark.webp">
|
|
72
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-3d-desk-light.webp" alt="Four table tennis areas on one floor in 3D, with a hung scoreboard." width="400">
|
|
73
|
+
</picture>
|
|
74
|
+
<br><strong><a href="./docs/multi.md">Tournament layouts</a></strong>: judo, table tennis and other areas on one floor, to scale, in a hall or a stadium, flat or in 3D.
|
|
75
|
+
</td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr>
|
|
78
|
+
<td align="center" valign="top">
|
|
79
|
+
<picture>
|
|
80
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-broadcast-3d-desk-dark.webp">
|
|
81
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-broadcast-3d-desk-light.webp" alt="A kata mat in 3D from the broadcast camera, with a board at its side listing each judge." width="400">
|
|
82
|
+
</picture>
|
|
83
|
+
<br><strong><a href="./docs/judging.md">Who judges where</a></strong>: each judo mat's officials by seat, a broadcast view with the officials on a board, and a page to print.
|
|
84
|
+
</td>
|
|
85
|
+
<td align="center" valign="top">
|
|
86
|
+
<picture>
|
|
87
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-3d-desk-dark.webp">
|
|
88
|
+
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-3d-desk-light.webp" alt="An MMA cage in 3D: a mesh fence on a solid platform." width="400">
|
|
89
|
+
</picture>
|
|
90
|
+
<br><strong><a href="./docs/combat.md">The combat sports</a></strong>: an MMA cage, boxing and wrestling rings and mats, flat and in 3D.
|
|
91
|
+
</td>
|
|
92
|
+
</tr>
|
|
93
|
+
</table>
|
|
94
|
+
|
|
39
95
|
## In 30 seconds
|
|
40
96
|
|
|
41
97
|
```sh
|
|
@@ -505,38 +561,6 @@ console.log(layout.needs.length, layout.needs.width);
|
|
|
505
561
|
// 47 19
|
|
506
562
|
```
|
|
507
563
|
|
|
508
|
-
<p align="center">
|
|
509
|
-
<picture>
|
|
510
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-judo-desk-dark.webp">
|
|
511
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-judo-desk-light.webp" alt="Three judo contest areas in a row on one red floor of mats, dressed with a sample event's name, simple emblems and boards." width="640">
|
|
512
|
-
</picture>
|
|
513
|
-
<br><em>Three judo contest areas on one floor of mats: 47 by 19 metres, with sample content.</em>
|
|
514
|
-
</p>
|
|
515
|
-
|
|
516
|
-
<p align="center">
|
|
517
|
-
<picture>
|
|
518
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-desk-dark.webp">
|
|
519
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-desk-light.webp" alt="Four table tennis areas in two rows of two on one blue floor, with sample words and emblems, a hung scoreboard and boards." width="640">
|
|
520
|
-
</picture>
|
|
521
|
-
<br><em>Four table tennis areas under one scoreboard.</em>
|
|
522
|
-
</p>
|
|
523
|
-
|
|
524
|
-
<p align="center">
|
|
525
|
-
<picture>
|
|
526
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-3d-desk-dark.webp">
|
|
527
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-tabletennis-3d-desk-light.webp" alt="Four table tennis areas in 3D: tables on legs, a surround round each, a hung scoreboard." width="640">
|
|
528
|
-
</picture>
|
|
529
|
-
<br><em>The same four in 3D.</em>
|
|
530
|
-
</p>
|
|
531
|
-
|
|
532
|
-
<p align="center">
|
|
533
|
-
<picture>
|
|
534
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-judo-empty-desk-dark.webp">
|
|
535
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/multi-judo-empty-desk-light.webp" alt="The three judo areas with the places for the event's words and marks left empty and dashed." width="640">
|
|
536
|
-
</picture>
|
|
537
|
-
<br><em>Without `sample`: the empty places an organiser fills.</em>
|
|
538
|
-
</p>
|
|
539
|
-
|
|
540
564
|
### Boards over a surface
|
|
541
565
|
|
|
542
566
|
`board` lays a results board, a bout presentation or a medal table, any SVG, over a surface in 2D and 3D, off its middle and never stretched ([boards](./docs/boards.md)).
|
|
@@ -567,23 +591,16 @@ console.log(layout.needs.length, layout.needs.width);
|
|
|
567
591
|
|
|
568
592
|
### The real venues
|
|
569
593
|
|
|
570
|
-
`crowd: { real: true }` draws an NHL arena in its building ([the real venues](./docs/venues.md)).
|
|
594
|
+
`crowd: { real: true }` draws an NHL arena in its building: the outline from OpenStreetMap, the rink lying along the building where it says so, and a plausible bowl of the seats, tiers and roof the sources give. Sixteen arenas so far, the Western Conference's (Pacific and Central Divisions); the Eastern Conference follows ([the real venues](./docs/venues.md)). In 3D the demo's [venues page](https://johnmorrisdotca.github.io/kyogijo-stadiums/venues.html) turns by itself, with the stands, walls, roof, building, markings and labels switched on the view while it turns.
|
|
571
595
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/venues-honda-desk-light.webp" alt="The Honda Center's rink in its building's outline: two tiers of seats and a north arrow." width="640">
|
|
576
|
-
</picture>
|
|
577
|
-
<br><em>The Honda Center.</em>
|
|
578
|
-
</p>
|
|
596
|
+
```ts
|
|
597
|
+
import { drawKyogijo } from "@johnmorrisdotca/kyogijo-stadiums";
|
|
598
|
+
import { planVenue, venueById } from "@johnmorrisdotca/kyogijo-stadiums/venues";
|
|
579
599
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
</picture>
|
|
585
|
-
<br><em>The Saddledome, in 3D.</em>
|
|
586
|
-
</p>
|
|
600
|
+
const svg = drawKyogijo({ sport: "nhl", arena: "climate-pledge-arena", crowd: { real: true } });
|
|
601
|
+
console.log(svg.includes("ky-cr-shell"), planVenue(venueById("climate-pledge-arena")!).total);
|
|
602
|
+
// true 17151
|
|
603
|
+
```
|
|
587
604
|
|
|
588
605
|
### A real stadium, and a district
|
|
589
606
|
|
|
@@ -609,32 +626,8 @@ console.log(layout.needs.length, layout.needs.width);
|
|
|
609
626
|
|
|
610
627
|
`drawJudging` puts each judo mat's officials by seat in the picture and in a chart ([judging](./docs/judging.md)).
|
|
611
628
|
|
|
612
|
-
<p align="center">
|
|
613
|
-
<picture>
|
|
614
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-3d-desk-dark.webp">
|
|
615
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-3d-desk-light.webp" alt="A kata area's judges' table in 3D, numbered badges, and the chart." width="640">
|
|
616
|
-
</picture>
|
|
617
|
-
<br><em>Judges, in 3D.</em>
|
|
618
|
-
</p>
|
|
619
|
-
|
|
620
629
|
The broadcast view puts the mat large, with the officials on a board at its side; `judgingPrint` prints one mat to an A4 or US letter page.
|
|
621
630
|
|
|
622
|
-
<p align="center">
|
|
623
|
-
<picture>
|
|
624
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-broadcast-3d-desk-dark.webp">
|
|
625
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-broadcast-3d-desk-light.webp" alt="A kata mat in 3D from the Broadcast camera, with a dark board at its side listing each judge's number, name and ID." width="640">
|
|
626
|
-
</picture>
|
|
627
|
-
<br><em>The broadcast view.</em>
|
|
628
|
-
</p>
|
|
629
|
-
|
|
630
|
-
<p align="center">
|
|
631
|
-
<picture>
|
|
632
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-print-a4-desk-dark.webp">
|
|
633
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/judging-print-a4-desk-light.webp" alt="An A4 page with the plan of one kata mat and the chart of its five judges under it." width="640">
|
|
634
|
-
</picture>
|
|
635
|
-
<br><em>One mat to an A4 page.</em>
|
|
636
|
-
</p>
|
|
637
|
-
|
|
638
631
|
### A table tennis area
|
|
639
632
|
|
|
640
633
|
A table in the ITTF's playing area, 14 m by 7 m, with surrounds and chairs ([courts](./docs/courts.md#the-table-tennis-playing-area)).
|
|
@@ -679,46 +672,6 @@ A table in the ITTF's playing area, 14 m by 7 m, with surrounds and chairs ([cou
|
|
|
679
672
|
|
|
680
673
|
An MMA cage, rings and wrestling mats ([the combat sports page](./docs/combat.md)).
|
|
681
674
|
|
|
682
|
-
<p align="center">
|
|
683
|
-
<picture>
|
|
684
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-desk-dark.webp">
|
|
685
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-desk-light.webp" alt="An MMA cage from above with a score" width="660">
|
|
686
|
-
</picture>
|
|
687
|
-
<br><em>With a score.</em>
|
|
688
|
-
</p>
|
|
689
|
-
|
|
690
|
-
<p align="center">
|
|
691
|
-
<picture>
|
|
692
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-3d-desk-dark.webp">
|
|
693
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/mma-cage-3d-desk-light.webp" alt="The cage in 3D: a mesh fence on a solid platform" width="660">
|
|
694
|
-
</picture>
|
|
695
|
-
<br><em>The cage in 3D.</em>
|
|
696
|
-
</p>
|
|
697
|
-
|
|
698
|
-
<p align="center">
|
|
699
|
-
<picture>
|
|
700
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/boxing-ring-3d-desk-dark.webp">
|
|
701
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/boxing-ring-3d-desk-light.webp" alt="The boxing ring in 3D: coloured corner posts, ropes and steps" width="660">
|
|
702
|
-
</picture>
|
|
703
|
-
<br><em>The ring in 3D.</em>
|
|
704
|
-
</p>
|
|
705
|
-
|
|
706
|
-
<p align="center">
|
|
707
|
-
<picture>
|
|
708
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/wrestling-mat-3d-desk-dark.webp">
|
|
709
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/wrestling-mat-3d-desk-light.webp" alt="The UWW's wrestling mat in 3D on its platform" width="660">
|
|
710
|
-
</picture>
|
|
711
|
-
<br><em>The UWW's mat in 3D.</em>
|
|
712
|
-
</p>
|
|
713
|
-
|
|
714
|
-
<p align="center">
|
|
715
|
-
<picture>
|
|
716
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/prowrestling-ring-3d-desk-dark.webp">
|
|
717
|
-
<img src="https://raw.githubusercontent.com/johnmorrisdotca/kyogijo-stadiums/main/docs/images/prowrestling-ring-3d-desk-light.webp" alt="A professional wrestling ring in 3D with three ropes" width="660">
|
|
718
|
-
</picture>
|
|
719
|
-
<br><em>A wrestling ring in 3D.</em>
|
|
720
|
-
</p>
|
|
721
|
-
|
|
722
675
|
### The element in a page
|
|
723
676
|
|
|
724
677
|
```html
|
|
@@ -815,7 +768,7 @@ English and Japanese: the title, the description and the statuses of a drawing,
|
|
|
815
768
|
Not here yet, each welcome as an [issue](https://github.com/johnmorrisdotca/kyogijo-stadiums/issues):
|
|
816
769
|
|
|
817
770
|
- **More surfaces**: the FIBA and college courts, the international rink, rugby pitches, soccer's beach and street formats.
|
|
818
|
-
- **More real venues**: the
|
|
771
|
+
- **More real venues**: the Eastern Conference's arenas, then the NBA's, NFL's and MLB's, and more districts.
|
|
819
772
|
- **More parks of the past**: the 19th-century grounds, and the parks whose articles give no distances yet.
|
|
820
773
|
- **More charts on data layers**: a formation chart, a pass sonar chart and a Voronoi chart of their own (the layers exist; see [team shape](./docs/team-shape.md)).
|
|
821
774
|
- **Football in a different standard**: the college and high-school hash marks.
|
package/dist/district.d.ts
CHANGED
|
@@ -112,7 +112,7 @@ export declare const DISTRICT_MARGIN: Readonly<Record<DistrictMode, number>>;
|
|
|
112
112
|
* import { planDistrict } from "@johnmorrisdotca/kyogijo-stadiums/district";
|
|
113
113
|
* const plan = planDistrict({ venues: ["bc-place", "rogers-arena"] });
|
|
114
114
|
* console.log(plan.mode, plan.members.length, Math.round(plan.between[0].metres));
|
|
115
|
-
* // neighbours 2
|
|
115
|
+
* // neighbours 2 264
|
|
116
116
|
* ```
|
|
117
117
|
*/
|
|
118
118
|
export declare function planDistrict(options: DistrictOptions): DistrictPlan;
|
package/dist/district.js
CHANGED
|
@@ -97,7 +97,7 @@ const haversine = (a, b) => {
|
|
|
97
97
|
* import { planDistrict } from "@johnmorrisdotca/kyogijo-stadiums/district";
|
|
98
98
|
* const plan = planDistrict({ venues: ["bc-place", "rogers-arena"] });
|
|
99
99
|
* console.log(plan.mode, plan.members.length, Math.round(plan.between[0].metres));
|
|
100
|
-
* // neighbours 2
|
|
100
|
+
* // neighbours 2 264
|
|
101
101
|
* ```
|
|
102
102
|
*/
|
|
103
103
|
export function planDistrict(options) {
|
package/dist/index.d.ts
CHANGED
|
@@ -63,8 +63,8 @@ export { ERA_CURRENT, ERA_SOURCES, ERA_SPORTS, eraChanges, eraRange, eraStates,
|
|
|
63
63
|
export type { EraChange, EraRules, EraRulesOf, EraSource, EraSpan, EraSport, FootballRules, MlbRules, NbaRules, NhlRules } from "./eras.ts";
|
|
64
64
|
export { ARENA_IDS, ARENAS, arenaById, arenaByName, arenaByWikidata, arenaCourtIn, arenaNameIn, arenaOfficialName, arenaRinkIn, arenaSourceUrl, arenasByName } from "./arenas.ts";
|
|
65
65
|
export type { Arena, ArenaCapacity, ArenaData, ArenaName, ArenaSize, ArenaSource } from "./arenas.ts";
|
|
66
|
-
export { VENUE_ATTRIBUTION, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn } from "./venues.ts";
|
|
67
|
-
export type { RealVenue, RealVenueData, VenueBasis, VenueDivision, VenueOrientation, VenueOsm, VenuePlan, VenueRoof } from "./venues.ts";
|
|
66
|
+
export { VENUE_ATTRIBUTION, VENUE_CONFERENCES, VENUE_DIVISIONS, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, conferenceOf, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn, venuesInConference } from "./venues.ts";
|
|
67
|
+
export type { RealVenue, RealVenueData, VenueBasis, VenueConference, VenueDivision, VenueOrientation, VenueOsm, VenuePlan, VenueRoof } from "./venues.ts";
|
|
68
68
|
export { GROUND_IDS, GROUNDS, groundById, groundByName, groundByWikidata, groundNameIn, groundOfficialName, groundSourceUrl, groundsByName, groundsHosting } from "./grounds.ts";
|
|
69
69
|
export type { Ground, GroundCompetition, GroundData, GroundName, GroundSource, GroundTournament } from "./grounds.ts";
|
|
70
70
|
export { AFL_GROUNDS, FAMILY_OF, LEAGUES, LEAGUE_SOURCES, VARIANTS, chooseLeague, hasHistory, leagueAt, leagueById, leagueChanges, leagueFigures, leagueIds, leagueSeason, leagueSize } from "./leagues.ts";
|
package/dist/index.js
CHANGED
|
@@ -39,7 +39,7 @@ export { PARKS, PARK_IDS, fenceFor, parkById, parkByName, parkByWikidata, parkNa
|
|
|
39
39
|
export { officialName, plainName } from "./names.js";
|
|
40
40
|
export { ERA_CURRENT, ERA_SOURCES, ERA_SPORTS, eraChanges, eraRange, eraStates, footballIn, rulesFor, seasonLabel } from "./eras.js";
|
|
41
41
|
export { ARENA_IDS, ARENAS, arenaById, arenaByName, arenaByWikidata, arenaCourtIn, arenaNameIn, arenaOfficialName, arenaRinkIn, arenaSourceUrl, arenasByName } from "./arenas.js";
|
|
42
|
-
export { VENUE_ATTRIBUTION, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn } from "./venues.js";
|
|
42
|
+
export { VENUE_ATTRIBUTION, VENUE_CONFERENCES, VENUE_DIVISIONS, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, conferenceOf, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn, venuesInConference } from "./venues.js";
|
|
43
43
|
export { GROUND_IDS, GROUNDS, groundById, groundByName, groundByWikidata, groundNameIn, groundOfficialName, groundSourceUrl, groundsByName, groundsHosting } from "./grounds.js";
|
|
44
44
|
export { AFL_GROUNDS, FAMILY_OF, LEAGUES, LEAGUE_SOURCES, VARIANTS, chooseLeague, hasHistory, leagueAt, leagueById, leagueChanges, leagueFigures, leagueIds, leagueSeason, leagueSize } from "./leagues.js";
|
|
45
45
|
export { SURFACE_UNITS, UNITS, convertLength, isUnit } from "./units.js";
|
package/dist/turn.dom.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type TurnPreset, type TurnView } from "./turn.camera.ts";
|
|
2
2
|
import { type TurnModel, type TurnSettings } from "./turn.model.ts";
|
|
3
3
|
import type { ScoreOptions, SurfaceOptions } from "./types.ts";
|
|
4
|
+
import type { VenueSettings } from "./venue.ts";
|
|
4
5
|
/** What `mountKyogijoTurn` gives back. `O` is what `update` takes: the options of a drawing, or (for `mountMultiTurn`) of a tournament layout. */
|
|
5
6
|
export interface KyogijoTurn<O = SurfaceOptions | ScoreOptions> {
|
|
6
7
|
/** `3d`, or `flat` where the browser cannot draw the 3D view (or there is nothing to turn): the flat drawing is shown and the rest of this does nothing. */
|
|
@@ -13,8 +14,13 @@ export interface KyogijoTurn<O = SurfaceOptions | ScoreOptions> {
|
|
|
13
14
|
preset(name: TurnPreset): void;
|
|
14
15
|
/** Back to the opening view. */
|
|
15
16
|
reset(): void;
|
|
16
|
-
/**
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Draw again with new options (a score that moved, a look that changed), keeping the view and the auto-turn: the view goes on turning. `change` alters what the venue's walls and roof stand on (the settings `venue` was
|
|
19
|
+
* mounted with, the parts given), so that a page can switch them on and off without mounting the view again.
|
|
20
|
+
*/
|
|
21
|
+
update(options: O, change?: {
|
|
22
|
+
venue?: VenueSettings;
|
|
23
|
+
}): void;
|
|
18
24
|
/** Whether the auto-turn is running. */
|
|
19
25
|
readonly playing: boolean;
|
|
20
26
|
/** Start the auto-turn, a slow turn of the whole view. It gives whether it is running (a surface that cannot turn gives `false`). Nothing turns by itself until this, the Play button or Space starts it, unless `autoPlay` asked. */
|
package/dist/turn.dom.js
CHANGED
|
@@ -40,6 +40,8 @@ export function mountKyogijoTurn(host, options, settings = {}) {
|
|
|
40
40
|
export function mountTurn(host, options, settings, build) {
|
|
41
41
|
const doc = host.ownerDocument;
|
|
42
42
|
const win = doc.defaultView;
|
|
43
|
+
/** The venue's settings as they are now: the mounted ones, altered by `update`. */
|
|
44
|
+
let venue = settings.venue;
|
|
43
45
|
let model = build(options, settings);
|
|
44
46
|
/** What names the four viewpoints: the model's own table (a tournament layout has one), else the sport's. */
|
|
45
47
|
const sport = () => model.presets ?? model.options.sport;
|
|
@@ -61,8 +63,10 @@ export function mountTurn(host, options, settings, build) {
|
|
|
61
63
|
play: () => false,
|
|
62
64
|
pause: () => undefined,
|
|
63
65
|
togglePlay: () => false,
|
|
64
|
-
update: (next) => {
|
|
65
|
-
|
|
66
|
+
update: (next, change) => {
|
|
67
|
+
if (change?.venue !== undefined)
|
|
68
|
+
venue = { ...(typeof venue === "object" ? venue : {}), ...change.venue };
|
|
69
|
+
model = build(next, { ...settings, id: settings.id ?? model.id, venue });
|
|
66
70
|
flat(next);
|
|
67
71
|
},
|
|
68
72
|
svg: () => (alive ? host.querySelector("svg.kyogijo") : null),
|
|
@@ -436,10 +440,12 @@ export function mountTurn(host, options, settings, build) {
|
|
|
436
440
|
},
|
|
437
441
|
preset: toPreset,
|
|
438
442
|
reset: toOpening,
|
|
439
|
-
update(next) {
|
|
443
|
+
update(next, change) {
|
|
440
444
|
if (!alive)
|
|
441
445
|
return;
|
|
442
|
-
|
|
446
|
+
if (change?.venue !== undefined)
|
|
447
|
+
venue = { ...(typeof venue === "object" ? venue : {}), ...change.venue };
|
|
448
|
+
model = build(next, { ...settings, id: settings.id ?? model.id, venue, preset: undefined, view });
|
|
443
449
|
view = clampView(view);
|
|
444
450
|
opening = openingView(settings, sport());
|
|
445
451
|
const layout = layoutOf(model, shown, stage.clientWidth || 960, stage.clientHeight || 600, settings.lens);
|
package/dist/venue.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface VenueSettings {
|
|
|
8
8
|
roof?: boolean;
|
|
9
9
|
/** A retractable roof (a real venue's: BC Place's) drawn open, the fabric gathered into its pod, instead of closed over the opening. Closed by default. */
|
|
10
10
|
roofOpen?: boolean;
|
|
11
|
+
/** The walls of a real venue's building (`crowd: { real: true }`), raised on its outline: they follow `roof` where left out (a roof and walls together, as before), and `walls: true` with `roof` off raises the walls alone, `roof: true` with `walls: false` the roof alone. */
|
|
12
|
+
walls?: boolean;
|
|
11
13
|
/** How finely the curves are cut: `low` a facet to each corner, `auto` (the default) three, `high` six; an oval is 12, 28 or 56 facets round. */
|
|
12
14
|
detail?: Cut;
|
|
13
15
|
}
|
package/dist/venue.js
CHANGED
|
@@ -150,8 +150,9 @@ export function standsVenueOf(stands, crowd, o, v, lift) {
|
|
|
150
150
|
if (wallSeats.length > 0)
|
|
151
151
|
items.push({ id: "wall-seats", kind: "wall-seats", at: centre, height: topOf(wallSeats), planes: wallSeats });
|
|
152
152
|
// The roof: a canopy over the back of the top tier, or a lid over it in a hall. A real venue has its own: the walls of its building and a roof of its kind over them.
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
const [walls, roof] = [v.walls ?? v.roof === true, v.roof === true];
|
|
154
|
+
if (stands.real !== undefined && (walls || roof))
|
|
155
|
+
items.push(...realBuilding(stands.real, topRing(stands), centre, lift, ARC_STEPS[cut].oval * 2, v.roofOpen === true, { walls, roof }));
|
|
155
156
|
const top = v.roof === true && crowd.roof && stands.real === undefined ? topRing(stands) : undefined;
|
|
156
157
|
if (top !== undefined) {
|
|
157
158
|
const lid = INDOOR.includes(String(o.sport));
|
package/dist/venue.real.d.ts
CHANGED
|
@@ -8,10 +8,13 @@ export declare function saddleAt(real: Pick<RealShell, "footprint">, [x, y]: Pt)
|
|
|
8
8
|
/** The height of the roof over a point of the building's edge, above the surface, in feet. */
|
|
9
9
|
export declare const roofAt: (real: RealShell, p: Pt) => number;
|
|
10
10
|
/**
|
|
11
|
-
* The walls and the roof of a real venue. The hall is the building's outline cut to the bowl's wall and a margin (`RealShell.hall`): its rim is where a ray from the middle meets the one or the other first, in `steps`
|
|
11
|
+
* The walls and the roof of a real venue (`parts` says which are made). The hall is the building's outline cut to the bowl's wall and a margin (`RealShell.hall`): its rim is where a ray from the middle meets the one or the other first, in `steps`
|
|
12
12
|
* rays. A wall stands on each stretch of the rim, up to the roof's height over it; the roof is a band from the rim in to the inner edge of the top tier (the middle stays open, as the 3D view's roofs are).
|
|
13
13
|
*/
|
|
14
|
-
export declare function realBuilding(real: RealShell, top: StandRing | undefined, centre: readonly [number, number], lift: number, steps: number, open?: boolean
|
|
14
|
+
export declare function realBuilding(real: RealShell, top: StandRing | undefined, centre: readonly [number, number], lift: number, steps: number, open?: boolean, parts?: {
|
|
15
|
+
walls: boolean;
|
|
16
|
+
roof: boolean;
|
|
17
|
+
}): Items;
|
|
15
18
|
/** The pod in the middle of a cable roof's opening, as a share of the opening's size, and how thick it is, in feet (ours: the article says the fabric gathers into a pod above the video board, not how large it is). */
|
|
16
19
|
export declare const POD: {
|
|
17
20
|
readonly share: 0.24;
|
package/dist/venue.real.js
CHANGED
|
@@ -52,10 +52,10 @@ function slopeThrough(points) {
|
|
|
52
52
|
return { x0: mx, y0: my, z0: mz, gx, gy };
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* The walls and the roof of a real venue. The hall is the building's outline cut to the bowl's wall and a margin (`RealShell.hall`): its rim is where a ray from the middle meets the one or the other first, in `steps`
|
|
55
|
+
* The walls and the roof of a real venue (`parts` says which are made). The hall is the building's outline cut to the bowl's wall and a margin (`RealShell.hall`): its rim is where a ray from the middle meets the one or the other first, in `steps`
|
|
56
56
|
* rays. A wall stands on each stretch of the rim, up to the roof's height over it; the roof is a band from the rim in to the inner edge of the top tier (the middle stays open, as the 3D view's roofs are).
|
|
57
57
|
*/
|
|
58
|
-
export function realBuilding(real, top, centre, lift, steps, open = false) {
|
|
58
|
+
export function realBuilding(real, top, centre, lift, steps, open = false, parts = { walls: true, roof: true }) {
|
|
59
59
|
const items = [];
|
|
60
60
|
const c = [centre[0], centre[1]];
|
|
61
61
|
const rim = Array.from({ length: steps }, (_, k) => {
|
|
@@ -73,10 +73,10 @@ export function realBuilding(real, top, centre, lift, steps, open = false) {
|
|
|
73
73
|
const high = lift + roofAt(real, [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]);
|
|
74
74
|
planes.push({ ...shy(wall(`shell-${i}`, "wall", a[0], a[1], b[0], b[1], 0, high, `<rect class="u-shell" width="${n(long)}" height="${n(high)}"/>`), centre), fadeTo: 0.02 });
|
|
75
75
|
});
|
|
76
|
-
if (planes.length > 0)
|
|
76
|
+
if (parts.walls && planes.length > 0)
|
|
77
77
|
items.push({ id: "shell", kind: "walls", at: centre, height: Math.max(...planes.map((p) => p.o[2])), planes });
|
|
78
78
|
const crown = real.roof === "cable" ? real.crown : undefined;
|
|
79
|
-
if (top?.hole == null && crown === undefined)
|
|
79
|
+
if (!parts.roof || (top?.hole == null && crown === undefined))
|
|
80
80
|
return items;
|
|
81
81
|
const roof = [];
|
|
82
82
|
// A cable roof rises from the rim of the hall to the opening over the surface; any other is a band from the rim in to the inner edge of the top tier.
|
package/dist/venues-entry.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { VENUE_ATTRIBUTION, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn } from "./venues.ts";
|
|
2
|
-
export type { RealVenue, RealVenueData, VenueBasis, VenueDivision, VenueOrientation, VenueOsm, VenuePlan, VenueRoof } from "./venues.ts";
|
|
1
|
+
export { VENUE_ATTRIBUTION, VENUE_CONFERENCES, VENUE_DIVISIONS, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, conferenceOf, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn, venuesInConference } from "./venues.ts";
|
|
2
|
+
export type { RealVenue, RealVenueData, VenueBasis, VenueConference, VenueDivision, VenueOrientation, VenueOsm, VenuePlan, VenueRoof } from "./venues.ts";
|
package/dist/venues-entry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// The real venues of the NHL's arenas: the outline of each building and the way its rink lies (OpenStreetMap, ODbL 1.0) and a plausible bowl from the seats, tiers and roof the sources give (Wikidata, Wikipedia).
|
|
2
|
-
export { VENUE_ATTRIBUTION, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn } from "./venues.js";
|
|
2
|
+
export { VENUE_ATTRIBUTION, VENUE_CONFERENCES, VENUE_DIVISIONS, VENUE_IDS, VENUES, arenaOfVenue, bowlInside, conferenceOf, planVenue, venueBowl, venueById, venueByWikidata, venueOrientation, venueRink, venuesIn, venuesInConference } from "./venues.js";
|
package/dist/venues.d.ts
CHANGED
|
@@ -6,8 +6,15 @@ export { VENUE_ATTRIBUTION };
|
|
|
6
6
|
export type VenueBasis = "documented" | "plausible";
|
|
7
7
|
/** The kinds of roof the venues have: `fixed` is a lid over the bowl, `saddle` a roof that rises at the two ends and falls at the two sides (the Scotiabank Saddledome's). */
|
|
8
8
|
export type VenueRoof = "fixed" | "saddle";
|
|
9
|
-
/** The NHL's divisions
|
|
10
|
-
export
|
|
9
|
+
/** The NHL's divisions, in the order of the league's own listing: the Western Conference's two, then the Eastern's. A division none of whose arenas has a venue yet has no venues in `venuesIn`. */
|
|
10
|
+
export declare const VENUE_DIVISIONS: readonly ["pacific", "central", "atlantic", "metropolitan"];
|
|
11
|
+
export type VenueDivision = (typeof VENUE_DIVISIONS)[number];
|
|
12
|
+
/** The NHL's two conferences, and the divisions of each. */
|
|
13
|
+
export declare const VENUE_CONFERENCES: {
|
|
14
|
+
readonly western: readonly ["pacific", "central"];
|
|
15
|
+
readonly eastern: readonly ["atlantic", "metropolitan"];
|
|
16
|
+
};
|
|
17
|
+
export type VenueConference = keyof typeof VENUE_CONFERENCES;
|
|
11
18
|
/** The facts of a venue: the seats and the number of seating levels and the kind of roof, each with what a source says. No text of an article is kept. */
|
|
12
19
|
export interface RealVenueData {
|
|
13
20
|
/** The key of the arena in `ARENAS`: `honda-center`. */
|
|
@@ -82,7 +89,7 @@ export interface VenueOrientation {
|
|
|
82
89
|
basis: "mapped" | "building" | "none";
|
|
83
90
|
north: number;
|
|
84
91
|
}
|
|
85
|
-
/** The venues by key:
|
|
92
|
+
/** The venues by key: the arenas of the NHL's divisions that have been drawn, with their facts and their outlines. */
|
|
86
93
|
export declare const VENUES: Readonly<Record<string, RealVenue>>;
|
|
87
94
|
/** The keys of `VENUES`, in the order of the data. */
|
|
88
95
|
export declare const VENUE_IDS: readonly string[];
|
|
@@ -92,6 +99,10 @@ export declare const venueById: (id: string | undefined) => RealVenue | undefine
|
|
|
92
99
|
export declare const venueByWikidata: (wikidata: string | undefined) => RealVenue | undefined;
|
|
93
100
|
/** The venues of a division of the NHL, in the order of the data. */
|
|
94
101
|
export declare const venuesIn: (division: VenueDivision) => RealVenue[];
|
|
102
|
+
/** The conference a division of the NHL is in. */
|
|
103
|
+
export declare const conferenceOf: (division: VenueDivision) => VenueConference;
|
|
104
|
+
/** The venues of a conference of the NHL, division by division, in the order of the data. */
|
|
105
|
+
export declare const venuesInConference: (conference: VenueConference) => RealVenue[];
|
|
95
106
|
/** The arena a venue is of. */
|
|
96
107
|
export declare const arenaOfVenue: (venue: RealVenue) => Arena;
|
|
97
108
|
/** How the rink lies in a venue's building (see `VenueOsm.axis`). */
|
package/dist/venues.data.js
CHANGED
|
@@ -71,4 +71,76 @@ export const VENUE_DATA = [
|
|
|
71
71
|
"tiers": { "count": 2, "basis": "plausible", "read": "no source says how many seating levels there are: two bowls are drawn" },
|
|
72
72
|
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
73
73
|
},
|
|
74
|
+
{
|
|
75
|
+
"id": "united-center",
|
|
76
|
+
"wikidata": "Q639975",
|
|
77
|
+
"division": "central",
|
|
78
|
+
"en": { "title": "United Center", "revision": 1380672233 },
|
|
79
|
+
"seats": { "hockey": 19717, "source": "wikipedia", "wikidata": 23500, "read": "the article's seating line for ice hockey, 19,717 (22,428 with standing room), which the infobox gives too; Wikidata's one capacity (23,500) is the concert one" },
|
|
80
|
+
"tiers": { "count": 2, "basis": "documented", "read": "the article tells of the 300 level seating bowl and of three levels of suites (down from 216 sky-boxes to 169 executive suites after 2009-10): a lower bowl and the 300 level, with the suites between as walks" },
|
|
81
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise; the article says the building is 140 feet tall, of concrete and steel" },
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "ball-arena",
|
|
85
|
+
"wikidata": "Q795470",
|
|
86
|
+
"division": "central",
|
|
87
|
+
"en": { "title": "Ball Arena", "revision": 1379560431 },
|
|
88
|
+
"seats": { "hockey": 17809, "source": "wikipedia", "wikidata": 19155, "read": "the infobox's figure for hockey (given with lacrosse), 17,809; Wikidata's capacity without a sport is 19,155 and its other (17,417) is for futsal" },
|
|
89
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source says how many seating levels there are: two bowls are drawn" },
|
|
90
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "american-airlines-center",
|
|
94
|
+
"wikidata": "Q463345",
|
|
95
|
+
"division": "central",
|
|
96
|
+
"en": { "title": "American Airlines Center", "revision": 1379833787 },
|
|
97
|
+
"seats": { "hockey": 18532, "source": "wikipedia", "wikidata": 19200, "read": "the infobox's figure for ice hockey, 18,532 (19,323 with standing room); Wikidata's one capacity (19,200) is the basketball one" },
|
|
98
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source says how many seating levels there are: two bowls are drawn; the article speaks of retractable seating, which the bowl does not draw" },
|
|
99
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise; the article says the roof looks like a Quonset hut, a barrel vault, which the one kind of fixed roof does not draw" },
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "grand-casino-arena",
|
|
103
|
+
"wikidata": "Q1421388",
|
|
104
|
+
"division": "central",
|
|
105
|
+
"en": { "title": "Grand Casino Arena", "revision": 1379407082 },
|
|
106
|
+
"seats": { "hockey": 17954, "source": "wikidata", "wikidata": 17954, "read": "Wikidata's capacity for ice hockey from 2012 (P1083 with P641 ice hockey and P580 2012), the later of its two (18,064 from 2000); the article's lede and infobox give 17,954 too" },
|
|
107
|
+
"tiers": { "count": 3, "basis": "documented", "read": "the article says the arena has four spectator levels, one of suites and three for general seating: three seating bowls, with the suite level as a walk between them" },
|
|
108
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "bridgestone-arena",
|
|
112
|
+
"wikidata": "Q302869",
|
|
113
|
+
"division": "central",
|
|
114
|
+
"en": { "title": "Bridgestone Arena", "revision": 1380457078 },
|
|
115
|
+
"seats": { "hockey": 17510, "source": "wikidata", "wikidata": 17510, "read": "Wikidata's capacity for ice hockey (P1083 with P641 ice hockey); the article's own line gives 17,159, 2.0 percent fewer" },
|
|
116
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source says how many seating levels there are everywhere in the building: two bowls are drawn; the article speaks of upper-level seats and, at the south end only, of no mid-level seating and one level of suites" },
|
|
117
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise; the article speaks of two round roof support columns at the south end, which are not drawn" },
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "enterprise-center",
|
|
121
|
+
"wikidata": "Q1067700",
|
|
122
|
+
"division": "central",
|
|
123
|
+
"en": { "title": "Enterprise Center", "revision": 1372086380 },
|
|
124
|
+
"seats": { "hockey": 18096, "source": "wikipedia", "wikidata": 18400, "read": "the infobox's figure for ice hockey, 18,096, which the article's first sentence gives too; Wikidata's one capacity (18,400) is not for hockey" },
|
|
125
|
+
"tiers": { "count": 2, "basis": "documented", "read": "the article tells of the replacement of all upper-tier seats and of the lower-tier seats in the 2017 to 2019 renovation: two seating tiers" },
|
|
126
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "delta-center",
|
|
130
|
+
"wikidata": "Q82294",
|
|
131
|
+
"division": "central",
|
|
132
|
+
"en": { "title": "Delta Center", "revision": 1379043310 },
|
|
133
|
+
"seats": { "hockey": 16020, "source": "wikipedia", "wikidata": 19911, "read": "the infobox's figure for ice hockey, 16,020, which the article's lede gives as the most for ice hockey; Wikidata's one capacity (19,911) is not for hockey" },
|
|
134
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source says how many seating levels there are: two bowls are drawn; the article speaks of a lower bowl rebuilt in 2025 and of terrace-style ledges" },
|
|
135
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "canada-life-centre",
|
|
139
|
+
"wikidata": "Q656928",
|
|
140
|
+
"division": "central",
|
|
141
|
+
"en": { "title": "Canada Life Centre", "revision": 1379717047 },
|
|
142
|
+
"seats": { "hockey": 15225, "source": "wikipedia", "wikidata": 15004, "read": "the article's seating capacity for hockey games, 15,225, which the infobox gives as the top of 8,812 to 15,225; Wikidata's one capacity (15,004) is older, before 278 premium seats were added to the upper level in 2015" },
|
|
143
|
+
"tiers": { "count": 2, "basis": "documented", "lowerShare": 0.579, "read": "the article says the lower bowl holds 8,812 and that premium seats were added to the upper level: two seating levels, the lower with 8,812 of the 15,225" },
|
|
144
|
+
"roof": { "kind": "fixed", "basis": "plausible", "read": "an indoor arena: a fixed roof, as nothing says otherwise" },
|
|
145
|
+
},
|
|
74
146
|
];
|
package/dist/venues.geo.d.ts
CHANGED
|
@@ -5,6 +5,28 @@ export type LonLat = readonly [number, number];
|
|
|
5
5
|
export declare function metresFrom(origin: LonLat, ring: readonly LonLat[]): Pt[];
|
|
6
6
|
/** The inverse of `metresFrom`: a point given as east and north metres from `origin`, in degrees. */
|
|
7
7
|
export declare function lonLatFrom(origin: LonLat, [east, north]: Pt): LonLat;
|
|
8
|
+
/** A point as OpenStreetMap's Overpass API returns it. */
|
|
9
|
+
export interface OsmPoint {
|
|
10
|
+
lat: number;
|
|
11
|
+
lon: number;
|
|
12
|
+
}
|
|
13
|
+
/** An element as Overpass returns it with its geometry (`out geom`): a way's points, or a relation's members, each with theirs. */
|
|
14
|
+
export interface OsmElement {
|
|
15
|
+
type: string;
|
|
16
|
+
id: number;
|
|
17
|
+
geometry?: readonly OsmPoint[];
|
|
18
|
+
members?: readonly {
|
|
19
|
+
type: string;
|
|
20
|
+
ref: number;
|
|
21
|
+
role: string;
|
|
22
|
+
geometry?: readonly OsmPoint[];
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The closed outline an OpenStreetMap element is, as its points with the first repeated at the end, or `undefined`: a closed way is its own; a multipolygon relation is its outer members joined end to end into one
|
|
27
|
+
* ring (a building drawn in two or more ways); a relation with two outer rings or an outer way that does not close is not an outline (the caller says what rule it needs). Inner members are courtyards and are left out.
|
|
28
|
+
*/
|
|
29
|
+
export declare function outerRingOf(element: OsmElement): OsmPoint[] | undefined;
|
|
8
30
|
/** The mean of a ring's longitudes and latitudes: a point to measure from. */
|
|
9
31
|
export declare const middleOf: (ring: readonly LonLat[]) => LonLat;
|
|
10
32
|
/** The area of a polygon, unsigned. */
|
package/dist/venues.geo.js
CHANGED
|
@@ -9,6 +9,34 @@ export function metresFrom(origin, ring) {
|
|
|
9
9
|
export function lonLatFrom(origin, [east, north]) {
|
|
10
10
|
return [origin[0] + east / (RAD * EARTH * Math.cos(origin[1] * RAD)), origin[1] + north / (RAD * EARTH)];
|
|
11
11
|
}
|
|
12
|
+
const same = (a, b) => a.lat === b.lat && a.lon === b.lon;
|
|
13
|
+
/**
|
|
14
|
+
* The closed outline an OpenStreetMap element is, as its points with the first repeated at the end, or `undefined`: a closed way is its own; a multipolygon relation is its outer members joined end to end into one
|
|
15
|
+
* ring (a building drawn in two or more ways); a relation with two outer rings or an outer way that does not close is not an outline (the caller says what rule it needs). Inner members are courtyards and are left out.
|
|
16
|
+
*/
|
|
17
|
+
export function outerRingOf(element) {
|
|
18
|
+
if (element.type === "way") {
|
|
19
|
+
const g = element.geometry;
|
|
20
|
+
return g !== undefined && g.length > 3 && same(g[0], g[g.length - 1]) ? [...g] : undefined;
|
|
21
|
+
}
|
|
22
|
+
if (element.type !== "relation" || element.members === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
const parts = element.members.filter((m) => m.type === "way" && m.role === "outer" && m.geometry !== undefined && m.geometry.length > 1).map((m) => [...m.geometry]);
|
|
25
|
+
if (parts.length === 0)
|
|
26
|
+
return undefined;
|
|
27
|
+
const ring = parts.shift();
|
|
28
|
+
while (!same(ring[0], ring[ring.length - 1]) && parts.length > 0) {
|
|
29
|
+
const tail = ring[ring.length - 1];
|
|
30
|
+
const next = parts.findIndex((part) => same(part[0], tail) || same(part[part.length - 1], tail));
|
|
31
|
+
if (next < 0)
|
|
32
|
+
return undefined;
|
|
33
|
+
const [part] = parts.splice(next, 1);
|
|
34
|
+
if (!same(part[0], tail))
|
|
35
|
+
part.reverse();
|
|
36
|
+
ring.push(...part.slice(1));
|
|
37
|
+
}
|
|
38
|
+
return parts.length === 0 && ring.length > 3 && same(ring[0], ring[ring.length - 1]) ? ring : undefined;
|
|
39
|
+
}
|
|
12
40
|
/** The mean of a ring's longitudes and latitudes: a point to measure from. */
|
|
13
41
|
export const middleOf = (ring) => [ring.reduce((s, p) => s + p[0], 0) / ring.length, ring.reduce((s, p) => s + p[1], 0) / ring.length];
|
|
14
42
|
/** The area of a polygon, unsigned. */
|
package/dist/venues.js
CHANGED
|
@@ -9,7 +9,11 @@ import { boxOf, edgeDistance, inside, metresFrom, middleOf, northOn, turnedTo }
|
|
|
9
9
|
import { VENUE_DATA } from "./venues.data.js";
|
|
10
10
|
import { VENUE_ATTRIBUTION, VENUE_OSM } from "./venues.osm.data.js";
|
|
11
11
|
export { VENUE_ATTRIBUTION };
|
|
12
|
-
/** The
|
|
12
|
+
/** The NHL's divisions, in the order of the league's own listing: the Western Conference's two, then the Eastern's. A division none of whose arenas has a venue yet has no venues in `venuesIn`. */
|
|
13
|
+
export const VENUE_DIVISIONS = ["pacific", "central", "atlantic", "metropolitan"];
|
|
14
|
+
/** The NHL's two conferences, and the divisions of each. */
|
|
15
|
+
export const VENUE_CONFERENCES = { western: ["pacific", "central"], eastern: ["atlantic", "metropolitan"] };
|
|
16
|
+
/** The venues by key: the arenas of the NHL's divisions that have been drawn, with their facts and their outlines. */
|
|
13
17
|
export const VENUES = Object.freeze(Object.fromEntries(VENUE_DATA.map((data) => [data.id, Object.freeze({ ...data, osm: VENUE_OSM[data.id] })])));
|
|
14
18
|
/** The keys of `VENUES`, in the order of the data. */
|
|
15
19
|
export const VENUE_IDS = Object.freeze(VENUE_DATA.map((data) => data.id));
|
|
@@ -19,6 +23,10 @@ export const venueById = (id) => (id !== undefined && Object.prototype.hasOwnPro
|
|
|
19
23
|
export const venueByWikidata = (wikidata) => Object.values(VENUES).find((venue) => venue.wikidata === wikidata);
|
|
20
24
|
/** The venues of a division of the NHL, in the order of the data. */
|
|
21
25
|
export const venuesIn = (division) => Object.values(VENUES).filter((venue) => venue.division === division);
|
|
26
|
+
/** The conference a division of the NHL is in. */
|
|
27
|
+
export const conferenceOf = (division) => VENUE_CONFERENCES.western.includes(division) ? "western" : "eastern";
|
|
28
|
+
/** The venues of a conference of the NHL, division by division, in the order of the data. */
|
|
29
|
+
export const venuesInConference = (conference) => VENUE_CONFERENCES[conference].flatMap((division) => venuesIn(division));
|
|
22
30
|
/** The arena a venue is of. */
|
|
23
31
|
export const arenaOfVenue = (venue) => {
|
|
24
32
|
const arena = arenaById(venue.id);
|
package/dist/venues.osm.data.js
CHANGED
|
@@ -360,4 +360,370 @@ export const VENUE_OSM = {
|
|
|
360
360
|
[-115.178259, 36.102039],
|
|
361
361
|
],
|
|
362
362
|
},
|
|
363
|
+
"united-center": {
|
|
364
|
+
"source": "way/205221993",
|
|
365
|
+
"read": "2026-10-20",
|
|
366
|
+
"base": "2026-10-20T21:33:18Z",
|
|
367
|
+
"licence": "ODbL-1.0",
|
|
368
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
369
|
+
"axis": { "heading": 90, "basis": "building", "strength": 1.93, "elongation": 1.36, "centre": [-87.67419, 41.880684] },
|
|
370
|
+
"ring": [
|
|
371
|
+
[-87.67477, 41.881206],
|
|
372
|
+
[-87.674976, 41.881201],
|
|
373
|
+
[-87.674976, 41.881158],
|
|
374
|
+
[-87.67507, 41.881155],
|
|
375
|
+
[-87.675066, 41.881085],
|
|
376
|
+
[-87.675125, 41.881084],
|
|
377
|
+
[-87.675121, 41.880907],
|
|
378
|
+
[-87.675104, 41.880906],
|
|
379
|
+
[-87.675149, 41.880782],
|
|
380
|
+
[-87.67518, 41.88078],
|
|
381
|
+
[-87.675178, 41.880549],
|
|
382
|
+
[-87.675143, 41.880552],
|
|
383
|
+
[-87.67509, 41.880426],
|
|
384
|
+
[-87.675104, 41.880422],
|
|
385
|
+
[-87.675103, 41.880245],
|
|
386
|
+
[-87.675049, 41.880246],
|
|
387
|
+
[-87.675045, 41.880174],
|
|
388
|
+
[-87.674946, 41.880176],
|
|
389
|
+
[-87.674944, 41.880135],
|
|
390
|
+
[-87.674742, 41.880138],
|
|
391
|
+
[-87.67474, 41.880117],
|
|
392
|
+
[-87.674168, 41.880122],
|
|
393
|
+
[-87.673601, 41.880133],
|
|
394
|
+
[-87.673601, 41.880155],
|
|
395
|
+
[-87.673393, 41.880157],
|
|
396
|
+
[-87.673393, 41.880199],
|
|
397
|
+
[-87.673293, 41.880199],
|
|
398
|
+
[-87.673293, 41.880275],
|
|
399
|
+
[-87.673242, 41.880275],
|
|
400
|
+
[-87.673247, 41.880455],
|
|
401
|
+
[-87.673262, 41.880461],
|
|
402
|
+
[-87.673218, 41.880584],
|
|
403
|
+
[-87.673187, 41.880585],
|
|
404
|
+
[-87.673196, 41.880814],
|
|
405
|
+
[-87.673232, 41.880814],
|
|
406
|
+
[-87.673276, 41.880931],
|
|
407
|
+
[-87.673255, 41.880937],
|
|
408
|
+
[-87.673263, 41.881114],
|
|
409
|
+
[-87.673322, 41.881115],
|
|
410
|
+
[-87.673322, 41.88118],
|
|
411
|
+
[-87.673422, 41.881181],
|
|
412
|
+
[-87.673421, 41.881226],
|
|
413
|
+
[-87.673627, 41.881223],
|
|
414
|
+
[-87.673626, 41.881241],
|
|
415
|
+
[-87.674213, 41.881239],
|
|
416
|
+
[-87.674769, 41.881226],
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
"ball-arena": {
|
|
420
|
+
"source": "way/25312645",
|
|
421
|
+
"read": "2026-10-20",
|
|
422
|
+
"base": "2026-10-20T21:33:18Z",
|
|
423
|
+
"licence": "ODbL-1.0",
|
|
424
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
425
|
+
"height": 22,
|
|
426
|
+
"axis": { "heading": 90, "basis": "none", "strength": 1.26, "elongation": 1.02, "centre": [-105.007573, 39.748633] },
|
|
427
|
+
"ring": [
|
|
428
|
+
[-105.008169, 39.749084],
|
|
429
|
+
[-105.008338, 39.748973],
|
|
430
|
+
[-105.008439, 39.748857],
|
|
431
|
+
[-105.008498, 39.748726],
|
|
432
|
+
[-105.008512, 39.748603],
|
|
433
|
+
[-105.008498, 39.748498],
|
|
434
|
+
[-105.008449, 39.748382],
|
|
435
|
+
[-105.00837, 39.748281],
|
|
436
|
+
[-105.008268, 39.7482],
|
|
437
|
+
[-105.008098, 39.748114],
|
|
438
|
+
[-105.008077, 39.748156],
|
|
439
|
+
[-105.007939, 39.748121],
|
|
440
|
+
[-105.00785, 39.748115],
|
|
441
|
+
[-105.007829, 39.748063],
|
|
442
|
+
[-105.007872, 39.74804],
|
|
443
|
+
[-105.007756, 39.747764],
|
|
444
|
+
[-105.007484, 39.74798],
|
|
445
|
+
[-105.007254, 39.748038],
|
|
446
|
+
[-105.007224, 39.747996],
|
|
447
|
+
[-105.00704, 39.74808],
|
|
448
|
+
[-105.006878, 39.748188],
|
|
449
|
+
[-105.00693, 39.748223],
|
|
450
|
+
[-105.00681, 39.748372],
|
|
451
|
+
[-105.006749, 39.748523],
|
|
452
|
+
[-105.006624, 39.74863],
|
|
453
|
+
[-105.006638, 39.748641],
|
|
454
|
+
[-105.006521, 39.748736],
|
|
455
|
+
[-105.006734, 39.748736],
|
|
456
|
+
[-105.006738, 39.748757],
|
|
457
|
+
[-105.006766, 39.748757],
|
|
458
|
+
[-105.006796, 39.748878],
|
|
459
|
+
[-105.00686, 39.748986],
|
|
460
|
+
[-105.00696, 39.749077],
|
|
461
|
+
[-105.006919, 39.749103],
|
|
462
|
+
[-105.007099, 39.749198],
|
|
463
|
+
[-105.007072, 39.74924],
|
|
464
|
+
[-105.006874, 39.749291],
|
|
465
|
+
[-105.006962, 39.749349],
|
|
466
|
+
[-105.00719, 39.749449],
|
|
467
|
+
[-105.007191, 39.749467],
|
|
468
|
+
[-105.00745, 39.749525],
|
|
469
|
+
[-105.007633, 39.749535],
|
|
470
|
+
[-105.007613, 39.749485],
|
|
471
|
+
[-105.007884, 39.749454],
|
|
472
|
+
[-105.007869, 39.749385],
|
|
473
|
+
[-105.007985, 39.749351],
|
|
474
|
+
[-105.007956, 39.749294],
|
|
475
|
+
[-105.008018, 39.749277],
|
|
476
|
+
[-105.007993, 39.749232],
|
|
477
|
+
[-105.008094, 39.749221],
|
|
478
|
+
[-105.008075, 39.749183],
|
|
479
|
+
[-105.008185, 39.749115],
|
|
480
|
+
],
|
|
481
|
+
},
|
|
482
|
+
"american-airlines-center": {
|
|
483
|
+
"source": "way/25312698",
|
|
484
|
+
"read": "2026-10-20",
|
|
485
|
+
"base": "2026-10-20T21:35:07Z",
|
|
486
|
+
"licence": "ODbL-1.0",
|
|
487
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
488
|
+
"axis": { "heading": 144, "basis": "building", "strength": 2.19, "elongation": 1.31, "centre": [-96.81028, 32.79049] },
|
|
489
|
+
"ring": [
|
|
490
|
+
[-96.810234, 32.791328],
|
|
491
|
+
[-96.810164, 32.791245],
|
|
492
|
+
[-96.810182, 32.791236],
|
|
493
|
+
[-96.810056, 32.791086],
|
|
494
|
+
[-96.810012, 32.791113],
|
|
495
|
+
[-96.809956, 32.791046],
|
|
496
|
+
[-96.809969, 32.791039],
|
|
497
|
+
[-96.809568, 32.790561],
|
|
498
|
+
[-96.809555, 32.790569],
|
|
499
|
+
[-96.8095, 32.790504],
|
|
500
|
+
[-96.809545, 32.790477],
|
|
501
|
+
[-96.80934, 32.790256],
|
|
502
|
+
[-96.809439, 32.790198],
|
|
503
|
+
[-96.809429, 32.790171],
|
|
504
|
+
[-96.80958, 32.790081],
|
|
505
|
+
[-96.809551, 32.790046],
|
|
506
|
+
[-96.809959, 32.789817],
|
|
507
|
+
[-96.809952, 32.789809],
|
|
508
|
+
[-96.81003, 32.789763],
|
|
509
|
+
[-96.810056, 32.789794],
|
|
510
|
+
[-96.810209, 32.789704],
|
|
511
|
+
[-96.81024, 32.789718],
|
|
512
|
+
[-96.810339, 32.789661],
|
|
513
|
+
[-96.810408, 32.789744],
|
|
514
|
+
[-96.810392, 32.789752],
|
|
515
|
+
[-96.81051, 32.789892],
|
|
516
|
+
[-96.810556, 32.789865],
|
|
517
|
+
[-96.810611, 32.789932],
|
|
518
|
+
[-96.810599, 32.789939],
|
|
519
|
+
[-96.810997, 32.790421],
|
|
520
|
+
[-96.81101, 32.790413],
|
|
521
|
+
[-96.811063, 32.790477],
|
|
522
|
+
[-96.811021, 32.790502],
|
|
523
|
+
[-96.811154, 32.790659],
|
|
524
|
+
[-96.811168, 32.790649],
|
|
525
|
+
[-96.811237, 32.790731],
|
|
526
|
+
[-96.811139, 32.79079],
|
|
527
|
+
[-96.81113, 32.790776],
|
|
528
|
+
[-96.810963, 32.790875],
|
|
529
|
+
[-96.811009, 32.790929],
|
|
530
|
+
[-96.810986, 32.790943],
|
|
531
|
+
[-96.810931, 32.790975],
|
|
532
|
+
[-96.810924, 32.790967],
|
|
533
|
+
[-96.81053, 32.791213],
|
|
534
|
+
[-96.810484, 32.791159],
|
|
535
|
+
[-96.810319, 32.791257],
|
|
536
|
+
[-96.810331, 32.791269],
|
|
537
|
+
],
|
|
538
|
+
},
|
|
539
|
+
"grand-casino-arena": {
|
|
540
|
+
"source": "relation/20658401",
|
|
541
|
+
"read": "2026-10-20",
|
|
542
|
+
"base": "2026-10-20T21:42:20Z",
|
|
543
|
+
"licence": "ODbL-1.0",
|
|
544
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
545
|
+
"axis": { "heading": 120, "basis": "building", "strength": 1.51, "elongation": 1.12, "centre": [-93.101118, 44.94475] },
|
|
546
|
+
"ring": [
|
|
547
|
+
[-93.101946, 44.945149],
|
|
548
|
+
[-93.101869, 44.945235],
|
|
549
|
+
[-93.101693, 44.945367],
|
|
550
|
+
[-93.101482, 44.945465],
|
|
551
|
+
[-93.101311, 44.945508],
|
|
552
|
+
[-93.101106, 44.945509],
|
|
553
|
+
[-93.101131, 44.945374],
|
|
554
|
+
[-93.10048, 44.945305],
|
|
555
|
+
[-93.100506, 44.945284],
|
|
556
|
+
[-93.100006, 44.945241],
|
|
557
|
+
[-93.100101, 44.9447],
|
|
558
|
+
[-93.100263, 44.944555],
|
|
559
|
+
[-93.100451, 44.944321],
|
|
560
|
+
[-93.100614, 44.944037],
|
|
561
|
+
[-93.100731, 44.944047],
|
|
562
|
+
[-93.100747, 44.943959],
|
|
563
|
+
[-93.100821, 44.943966],
|
|
564
|
+
[-93.100815, 44.943991],
|
|
565
|
+
[-93.101246, 44.944032],
|
|
566
|
+
[-93.101382, 44.944108],
|
|
567
|
+
[-93.101341, 44.944145],
|
|
568
|
+
[-93.102061, 44.944549],
|
|
569
|
+
[-93.102104, 44.94451],
|
|
570
|
+
[-93.102203, 44.94456],
|
|
571
|
+
[-93.102207, 44.944633],
|
|
572
|
+
[-93.102063, 44.944755],
|
|
573
|
+
[-93.102049, 44.944967],
|
|
574
|
+
],
|
|
575
|
+
},
|
|
576
|
+
"bridgestone-arena": {
|
|
577
|
+
"source": "way/130905914",
|
|
578
|
+
"read": "2026-10-20",
|
|
579
|
+
"base": "2026-10-20T21:37:18Z",
|
|
580
|
+
"licence": "ODbL-1.0",
|
|
581
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
582
|
+
"axis": { "heading": 156, "basis": "building", "strength": 1.74, "elongation": 1.21, "centre": [-86.778468, 36.159052] },
|
|
583
|
+
"ring": [
|
|
584
|
+
[-86.779614, 36.159778],
|
|
585
|
+
[-86.778759, 36.160135],
|
|
586
|
+
[-86.778748, 36.160074],
|
|
587
|
+
[-86.778708, 36.160087],
|
|
588
|
+
[-86.778657, 36.160137],
|
|
589
|
+
[-86.77863, 36.160144],
|
|
590
|
+
[-86.778566, 36.160124],
|
|
591
|
+
[-86.778547, 36.160061],
|
|
592
|
+
[-86.778603, 36.160001],
|
|
593
|
+
[-86.778587, 36.159892],
|
|
594
|
+
[-86.778367, 36.159879],
|
|
595
|
+
[-86.778252, 36.15984],
|
|
596
|
+
[-86.77811, 36.159773],
|
|
597
|
+
[-86.778, 36.159674],
|
|
598
|
+
[-86.777903, 36.159554],
|
|
599
|
+
[-86.777817, 36.159388],
|
|
600
|
+
[-86.77727, 36.158538],
|
|
601
|
+
[-86.777404, 36.15848],
|
|
602
|
+
[-86.777688, 36.158435],
|
|
603
|
+
[-86.777713, 36.158509],
|
|
604
|
+
[-86.777852, 36.158491],
|
|
605
|
+
[-86.777874, 36.158562],
|
|
606
|
+
[-86.777965, 36.158543],
|
|
607
|
+
[-86.778107, 36.158439],
|
|
608
|
+
[-86.778198, 36.158394],
|
|
609
|
+
[-86.778332, 36.158368],
|
|
610
|
+
[-86.778493, 36.158366],
|
|
611
|
+
[-86.778716, 36.158268],
|
|
612
|
+
[-86.778981, 36.158632],
|
|
613
|
+
[-86.779008, 36.158606],
|
|
614
|
+
[-86.779056, 36.15874],
|
|
615
|
+
[-86.779362, 36.159223],
|
|
616
|
+
[-86.779244, 36.159221],
|
|
617
|
+
],
|
|
618
|
+
},
|
|
619
|
+
"enterprise-center": {
|
|
620
|
+
"source": "way/42369176",
|
|
621
|
+
"read": "2026-10-20",
|
|
622
|
+
"base": "2026-10-20T21:38:19Z",
|
|
623
|
+
"licence": "ODbL-1.0",
|
|
624
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
625
|
+
"axis": { "heading": 105, "basis": "building", "strength": 1.36, "elongation": 1.36, "centre": [-90.202628, 38.62678] },
|
|
626
|
+
"ring": [
|
|
627
|
+
[-90.203486, 38.626974],
|
|
628
|
+
[-90.203327, 38.627369],
|
|
629
|
+
[-90.203071, 38.627308],
|
|
630
|
+
[-90.202527, 38.627404],
|
|
631
|
+
[-90.202343, 38.627419],
|
|
632
|
+
[-90.202349, 38.627393],
|
|
633
|
+
[-90.202238, 38.627384],
|
|
634
|
+
[-90.202115, 38.627355],
|
|
635
|
+
[-90.201929, 38.627257],
|
|
636
|
+
[-90.201837, 38.627163],
|
|
637
|
+
[-90.201774, 38.627054],
|
|
638
|
+
[-90.201731, 38.626911],
|
|
639
|
+
[-90.201726, 38.626818],
|
|
640
|
+
[-90.201749, 38.626703],
|
|
641
|
+
[-90.2018, 38.626603],
|
|
642
|
+
[-90.201929, 38.626473],
|
|
643
|
+
[-90.202014, 38.626357],
|
|
644
|
+
[-90.201956, 38.626201],
|
|
645
|
+
[-90.202915, 38.62625],
|
|
646
|
+
[-90.203048, 38.62627],
|
|
647
|
+
[-90.20325, 38.626353],
|
|
648
|
+
[-90.203402, 38.626491],
|
|
649
|
+
[-90.203522, 38.626559],
|
|
650
|
+
[-90.203455, 38.626579],
|
|
651
|
+
[-90.203511, 38.626784],
|
|
652
|
+
],
|
|
653
|
+
},
|
|
654
|
+
"delta-center": {
|
|
655
|
+
"source": "way/23335190",
|
|
656
|
+
"read": "2026-10-20",
|
|
657
|
+
"base": "2026-10-20T21:39:17Z",
|
|
658
|
+
"licence": "ODbL-1.0",
|
|
659
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
660
|
+
"axis": { "heading": 45, "basis": "building", "strength": 1.31, "elongation": 1.13, "centre": [-111.901119, 40.768261] },
|
|
661
|
+
"ring": [
|
|
662
|
+
[-111.901061, 40.768973],
|
|
663
|
+
[-111.900901, 40.76885],
|
|
664
|
+
[-111.900611, 40.769069],
|
|
665
|
+
[-111.900045, 40.768639],
|
|
666
|
+
[-111.900252, 40.768482],
|
|
667
|
+
[-111.900269, 40.768495],
|
|
668
|
+
[-111.900342, 40.768439],
|
|
669
|
+
[-111.900155, 40.768297],
|
|
670
|
+
[-111.900339, 40.768162],
|
|
671
|
+
[-111.900263, 40.768103],
|
|
672
|
+
[-111.900488, 40.767934],
|
|
673
|
+
[-111.900391, 40.767859],
|
|
674
|
+
[-111.900588, 40.76771],
|
|
675
|
+
[-111.900686, 40.767785],
|
|
676
|
+
[-111.900912, 40.767616],
|
|
677
|
+
[-111.900994, 40.76768],
|
|
678
|
+
[-111.901174, 40.767547],
|
|
679
|
+
[-111.901342, 40.767674],
|
|
680
|
+
[-111.901494, 40.767553],
|
|
681
|
+
[-111.902045, 40.767972],
|
|
682
|
+
[-111.901892, 40.768087],
|
|
683
|
+
[-111.902062, 40.768216],
|
|
684
|
+
[-111.901874, 40.768358],
|
|
685
|
+
[-111.901955, 40.768419],
|
|
686
|
+
[-111.90174, 40.768581],
|
|
687
|
+
[-111.901841, 40.768658],
|
|
688
|
+
[-111.901641, 40.768809],
|
|
689
|
+
[-111.901542, 40.768733],
|
|
690
|
+
[-111.901322, 40.768899],
|
|
691
|
+
[-111.901241, 40.768837],
|
|
692
|
+
],
|
|
693
|
+
},
|
|
694
|
+
"canada-life-centre": {
|
|
695
|
+
"source": "way/14869890",
|
|
696
|
+
"read": "2026-10-20",
|
|
697
|
+
"base": "2026-10-20T21:40:19Z",
|
|
698
|
+
"licence": "ODbL-1.0",
|
|
699
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
700
|
+
"height": 15,
|
|
701
|
+
"axis": { "heading": 162, "basis": "building", "strength": 2.55, "elongation": 1.57, "centre": [-97.143717, 49.892609] },
|
|
702
|
+
"ring": [
|
|
703
|
+
[-97.144608, 49.893039],
|
|
704
|
+
[-97.144619, 49.893025],
|
|
705
|
+
[-97.144553, 49.892939],
|
|
706
|
+
[-97.144589, 49.892931],
|
|
707
|
+
[-97.144197, 49.892203],
|
|
708
|
+
[-97.144242, 49.892143],
|
|
709
|
+
[-97.144286, 49.892134],
|
|
710
|
+
[-97.144231, 49.892033],
|
|
711
|
+
[-97.144188, 49.892043],
|
|
712
|
+
[-97.14403, 49.891994],
|
|
713
|
+
[-97.14399, 49.891921],
|
|
714
|
+
[-97.143964, 49.891914],
|
|
715
|
+
[-97.143862, 49.891938],
|
|
716
|
+
[-97.143868, 49.891949],
|
|
717
|
+
[-97.142843, 49.892177],
|
|
718
|
+
[-97.142852, 49.892194],
|
|
719
|
+
[-97.142835, 49.892198],
|
|
720
|
+
[-97.14287, 49.89226],
|
|
721
|
+
[-97.142887, 49.892256],
|
|
722
|
+
[-97.143448, 49.89329],
|
|
723
|
+
[-97.143472, 49.893397],
|
|
724
|
+
[-97.143544, 49.893435],
|
|
725
|
+
[-97.143634, 49.893423],
|
|
726
|
+
[-97.143674, 49.893381],
|
|
727
|
+
],
|
|
728
|
+
},
|
|
363
729
|
};
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** The package's version: the same as package.json's, and a test holds them to each other. */
|
|
2
|
-
export declare const VERSION = "0.
|
|
2
|
+
export declare const VERSION = "0.29.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** The package's version: the same as package.json's, and a test holds them to each other. */
|
|
2
|
-
export const VERSION = "0.
|
|
2
|
+
export const VERSION = "0.29.0";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@johnmorrisdotca/kyogijo-stadiums",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "Kyogijo Stadiums 競技場, 40 sports' surfaces as SVG, drawn to scale from the rulebooks: NFL, CFL and IFAF football fields, an NHL rink, an NBA court, MLB ballparks, soccer pitches, curling sheets, athletics stadiums, speed skating, short track and figure skating rinks, swimming pools, water polo fields, diving wells, artistic swimming areas, and the courts and fields of tennis, volleyball (indoor, beach and sitting), badminton, pickleball, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet, netball, lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball, and the budo of judo, karate, kendo, sumo and kyudo with a dojo of tatami laid as real units, the MMA cage, with each team's name and logo on its side and the score in the middle, stands and a crowd, a pageant of flags, and a 3D view. Light and dark, accessible, a compact badge for lists, a helper for React and a custom element. Zero dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sports",
|
|
@@ -292,7 +292,8 @@
|
|
|
292
292
|
"prepublishOnly": "pnpm check",
|
|
293
293
|
"site": "pnpm build && node scripts/site.mjs",
|
|
294
294
|
"test:demo": "pnpm site && playwright test",
|
|
295
|
-
"screenshots:readme": "pnpm site && node scripts/readme-pictures.mjs",
|
|
295
|
+
"screenshots:readme": "pnpm site && node scripts/readme-pictures.mjs && node scripts/readme-animation.mjs",
|
|
296
|
+
"screenshots:animation": "pnpm site && node scripts/readme-animation.mjs",
|
|
296
297
|
"test:readme": "pnpm build && node scripts/check-readme-examples.mjs",
|
|
297
298
|
"docs:make": "node scripts/docs.mjs",
|
|
298
299
|
"parks": "node scripts/build-parks.mjs",
|