Follow-up to #16.
Problem #
#16 lists why the submit buttons are disabled in a box right above them ("Before you can create this automation: • Give it a name."). The box has its own look: a neutral bordered card with secondary text, matching neither the shared Alert nor the form's own field errors. It also points at the problem from far away: the name field is at the top of a long form, unmarked, while the message about it sits at the bottom. And it doesn't cover every required field, so the form now validates two ways that look nothing alike.
Evidence #
app/islands/AutomationForm.tsx:3070:#submit-blockers, rendered above the create buttons and inside the sticky edit bar.app/islands/AutomationForm.css.ts:324:submitBlockers, a one-off style (surface background,bordercolour,textSecondary), next to the form's own copies of the alert styles (alertError/alertInfo/alertWarning, l. 341+).app/components/Alertalready provides these variants.- The form already has a field-level error pattern:
aria-invalid+aria-describedby+s.errorTextunder the input (variable step name,AutomationForm.tsx:2466). blockingReasons(AutomationForm.tsx:1608) checks the name, trigger events and an action step, but not the Lexicon NSID. An empty NSID leaves the buttons enabled, andNsidComboboxforwardsrequired, so the browser's native bubble is what stops the submit.
Expected #
The form says what's missing where it's missing, with the styles the rest of the UI uses:
- Each blocking field shows its own message under it with the existing
errorTextpattern andaria-invalid, for the name, the Lexicon NSID, the trigger events and the steps. - To avoid a fresh form opening covered in red, the field messages show once the user has tried to submit (or left the field). The buttons stay enabled; a submit with missing fields shows them and moves focus to the first one, instead of a disabled button with a list.
- Next to the buttons, at most one short line in the shared style (an
Alertvariant, or the form'serrorText), e.g. "2 things to fix before you can create this automation", not a bespoke box. - The Lexicon NSID goes through the same path as the other fields, not the browser's native bubble.
Acceptance criteria #
Out of scope #
Replacing the form's other local alert copies (alertError / alertInfo / alertWarning) with Alert everywhere: worth its own issue.
Queued: the loop will work on this version of the issue.
loop:queued cid=bafyreidjyckngx3w4nwmc7o3kftnutygae25rjmp4xbmpvllsimjrxo3ly