Skip to content
Back to skills

Orbit Designer Empty Error

ASecurity

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.

  • 2 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 9, 2026
testingrustgophpbashapisecurity

Works with

  • api

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add adityaarsharma/orbit --skill orbit-designer-empty-error --agent claude-code

Installs 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 with every re-scan.

Security grade badge for Orbit Designer Empty Error
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/adityaarsharma-orbit-designer-empty-error/badge)](https://www.skillsdirectory.com/skills/adityaarsharma-orbit-designer-empty-error)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…