algorithmic-color-pale…
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Spinners, skeletons and staggered reveals that manage wait times. Use when designing loading states, async data or the feel of a slow interface.
Claude Code
$ npx -y skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance --agent claude-code
Codex
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a codex -y
Cursor
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a cursor -y
Gemini CLI
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a gemini-cli -y
GitHub Copilot
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a github-copilot -y
OpenCode
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a opencode -y
Windsurf
$ npx skills add dembrandt/dembrandt-skills --skill loading-states-and-perceived-performance -a windsurf -y
name: loading-states-and-perceived-performance
description: Spinners, skeletons and staggered reveals that manage wait times. Use when designing loading states, async data or the feel of a slow interface.
metadata:
priority: 7
pathPatterns:
- "components/**"
- "src/components/**"
- "**/*.tsx"
- "**/*.jsx"
- "**/*.css"
- "**/*.scss"
- "design-system/**"
promptSignals:
phrases:
- "loading state"
- "spinner"
- "skeleton screen"
- "skeleton loader"
- "perceived performance"
- "loading animation"
- "shimmer effect"
- "staggered loading"
- "prefetch"
- "prioritise loading"
- "progressive loading"
- "lazy load data"
retrieval:
aliases:
- loading states
- skeleton loaders
- spinners
- perceived performance
- shimmy
- glimmer
- prefetching
- priority loading
- progressive data loading
intents:
- design a loading state
- add a skeleton screen
- improve perceived performance
- choose between spinner and skeleton
- handle slow data loading
- adding delight to the wait
- load the most important content first
- prefetch the likely next step
examples:
- what loading state should this card use
- add a skeleton loader for this list
- make the page feel faster while loading
- design a spinner for this button
- load the key content first then stream the rest
- prefetch the next page so it feels instantUsers don't mind waiting as much if they understand *what* they are waiting for and *how much* progress is being made. Perceived performance is the design work of making a system feel faster than it actually is.
---
| Wait Duration | Best Pattern | Use for | |---|---|---| | **Short (< 1s)** | **Inline Spinner / Loader** | Button actions, small updates, quick data fetches | | **Medium (1s – 3s)** | **Skeleton Screen** | Cards, lists, dashboards, profile pages | | **Long (> 3s)** | **Determinate Progress Bar** | File uploads, complex exports, heavy processing | | **Full Page** | **Staggered Entry / Animated Sections** | Initial app load, hero sections, immersive transitions |
---
Use spinners for small, contained actions where the layout doesn't change significantly.
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.spinner {
animation: spin 800ms cubic-bezier(0.4, 0, 0.2, 1) infinite;
}---
Skeleton screens provide a visual placeholder that mimics the layout of the final content. This reduces "layout shift" (CLS) and signals to the user exactly where the content will appear.
A subtle, moving gradient that travels across the skeleton elements.
.skeleton {
background: var(--color-grey-100);
background-image: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.5) 50%,
rgba(255, 255, 255, 0) 100%
);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: -200% 0; }
100% { background-position: 200% 0; }
}---
For major page transitions or initial loads, use a coordinated animation strategy.
Instead of the whole page appearing at once, animate sections in a sequence. This guides the user's eye from the most important content (hero) down to secondary areas.
.section {
opacity: 0;
transform: translateY(10px);
animation: slide-up 400ms ease-out forwards;
}
/* Stagger by index */
.section:nth-child(1) { animation-delay: 100ms; }
.section:nth-child(2) { animation-delay: 200ms; }
.section:nth-child(3) { animation-delay: 300ms; }
@keyframes slide-up {
to { opacity: 1; transform: translateY(0); }
}For hero sections, you might use a more complex animation: 1. **Background image** fades in slowly. 2. **Heading** slides in with a slight overshoot (spring). 3. **CTA button** appears last with a crisp fade-in or subtle color transition.
---
Don't wait for everything before showing anything. Load in the order of **value to the user**, so the thing they came for appears first and the rest fills in around it. This is both a perceived-performance win and a code-efficiency one: you fetch and render less up front.
**Prefetch the predictable next step** — next page, a hovered row's detail, the next wizard step — in the backg
Enterprise UX secrets, now built into your AI agent. Your agent writes the component in seconds. It does not know the modal should be a drawer, or that the grey it picked fails contrast. These skills carry that judgment: what to do, and what breaks otherwise.
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Top bar, sidebar rail, app launcher, tenant and environment cue, status bar. Use when designing the persistent shell, a…
Product visuals must show the real product with real data. Use when building landing pages, hero sections, screenshots or demo…
Shape language across type, radius and icons carries brand personality. Use when starting a design system, picking icons or…
Rest, hover, active, focus, disabled and loading states, derived from the base colour. Use when designing buttons, links, inputs…
Rebuild a live web page 1:1 from measurement into Figma, Penpot or code, then verify it. Use when reproducing a page or checking…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.