From da59c4873ff9753cdb4485c00be278172463b9cb Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 30 May 2026 07:37:50 +0000 Subject: [PATCH 1/5] chore: bump minor version to 0.2.0 Reflects the mobile-touch and court-rendering fixes on this branch. Updates package.json, the in-app version badge, and the version assertion test. --- index.html | 2 +- package.json | 2 +- tests/editor.spec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index ade3154..921ebfb 100644 --- a/index.html +++ b/index.html @@ -23,7 +23,7 @@

OCFeditor

- v0.1.0 + v0.2.0
diff --git a/package.json b/package.json index a3ea8e9..17a3a2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocf-editor", - "version": "0.1.0", + "version": "0.2.0", "description": "Reference web editor for the Open Coaching Format", "private": true, "homepage": "https://opencoachingformat.github.io/editor", diff --git a/tests/editor.spec.js b/tests/editor.spec.js index 4bd3d45..9e81e01 100644 --- a/tests/editor.spec.js +++ b/tests/editor.spec.js @@ -31,7 +31,7 @@ test.describe('App loads', () => { test('page title and version are correct', async ({ page }) => { await openEditor(page); await expect(page).toHaveTitle(/OCF Editor/); - await expect(page.locator('.app-version')).toHaveText('v0.1.0'); + await expect(page.locator('.app-version')).toHaveText('v0.2.0'); }); test('court SVG is rendered (no 404 on bundle)', async ({ page }) => { From 03e70150f18e1a977b1469290e16e34bc05dc3cf Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 30 May 2026 11:02:09 +0000 Subject: [PATCH 2/5] ci: release-tag deploys + main preview on GitHub Pages Restructure the Pages deployment so a release and a test build coexist: - Root (/) serves the newest v* release tag; /preview serves current main. Both are rebuilt from their own source tree on every deploy by scripts/build-pages.sh (the app uses only relative asset paths, so it works from any sub-path). Until the first tag exists, root mirrors the preview. - Deploy runs on main pushes and on v* tag pushes, but only after build + E2E tests pass. - On a tag push, a version-check job fails the pipeline unless package.json matches the tag (scripts/check-version.sh), so a release can't ship a mismatched version. Both scripts were verified locally (no-tag and tagged cases, version gate, and serving _site so root + /preview load with correct version badges). Documents the release flow in the README. --- .github/workflows/ci.yml | 47 +++++++++++++++++------- .gitignore | 1 + README.md | 24 ++++++++++++ scripts/build-pages.sh | 79 ++++++++++++++++++++++++++++++++++++++++ scripts/check-version.sh | 20 ++++++++++ 5 files changed, 158 insertions(+), 13 deletions(-) create mode 100755 scripts/build-pages.sh create mode 100755 scripts/check-version.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd1abb1..88fe7bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,9 +3,15 @@ name: CI on: push: branches: [main] + tags: ['v*'] pull_request: branches: [main] +# Allow one concurrent deployment; newer runs supersede in-progress ones. +concurrency: + group: pages + cancel-in-progress: false + jobs: build: name: Build & Validate @@ -20,19 +26,17 @@ jobs: - run: npm run build - run: node scripts/validate-examples.js - - name: Assemble Pages artifact - if: github.ref == 'refs/heads/main' - run: | - mkdir -p _site - cp index.html style.css ocf-bundle.js ocf-bundle.js.map _site/ - cp -r examples _site/examples - cp opencoachingformat-v1.schema.json _site/ - - - name: Upload Pages artifact - if: github.ref == 'refs/heads/main' - uses: actions/upload-pages-artifact@v3 + # On a release tag, package.json must match the tag, or we refuse to ship. + version-check: + name: Version matches tag + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - path: '_site' + node-version: '20' + - run: bash scripts/check-version.sh "${GITHUB_REF_NAME}" test: name: E2E Tests @@ -49,18 +53,35 @@ jobs: - run: npx playwright install chromium --with-deps - run: npm test + # Assemble the full Pages site (root = newest release tag, /preview = main) + # only after build + tests are green. Runs on main pushes and on tag pushes. deploy: name: Deploy to GitHub Pages needs: [build, test] - if: github.ref == 'refs/heads/main' + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) runs-on: ubuntu-latest permissions: + contents: read pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: + - uses: actions/checkout@v4 + with: + # Need full history + all tags so build-pages.sh can pick the newest. + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + - run: npm ci + - name: Assemble Pages site (release + preview) + run: bash scripts/build-pages.sh _site + - uses: actions/upload-pages-artifact@v3 + with: + path: '_site' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 94dc222..5123711 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ ocf-bundle.js.map .idea/ playwright-report/ test-results/ +_site/ diff --git a/README.md b/README.md index 888ea8f..48c6835 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,30 @@ OCF (Open Coaching Format) is a JSON-based standard for basketball drill diagram This editor intentionally deviates from the spec in two places for `ajv` strict-mode compatibility — see the comment block at the top of `src/schema.js` for details. +## Releases & Deployment + +GitHub Pages hosts two builds side by side: + +- **`/`** (root) — the latest **release**, built from the newest `v*` tag. +- **`/preview/`** — the current **`main`**, redeployed on every merge (after CI passes). + +Until the first release tag exists, the root mirrors the preview build. + +To cut a release: + +1. Bump `version` in `package.json` (and the `.app-version` badge in `index.html`). +2. Commit and merge to `main`. +3. Tag the merge commit and push the tag: + ```bash + git tag v0.3.0 + git push origin v0.3.0 + ``` + +CI refuses to deploy a tag whose `package.json` version doesn't match it +(`scripts/check-version.sh`). The Pages site is assembled by +`scripts/build-pages.sh`, which you can run locally (`bash scripts/build-pages.sh`) +to preview the exact deployed layout in `./_site`. + ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md). diff --git a/scripts/build-pages.sh b/scripts/build-pages.sh new file mode 100755 index 0000000..4271cc4 --- /dev/null +++ b/scripts/build-pages.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# +# Build the full GitHub Pages site into ./_site: +# / → newest v* release tag (the "final" build) +# /preview/ → current main (the "test" build) +# +# Both variants are rebuilt from their own source tree on every deploy, so the +# Pages site always contains both the latest release and the latest preview. +# The app uses only relative asset paths, so it works from any sub-path. +# +# Requires: git, node + npm deps installed (esbuild) in the current checkout. +# +# Usage: scripts/build-pages.sh [output_dir] +set -euo pipefail + +OUT="${1:-_site}" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ESBUILD="$ROOT/node_modules/.bin/esbuild" + +# Files that make up a deployable site (everything index.html references). +STATIC_FILES=(style.css opencoachingformat-v1.schema.json) + +# Build one variant from a git ref into a target directory, stamping the version. +# $1 = git ref (tag or branch), $2 = target dir, $3 = version label for the badge +build_variant() { + local ref="$1" dest="$2" version="$3" + local src + src="$(mktemp -d)" + echo "→ building '$ref' as version '$version' into $dest" + git archive "$ref" | tar -x -C "$src" + + mkdir -p "$dest" + "$ESBUILD" "$src/src/main.js" --bundle \ + --outfile="$dest/ocf-bundle.js" --format=iife \ + --global-name=OCFEditor --sourcemap + + cp "$src/index.html" "$dest/index.html" + for f in "${STATIC_FILES[@]}"; do + [ -e "$src/$f" ] && cp "$src/$f" "$dest/" + done + [ -d "$src/examples" ] && cp -r "$src/examples" "$dest/examples" + + # Stamp the in-app version badge so the deployed build self-reports its version. + if [ -n "$version" ]; then + sed -i "s#[^<]*#${version}#" "$dest/index.html" + fi + + rm -rf "$src" +} + +rm -rf "$OUT" +mkdir -p "$OUT" + +# Resolve "main" robustly: when CI checks out a tag, main may only exist as a +# remote-tracking ref. +if git rev-parse --verify --quiet main >/dev/null; then + MAIN_REF="main" +elif git rev-parse --verify --quiet origin/main >/dev/null; then + MAIN_REF="origin/main" +else + MAIN_REF="HEAD" +fi + +# Newest release tag, if any (semantic sort). +LATEST_TAG="$(git tag -l 'v*' --sort=-v:refname | head -n1 || true)" + +if [ -n "$LATEST_TAG" ]; then + build_variant "$LATEST_TAG" "$OUT" "$LATEST_TAG" +else + # No release yet → root shows the preview build so the site is never empty. + echo "→ no v* tag found; root will mirror the preview build" + build_variant "$MAIN_REF" "$OUT" "main-preview" +fi + +# Always (re)build the preview from main into /preview. +build_variant "$MAIN_REF" "$OUT/preview" "main-preview" + +echo "✓ Pages site assembled in $OUT" +ls -la "$OUT" diff --git a/scripts/check-version.sh b/scripts/check-version.sh new file mode 100755 index 0000000..01d9849 --- /dev/null +++ b/scripts/check-version.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# +# Verify that package.json's version matches a release tag. +# Used by CI on tag pushes so a release can never ship a mismatched version. +# +# Usage: scripts/check-version.sh e.g. check-version.sh v0.2.0 +set -euo pipefail + +TAG="${1:?usage: check-version.sh }" +TAG_VERSION="${TAG#v}" # strip leading "v" + +PKG_VERSION="$(node -p "require('./package.json').version")" + +if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then + echo "::error::Version mismatch — tag is '$TAG' (=$TAG_VERSION) but package.json is '$PKG_VERSION'." + echo "Update package.json to $TAG_VERSION (and the version badge) before tagging, or retag to match." + exit 1 +fi + +echo "✓ Version OK: tag $TAG matches package.json $PKG_VERSION" From d27cee62b6dc2b4e2de14bf1ad9816765bdece1b Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 30 May 2026 11:05:52 +0000 Subject: [PATCH 3/5] docs: add arc42 architecture doc and link preview build in README - Add doc/arc42.md: full arc42 architecture writeup capturing the editor's module structure, runtime flows, the release/preview Pages deployment, the key fixes from recent work (pointer input, screen-CTM coordinate mapping, curve direction, FIBA defender symbol, center-circle arc), the test strategy, and known risks. - README: surface the /preview/ (current main) URL alongside the release URL and link the architecture doc. --- README.md | 8 +- doc/arc42.md | 266 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 doc/arc42.md diff --git a/README.md b/README.md index 48c6835..1bd3b01 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,13 @@ Reference web editor for the [Open Coaching Format](https://github.com/opencoachingformat/spec) — an open standard for basketball drill diagrams and animations. -**Live demo:** https://opencoachingformat.github.io/ocf-editor +**Live demo (latest release):** https://opencoachingformat.github.io/ocf-editor +**Preview (current `main`):** https://opencoachingformat.github.io/ocf-editor/preview/ + +> The root URL serves the latest tagged release; `/preview/` always tracks the +> current `main` and is redeployed on every merge (after CI passes). See +> [Releases & Deployment](#releases--deployment). Architecture is documented in +> [doc/arc42.md](doc/arc42.md). --- diff --git a/doc/arc42.md b/doc/arc42.md new file mode 100644 index 0000000..e18141c --- /dev/null +++ b/doc/arc42.md @@ -0,0 +1,266 @@ +# OCF Editor — Architecture (arc42) + +This document follows the [arc42](https://arc42.org/) template. It describes the +architecture of the OCF Editor, a reference web editor for the Open Coaching +Format (OCF) — an open JSON standard for basketball drill diagrams and +animations. + +> Status: living document. Last substantive update reflects work up to and +> including the mobile-touch / rendering fixes and the release/preview CI +> pipeline (app version `0.2.0`). + +--- + +## 1. Introduction and Goals + +The OCF Editor lets coaches build basketball drills visually on a court, export +them as OCF-compliant `.ocf.json`, and play them back frame by frame. It is the +reference implementation of the OCF format. + +### Requirements overview + +- Visual half-court / full-court editor for FIBA, NBA, NCAA and NFHS courts. +- Place and drag entities: offense, defense, coach, cone, station, ball. +- Draw movement, passing, dribbling, screen and plain lines (straight or curved). +- Multi-frame drills using per-frame entity-state deltas. +- Live JSON view, import/export, and structural validation against OCF v1.0.0. +- A viewer mode that animates through frames. + +### Quality goals + +| # | Quality | Motivation | +|---|---------|------------| +| 1 | **Correctness of rendering** | Diagrams must read like standard coaching notation (court lines per ruleset, FIBA defender horseshoe, curve direction). | +| 2 | **Usability on touch devices** | Coaches use phones/tablets courtside; drag and draw must work with a finger. | +| 3 | **Portability / zero-backend** | Pure static site; deployable to GitHub Pages with relative asset paths. | +| 4 | **Format fidelity** | Output validates against the OCF schema. | +| 5 | **Testability** | Behaviour and geometry are covered by automated tests. | + +### Stakeholders + +- **Coaches** — end users authoring and viewing drills. +- **OCF maintainers** — own the spec; the editor is its reference UI. +- **Contributors** — extend rendering/interaction. + +--- + +## 2. Architecture Constraints + +- **No backend.** Everything runs in the browser; persistence is file + import/export. The site must work as static files from any sub-path. +- **No runtime dependencies.** All `import`s are relative; the app is bundled + with esbuild into a single IIFE (`ocf-bundle.js`). This is what lets CI build + any git ref from a throwaY checkout (see §7). +- **Schema compatibility.** The embedded schema deviates from the published spec + in two spots for `ajv` strict-mode compatibility (unknown `format` keywords); + see the comment block atop `src/schema.js`. +- **Coordinate system.** Origin = midcourt center, `y+` = frontcourt (toward the + offense basket). FIBA stores court coords in metres; NBA/NCAA/NFHS in feet. +- **Build tooling.** `esbuild` (bundling) and `@playwright/test` (E2E) are the + only dev dependencies. + +--- + +## 3. Context and Scope + +``` + ┌─────────────────────────────────────────┐ + Coach ───▶│ OCF Editor (SPA) │───▶ .ocf.json file + (browser) │ court rendering · editing · playback │◀─── .ocf.json file + └─────────────────────────────────────────┘ + │ validates against + ▼ + OCF v1.0.0 JSON Schema (embedded copy) +``` + +- **In scope:** the browser application, its rendering/editing/playback logic, + the embedded schema and validator, examples, tests, and the CI/deploy pipeline. +- **Out of scope:** the OCF specification itself (lives in + `opencoachingformat/spec`), any server, accounts, or cloud storage. + +--- + +## 4. Solution Strategy + +| Goal | Approach | +|------|----------| +| Correct rendering | A pure, side-effect-free renderer turns an OCF document + frame index into an SVG string. Geometry is unit-tested on the emitted path data. | +| Touch usability | A single **Pointer Events** code path (mouse + touch + pen), `touch-action: none` on the court, and a larger hit radius for coarse pointers. | +| Portability | Static files only; **relative** asset paths so the app runs from `/` or `/preview/`. | +| Format fidelity | A dependency-free structural validator plus CI validation of all examples. | +| Testability | Pure modules (renderer, curves, editor state) are tested directly; UI flows are driven through the real bundle via `window.OCFEditor`. | + +--- + +## 5. Building Block View + +### Level 1 — modules (`src/`) + +| Module | Responsibility | +|--------|----------------| +| `main.js` | Entry point. Wires UI components, owns app mode (editor/viewer) and the current transform. Exposes `editorState`, `player`, `getCurrentTransform()` on the `OCFEditor` global (used by tests). | +| `schema.js` | Embedded OCF v1.0.0 schema + `createBlankDocument()`. | +| `court/court-svg.js` | Court background per ruleset, and `createTransform()` (court coords ↔ viewBox coords). | +| `court/renderer.js` | `renderOCF(doc, frameIndex, w, h)` → `{ svgContent, transform }`. Resolves entity positions, draws entities/lines/areas/labels. | +| `court/curves.js` | Path geometry: `curvedPath`, `straightPath`, `dribblingPath`. | +| `court/positions.js` | Named positions per ruleset, coordinate resolution, snapping. | +| `editor/editor.js` | `EditorState`: the central store with undo/redo, entity/line/frame ops, tool state, ball assignment, `startLineTool`. | +| `editor/interaction.js` | `InteractionManager`: pointer drag, hit-testing, line drawing, snapping, keyboard. | +| `editor/context-menu.js` | Floating per-entity action menu (draw tools, ball, delete). | +| `editor/palette.js`, `properties.js`, `frames.js`, `toolbar.js` | Sidebar UI: add entities, edit properties, manage frames, keyboard shortcuts. | +| `player/player.js` | `FramePlayer`: frame navigation and timed playback. | +| `export/validate.js` | Dependency-free structural OCF validator. | +| `export/json.js` | JSON serialization + file import/export. | + +### Level 2 — key abstractions + +- **Pure renderer.** `renderOCF` has no DOM side effects; `main.js` assigns its + string to `svg.innerHTML`. This makes rendering snapshot/geometry testable. +- **Single source of truth.** `EditorState` holds the document and notifies + subscribers (`subscribe`/`notify`); UI components re-render on change. +- **Transform object.** `createTransform` returns `toSvg` / `toCourt` plus a + scale helper, derived from the ruleset dimensions and padding. + +--- + +## 6. Runtime View + +### Editing an entity (drag) + +1. `pointerdown` on the court → `InteractionManager` hit-tests entities (radius + depends on pointer type) and starts a drag, capturing the pointer. +2. `pointermove` → convert client → viewBox coords via the SVG **screen CTM**, + apply optional snap to a named position, call `editorState.moveEntity`. +3. `EditorState` updates the base position (frame 0) or writes a frame + `entity_states` delta (frame > 0) and notifies. +4. `main.js` re-renders the SVG; the snap indicator is re-appended (innerHTML + reset detaches it). +5. `pointerup` releases capture; a synthesized click after a real drag is + swallowed so it can't deselect. + +### Drawing a line from a player + +1. Player selected → context menu shown. A draw tool button calls + `editorState.startLineTool(tool, key)`, which seeds the player's position as + waypoint 1 and sets `from_entity`. +2. Court clicks append waypoints; double-click / Enter / ✓ commits the line into + the current frame. + +### Playback (viewer mode) + +`FramePlayer.load(doc)` then `play()` schedules frame advances using each +frame's `duration_ms` (default 1500 ms), looping at the end; `onFrameChange` +re-renders. + +--- + +## 7. Deployment View + +Static site on **GitHub Pages**, assembled by `scripts/build-pages.sh`: + +``` +GitHub Pages site +├── / → newest v* release tag (the "final" build) +└── /preview/ → current main (the "test" build) +``` + +- Both variants are rebuilt from their **own** git ref on every deploy + (`git archive ` → esbuild → copy static files → stamp version badge). + This is possible only because the app has no runtime deps and uses relative + asset paths. +- Until the first `v*` tag exists, the root mirrors the preview build. + +### CI pipeline (`.github/workflows/ci.yml`) + +| Job | Runs on | Purpose | +|-----|---------|---------| +| `build` | PR, main push, tag push | `npm ci` → build → validate examples | +| `test` | needs `build` | Playwright E2E (chromium) | +| `version-check` | tag push only | `scripts/check-version.sh` fails unless `package.json` == tag | +| `deploy` | main push or `v*` tag, after build+test | assemble `_site` and publish to Pages | + +### Release process + +1. Bump `version` in `package.json` and the `.app-version` badge in `index.html`. +2. Merge to `main` (updates `/preview`). +3. `git tag vX.Y.Z && git push origin vX.Y.Z` → version-check gate → deploy to root. + +> Note: the repo's *Settings → Pages → Source* must be **GitHub Actions** for the +> Actions-based deploy to take effect. + +--- + +## 8. Cross-cutting Concepts + +- **Coordinate transforms.** Court units ↔ viewBox via `createTransform`; + client pixels ↔ viewBox via the SVG **screen CTM** (`getScreenCTM`). The court + scales to 100% width, so client pixels never equal viewBox units — using the + CTM is mandatory for correct hit-testing on any screen size. +- **Input.** Unified Pointer Events; `touch-action: none` prevents the browser + from claiming finger drags as scroll/pan. +- **State & undo.** `EditorState` snapshots JSON for undo/redo and emits change + notifications; the singleton is reset in tests for order-independence. +- **Validation.** Structural validator with no external deps; CI validates all + `examples/*.ocf.json`. +- **Versioning.** Version lives in `package.json`, the in-app badge, and the + version test; the CI gate keeps a release tag consistent with `package.json`. + +--- + +## 9. Architecture Decisions + +| ADR | Decision | Rationale | +|-----|----------|-----------| +| Pure string renderer | `renderOCF` returns an SVG string, no DOM writes | Testable geometry; trivial re-render via `innerHTML`. | +| Pointer Events over mouse events | One handler path for mouse/touch/pen | Mouse-only handlers never fired for touch — entities couldn't be dragged on phones. | +| Screen-CTM coordinate mapping | Map client→viewBox via `getScreenCTM`, not `clientX - rect.left` | The 1:1 assumption was wrong whenever the SVG was scaled (always on mobile), mis-placing hits/drags. | +| Midpoint-quadratic curves | Interior waypoints are control points; spans join at segment midpoints | The old angle-bisector approach bowed curves *into* bends (wrong direction) and left half the line straight. | +| Stroked-arc defender | FIBA defender = single open stroked arc | The old filled self-intersecting Bézier collapsed into two crescents. | +| Possession via ball position | Ball ownership modeled by moving the ball entity onto a player | OCF has a single ball; no schema change, honors frame deltas. | +| Release/preview on one Pages site | Root = tag, `/preview` = main, rebuilt each deploy | Coexisting stable + test builds without a `gh-pages` branch. | + +--- + +## 10. Quality Requirements + +Automated tests (Playwright; pure modules tested without a browser): + +| Suite | Focus | +|-------|-------| +| `tests/editor.spec.js` | App load, palette, settings, frames, undo/redo, JSON panel, viewer toggle, example import, version badge. | +| `tests/curves.spec.js` | Curve geometry: single quadratic with waypoint as control, apex on the same side as the waypoint, endpoints preserved; dribble waves alternate sides and follow bends. | +| `tests/renderer.spec.js` | Entity symbols (defender = open stroked arc), court surface/rim, line styling, and the half-court center-circle arc bulging into the court. | +| `tests/regressions.spec.js` | Ball possession, line selection/deletion, snap indicator persistence, right-click-selects, numbering cap, touch dragging (touch-action + generous radius), line-from-player. | + +Practice: each bug fix ships with a test verified to **fail on the pre-fix code** +and pass after. Full suite at the time of writing: **51 tests**. + +--- + +## 11. Risks and Technical Debt + +- **Viewer/animation path** is the least test-covered area (frame deltas, + playback timing) — next candidate for a rendered review + tests. +- **Court dimensions** are validated visually for plausibility, not numerically + against rulebooks (deliberate — drills, not pixel-perfect designs). +- **Schema deviations** from the published spec exist for ajv strict mode; a + drift risk if the spec changes (documented in `src/schema.js`). +- **Single-file bundle / global `OCFEditor`** is convenient for tests but is a + global; acceptable for a small reference app. +- **External fonts** (Google Fonts) are loaded from a CDN; offline/blocked + networks fall back to system fonts (cosmetic only). + +--- + +## 12. Glossary + +| Term | Meaning | +|------|---------| +| OCF | Open Coaching Format — the JSON standard this editor targets. | +| Entity | A court object: offense, defense, coach, cone, station, ball. | +| Frame | One step of a drill; carries lines and entity-state deltas. | +| Entity-state delta | Per-frame position override for an entity, layered on the base. | +| Named position | A ruleset-specific court location (e.g. `top_of_the_key`) used for snapping/coordinates. | +| Transform | The mapping between court coordinates and SVG viewBox coordinates. | +| Preview build | The deployment of the current `main` at `/preview/`. | +| Release build | The deployment of the newest `v*` tag at the site root. | From 578cb8711dfc626a259fe2f9f0cd07264a178c61 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 30 May 2026 11:14:49 +0000 Subject: [PATCH 4/5] docs(arc42): replace ASCII diagrams with Mermaid Convert the architecture diagrams to Mermaid (rendered natively by GitHub): - context flowchart (chapter 3) - building-block component diagram (chapter 5) - drag-interaction sequence diagram (chapter 6) - deployment graph + CI pipeline flowchart (chapter 7) All five diagrams were validated with the Mermaid parser and rendered in a headless browser to confirm they display correctly. --- doc/arc42.md | 113 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 12 deletions(-) diff --git a/doc/arc42.md b/doc/arc42.md index e18141c..bfb0b7a 100644 --- a/doc/arc42.md +++ b/doc/arc42.md @@ -63,14 +63,17 @@ reference implementation of the OCF format. ## 3. Context and Scope -``` - ┌─────────────────────────────────────────┐ - Coach ───▶│ OCF Editor (SPA) │───▶ .ocf.json file - (browser) │ court rendering · editing · playback │◀─── .ocf.json file - └─────────────────────────────────────────┘ - │ validates against - ▼ - OCF v1.0.0 JSON Schema (embedded copy) +```mermaid +flowchart LR + coach(["Coach
(browser)"]) + editor["OCF Editor (SPA)
court rendering · editing · playback"] + file[/".ocf.json file"/] + schema[["OCF v1.0.0 JSON Schema
(embedded copy)"]] + + coach -->|edits / views| editor + editor -->|export| file + file -->|import| editor + editor -.->|validates against| schema ``` - **In scope:** the browser application, its rendering/editing/playback logic, @@ -94,6 +97,52 @@ reference implementation of the OCF format. ## 5. Building Block View +```mermaid +flowchart TD + main["main.js
entry point · app mode · OCFEditor global"] + + subgraph ui["editor/ — UI"] + palette["palette.js"] + properties["properties.js"] + frames["frames.js"] + toolbar["toolbar.js"] + ctxmenu["context-menu.js"] + interaction["interaction.js
pointer drag · hit-test · draw"] + end + + state["editor.js
EditorState
(single source of truth + undo/redo)"] + + subgraph court["court/ — rendering"] + renderer["renderer.js
renderOCF()"] + courtsvg["court-svg.js
createTransform()"] + curves["curves.js"] + positions["positions.js"] + end + + player["player/player.js
FramePlayer"] + schema["schema.js
embedded schema"] + + subgraph exp["export/"] + validate["validate.js"] + json["json.js"] + end + + main --> ui + main --> state + main --> player + main --> renderer + ui --> state + state -.->|notify| ui + state --> schema + interaction --> renderer + renderer --> courtsvg + renderer --> curves + renderer --> positions + main --> exp + exp --> validate + exp --> json +``` + ### Level 1 — modules (`src/`) | Module | Responsibility | @@ -127,6 +176,29 @@ reference implementation of the OCF format. ### Editing an entity (drag) +```mermaid +sequenceDiagram + actor U as Coach + participant IM as InteractionManager + participant ES as EditorState + participant M as main.js (render) + + U->>IM: pointerdown + IM->>IM: hit-test (radius by pointer type) + IM->>IM: setPointerCapture + IM->>ES: select(entity) + loop pointermove + IM->>IM: client→viewBox via screen CTM + IM->>IM: snap to named position? + IM->>ES: moveEntity(x, y) + ES-->>M: notify + M->>M: re-render SVG (+ re-append snap indicator) + end + U->>IM: pointerup + IM->>IM: releasePointerCapture + Note over IM: swallow synthesized click after a real drag +``` + 1. `pointerdown` on the court → `InteractionManager` hit-tests entities (radius depends on pointer type) and starts a drag, capturing the pointer. 2. `pointermove` → convert client → viewBox coords via the SVG **screen CTM**, @@ -158,10 +230,12 @@ re-renders. Static site on **GitHub Pages**, assembled by `scripts/build-pages.sh`: -``` -GitHub Pages site -├── / → newest v* release tag (the "final" build) -└── /preview/ → current main (the "test" build) +```mermaid +flowchart LR + tag["newest v* tag"] -->|git archive → esbuild| root["/ (release build)"] + main["current main"] -->|git archive → esbuild| preview["/preview/ (test build)"] + root --> pages[["GitHub Pages site"]] + preview --> pages ``` - Both variants are rebuilt from their **own** git ref on every deploy @@ -172,6 +246,21 @@ GitHub Pages site ### CI pipeline (`.github/workflows/ci.yml`) +```mermaid +flowchart TD + trigger{{"trigger: PR · main push · v* tag"}} + build["build
npm ci → build → validate examples"] + test["test
Playwright E2E (chromium)"] + vcheck["version-check
(tag only) package.json == tag"] + deploy["deploy
assemble _site → GitHub Pages"] + + trigger --> build + build --> test + trigger -->|tag only| vcheck + test -->|main push or v* tag| deploy + vcheck --> deploy +``` + | Job | Runs on | Purpose | |-----|---------|---------| | `build` | PR, main push, tag push | `npm ci` → build → validate examples | From f1d15658cb74b6b6ca720a790f5e039f1b555aa8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 30 May 2026 15:20:49 +0000 Subject: [PATCH 5/5] docs(arc42): embed diagrams as PNGs for universal rendering The GitHub mobile app (and some other viewers) don't render ```mermaid``` code blocks. Pre-render all five diagrams to PNGs under doc/diagrams/ and embed them as images so they show everywhere, while keeping the editable Mermaid source in a collapsible
block beneath each image. Images were rendered from the Mermaid sources in a headless browser at 2x. --- doc/arc42.md | 30 ++++++++++++++++++++++++++++++ doc/diagrams/building-blocks.png | Bin 0 -> 16582 bytes doc/diagrams/ci-pipeline.png | Bin 0 -> 34691 bytes doc/diagrams/context.png | Bin 0 -> 16114 bytes doc/diagrams/deployment.png | Bin 0 -> 13767 bytes doc/diagrams/runtime-drag.png | Bin 0 -> 41627 bytes 6 files changed, 30 insertions(+) create mode 100644 doc/diagrams/building-blocks.png create mode 100644 doc/diagrams/ci-pipeline.png create mode 100644 doc/diagrams/context.png create mode 100644 doc/diagrams/deployment.png create mode 100644 doc/diagrams/runtime-drag.png diff --git a/doc/arc42.md b/doc/arc42.md index bfb0b7a..f8b8d09 100644 --- a/doc/arc42.md +++ b/doc/arc42.md @@ -63,6 +63,10 @@ reference implementation of the OCF format. ## 3. Context and Scope +![Context diagram: Coach uses the OCF Editor SPA, which imports/exports .ocf.json files and validates against the embedded OCF schema](diagrams/context.png) + +
Diagram source (Mermaid) + ```mermaid flowchart LR coach(["Coach
(browser)"]) @@ -76,6 +80,8 @@ flowchart LR editor -.->|validates against| schema ``` +
+ - **In scope:** the browser application, its rendering/editing/playback logic, the embedded schema and validator, examples, tests, and the CI/deploy pipeline. - **Out of scope:** the OCF specification itself (lives in @@ -97,6 +103,10 @@ flowchart LR ## 5. Building Block View +![Building block view: main.js wires the editor UI, the court rendering modules, the player, export, the embedded schema, and EditorState as the single source of truth](diagrams/building-blocks.png) + +
Diagram source (Mermaid) + ```mermaid flowchart TD main["main.js
entry point · app mode · OCFEditor global"] @@ -143,6 +153,8 @@ flowchart TD exp --> json ``` +
+ ### Level 1 — modules (`src/`) | Module | Responsibility | @@ -176,6 +188,10 @@ flowchart TD ### Editing an entity (drag) +![Sequence diagram of an entity drag: pointerdown hit-tests and captures, each pointermove maps client to viewBox via the screen CTM, snaps, and moves the entity which notifies a re-render; pointerup releases and swallows the synthesized click](diagrams/runtime-drag.png) + +
Diagram source (Mermaid) + ```mermaid sequenceDiagram actor U as Coach @@ -199,6 +215,8 @@ sequenceDiagram Note over IM: swallow synthesized click after a real drag ``` +
+ 1. `pointerdown` on the court → `InteractionManager` hit-tests entities (radius depends on pointer type) and starts a drag, capturing the pointer. 2. `pointermove` → convert client → viewBox coords via the SVG **screen CTM**, @@ -230,6 +248,10 @@ re-renders. Static site on **GitHub Pages**, assembled by `scripts/build-pages.sh`: +![Deployment: the newest v* tag is built to the site root and current main is built to /preview, both published to one GitHub Pages site](diagrams/deployment.png) + +
Diagram source (Mermaid) + ```mermaid flowchart LR tag["newest v* tag"] -->|git archive → esbuild| root["/ (release build)"] @@ -238,6 +260,8 @@ flowchart LR preview --> pages ``` +
+ - Both variants are rebuilt from their **own** git ref on every deploy (`git archive ` → esbuild → copy static files → stamp version badge). This is possible only because the app has no runtime deps and uses relative @@ -246,6 +270,10 @@ flowchart LR ### CI pipeline (`.github/workflows/ci.yml`) +![CI pipeline: a trigger runs build then test; tags also run version-check; deploy runs after tests on main pushes or v* tags](diagrams/ci-pipeline.png) + +
Diagram source (Mermaid) + ```mermaid flowchart TD trigger{{"trigger: PR · main push · v* tag"}} @@ -261,6 +289,8 @@ flowchart TD vcheck --> deploy ``` +
+ | Job | Runs on | Purpose | |-----|---------|---------| | `build` | PR, main push, tag push | `npm ci` → build → validate examples | diff --git a/doc/diagrams/building-blocks.png b/doc/diagrams/building-blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..efd284bde385d06a9414fc1efd2dd057d03cf99c GIT binary patch literal 16582 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

Q4`n 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 R;4diB;tFqzUw`oVKL7@>m|y?^ literal 0 HcmV?d00001 diff --git a/doc/diagrams/context.png b/doc/diagrams/context.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8cb3784780b6d691fb6120fff612aef10e2c32 GIT binary patch literal 16114 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 TM|gq$=AE>-f>@QvkAVLHx^sQ{ literal 0 HcmV?d00001 diff --git a/doc/diagrams/deployment.png b/doc/diagrams/deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..55b53d24d05ed9235262e9953383f18b4d62411a GIT binary patch literal 13767 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 literal 0 HcmV?d00001 diff --git a/doc/diagrams/runtime-drag.png b/doc/diagrams/runtime-drag.png new file mode 100644 index 0000000000000000000000000000000000000000..25d9f8cd78cc67a3027af57366097561c1e0945b GIT binary patch literal 41627 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

LzeZRmObE1>@R} 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 W9I~~qE2)4hJIrrbUN13riTXE>AWCEa literal 0 HcmV?d00001