Skip to content
Back to skills

Edge State Ux Designer

ASecurity

Design the non-happy-path UI states for a view or flow — the distinct empty states (first-run vs filtered-to-nothing vs error-emptied, each with its own copy and next action), loading states (skeleton vs spinner vs inline, a delay threshold to avoid flash, optimistic updates with rollback), error states (inline vs toast vs full-page, retry affordance, partial failure, stale-on-error), and the permutations teams forget (offline, refetching/stale, slow, partial data, permission-denied, too-much...

  • 4 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 11, 2026
designgogit

Works with

  • cursor

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 28, 2026

npx -y skills add ModernNomad-98/Project-Aegis --skill edge-state-ux-designer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Edge State Ux Designer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Edge State Ux Designer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/modernnomad-98-edge-state-ux-designer/badge)](https://www.skillsdirectory.com/skills/modernnomad-98-edge-state-ux-designer)

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: edge-state-ux-designer
description: Design the non-happy-path UI states for a view or flow — the distinct empty states (first-run vs filtered-to-nothing vs error-emptied, each with its own copy and next action), loading states (skeleton vs spinner vs inline, a delay threshold to avoid flash, optimistic updates with rollback), error states (inline vs toast vs full-page, retry affordance, partial failure, stale-on-error), and the permutations teams forget (offline, refetching/stale, slow, partial data, permission-denied, too-much-data). Produces a per-view state matrix so every state is deliberate, never a blank screen or an eternal spinner. Renders the codes/messages from error-taxonomy-designer; owns presentation, not the error model. Use when designing empty/loading/error states, first-run experiences, or when a screen shows nothing on the unhappy path. Do NOT use to design error codes/taxonomy (error-taxonomy-designer), mobile viewport/touch craft (mobile-viewport-craft), or to verify state accessibility (accessibility-test-harness).
---

# Edge State UX Designer

Terms: **UX** means user experience; **UI** means user interface; **CTA**
means call to action; **a11y** means accessibility. HTTP **403** denotes
forbidden access and **404** denotes a missing resource.

## Purpose

Product design covers the happy path and forgets the other twelve
states. The result ships to production: a list that shows a blank white
rectangle when it's empty (is it loading? broken? actually empty?), a
spinner that never resolves when the network drops, a search that
returns "No results" with the same dead-end copy whether you have no
data yet or just filtered too hard. This skill produces the design for
every non-happy-path state of a view — the three different empties,
loading that doesn't flash or lie, errors placed and retried
appropriately, and the permutations everyone forgets (offline, stale,
partial, forbidden) — as a per-view state matrix where each state has a
deliberate trigger, visual, copy, and next action. It RENDERS the error
model that `error-taxonomy-designer` defines; it does not design the
codes.

## Use When

- Use when: designing the empty, loading, and error states for a view,
  list, form, or flow — or auditing a screen that only handles success.
- Use when: a screen shows a blank area, a raw error, or an eternal
  spinner on the unhappy path, and users can't tell which state they're
  in.
- Use when: designing a first-run / zero-data experience, or the
  difference between "you have nothing yet" and "your filter matched
  nothing".
- Use when: adding optimistic updates and you need the rollback/failure
  presentation, or designing partial-failure UX (some widgets load, some
  fail).
- Do NOT use when: the task is the error MODEL — categories, machine
  codes, retryable flags, the envelope — that is `error-taxonomy-designer`;
  this skill renders what that produces.
- Do NOT use when: the task is mobile viewport / touch / responsive
  layout craft (breakpoints, touch targets, safe areas) — that is
  `mobile-viewport-craft`.
- Do NOT use when: the task is VERIFYING accessibility of these states
  (keyboard, screen-reader announcements, contrast) as a test pass —
  that is `accessibility-test-harness`; this skill designs the states and
  notes their a11y intent, which that harness then checks.

## Inputs to Inspect

1. The view's data lifecycle: where the data comes from, whether it can
   be empty legitimately, how long it typically takes to load, and
   whether it refetches/polls (each is a state).
2. The error surface for this view: which taxonomy codes it can receive
   (from `error-taxonomy-designer` output), which are retryable, and
   which are per-field vs whole-view.
3. First-run reality: what a brand-new user/tenant sees before any data
   exists, and what the desired first action is (create, import, invite).
4. Existing state handling in the codebase: shared empty/loading/error
   components if any, and screens that currently mishandle these states
   (blank renders, infinite spinners) as the concrete gap.
5. Product tone/content conventions and any design-system components for
   skeletons, toasts, banners, and empty states already available to
   reuse.

## Workflow

1. **Enumerate the view's states.** Beyond "loaded": uninitialized,
   loading-first-time, loaded-empty, loaded-partial, loaded-full,
   refetching/stale, error (whole-view), error (partial), offline, and
   permission-denied. Not every view has all — but each is decided IN or
   OUT deliberately, not by omission.
2. **Split the empties — they are not one state.** First-run / never-had-
   data (onboarding copy + a create/import CTA), filtered-or-searched-to-
   nothing (a "clear filters" affordance, and DON'T imply the user has no
   data), and error-emptied (this is an error, show retry — not a
   cheerful empty). Each gets distinct copy and a distinct next action.
3. **Design loading honestly.** Choose skeleton (layout known, content
   coming — reserves space, no layout shift) vs spinner (short/unknown
   shape) vs inline indicator (background refresh). Apply a small delay
   threshold before showing a loader so fast responses don't flash one.
   For optimistic updates, design the rollback: what the UI shows if the
   write fails, and how the user learns it reverted.
4. **Place errors by blast radius.** Field/section error → inline near
   the cause; transient action failure → toast (with retry if
   retryable); whole-view failure → full-view error with a retry and a
   correlation id to quote. Design partial failure: the working parts
   render, the failed widget shows its own error, and the page is not
   held hostage by one failed call.
5. **Design stale/offline/refetch.** On refetch, keep the last-good data
   visible with a subtle refreshing indicator rather than flashing to a
   skeleton. On error-during-refetch, keep last-good + a banner ("couldn't
   update"). Offline: distinguish it from a server error and say what's
   safe to do.
6. **Cover the forgotten permutations.** Permission-denied is not empty
   (403 → "you don't have access", not "no items"). Too-much-data →
   pagination/virtualization handoff (`pagination-cursor-designer`).
   Zero-after-filter vs zero-ever. Slow-but-working (progress, not just a
   spinner).
7. **Note accessibility intent per state.** Loading announced to screen
   readers (aria-live/busy), focus moved to the error on failure, empty-
   state not a silent visual — record the intent; VERIFICATION is
   `accessibility-test-harness`.
8. **Design for reuse.** Factor shared empty/loading/error components and
   copy patterns so states are consistent across views, not reinvented
   per screen. Keep the error copy keyed to taxonomy codes.
9. **Deliver** the per-view state matrix in the Output Format.

The full state checklist, the three-empties comparison, loading-pattern
selection, and copy patterns:
[references/edge-state-sheet.md](references/edge-state-sheet.md).

## Output Format

```
EDGE-STATE MATRIX — <view/flow>
Per state row:
  <state> | trigger=<what puts the view here> | visual=<skeleton|spinner|inline|
           banner|toast|full-view|empty-illustration> | copy="<actionable>" |
           action=<primary CTA / retry / clear-filter / none> | a11y=<announce/focus intent>
States covered: uninitialized, loading-first, empty(first-run), empty(filtered),
  empty(error), loaded-partial, refetching/stale, error(view), error(partial),
  offline, forbidden   — each IN or OUT with reason
Optimistic writes: <rollback presentation + how user learns of revert> | n/a
Reuse: <shared components/copy patterns factored>
Handoffs: error codes/messages ← error-taxonomy-designer; a11y verification →
  accessibility-test-harness; huge lists → pagination-cursor-designer
```

## Validation Checklist

- [ ] Every plausible state for this view is listed and marked IN or OUT
      with a reason — no state left to accidental blank render.
- [ ] The three empties are distinct: first-run, filtered-to-nothing, and
      error-emptied each have their own copy and next action.
- [ ] Loading uses skeleton vs spinner vs inline deliberately, with a
      delay threshold so fast responses don't flash a loader.
- [ ] Errors are placed by blast radius (inline / toast / full-view) and
      retryable errors offer retry; whole-view errors surface a
      correlation id.
- [ ] Partial failure is designed — one failed call does not blank the
      whole page.
- [ ] Refetch keeps last-good data visible rather than flashing to a
      skeleton; offline is distinguished from a server error.
- [ ] Permission-denied is rendered as forbidden, not as empty.
- [ ] Error copy is keyed to `error-taxonomy-designer` codes, and a11y
      verification is handed to `accessibility-test-harness`.

## Gotchas

- A blank rectangle is three bugs wearing a trench coat: the user can't
  tell empty from loading from broken. Every "nothing here" must say
  WHICH nothing it is.
- "No results" after a filter that reads like "you have no data" makes
  users think their data is gone. Filtered-empty must point at the
  filter, not the void.
- Showing a spinner with zero delay makes every fast page flicker; never
  showing one makes a slow page look frozen. A short delay threshold
  (then a skeleton) is the honest middle.
- Optimistic UI without a rollback design is a data-integrity illusion:
  the user sees success, the write failed, and nobody told them. Design
  the revert and its notification, or don't go optimistic.
- One failed side-panel call should not blank the entire dashboard.
  Partial failure is a first-class state, not an afterthought — isolate
  the failed region.
- Flashing loaded data back to a skeleton on every background refetch is
  visual noise that reads as breakage. Keep last-good visible; indicate
  refreshing subtly.
- 403 is not 404 is not empty. "You don't have access" and "this doesn't
  exist" and "there's nothing here yet" are three different messages;
  collapsing them confuses and can leak existence.
- Designing these states as one-off markup per screen guarantees drift.
  Factor shared components so the empty state on view A matches view B.

## Stop Conditions

- The request is to design the error MODEL — codes, retryable semantics,
  the envelope, disclosure rules → route to `error-taxonomy-designer`;
  this skill renders that model, it does not define it.
- The request is mobile viewport / responsive / touch craft (breakpoints,
  touch-target sizing, safe areas) → route to `mobile-viewport-craft`.
- The request is to VERIFY accessibility of the states as a test pass
  (keyboard traversal, screen-reader announcement checks, contrast in CI)
  → route to `accessibility-test-harness`; this skill records a11y intent
  but does not run the verification.
- A "permission-denied" state's copy would reveal whether a resource
  exists to someone not allowed to see it → flag the existence-disclosure
  risk and coordinate the wording with the authorization owner rather
  than guessing.

## Supporting Files

- [references/edge-state-sheet.md](references/edge-state-sheet.md) — the
  full state checklist, the three-empties comparison, loading-pattern
  selection table, and reusable copy patterns per state.
- `evals/evals.json` — behavior cases including the three-empties split,
  the optimistic-rollback design, and the partial-failure state.
- `evals/trigger-evals.json` — discrimination against `error-taxonomy-designer`
  (the model), `mobile-viewport-craft`, and `accessibility-test-harness`.

Files in this skill

  • SKILL.md11.2 KB
  • evals/evals.json4.4 KB
  • evals/trigger-evals.json3 KB
  • references/edge-state-sheet.md3.6 KB

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.