The summary.
MANY SITES BUILT WITH A FRAMEWORK DID NOT NEED ONE
Assess whether the complexity justifies the build step, the learning curve, and the code shipped to every visitor.
DESIGN COMPONENTS WITH EVERY STATE
Default, loading, empty, error, disabled. Components without them fail visibly in production.
Keep data fetching and business logic out of presentational components.
KEEP STATE LOCAL UNLESS IT GENUINELY NEEDS SHARING
Lifting everything to a shared store makes an application harder to reason about.
Treat server data as a cache, not as state you own.
START FROM NATIVE ELEMENTS
A button built from a generic container requires reimplementing keyboard handling, focus and announcement — and most implementations are incomplete.
Never remove the focus indicator; replace it with something better.
ANNOUNCE CHANGES THAT HAPPEN WITHOUT A PAGE LOAD
Otherwise a non-visual user has no indication anything happened.
DISABLE THE SUBMIT CONTROL WHILE SUBMITTING
Otherwise people click again and create duplicates.
TEST BEHAVIOUR, NOT IMPLEMENTATION
Tests coupled to implementation break on every refactor and prevent improvement.