A framework-free static HTML prototype for clubs, tournament organisers, coaches and officials. It extends the Padeuce scoring experience into a responsive operational command centre for live matches, courts and competitions.
The site is a static bundle that can be hosted by any basic file server. For local development and production optimisation, install dependencies and run:
npm run devOpen the local URL shown in the terminal. The optimised production build is created with:
npm run buildThe checked-in wrangler.jsonc is the source of truth for both Vite and
Wrangler. The install lifecycle creates the production bundle before
Cloudflare reaches its deploy stage, so the repository works with the default
Workers Builds settings:
npx wrangler deployFor the existing Cloudflare Git integration, use:
- Build command: leave blank
- Deploy command:
npx wrangler deploy
The postinstall script deliberately supplies the build step because
Cloudflare Workers Builds does not honor Wrangler custom-build settings. If
the dashboard is later configured with npm run build as a separate build
command, the install hook may be removed to avoid building twice.
To verify the complete build and upload bundle locally without publishing:
npm run deploy:dry-runThe prototype uses a lightweight hash router:
#/login#/today#/competitions#/courts#/matches#/community#/insights#/sponsors#/assistant#/administration
Unauthenticated routes redirect to the login screen. Any valid email and a password of six or more characters will enter the prototype. Session state is stored in sessionStorage; remembered email is stored locally.
- Login validation, loading state, password visibility and logout
- Club, profile and notification menus
- Responsive sidebar, mobile drawer and bottom navigation
- Dashboard action confirmations, live court actions and toast feedback
- Deterministic Padeuce Assistant responses and dismissible suggestions
- Competition tabs, search, format/status/venue filters and selected-tournament details
- Mobile tournament bottom sheet
- Court operations grid, list and CSS map views with persistent display mode
- Court status and zone filters, live search, sorting and selected-court details
- Start, confirm, delay, assign, reconnect, move, official-request and add-court workflows
- Responsive court detail drawer with keyboard focus trapping
- Match table, chronological timeline and draggable Kanban views with session-persisted display mode
- Tournament, round, court, status, player, date, format, official and free-text match filtering
- Selected-match scoring, teams, history, notes and operational detail panel or mobile drawer
- Launch scoring, pause, resume, move, confirm, cancel, share, import, export and new-match workflows
- Community Players, Teams, Coaches and Officials directories with per-tab filters and persistent active tab
- Semantic list tables, responsive profile cards, selected-profile details and keyboard-operable directory tabs
- Add Person and Add Team flows, invitations, assignments, editable notes, attention filters and CSV export
- Five-step tournament creation flow that adds a session-local draft
- Five-step match creation flow that adds a session-local scheduled match
- Tournament import, more menus, help, request-access and password-reset dialogs
Design tokens live in css/styles.css. The core palette uses deep navy surfaces, restrained cool-grey borders and selective electric chartreuse emphasis. Headings use a Montserrat-style system stack; body copy uses an Inter-style system stack.
The prototype uses semantic controls, labels, visible focus treatment, 44px mobile targets, keyboard-operable menus, modal focus trapping, Escape-to-close behaviour, ARIA state attributes and reduced-motion support. Statuses always combine colour with text and symbols.
index.html- semantic markup for login, command centre, competitions, courts, matches, placeholders, dialogs and mobile navigationjs/app.js- shared hash routing, shell state and cross-screen interactionsjs/data.js- local courts, matches, competitions, activity, schedule and navigation datajs/pages/courts.js- court operations state, filters, view rendering and workflowsjs/pages/matches.js- match operations state, filters, three views and workflowsjs/pages/community.js- community tabs, filtering, session-local records, assignments and export flowsjs/components/- reusable court and match cards, detail panels, status utilities and view controlscss/styles.css- reset, tokens, components, pages and responsive behaviourcss/pages/courts.css- Courts-specific grid, list, map, detail and responsive stylescss/pages/matches.css- Matches-specific table, timeline, Kanban, detail and responsive stylescss/pages/community.css- Community directory, profile, modal and responsive stylesassets/- local imagery and brand assetsmanifest.webmanifest- installable-site metadatawrangler.jsonc- Cloudflare Worker, static assets and deployment build configuration
The browser application has no framework, no inline styles, no inline scripts and no runtime dependency.
Add a route entry to navItems in js/data.js, add the semantic page section to index.html, and update syncRoute() in js/app.js. Shared shell, modal, toast, heading, button and status styles can be reused.
Keep the competition, court and match object shapes in js/data.js as view models. Replace the seed arrays and other static exports with asynchronous fetch functions, then load them into the existing screen state. The filtering, selection and rendering functions can remain unchanged.