A disabled submit button communicates that something is wrong and refuses to say what. It is also skipped by keyboard focus and often unreadable against its background, so a screen reader user gets no signal at all.
Keep the button enabled. Validate on submit. Move focus to the first error and describe it in text.
The user learns what the form wants by asking, which is the interaction they were already attempting. The disabled state asks them to guess instead.
If the action is genuinely unavailable — a plan limit, a missing permission — say so in text next to the control. The reason is the useful part; the disabled state is just the absence of one.
One useful email a month
Design system patterns, front-end techniques and case study breakdowns. No promotions, no digest of other people's links.