Audit empty-states + error-states across a WordPress plugin's admin UI — every list / table / dashboard / form should have a designed empty state with CTA, and every error path should have a recoverable error message (not a stack trace). Use when the user says "empty state audit", "error state design", "blank screen UX", or after a UX review.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add adityaarsharma/orbit --skill orbit-designer-empty-error --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Orbit Designer Empty Error?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/adityaarsharma-orbit-designer-empty-error)More formats (shields.io, HTML) on the badges page.
---
name: orbit-designer-empty-error
description: Audit empty-states + error-states across a WordPress plugin's admin UI — every list / table / dashboard / form should have a designed empty state with CTA, and every error path should have a recoverable error message (not a stack trace). Use when the user says "empty state audit", "error state design", "blank screen UX", or after a UX review.
---
# 🪐 orbit-designer-empty-error — Empty + error state audit
The two states designers forget. Empty = "nothing here yet" = first impression. Error = "something broke" = trust moment. Both ship as afterthoughts in 80% of plugins.
---
## Quick start
```bash
PLUGIN_SLUG=my-plugin npx playwright test --project=designer-states
```
The spec navigates to every admin page in a fresh-install state (no data) AND a forced-error state (broken DB, missing file, expired session) and screenshots both.
---
## What it checks
### 1. Empty-state coverage
For every list / table / dashboard:
- Is there content shown when no data exists?
- Does it explain *why* it's empty?
- Does it include a CTA to populate it?
**Whitepaper intent:** A blank table after fresh install = user thinks "broken." A designed empty state = user thinks "next step is clear."
```
✅ Good empty state
┌──────────────────────────────────────────┐
│ 📋 No submissions yet │
│ │
│ When someone fills out your form, │
│ their submissions will show up here. │
│ │
│ [ Create your first form → ] │
└──────────────────────────────────────────┘
❌ Bad empty state
┌──────────────────────────────────────────┐
│ No items found. │ ← nothing else
└──────────────────────────────────────────┘
```
### 2. Error-state coverage
For every error path:
- Replace stack traces with friendly message
- Include action ("Try again", "Contact support", "Go back")
- Log the technical detail to error_log, not the UI
- Avoid blame ("You did X wrong") in favour of partnership ("Let's try again")
```php
// ❌ Stack trace to user
catch ( Exception $e ) {
echo $e->getMessage() . $e->getTraceAsString();
}
// ✅ Friendly + logged
catch ( Exception $e ) {
error_log( 'My Plugin: ' . $e->getMessage() . ' ' . $e->getTraceAsString() );
echo '<div class="notice notice-error"><p>' .
esc_html__( "Something didn't go as expected. Please try again, or contact support if this keeps happening.", 'my-plugin' ) .
'</p></div>';
}
```
### 3. Loading states between empty + filled
- Skeleton loaders or spinners while fetching
- Indeterminate progress for unknown durations
- Time-based fallback ("Still loading… retry in 30s")
### 4. Network error states
- Disconnected → show offline indicator
- API down → show "Service temporarily unavailable, try in 5 min"
- Timeout → distinguish from "no results"
### 5. Partial data states
- 404 entity (e.g. plugin's CPT post deleted but linked elsewhere)
- Permission denied (user lacks capability)
- Quota exceeded (free plan limit)
---
## Output
```markdown
# Empty + Error State Audit — my-plugin
## Empty states (12 admin pages scanned)
- ✓ 6 pages have designed empty states with CTAs
- ⚠ 4 pages show blank table only ("No items found.")
- ❌ 2 pages show JS error in console when empty
## Error states
- ✓ Settings save failure shows friendly message
- ❌ DB query failure dumps Exception::getTraceAsString() to UI (security + UX)
- ❌ REST endpoint timeout shows "Network Error" with no retry
## Loading states
- ⚠ 8 admin pages have no loading indicator — perceived as broken on slow connections
## Recommendations
1. Design 4 missing empty states with CTAs
2. Wrap all PHP exceptions in friendly notices
3. Add skeleton loaders to top 5 list pages
```
---
## Pair with
- `/orbit-designer-tokens` — visual consistency
- `/orbit-pm-ux-audit` — guidance score
- `/orbit-accessibility` — error-message a11y associations
- `/orbit-wp-security` — exception leak = info disclosure
---
## Sources & Evergreen References
### Canonical docs
- [Material Empty States](https://m3.material.io/components/empty-states/overview) — pattern reference
- [NN/g — Error Message Guidelines](https://www.nngroup.com/articles/error-message-guidelines/) — research
- [WP Admin Notices API](https://developer.wordpress.org/reference/hooks/admin_notices/) — official notice patterns
### Last reviewed
- 2026-04-29
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!