Skip to content

Collect the graduation year and country on the profile - #383

Merged
PatrikBak merged 2 commits into
mainfrom
patrik/profile-competition-fields
Aug 22, 2026
Merged

Collect the graduation year and country on the profile#383
PatrikBak merged 2 commits into
mainfrom
patrik/profile-competition-fields

Conversation

@PatrikBak

Copy link
Copy Markdown
Owner

Adds the two competition fields to the profile page, alongside the username that shipped in #382. Nothing reads either column yet.

Schema. Three columns on User: GraduationYear, HasLeftHighSchool, CountryCode. All nullable or defaulted, nobody backfilled, and all three join the webhook upsert's exclude list so a Clerk avatar change cannot wipe them.

Being past school is an answer, not a missing year. Somebody who left years ago has no reason to remember which year it was, so they say so outright. The two are exclusive: setting one clears the other. Nothing bounds the year column, and the form offers the current year onward.

The page splits on privacy. Email and member-since are the account's own business; the year and the country are what a results listing shows. Both save on the pick, so neither has a Save button. The sign-out button is gone: the avatar menu already carries one on every page, and a lone red button under a divider reads as "delete account".

Controls. SearchableSelect joins the shared set, built on a HeadlessUI Combobox with accent-folding prefix-first matching, and puts the reader's own country first. It shares its panel, option row and chevron with Select, and both now live under shared/components/select/.

Two fixes fell out of building it. Both panels carried a max-h class that never applied, because HeadlessUI's anchor writes its own inline max-height; the cap goes through --anchor-max-height now. And macOS hides overlay scrollbars at rest, so a 250-row list looked like it ended after seven items until the house scrollbar-visible utility went on.

🤖 Generated with Claude Code

A competition has to know where to place a student before it can place
them, and the country is the one thing nobody can reconstruct after the
fact. Both are asked for now, while there is a form to ask in, and
nothing reads either yet.

Being past high school is its own answer rather than an old year:
somebody who left years ago has no reason to remember which year it was.
The two are exclusive, so saying one clears the other. Nothing bounds the
column, and the years the form offers start at the current one.

The profile splits on privacy. Email and member-since are the account's
own business; the year and the country are what a results listing shows.
Saving happens on the pick, so there is no Save button, and the sign-out
button is gone from the page since the avatar menu already carries it.

The country needs search over 250 options, so SearchableSelect joins the
shared set on a HeadlessUI Combobox, with the reader's own country first.
Both selects now share their panel, option row and chevron, and both take
their height cap through --anchor-max-height, since the anchor writes an
inline max-height that no class can beat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
math-comps Ready Ready Preview Aug 22, 2026 4:17pm

SELECT_PANEL_GAP arrived in the previous commit by mistake, along with a
docblock describing a positioner this branch does not have. Nothing
imports it, so knip refuses the build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@PatrikBak
PatrikBak merged commit 3c27b1d into main Aug 22, 2026
5 checks passed
@PatrikBak
PatrikBak deleted the patrik/profile-competition-fields branch August 22, 2026 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant