Make Interfaces Feel Better
samuelclay/NewsBlur
Design engineering principles for making interfaces feel polished.
UI craftsmanship: animation rules, easing, micro-interactions, state polish.
$ npx skills add softspark/ai-toolkit --skill design-engineering -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install softspark/ai-toolkit design-engineering --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/app/skills/design-engineering .claude/skills/design-engineering && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .claude/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineeringType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add softspark/ai-toolkit --skill design-engineering -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install softspark/ai-toolkit design-engineering --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/app/skills/design-engineering .agents/skills/design-engineering && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .agents/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add softspark/ai-toolkit --skill design-engineering -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install softspark/ai-toolkit design-engineering --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/app/skills/design-engineering .cursor/skills/design-engineering && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .cursor/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/softspark/ai-toolkit.git --path app/skills/design-engineering--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add softspark/ai-toolkit --skill design-engineering -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install softspark/ai-toolkit design-engineering --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/app/skills/design-engineering .gemini/skills/design-engineering && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .gemini/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install softspark/ai-toolkit design-engineeringInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add softspark/ai-toolkit --skill design-engineering -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/app/skills/design-engineering .github/skills/design-engineering && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .github/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add softspark/ai-toolkit --skill design-engineering -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install softspark/ai-toolkit design-engineering --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/app/skills/design-engineering .opencode/skills/design-engineering && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "design-engineering" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/design-engineering into .opencode/skills/design-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-engineering", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
design-engineeringUI craftsmanship: animation rules, easing, micro-interactions, state polish.
Design Engineering is an agent skill from softspark/ai-toolkit. UI craftsmanship: animation rules, easing, micro-interactions, state polish. Triggers: animation, transition, ease-out, motion, micro-interaction, hover, loading state, UI polish.
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `reference/animation-recipes.md` and `reference/component-craft.md`).
It sits in Frontend & Design, covering Web animation and motion and UI design. The repository describes itself as: Professional-grade AI coding toolkit: 94 skills, 44 agents, multi-platform (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo Code, Aider, Augment, Antigravity, Codex CLI… The licence is Apache-2.0.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit d64db2b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are css and typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Design Engineering loads about 4.3k tokens when it runs. Until then it costs about 50 tokens; SKILL.md has 2,019 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from softspark/ai-toolkit at commit d64db2b, republished under its Apache-2.0 licence (© softspark). 2,019 words, ~4,350 tokens.
.claude/skills/design-engineering/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Based on Emil Kowalski's design engineering philosophy — UI polish, component craftsmanship, and the compound value of invisible details.
Defaults that signal machine-generated UI ("AI slop"). Each is a falsifiable rule to uphold:
background-clip: text). Use solid ink or warm neutral tinting.<figure>.font-style: normal). Never use single-word italic emphasis inside a headline.Before marking any UI output complete, score it 1–5 on these six axes (score <3 on any axis triggers a revision pass):
| # | Axis | Assessment |
|---|---|---|
| P | Philosophy | Clear position and intent ("why"), not just arbitrary decoration |
| H | Hierarchy | Clear primary / secondary / tertiary weight distinguishable in 2 seconds |
| E | Execution | Exact rule weights, contrast ratios, focus rings, zero layout shifts |
| S | Specificity | Tailored specifically to this brief, not a generic interchangeable template |
| R | Restraint | Removed anything unearned (decorative bloat, redundant cards, excess padding) |
| V | Variety | Structurally distinct from previous layouts in the project (not just a color swap) |
Every interactive element (button, input, select, card, tab, switch) must explicitly handle all 8 states in code. Styling only default + hover is an immediate defect:
| State | Trigger | Required Treatment |
|---|---|---|
| 1. Default | At rest | Clean base styling, defined token bindings |
| 2. Hover | Pointer over (@media (hover: hover)) | Subtle background shift (4–6%) or 1px translate, no layout jump |
| 3. Focus | Keyboard navigation | Visible :focus-visible ring (2px solid, 1–2px offset), instant appearance |
| 4. Active | Pressed | Pressed-in feel: slight darken, transform: translateY(1px) or scale(0.98) |
| 5. Disabled | Inactive (disabled, aria-disabled) | 3 channels: opacity: 0.55, cursor: not-allowed, muted token color |
| 6. Loading | Async in-flight (data-state="loading") | Inline spinner replacing icon/badge, label preserved, submit disabled |
| 7. Error | Validation failure (aria-invalid="true") | Distinct error token border/message, helper text replaced, error icon |
| 8. Success | Operation completed (data-state="success") | Quiet confirmation: subtle green/accent indicator or checkmark, auto-dismiss |
Input fields, textareas, and selects are where almost-right UIs break:
border-width between default, hover, focus, error, or disabled states. State changes go to background-color, outline, box-shadow, or border-color.outline: 2px solid transparent; outline-offset: 1px; so activating :focus-visible never shifts layout or thrashes paint.min-height: 1lh for helper/error text so appearing validation messages do not push downstream page content.Verify every layout at 320px, 375px, 414px, and 768px:
overflow-x: clip (never hidden) on both html and body.minmax(0, 1fr) instead of bare 1fr to prevent image intrinsic dimensions from blowing out the grid.overflow-wrap: anywhere; min-width: 0;.var(--color-accent), var(--font-display)).#000 / #fff.Accessibility-grounded hard thresholds. Going below these is a defect, not a style choice:
| Context | Floor | Basis |
|---|---|---|
| Slide / presentation body text | ~24px | Readable from the back of a room |
| Print body text | ~12pt | Legible at arm's length on paper |
| Mobile touch targets | 44px × 44px | Apple HIG minimum tappable size |
Treat these as the lower bound, not the target. Captions and footnotes may approach the floor; primary content should sit comfortably above it.
High-fidelity work MUST be rooted in real context before any pixels are produced:
design.md, package font stacks, palette tokens (:root, Tailwind @theme), motion libraries (framer-motion, motion, gsap), and spacing scale.Calibrate questions to how bounded the ask is, then proceed:
For exploratory or open work, produce 3+ atomic variations across distinct axes, never three tweaks of one idea:
When editing a live UI, conform to it instead of imposing a new style:
| Usage Pattern | Strategy |
|---|---|
| 100+ daily | No animation |
| Tens daily | Drastically reduce |
| Occasional | Standard animation |
| Rare/first-time | Add delight |
Never animate keyboard-initiated actions — they repeat hundreds of times daily, making animation feel sluggish.
Every animation requires justification: spatial consistency, state indication, explanation, user feedback, or preventing jarring transitions. "It looks cool" alone disqualifies frequent interactions.
| Direction | Easing | Why |
|---|---|---|
| Entering elements | ease-out | Immediate feedback |
| On-screen movement | ease-in-out | Natural acceleration |
| Hover/color changes | ease | Smooth transition |
| Constant motion | linear | No acceleration |
Critical: Abandon default CSS easings. Use custom curves:
/* Punchy entrance */
transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1);Never use ease-in — it delays initial movement exactly when attention peaks, making interfaces feel sluggish.
| Element | Timing |
|---|---|
| Button press | 100-160ms |
| Tooltips, small popovers | 125-200ms |
| Dropdowns, selects | 150-250ms |
| Modals, drawers | 200-500ms |
UI animations should stay under 300ms. Speed perception matters as much as actual speed.
button:active {
transform: scale(0.97);
}Tactile feedback confirming interface responsiveness.
/* Bad */
.enter { transform: scale(0); opacity: 0; }
/* Good — natural entrance */
.enter { transform: scale(0.95); opacity: 0; }Real-world objects don't vanish and reappear. Start from scale(0.95).
.popover {
transform-origin: var(--radix-popover-content-transform-origin);
}Exception: modals keep centered origin (viewport-anchored, not trigger-anchored).
Initial tooltip includes delay; subsequent hovers skip both delay and animation via [data-instant] attribute — perceived speed without defeating accidental activation prevention.
For advanced transform mastery, 3D orbits, and clip-path animation recipes (tabs, hold-to-delete, image reveals, sliders), see reference/animation-recipes.md.
Only animate transform and opacity — these skip layout and paint. Animating padding, margin, height, width triggers full rendering pipeline.
Changing parent CSS variables recalculates styles on all children. Update transform directly on elements instead.
Shorthand properties (x, y, scale) use main-thread requestAnimationFrame, not GPU:
// Bad — main thread
<motion.div animate={{ x: 100 }} />
// Good — GPU accelerated
<motion.div animate={{ transform: "translateX(100px)" }} />CSS animations run off-thread and remain smooth during page loads. Framer Motion drops frames when browser is busy. Use CSS for predetermined animations; JavaScript for dynamic, interruptible ones.
Keep opacity and color transitions (aid comprehension). Remove movement and position animations:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}@media (hover: hover) and (pointer: fine) {
.card:hover {
transform: translateY(-2px);
}
}Touch triggers false hover positives — always gate hover animations.
For component craftsmanship principles (developer experience, defaults, edge cases, asymmetric timing), see reference/component-craft.md.
| Issue | Resolution |
|---|---|
transition: all | Specify properties: transition: transform 200ms ease-out |
scale(0) entries | Start scale(0.95) with opacity: 0 |
ease-in on UI | Switch to ease-out or custom curve |
Popover transform-origin: center | Use trigger-aware CSS variable |
| Animation on keyboard actions | Remove entirely |
| Duration > 300ms UI | Reduce to 150-250ms |
| Hover without media query | Add @media (hover: hover) and (pointer: fine) |
| Keyframes on rapid triggers | Use CSS transitions |
Framer x/y under load | Use transform: "translateX()" |
| Identical enter/exit speed | Make exit faster (e.g., 2s enter, 200ms exit) |
| Simultaneous element appearance | Stagger 30-80ms between items |
Visual work ships through two passes, mirroring the toolkit's verification-before-completion and subagent two-stage review ethos:
transition: all — animates unintended properties, hurts performanceease-in on UI elements — delays feedback when attention peaksheight/width/margin — triggers layout recalculation@media (hover: hover) — breaks touch devicestransition (transition: transform 200ms ease-out) — never transition: allease-out (or a custom curve) on UI appearances; ease-in delays feedback at the moment the user's attention peaksheight, width, margin, or top/left — animate transform and opacity onlyborder-width: 1px constant across all input states (default/hover/focus/error/disabled) with a reserved transparent outline to guarantee zero layout shiftoverflow-x: clip on both html and body to eliminate horizontal viewport scrolling on mobile (320px–768px)font-style: normal) — never use single-word italic emphasis inside headlinesFor compositor edge cases, Framer Motion GPU optimizations, and reduced-motion gotchas, see reference/animation-recipes.md.
/a11y-validate/frontend-specialist agent/ux-designer agent/brand-voice© softspark, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in app/skills/design-engineering of softspark/ai-toolkit.
Open the folder on GitHubat commit d64db2b
Design Engineering next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Design Engineering this skillsoftspark/ai-toolkit | 179 | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Make Interfaces Feel Bettersamuelclay/NewsBlur | 7.6k | 10 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Baseline UIibelick/ui-skills | 9.5k | 8 repos | ~855 | Automated safety check: Pass | MIT | |
| Apple Liquid Glass Designnaplesblue/apple-design-skill | 267 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Better UItrycompai/crm | 11k | — | ~2.4k | Automated safety check: Pass | MIT | |
| UI UX Pro MaxOhh-889/skyroc | 795 | 6 repos | ~14k | Automated safety check: Pass | MIT |
samuelclay/NewsBlur
Design engineering principles for making interfaces feel polished.
ibelick/ui-skills
Applies a fixed set of UI rules for stack, components, interaction, animation, typography and layout, or reviews a file against them with concrete fixes.
naplesblue/apple-design-skill
Sets design rules for web interfaces that should feel like current Apple design: unified surfaces, restrained type and glass only where layers overlap.
trycompai/crm
Design engineering principles for making interfaces feel polished.
Ohh-889/skyroc
UI/UX design intelligence for web, mobile, and desktop. An agent skill from Ohh-889/skyroc.
sickn33/agentic-awesome-skills
Core UI/UX engineering skill for building highly interactive, spatial, weightless, and glassmorphism-based web interfaces using GSAP and 3D CSS.
softspark/ai-toolkit
Prepare or verify a project QA environment with source identity, readiness, browser access, evidence paths and owned cleanup.
softspark/ai-toolkit
Accessibility validator: WCAG 2.1 AA, EN 301 549, EAA. An agent skill from softspark/ai-toolkit.
softspark/ai-toolkit
Analyzes code quality, complexity, patterns across codebase.
softspark/ai-toolkit
Drives a brief, specification, issue or existing PR through implementation, review, tests and QA to a ready PR.
softspark/ai-toolkit
Direct technical voice for docs, README, user-facing text. An agent skill from softspark/ai-toolkit.
softspark/ai-toolkit
Detect/generate/debug CI pipeline config (GitHub Actions, GitLab CI).
Categories
UI craftsmanship: animation rules, easing, micro-interactions, state polish. Design Engineering is an agent skill from softspark/ai-toolkit. UI craftsmanship: animation rules, easing, micro-interactions, state polish.
Design Engineering fits situations like: tasks that involve Web animation and motion; tasks that involve UI design.
Run `npx skills add softspark/ai-toolkit --skill design-engineering -a claude-code`. Or copy the skill folder (app/skills/design-engineering in softspark/ai-toolkit) into .claude/skills/design-engineering in your project. Claude Code loads it when a task matches its description.
Run `npx skills add softspark/ai-toolkit --skill design-engineering -a codex`. Or copy the skill folder (app/skills/design-engineering in softspark/ai-toolkit) into .agents/skills/design-engineering in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add softspark/ai-toolkit --skill design-engineering -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/design-engineering, .gemini/skills/design-engineering, .github/skills/design-engineering and .opencode/skills/design-engineering in your project.
SKILL.md names no scripts, command-line tools or credentials: Design Engineering is instructions for the agent only. Its frontmatter pre-approves these tools: Read.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Design Engineering is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Design Engineering: Make Interfaces Feel Better (samuelclay/NewsBlur, 7.6k stars), Baseline UI (ibelick/ui-skills, 9.5k stars), Apple Liquid Glass Design (naplesblue/apple-design-skill, 267 stars) and Better UI (trycompai/crm, 11k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
softspark (a GitHub user) maintains it in softspark/ai-toolkit, which has 179 GitHub stars. The repository holds 112 skills in this directory. The repository was last updated on October 7, 2026.
Source: softspark/ai-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.