algorithmic-color-pale…
Derive a full UI colour palette algorithmically from one or two brand colours. Darker and lighter variants for interactive states, desaturated greys from the…
Forms have three layers of guidance: helper text below the input explains what to enter, placeholder shows the expected format, and validation confirms correctness. Real-time validation for complex inputs. Submit enables only when the form is valid. Use when designing or
$ npx -y skills add dembrandt/dembrandt-skills --skill form-design --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/form-designContext preview
The summary Claude sees to decide when to auto-load this skill.
Forms have three layers of guidance: helper text below the input explains what to enter, placeholder shows the expected format, and validation confirms correctness. Real-time validation for complex inputs. Submit enables only when the form is valid. Use when designing or
name: form-design
description: "Forms have three layers of guidance: helper text below the input explains what to enter, placeholder shows the expected format, and validation confirms correctness. Real-time validation for complex inputs. Submit enables only when the form is valid. Use when designing or reviewing any form, input field, or data entry UI."
metadata:
priority: 8
pathPatterns:
- "components/**"
- "src/components/**"
- "**/*.tsx"
- "**/*.jsx"
- "**/*.html"
- "design-system/**"
- "ui/**"
promptSignals:
phrases:
- "form"
- "input"
- "validation"
- "placeholder"
- "helper text"
- "field"
- "submit"
- "required"
- "error message"
- "fieldset"
retrieval:
aliases:
- form design
- input validation
- helper text
- placeholder
- form validation
- real-time validation
- submit button state
intents:
- design a form
- add validation to inputs
- write helper text
- enable submit when valid
- add real-time validation
- improve form usability
examples:
- add helper text to this input
- validate this field in real time
- disable the submit button until the form is valid
- design this form with proper validationForms are where users give the product data. Every unnecessary obstacle between the user and a completed form is a failure. The design goal is to make correct input easy and incorrect input obvious — before the user submits.
---
Each layer serves a distinct purpose. Do not collapse them.
Explains *what* to enter. Appears below the input, always visible, in small secondary text.
Email address [ ] Use the email you signed up with.
Shows the *format* or an example value. Appears inside the input, disappears on typing.
[jane@example.com ]
Confirms whether the input is correct. The most important layer.
Email address [jane@ ] ← invalid ✗ Enter a valid email address.
**Validation timing:**
Real-time validation must be forgiving at the start — do not show an error the instant the user starts typing. Show it after a short debounce (300–500ms) or after the first character that makes the input definitively wrong.
---
The submit button enables when the form is valid. This is one of the clearest affordance signals in form design — the user sees the goal and knows when they have reached it.
[Submit] ← disabled, low contrast, cursor: not-allowed
(fields incomplete or invalid)
[Submit] ← enabled, full colour, cursor: pointer
(all required fields valid)**Implementation:**
<button type="submit" disabled={!isFormValid}>Submit</button>For long or complex forms where real-time validation is not practical, do not disable the submit — validate on submit and scroll to errors instead. Disabled submit on a long form frustrates users who cannot tell what is missing.
**Loading state on submit:** Replace label with spinner, disable the button. Prevent double-submission.
---
[Label] [Optional badge if optional] [Input field ] [Helper text — what to enter, format, constraints ] [Error message — appears below helper text on validation fail ]
<div class="field">
<label for="vat">VAT number <span class="optional">Optional</span></label>
<input
id="vat"
type="text"
placeholder="FI12345678"
aria-describedby="vat-helper vat-error"
aria-invalid="true"
>
<p id="vat-helper" class="helper-text">Finnish VAT numbers start with FI followed by 8 digits.</p>
<p id="vat-error" class="error-text" role="alert">Enter a valid Finnish VAT number (e.g. FI12345678).</p>
</div>---
Mark the minority. If most fields are required, mark the optional ones. If most are optional, mark the required ones.
<label>Email <abbr title="Required">*</abbr></label> <!-- or --> <label>Phone <span class="badge">Optional</span></label>
---
Related fields belong in a `<fieldset>` with a `<legend>`. This is semantic HTML and helps screen readers announce the group context.
<fieldset> <legend>Billing address</legend> <label>Street</label><input type="text"> <label>City</label><input type="text"> <label>Postal code</label><input type="text"> </fieldset>
Use fieldsets for:
---
Use the correct `type` — browsers provide free validation, appropriate keyboards, and autofill.
| Data | In
UX and design-system skills for AI agents. Install once, and your agent knows how to design. --all installs every skill at once. They load only when a prompt needs them, so there is no runtime cost to having them all. Want to pick by hand?
Repo: dembrandt/dembrandt-skills
Derive a full UI colour palette algorithmically from one or two brand colours. Darker and lighter variants for interactive states, desaturated greys from the…
The persistent shell around an application — the top bar, the app launcher, the tenant and environment cue, and in heavy tools a status bar. In an estate of…
Product visuals — hero shots, demos, screenshots, landing-page panels — must reproduce the real product, not a stylised poster of it. Design with real content…
A brand's visual tone — playful or serious, rounded or angular — should be consistent across all UI elements. Shape language in typography, border-radius, and…
Every interactive element needs a complete set of visual states — rest, hover, active/pressed, focus, disabled, and loading. States should be derived…
Rebuild an existing web page 1:1 from measurement instead of by eye — into Figma, Penpot, or code. Captures the rendered page, the raw source and the computed…