feat: Teams page with Kings/Queens toggle + profile gate (#93) #44
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "93-teams-page"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
[data-program-content]to avoid conflicts with coach.html gridChanges
teams.html(new): Full teams page with KQ toggle, 5 Kings team sections (16U Elite, 17U Elite, 17U Select, 16U Local, 17U Local), roster cards with mock player data, profile-pending placeholders, Queens coming-soon block, CTA, footershared/style.css: Roster card styles, profile-pending state (dashed border, dimmed opacity), Queens coming-soon box, responsive grid (1col mobile, 2col tablet, 3col desktop)index.html: Add Teams to navabout.html: Add Teams to navstaff.html: Add Teams to navtryouts.html: Add Teams to navsponsors.html: Add Teams to navschedule.html: Add Teams to navregister.html: Add Teams to navsuccess.html: Add Teams to navTest Plan
Review Checklist
Related Notes
westside-playground-overhaul— parent projectReview: PASS
Files reviewed: 10 (1 new, 9 modified)
Checks
kq-toggle/data-program-contentpattern as tryouts.html.initKQToggle()auto-wires on DOMContentLoaded.data-program-content="queens"wrapper.[data-program-content] .roster-gridand[data-program-content] .roster-cardprevent conflicts with the existing coach.html roster grid (which uses unscoped.roster-grid/.roster-card).Nits (non-blocking)
None found. Clean implementation.
Ready for Lucas phone review at 390px.
PR #44 Review
DOMAIN REVIEW
Tech stack: Static HTML/CSS playground (vanilla JS via shared/app.js). No build step, no framework, no backend.
KQ Toggle reuse -- Correctly reuses the
initKQToggle()function fromshared/app.js(line 405). The function is auto-initialized onDOMContentLoaded(line 458), soteams.htmlneeds zero inline JS. Thedata-program-content="kings"anddata-program-content="queens"attributes match the selector pattern used by the toggle function. localStorage persistence of program state works across page navigations.CSS scoping -- The PR description claims styles are "scoped under
[data-program-content]to avoid conflicts with coach.html roster grid." Verified:coach.htmluses.roster-gridand.roster-card(unscoped, lines 2349-2413 ofshared/style.css), while the new teams page styles use[data-program-content] .roster-gridand[data-program-content] .roster-cardwith higher specificity. No collision. Thedisplay: griddeclaration is correctly inherited from the unscoped.roster-gridrule via cascade.Nav consistency -- Teams link inserted at the same position on all 8 public pages (after Staff, before Tryouts). Verified against
mainbranch nav order. Thetryouts.htmlpage already had forward references toteams.html("View Teams" links at lines 100 and 112) from a prior PR -- this PR fulfills those references.Responsive grid -- Follows the existing breakpoint pattern: 1-column mobile (default), 2-column at tablet media query, 3-column at desktop media query. Both responsive overrides are present in the diff.
Accessibility --
aria-hidden="true"on decorative photo placeholders,aria-labelon nav toggle,lang="en"on html element. Heading hierarchy is correct (h1 in hero, h2 per team section, h3 in Queens coming-soon).HTML structure -- Clean semantic markup. Proper
<section>usage, meta description, Open Graph tags. OG image URL matches all other pages.BLOCKERS
None.
This is a static HTML/CSS playground page. No user input processing, no backend integration, no auth paths, no secrets. The BLOCKER criteria (unvalidated input, secrets, DRY auth violations, zero test coverage) do not apply to this domain -- there is no automated test infrastructure for static playground pages, and the test plan appropriately defines manual visual verification steps.
NITS
DRY:
.roster-photo-placeholderand.roster-photo-pendingshare 3 identical properties --width: 56px,height: 56px,min-width: 56px,border-radius: 50%. Could extract a shared base class (e.g.,.roster-photo) and extend with modifiers. Low impact but worth noting for when these patterns promote to SvelteKit components.Hardcoded
font-size: 3remon.queens-coming-soon-icon-- The stylesheet defines--font-size-4xl: 2.5remand--font-size-5xl: 3.5rembut has no3remvariable. This is the only3remvalue in the entire stylesheet. Could use one of the existing tokens or add a new one.Partial scoping -- The PR description says styles are scoped under
[data-program-content], but only.roster-gridand.roster-carduse the scope selector. The child classes (.roster-photo-placeholder,.roster-info,.roster-name,.roster-number,.roster-detail,.roster-note, and all pending/queens classes) are unscoped. These names are unique so there is no collision today, but the scoping strategy is inconsistent with the stated intent. When promoting to SvelteKit this becomes moot (component scoping takes over).Profile Pending card markup repeated 12 times -- Each pending card is an identical 7-line HTML block. In the playground this is fine (static mock data), but when promoting to SvelteKit, this should be a
{#each}block or a component.SOP COMPLIANCE
93-teams-pagereferences issue #93)westside-playground-overhaul). No plan slug -- consistent with user instruction that not all work needs plans.forgejo_admin/westside-app#93)PROCESS OBSERVATIONS
Clean, well-scoped PR. The
initKQTogglereuse pattern is working as intended -- zero new JS for new pages that use the toggle. The nav duplication across 8 HTML files is an inherent cost of the playground approach (no shared layout component), but it is mitigated by the fact that SvelteKit will have a single+layout.svelte. The profile-pending placeholder pattern is a strong visual design choice that clearly communicates the completeness gate concept for promotion to the real app.VERDICT: APPROVED