Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,9 @@ dist-ssr
*.njsproj
*.sln
*.sw?

# Code of Points extraction: the PDF must never be committed
scripts/extract-cop/en_1.1.-WAG-Code-of-Points-2025-2028.pdf
scripts/extract-cop/review.html
scripts/extract-cop/.venv
__pycache__
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ We are building a web application that helps gymnastics coaches plan their gymna

## Status

The first delivery is a specification. There is no working application yet.
The first delivery was a specification. There is no working application yet, but the catalog data has been extracted from the Code of Points and is in [`data/`](data/).

The code in `src/` is the Vite starter project with one example test. The tooling is set up: TypeScript, ESLint, Prettier and Vitest.

Expand All @@ -21,7 +21,7 @@ The code in `src/` is the Vite starter project with one example test. The toolin

## The dataset

The catalog data comes from the FIG Women's Artistic Gymnastics Code of Points 2025–2028, which is published as a PDF. We will extract the apparatus, element groups, elements and vaults from the PDF with a script, and load them into the database with a seed script. Neither script is written yet.
The catalog data comes from the FIG Women's Artistic Gymnastics Code of Points 2025–2028, which is published as a PDF. We have extracted the apparatus, element groups, elements and vaults from the PDF with a Python script in [`scripts/extract-cop/`](scripts/extract-cop/), and the result is in [`data/`](data/). [docs/EXTRACTION.md](docs/EXTRACTION.md) explains how it was done and what has been checked by hand. The data will be loaded into the database with a seed script, which is not written yet.

The data is used for educational purposes. All rights to the Code of Points belong to FIG (Fédération Internationale de Gymnastique).

Expand Down Expand Up @@ -78,6 +78,16 @@ Other commands:
| `pnpm format` | Formats all files with Prettier |
| `pnpm test` | Runs the tests with Vitest |

## Project structure

| Folder | Contents |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `data/` | The catalog data extracted from the Code of Points: JSON files and one image per element |
| `docs/` | The specification: user interface plans, data model, example data and AI usage. [docs/EXTRACTION.md](docs/EXTRACTION.md) explains how `data/` was made |
| `public/` | Static files served as they are, such as the favicon |
| `scripts/extract-cop/` | The Python script that extracts `data/` from the Code of Points PDF |
| `src/` | The frontend code. For now the Vite starter project and one example test |

## Working in this repository

`main` is protected — you cannot push to it directly. Work on a branch and
Expand Down
14 changes: 14 additions & 0 deletions data/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Catalog data

These files are generated by [`scripts/extract-cop/`](../scripts/extract-cop/) from the FIG Women's Artistic Gymnastics Code of Points 2025–2028. Do not edit them by hand: fix the script and run it again instead. All rights to the content belong to FIG (Fédération Internationale de Gymnastique), and the data is used here for educational purposes.

The structure of the data is described in [docs/DATA_MODEL.md](../docs/DATA_MODEL.md). How the data was made, and what has been checked by hand, is explained in [docs/EXTRACTION.md](../docs/EXTRACTION.md).

| File | Contents |
| -------------------- | ---------------------------------------------------------------------------------------------- |
| `apparatus.json` | The four apparatus: vault, uneven bars, balance beam and floor exercise |
| `elementGroups.json` | The element groups on each apparatus, with their number and name |
| `elements.json` | The elements on uneven bars, balance beam and floor exercise, with code, value and description |
| `vaults.json` | The vaults, with code, D-value and description |
| `variantGroups.json` | For each code with more than one variant, the ids of its variants |
| `images/` | One drawing per element and vault, in a folder per apparatus: `images/UB/UB-2.305-a.webp` |
18 changes: 18 additions & 0 deletions data/apparatus.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[
{
"id": "VT",
"name": "Vault"
},
{
"id": "UB",
"name": "Uneven bars"
},
{
"id": "BB",
"name": "Balance beam"
},
{
"id": "FX",
"name": "Floor exercise"
}
]
134 changes: 134 additions & 0 deletions data/elementGroups.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
[
{
"id": "VT-1",
"apparatusId": "VT",
"number": 1,
"name": "Handspring, Yamashita, round-off with or without turn in 1st and/or 2nd flight phase"
},
{
"id": "VT-2",
"apparatusId": "VT",
"number": 2,
"name": "Handspring fwd with/without 1/1 turn (360°) in 1st flight phase – salto fwd/bwd with/without twist in 2nd flight phase"
},
{
"id": "VT-3",
"apparatusId": "VT",
"number": 3,
"name": "Handspring with ¼ - ½ turn (90°-180°) in 1st flight phase (Tsukahara) – salto bwd with/without twist in 2nd flight phase"
},
{
"id": "VT-4",
"apparatusId": "VT",
"number": 4,
"name": "Round-off (Yurchenko) with/wo ¾ turn (270°) in 1st flight phase – salto bwd with/without twist in 2nd flight phase"
},
{
"id": "VT-5",
"apparatusId": "VT",
"number": 5,
"name": "Round-off with ½ turn (180°) in 1st flight phase – salto fwd/bwd with/without twist in 2nd flight phase"
},
{
"id": "UB-1",
"apparatusId": "UB",
"number": 1,
"name": "Mounts"
},
{
"id": "UB-2",
"apparatusId": "UB",
"number": 2,
"name": "Casts and clear hip circles"
},
{
"id": "UB-3",
"apparatusId": "UB",
"number": 3,
"name": "Giant circles"
},
{
"id": "UB-4",
"apparatusId": "UB",
"number": 4,
"name": "Stalder circles"
},
{
"id": "UB-5",
"apparatusId": "UB",
"number": 5,
"name": "Pike circles"
},
{
"id": "UB-6",
"apparatusId": "UB",
"number": 6,
"name": "Dismounts"
},
{
"id": "BB-1",
"apparatusId": "BB",
"number": 1,
"name": "Mounts"
},
{
"id": "BB-2",
"apparatusId": "BB",
"number": 2,
"name": "Gymnastic leaps, jumps and hops"
},
{
"id": "BB-3",
"apparatusId": "BB",
"number": 3,
"name": "Gymnastic turns"
},
{
"id": "BB-4",
"apparatusId": "BB",
"number": 4,
"name": "Holds and acrobatic non-flight"
},
{
"id": "BB-5",
"apparatusId": "BB",
"number": 5,
"name": "Acrobatic flight"
},
{
"id": "BB-6",
"apparatusId": "BB",
"number": 6,
"name": "Dismounts"
},
{
"id": "FX-1",
"apparatusId": "FX",
"number": 1,
"name": "Gymnastic leaps, jumps and hops"
},
{
"id": "FX-2",
"apparatusId": "FX",
"number": 2,
"name": "Gymnastic turns"
},
{
"id": "FX-3",
"apparatusId": "FX",
"number": 3,
"name": "Hand support elements"
},
{
"id": "FX-4",
"apparatusId": "FX",
"number": 4,
"name": "Saltos forward & sideward"
},
{
"id": "FX-5",
"apparatusId": "FX",
"number": 5,
"name": "Saltos backward"
}
]
Loading