mit einem Klick
harden
// Strengthen a UXSpec against real-world conditions — overflow, missing data, network failures, and accessibility
// Strengthen a UXSpec against real-world conditions — overflow, missing data, network failures, and accessibility
Add purposeful motion to a UXSpec — $animations, onEnter choreography, and timing tokens
Improve every piece of text in a UXSpec — descriptions, labels, error messages, empty states, and loading copy
Identify repeated patterns and consolidate them into $elements and shared tokens for systematic reuse
Collect design context, audience, intent, and requirements before writing any UXSpec JSON
Run a systematic quality audit on a completed UXSpec — design intent, consistency, accessibility, and state coverage
Walk through building a UXSpec (.uxspec.json) file — gathering requirements, making design decisions about layout/typography/color/motion/accessibility, designing the state machine, defining visuals, then compiling and verifying the output.
| name | harden |
| description | Strengthen a UXSpec against real-world conditions — overflow, missing data, network failures, and accessibility |
Strengthen a UXSpec against real-world conditions — long text, missing data, network failures, diverse devices, keyboard navigation. Specs that only work with perfect data aren't specs.
After the happy path is designed. When preparing a spec for production. When reviewing a spec and asking "what could go wrong?"
$visual or $description.Every async operation needs an error path. For each, define:
Error categories need different handling:
| Error type | UXSpec approach |
|---|---|
| Network/timeout | Show message + retry button. Preserve form state. |
| Validation | Inline per-field errors near the relevant input. Specific fix suggestion. |
| Permission | Explain what's needed and how to get it. Don't just say "forbidden." |
| Rate limiting | Show wait time. Disable the action with a visible countdown. |
| Not found | Explain what was expected. Offer search or navigation home. |
Not all loading is the same:
keyboard bindings in $visual for shortcuts. Every focusable element needs a visible focus state.enabledWhen tied to a loading flag.aria.label on icon buttons, abstract shapes, and any element where visual content isn't self-describingaria.live on dynamically updating regions: "assertive" for errors, "polite" for status updates$description if a specific combination is intentional.If the spec targets multiple screen sizes, note adaptation in $description:
A hardened spec doesn't assume ideal conditions. It explicitly handles what happens when text is too long, the network fails, the user navigates by keyboard, and data arrives empty. These aren't edge cases — they're Tuesday.