Skip to content

feat(golf): premium password-reset flow — pages + branded email (#650) - #1019

Merged
njrini99-code merged 2 commits into
mainfrom
feat/golf-auth-reset-redesign
Jul 23, 2026
Merged

feat(golf): premium password-reset flow — pages + branded email (#650)#1019
njrini99-code merged 2 commits into
mainfrom
feat/golf-auth-reset-redesign

Conversation

@njrini99-code

Copy link
Copy Markdown
Owner

What

Rebuilds the GolfHelm forgot-password and reset-password pages on the same illustrated auth chrome as the approved login redesign (#650), replacing the retired orb/glass look. Requested alongside the settings audit: "ensure the password reset model is modern and premium."

How

  • New GolfAuthShell (src/components/auth/GolfAuthShell.tsx) — factors the login's chrome into one reusable shell so both reset pages (and any future auth surface) stay pixel-matched:
    • LazyMotion + one scene per viewport (useMediaQuery swaps CoastalScene on desktop / CourseScene on mobile, exactly like the login)
    • floating HelmMark brand lockup + Golf/Helm wordmark
    • warm-cream form card (rgba(255,253,245,0.94), 24px radius, inset-highlight shadow)
    • footer slot + AuthPrimaryButton (login's submit button with a bouncing-dot loading state)
    • built on the shared ui/Input + ui/Button primitives → no raw input/button, no bg-white (lint ratchet clean)
  • forgot-password — shared Input, success ("Check your email") state; the hardened, rate-limited requestPasswordResetAction is preserved.
  • reset-password — recovery-session state machine preserved verbatim (getSession / exchangeCodeForSession / verifyOtpverifying/ready/invalid), PasswordStrengthIndicator, match/mismatch affordances, and danger-token error styling instead of raw red.

Verification

  • tsc + eslint clean (0 warnings) on all 3 files
  • Full business suite: 798 files / 7393 tests passed, 0 failed
  • Rendered all 3 states (forgot / check-email / link-expired) on desktop + mobile — premium, matches the login aesthetic exactly

🤖 Generated with Claude Code

…650)

Rebuild forgot-password and reset-password on the same illustrated auth
chrome as the login redesign (#650) — CoastalScene/CourseScene, the
HelmMark brand lockup, and the warm-cream form card — replacing the
retired orb/glass look. Shared chrome is factored into a new GolfAuthShell
so both pages (and future auth surfaces) stay pixel-matched to the login.

- GolfAuthShell: LazyMotion + one scene per viewport (useMediaQuery swaps
  Coastal on desktop / Course on mobile, exactly like the login), the
  floating HelmMark lockup, the cream form card, a footer slot, and
  AuthPrimaryButton (the login's submit button with a bouncing-dot
  loading state). Built on the shared ui Input/Button primitives so the
  lint ratchet stays clean (no raw input/button, no bg-white).
- forgot-password: shared Input + success ("Check your email") state;
  the hardened, rate-limited requestPasswordResetAction is preserved.
- reset-password: recovery-session state machine preserved verbatim
  (getSession / exchangeCodeForSession / verifyOtp → verifying/ready/
  invalid), PasswordStrengthIndicator, match/mismatch affordances, and
  danger-token error styling instead of raw red.

tsc + eslint clean (0 warnings); full business suite (798 files / 7393
tests) green against these changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LSNMRp1FKhPsiPZ3K7pR3d
@vercel

vercel Bot commented Jul 23, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
helmv3 Ignored Ignored Preview Jul 23, 2026 4:09pm

Request Review

@cursor

cursor Bot commented Jul 23, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@supabase

supabase Bot commented Jul 23, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project qmnssrrolpinvwjjnufo because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f82e5d81-2878-4c04-9623-4f06dae1b6f7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/golf-auth-reset-redesign

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The reset flow's web pages were premium, but the email Supabase sends on
resetPasswordForEmail() was its bare default template. Add a brand-matched
recovery email and wire it via config.toml so it's code-managed:

- supabase/templates/recovery.html — warm-parchment shell, the real
  GolfHelm helm-wheel mark (hosted /helm-golf-logo-transparent.png, 200 in
  prod) stacked above the live-text "GolfHelm" wordmark (so it still reads
  if a client blocks images), cream card, helm-green CTA linking
  {{ .ConfirmationURL }}, a plain-link fallback, 1-hour expiry, and a
  didn't-request-this reassurance line. Email-client-safe: table layout,
  inline styles, Outlook VML button, mobile media query.
- config.toml [auth.email.template.recovery] → subject + content_path.
  Applied to the linked project on `supabase config push`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LSNMRp1FKhPsiPZ3K7pR3d
@njrini99-code njrini99-code changed the title feat(golf): premium password-reset flow matching the approved login (#650) feat(golf): premium password-reset flow — pages + branded email (#650) Jul 23, 2026
@njrini99-code

Copy link
Copy Markdown
Owner Author

Added the branded reset email (real GolfHelm helm-wheel mark) + config.toml wiring in 06ff381 — this PR is now the complete premium reset flow (pages + email). Applies to the linked Supabase project on supabase config push.

@njrini99-code
njrini99-code merged commit 0605a11 into main Jul 23, 2026
51 of 53 checks passed
@njrini99-code
njrini99-code deleted the feat/golf-auth-reset-redesign branch July 23, 2026 16:29
njrini99-code added a commit that referenced this pull request Jul 24, 2026
…ical apply (#1022)

Extends the branded recovery email (#1019) to the two remaining
user-facing auth emails, and adds a safe way to apply all three to prod.

- supabase/templates/confirmation.html + email_change.html — same warm
  GolfHelm shell (real helm-wheel mark, cream card, helm-green CTA) as
  recovery. email_change names the target address via {{ .NewEmail }}
  (a variable GoTrue supports only for that template).
- config.toml — [auth.email.template.confirmation] + [.email_change];
  the block now carries an explicit ⚠️ warning NOT to `supabase config
  push` (that would push the dev site_url=127.0.0.1 and break prod).
- scripts/apply-auth-email-templates.sh — applies ONLY the 6 mailer_*
  fields via the Management API PATCH /config/auth (the documented
  partial-update endpoint), reading subjects/paths from config.toml as
  the single source of truth. Backs up first, then PROVES it was
  surgical with a full before/after key diff (fails if any non-template
  field changed). Token via SUPABASE_ACCESS_TOKEN env only — never
  stored/printed; umask 077 + payload cleanup on the temp files.

Adversarial review (3 agents) caught + fixed before ship: expiry copy
was "24 hours" but otp_expiry=3600 governs all three links → corrected
to "1 hour"; inline text-decoration:none on the buttons (webmail strips
<style>); the surgical proof + secret-file hardening above. Field names,
{{ .NewEmail }}, and the partial-PATCH behavior verified against the
Supabase docs. shellcheck clean; all 3 templates render premium.


Claude-Session: https://claude.ai/code/session_01LSNMRp1FKhPsiPZ3K7pR3d

Co-authored-by: Fable Integrator <fable@helm.local>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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