Implement the GratiText Figma designs across marketing, auth, recipients, and settings - #98
Merged
Merged
Conversation
- Add Fraunces/Poppins fonts and the Figma colour palette as semantic light/dark tokens with a matching type scale - Restyle button, input, textarea, checkbox, label, OTP and form field components to the pill-shaped Figma components - Rebuild header, footer, mobile menu and theme toggle per the designs - Rebuild the marketing landing page with extracted illustration assets, wave dividers, flower stickers, pricing and CTA banner Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
- Centre Fraunces headline over a cream form card with right-aligned primary action; full-bleed beige layout with bottom action on phones - Add PasswordField with show/hide toggle and eye icons - Share the country-code list (with flags) between signup and recovery - Let auth routes trim the header via a route handle Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
- Cream dashboard tint, table-style recipient list with column labels, bold weekday schedule, prepared-message counts and Manage buttons; card layout on phones - Full-bleed trial banner in the recipients layout and tier-aware header CTA / user menu (basic plan gets the orange upgrade button) - Recipient editor rebuilt on the shared FormPage shell with country code select, labelled time zones, weekly day/time pickers (with a cron fallback), pause/resume pill and reserved days on the Basic plan - Edit route no longer nests inside the recipient detail layout Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
kentcdodds
marked this pull request as ready for review
September 14, 2026 18:53
The paper plane carried part of the Figma dashed trail and a translucent smear from misaligned light/dark frames; the CTA leaves carried a sliver of the input field and a petal of the neighbouring flower. Re-cut all three from the light frame with tight regions and fixed palettes. Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
- Draw a true sine (7 periods desktop, 2.5 on phones) with the crest phase from the design - Raise the divider above neighbouring sections so the bottom wave is no longer painted over by the section that follows - Overshoot the section edge by 1 unit to avoid hairline gaps Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
- Remove the white gap above the green band by letting the wave rise into the hero's own padding; centre both stickers on the wave lines - Anchor the paper plane inside the trail SVG and use a path traced from the design so the tail connects and loops like the original - Scale up the How-it-works numbers, titles and body copy, and space the steps to the design's grid; use the 3rem section heading and 17px body - Place the CTA illustrations from measured positions; full-bleed banner on phones with the leaves strip visible - Pricing: narrower plan rows, smileys around (not over) the heading, cream featured card and outline basic button in dark mode - Footer sits on the cream pricing band for the landing page Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
The previous extraction region clipped the right and bottom petals; the wider region also picks up the banner's rounded corner, so pixels that are a blend of the banner colour and the page cream are dropped. Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Member
Author
|
bugbot run |
The bottom "Get started" form sent phoneNumber to /signup, which ignored it. Signup now reads the query param to prefill the country code and number. Logged-in visitors get a link to /recipients instead of the form, matching the hero CTA. Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
The field is labelled "Username or Phone Number" and login() already looks up phone numbers, but UsernameSchema rejected "+", spaces and dashes client-side. Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Track the md breakpoint with a media-query hook so role="dialog", aria-modal and the focus trap follow the viewport instead of a one-off read at render time. Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Member
Author
|
bugbot run |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit d7c8cfd. Configure here.
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Faithful implementation of the GratiText Figma designs (light, dark, and mobile frames).
public/images.FormPage.?edit=), settings link list, and dialog-style sub-pages (DialogPage) for password, 2FA, and subscription that float over the inert overview on desktop and render as full pages with a back link on phones.Landing page follow-up
Review follow-up
phoneNumberto/signup, which ignored it. Signup now reads the query param to prefill the country code and number; logged-in visitors get a "Go to your recipients" link instead of the form.UsernameSchema, which rejects+, spaces and dashes. It now uses a looser identifier schema (login()already matches phone numbers).DialogPagesetrole="dialog"/aria-modalunconditionally and read the breakpoint once. AuseMediaQueryhook now drives the role,aria-modaland the focus trap, so phones get a plain page and resizes stay in sync.Test Plan
bun run typecheck,bun run lint,bun run testpass.bunx playwright test(14 e2e tests) passes serially;settings-profileand2fatests updated for the inline edit / dialog flows.Checklist
Screenshots
Figma frame on the left, implementation on the right.