Repository navigation
chore: re-arm set-state-in-effect and close out the debt cleanup - #15
Merged
Merged
Conversation
The rule was demoted to a warning to land the Next.js 16 upgrade, with the six offending components tracked as follow-up work. All six are now fixed at the pattern level rather than silenced: the media-query reads go through a shared useSyncExternalStore hook, the arrival skip path no longer sets state synchronously in its layout effect, the contact toast is derived from the action state, and the nav closes on route change during render. Deleting the override restores eslint-config-next 16's default. npm run lint reports 0 errors and 0 warnings, and a deliberate setState-in-effect now fails the build as an error rather than a warning.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Ticks every acceptance criterion with the evidence behind it, records the two screenshot differences the spec's 'or every difference is explained' clause allows, and moves the feature to the Done table in the roadmap. The two explained differences: the original contact-page baseline is not reproducible because it was captured with a reCAPTCHA site key in the environment and no .env file exists in the repo, so the comparison was re-based on a fresh same-environment capture of pre-change main; and the two reduced-motion first-paint shots changed on purpose, which is the arrival fix.
This branch was successfully deployed
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.
Why
Closes the post-upgrade debt cleanup.
react-hooks/set-state-in-effectbecame an error ineslint-config-next16 and was demoted to a warning to land the upgrade, with the six offending components tracked as follow-up. All six are now fixed at the pattern level rather than silenced, across #10–#14:RevealandMagneticButtonread media queries through a shareduseSyncExternalStorehookPreloader's reduced-motion skip path no longer sets state synchronously in its layout effectToastandContactClientderive the toast from the action stateSiteNavcloses the mobile menu during render on apathnamechangeWhat changed
Deleted the override block and its comment, restoring
eslint-config-next16's default. No other change.Verification
npm run lintreports 0 errors and 0 warnings.npx tsc --noEmitis clean,npm testis 308 passed / 31 files, andnpm run checkpasses.The rule is armed, not merely un-overridden: a deliberate
setStateinside auseEffectadded to a scratch component fails as1 problem (1 error, 0 warnings)withreact-hooks/set-state-in-effect. Probe removed before committing.Also closes the feature
Ticks every acceptance criterion in
docs/features/post-upgrade-debt-cleanup.mdwith its evidence, and moves the feature to the Done table indocs/ROADMAP.md.Two screenshot differences are recorded under the spec's "or every difference is explained" clause. The original contact-page baseline turned out not to be reproducible — it was captured with a reCAPTCHA site key in the environment and no
.envfile exists in the repo, so contact rendered the real widget then and "reCAPTCHA is not configured." now. The comparison was re-based on a fresh same-environment capture of pre-changemain, against which contact is byte-identical at both viewports. The other difference is the two reduced-motion first-paint shots, which changed on purpose.No hydration warnings on a production build, checked in a real browser across all five routes at both
prefers-reduced-motionsettings — no console error or warning of any kind.