feat: travel schedule page (v1) + nav updates (#77) #10

Open
forgejo_admin wants to merge 1 commit from 77-schedule-page-v2 into main

Summary

Add a v1 travel schedule page for Westside Kings & Queens with per-team tournament sections, and update navigation across all pages to include the new Schedule link.

Changes

  • westside/schedule.html — New Vite entry point for the schedule page (same pattern as index.html)
  • westside/Schedule.svelte — New Svelte component with travel teams (16U Elite, 17U Elite, 17U Select on Power 32 Circuit) and local teams (16U Local, 17U Local with Utah tournaments TBD). Uses Nav.svelte + Footer.svelte. Scoped styles for team badges, event lists, and date formatting.
  • westside/Nav.svelte — Added "Schedule" link between Sponsors and FAQ
  • westside/staff.html — Added Schedule nav link to hardcoded nav
  • westside/sponsors.html — Added Schedule nav link to hardcoded nav
  • westside/success.html — Added Schedule nav link to hardcoded nav
  • vite.config.js — Added westside-schedule entry point (no other changes)

Test Plan

  • npm run build passes with no errors
  • Visit /westside/schedule.html — shows hero, travel teams section (3 cards), local teams section (2 cards), CTA, footer
  • Nav on all pages (index, staff, sponsors, success, schedule) shows Schedule link between Sponsors and FAQ
  • Mobile hamburger menu includes Schedule link and closes on click
  • Travel team cards show red "Travel" badge, local cards show gray "Local" badge
  • Responsive: event dates stack correctly on mobile (375px), align on tablet/desktop

Review Checklist

  • Passed automated review-fix loop
  • No secrets committed
  • No unnecessary file changes
  • Commit messages are descriptive
## Summary Add a v1 travel schedule page for Westside Kings & Queens with per-team tournament sections, and update navigation across all pages to include the new Schedule link. ## Changes - **westside/schedule.html** — New Vite entry point for the schedule page (same pattern as index.html) - **westside/Schedule.svelte** — New Svelte component with travel teams (16U Elite, 17U Elite, 17U Select on Power 32 Circuit) and local teams (16U Local, 17U Local with Utah tournaments TBD). Uses Nav.svelte + Footer.svelte. Scoped styles for team badges, event lists, and date formatting. - **westside/Nav.svelte** — Added "Schedule" link between Sponsors and FAQ - **westside/staff.html** — Added Schedule nav link to hardcoded nav - **westside/sponsors.html** — Added Schedule nav link to hardcoded nav - **westside/success.html** — Added Schedule nav link to hardcoded nav - **vite.config.js** — Added `westside-schedule` entry point (no other changes) ## Test Plan - [x] `npm run build` passes with no errors - [ ] Visit `/westside/schedule.html` — shows hero, travel teams section (3 cards), local teams section (2 cards), CTA, footer - [ ] Nav on all pages (index, staff, sponsors, success, schedule) shows Schedule link between Sponsors and FAQ - [ ] Mobile hamburger menu includes Schedule link and closes on click - [ ] Travel team cards show red "Travel" badge, local cards show gray "Local" badge - [ ] Responsive: event dates stack correctly on mobile (375px), align on tablet/desktop ## Review Checklist - [x] Passed automated review-fix loop - [x] No secrets committed - [x] No unnecessary file changes - [x] Commit messages are descriptive ## Related - Closes forgejo_admin/westside-app#77
Add westside/schedule.html entry point and Schedule.svelte component
with per-team sections for travel (Power 32 Circuit) and local (Utah
tournaments) teams. Add "Schedule" nav link between Sponsors and FAQ
in Nav.svelte and all sibling HTML pages. Add Vite build entry point.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author
Owner

Review -- PR #10

Scope check

  • 7 files changed, 300 additions, 0 deletions
  • No base path changes (vite.config.js base untouched) -- constraint from issue #77 satisfied
  • No unrelated file changes

Code quality

  • Schedule.svelte follows existing component pattern (Nav + Footer imports, same section/card/cta-banner class usage)
  • Scoped styles use CSS custom properties from style.css consistently -- no hardcoded colors or magic numbers
  • Mobile-first layout with 640px breakpoint for date column width
  • Data is hardcoded in component (appropriate for v1, easy to extract later)
  • Team badge variants (travel=red, local=gray-bordered) provide clear visual distinction

Nav consistency

  • Schedule link added between Sponsors and FAQ in all 4 nav locations:
    • Nav.svelte (Svelte component with onclick={closeMenu})
    • staff.html, sponsors.html, success.html (hardcoded HTML nav)
  • Link format matches existing pattern exactly

Entry point

  • schedule.html follows same meta/OG/favicon/stylesheet pattern as index.html
  • vite.config.js entry point added in alphabetical position among westside entries

Build

  • npm run build passes, output includes westside/schedule.html and scoped CSS bundle

Nits

None.

VERDICT: APPROVE

## Review -- PR #10 ### Scope check - 7 files changed, 300 additions, 0 deletions - No base path changes (vite.config.js `base` untouched) -- constraint from issue #77 satisfied - No unrelated file changes ### Code quality - **Schedule.svelte** follows existing component pattern (Nav + Footer imports, same section/card/cta-banner class usage) - Scoped styles use CSS custom properties from style.css consistently -- no hardcoded colors or magic numbers - Mobile-first layout with 640px breakpoint for date column width - Data is hardcoded in component (appropriate for v1, easy to extract later) - Team badge variants (travel=red, local=gray-bordered) provide clear visual distinction ### Nav consistency - Schedule link added between Sponsors and FAQ in all 4 nav locations: - Nav.svelte (Svelte component with `onclick={closeMenu}`) - staff.html, sponsors.html, success.html (hardcoded HTML nav) - Link format matches existing pattern exactly ### Entry point - schedule.html follows same meta/OG/favicon/stylesheet pattern as index.html - vite.config.js entry point added in alphabetical position among westside entries ### Build - `npm run build` passes, output includes `westside/schedule.html` and scoped CSS bundle ### Nits None. **VERDICT: APPROVE**
Author
Owner

PR #10 Review

DOMAIN REVIEW

Tech stack: SvelteKit (Svelte 5 runes mode), Vite MPA, vanilla CSS with design tokens. This is a playground repo -- static HTML/CSS/Svelte prototypes, no production backend, no test framework.

Files changed (7): vite.config.js, westside/Nav.svelte, westside/Schedule.svelte (new), westside/schedule.html (new), westside/staff.html, westside/sponsors.html, westside/success.html. All changes are additions (+300/-0). Clean scope.

Scope creep check (critical -- PR #8 was NOT APPROVED for this): No base path changes anywhere. No base config in vite.config.js. The diff touches exactly the files described in the PR body -- schedule page + nav link additions to all hardcoded-nav HTML pages. Clean.

Component architecture: Schedule.svelte correctly imports Nav.svelte and Footer.svelte, matching the pattern established by App.svelte. The Svelte component uses mount() in the HTML entry point, matching the index.html pattern exactly.

CSS quality:

  • All spacing uses design tokens (--space-*). Good.
  • All colors use design tokens (--color-*). Good.
  • font-size: 0.75rem on .team-badge (line 179) is a hardcoded value rather than var(--font-size-sm) (0.875rem). This is a deliberate choice since there is no --font-size-xs token. Acceptable -- the badge intentionally needs a smaller size than the smallest token.
  • min-width: 100px / 120px on .schedule-event-date are magic numbers, but reasonable for date column width. No token exists for this. Acceptable.
  • gap: 0 on .schedule-events is explicit and intentional (events separated by border-top, not gap). Fine.
  • Responsive breakpoint at 640px matches the global stylesheet's tablet breakpoint. Good.
  • No breakpoint at 1024px needed since the schedule layout is single-column by design.

Accessibility:

  • schedule.html has lang="en". Good.
  • Nav component has aria-label="Main navigation", aria-expanded, aria-controls. Good.
  • Semantic HTML: sections with headings, ul for event lists, proper heading hierarchy (h1 > h2 > h3). Good.
  • The schedule event list items use <ul> / <li> which is correct semantics.
  • CTA link is a mailto with descriptive text. Good.

SEO / Meta:

  • schedule.html includes Open Graph and Twitter Card meta tags matching the pattern of other pages. Good.
  • Favicon links present. Good.
  • og:url is missing from schedule.html, but it is also missing from all other entry HTML files in this repo, so this is a pre-existing pattern, not a regression.

Nav consistency: The Schedule link is inserted between Sponsors and FAQ in all four locations:

  1. Nav.svelte (Svelte component used by index + schedule pages) -- line 35
  2. staff.html (hardcoded nav) -- line 45
  3. sponsors.html (hardcoded nav) -- line 45
  4. success.html (hardcoded nav) -- line 45

All four match. Nav link order is consistent: Home, About, Staff, Sponsors, Schedule, FAQ. Good.

DRY observation (nit, not blocker): The three travel teams share identical event arrays (same 5 Power 32 sessions with same dates). This is data, not logic -- they genuinely are the same circuit events. Extracting power32Events as a shared constant and referencing it from each team object would reduce duplication, but this is a v1 prototype with placeholder data. Acceptable for playground.

Hardcoded nav duplication (pre-existing): staff.html, sponsors.html, and success.html all have hardcoded nav HTML + inline JS for the hamburger menu, while index.html and schedule.html use the Svelte Nav.svelte component. This means nav changes require touching 4+ files. This is a pre-existing architectural debt, not introduced by this PR. The PR correctly updates all instances.

BLOCKERS

None.

This is a playground repo with no test framework configured (package.json has no test script, no vitest/playwright dependency). Per project conventions, playground repos are prototype gates -- test coverage requirements apply at the production repo stage, not here. The "new functionality with zero test coverage" blocker does not apply to playground prototypes.

No unvalidated user input (static content, no forms, no dynamic data). No secrets or credentials. No DRY violations in auth/security paths (no auth exists in this repo).

NITS

  1. DRY -- shared event data: The power32Events array is duplicated 3x across travelTeams. Consider extracting to a const power32Events = [...] and referencing it: events: power32Events. Low priority for a playground prototype with placeholder data.

  2. Missing --font-size-xs token: The .team-badge uses 0.75rem directly. If this pattern recurs, consider adding --font-size-xs: 0.75rem to the design tokens in style.css.

  3. Queens not represented in schedule data: The hero says "Westside Kings" (not "Kings & Queens"), and all team entries are "Kings" only. The page title in schedule.html says "Westside Kings & Queens." If Queens teams will be added, this is fine for v1. If not, the page title/meta should align with the content.

SOP COMPLIANCE

  • Branch named after issue: 77-schedule-page-v2 references issue #77
  • PR body has Summary, Changes, Test Plan, Related sections
  • Related references parent issue: Closes forgejo_admin/westside-app#77
  • Related references plan slug: No plan slug referenced. PR says no plan slug -- confirmed acceptable per task description.
  • No secrets committed
  • No unnecessary file changes (scope creep) -- verified clean after PR #8 rejection
  • Commit messages are descriptive (PR title follows conventional commit format)

PROCESS OBSERVATIONS

  • Scope discipline: This PR cleanly addresses the PR #8 rejection feedback. The base path changes were correctly separated into PR #9 (already merged). This PR contains only schedule page + nav updates. Good process recovery.
  • Deployment frequency: Low risk, additive-only change (+300/-0). No existing functionality modified beyond nav link additions.
  • Change failure risk: Minimal. Static content, no logic changes to existing components, no build config regressions (entry point addition only).
  • Cross-repo note: The parent issue is on westside-app but the work is in svelte-playground. This follows the playground-first convention correctly.

VERDICT: APPROVED

## PR #10 Review ### DOMAIN REVIEW **Tech stack**: SvelteKit (Svelte 5 runes mode), Vite MPA, vanilla CSS with design tokens. This is a playground repo -- static HTML/CSS/Svelte prototypes, no production backend, no test framework. **Files changed (7)**: `vite.config.js`, `westside/Nav.svelte`, `westside/Schedule.svelte` (new), `westside/schedule.html` (new), `westside/staff.html`, `westside/sponsors.html`, `westside/success.html`. All changes are additions (+300/-0). Clean scope. **Scope creep check (critical -- PR #8 was NOT APPROVED for this)**: No base path changes anywhere. No `base` config in `vite.config.js`. The diff touches exactly the files described in the PR body -- schedule page + nav link additions to all hardcoded-nav HTML pages. Clean. **Component architecture**: `Schedule.svelte` correctly imports `Nav.svelte` and `Footer.svelte`, matching the pattern established by `App.svelte`. The Svelte component uses `mount()` in the HTML entry point, matching the `index.html` pattern exactly. **CSS quality**: - All spacing uses design tokens (`--space-*`). Good. - All colors use design tokens (`--color-*`). Good. - `font-size: 0.75rem` on `.team-badge` (line 179) is a hardcoded value rather than `var(--font-size-sm)` (0.875rem). This is a deliberate choice since there is no `--font-size-xs` token. Acceptable -- the badge intentionally needs a smaller size than the smallest token. - `min-width: 100px` / `120px` on `.schedule-event-date` are magic numbers, but reasonable for date column width. No token exists for this. Acceptable. - `gap: 0` on `.schedule-events` is explicit and intentional (events separated by border-top, not gap). Fine. - Responsive breakpoint at `640px` matches the global stylesheet's tablet breakpoint. Good. - No breakpoint at `1024px` needed since the schedule layout is single-column by design. **Accessibility**: - `schedule.html` has `lang="en"`. Good. - Nav component has `aria-label="Main navigation"`, `aria-expanded`, `aria-controls`. Good. - Semantic HTML: sections with headings, `ul` for event lists, proper heading hierarchy (h1 > h2 > h3). Good. - The schedule event list items use `<ul>` / `<li>` which is correct semantics. - CTA link is a mailto with descriptive text. Good. **SEO / Meta**: - `schedule.html` includes Open Graph and Twitter Card meta tags matching the pattern of other pages. Good. - Favicon links present. Good. - `og:url` is missing from `schedule.html`, but it is also missing from all other entry HTML files in this repo, so this is a pre-existing pattern, not a regression. **Nav consistency**: The Schedule link is inserted between Sponsors and FAQ in all four locations: 1. `Nav.svelte` (Svelte component used by index + schedule pages) -- line 35 2. `staff.html` (hardcoded nav) -- line 45 3. `sponsors.html` (hardcoded nav) -- line 45 4. `success.html` (hardcoded nav) -- line 45 All four match. Nav link order is consistent: Home, About, Staff, Sponsors, **Schedule**, FAQ. Good. **DRY observation (nit, not blocker)**: The three travel teams share identical event arrays (same 5 Power 32 sessions with same dates). This is data, not logic -- they genuinely are the same circuit events. Extracting `power32Events` as a shared constant and referencing it from each team object would reduce duplication, but this is a v1 prototype with placeholder data. Acceptable for playground. **Hardcoded nav duplication (pre-existing)**: `staff.html`, `sponsors.html`, and `success.html` all have hardcoded nav HTML + inline JS for the hamburger menu, while `index.html` and `schedule.html` use the Svelte `Nav.svelte` component. This means nav changes require touching 4+ files. This is a pre-existing architectural debt, not introduced by this PR. The PR correctly updates all instances. ### BLOCKERS None. This is a playground repo with no test framework configured (`package.json` has no test script, no vitest/playwright dependency). Per project conventions, playground repos are prototype gates -- test coverage requirements apply at the production repo stage, not here. The "new functionality with zero test coverage" blocker does not apply to playground prototypes. No unvalidated user input (static content, no forms, no dynamic data). No secrets or credentials. No DRY violations in auth/security paths (no auth exists in this repo). ### NITS 1. **DRY -- shared event data**: The `power32Events` array is duplicated 3x across `travelTeams`. Consider extracting to a `const power32Events = [...]` and referencing it: `events: power32Events`. Low priority for a playground prototype with placeholder data. 2. **Missing `--font-size-xs` token**: The `.team-badge` uses `0.75rem` directly. If this pattern recurs, consider adding `--font-size-xs: 0.75rem` to the design tokens in `style.css`. 3. **Queens not represented in schedule data**: The hero says "Westside Kings" (not "Kings & Queens"), and all team entries are "Kings" only. The page title in `schedule.html` says "Westside Kings & Queens." If Queens teams will be added, this is fine for v1. If not, the page title/meta should align with the content. ### SOP COMPLIANCE - [x] Branch named after issue: `77-schedule-page-v2` references issue #77 - [x] PR body has Summary, Changes, Test Plan, Related sections - [x] Related references parent issue: `Closes forgejo_admin/westside-app#77` - [ ] Related references plan slug: No plan slug referenced. PR says no plan slug -- confirmed acceptable per task description. - [x] No secrets committed - [x] No unnecessary file changes (scope creep) -- verified clean after PR #8 rejection - [x] Commit messages are descriptive (PR title follows conventional commit format) ### PROCESS OBSERVATIONS - **Scope discipline**: This PR cleanly addresses the PR #8 rejection feedback. The base path changes were correctly separated into PR #9 (already merged). This PR contains only schedule page + nav updates. Good process recovery. - **Deployment frequency**: Low risk, additive-only change (+300/-0). No existing functionality modified beyond nav link additions. - **Change failure risk**: Minimal. Static content, no logic changes to existing components, no build config regressions (entry point addition only). - **Cross-repo note**: The parent issue is on `westside-app` but the work is in `svelte-playground`. This follows the playground-first convention correctly. ### VERDICT: APPROVED
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 77-schedule-page-v2:77-schedule-page-v2
git switch 77-schedule-page-v2

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff 77-schedule-page-v2
git switch 77-schedule-page-v2
git rebase main
git switch main
git merge --ff-only 77-schedule-page-v2
git switch 77-schedule-page-v2
git rebase main
git switch main
git merge --no-ff 77-schedule-page-v2
git switch main
git merge --squash 77-schedule-page-v2
git switch main
git merge --ff-only 77-schedule-page-v2
git switch main
git merge 77-schedule-page-v2
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forgejo_admin/svelte-playground!10
No description provided.