gsd-headless
Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent…
Design-engineering principles for making interfaces feel polished. Use when building UI components or doing visual detail work — animations, hover states, shadows, borders, typography, micro-interactions. Triggers on "make it feel better", "feels off", stagger animations, border
$ npx -y skills add open-gsd/gsd-pi --skill make-interfaces-feel-better --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/make-interfaces-feel-betterContext preview
The summary Claude sees to decide when to auto-load this skill.
Design-engineering principles for making interfaces feel polished. Use when building UI components or doing visual detail work — animations, hover states, shadows, borders, typography, micro-interactions. Triggers on "make it feel better", "feels off", stagger animations, border
name: make-interfaces-feel-better description: Design-engineering principles for making interfaces feel polished. Use when building UI components or doing visual detail work — animations, hover states, shadows, borders, typography, micro-interactions. Triggers on "make it feel better", "feels off", stagger animations, border radius, optical alignment, font smoothing, tabular numbers, box shadows.
Great interfaces rarely come from a single thing. It's usually a collection of small details that compound into a great experience. Apply these principles when building or reviewing UI code.
| Category | When to Use | | --- | --- | | [Typography](typography.md) | Text wrapping, font smoothing, tabular numbers | | [Surfaces](surfaces.md) | Border radius, optical alignment, shadows, image outlines, hit areas | | [Animations](animations.md) | Interruptible animations, enter/exit transitions, icon animations, scale on press | | [Performance](performance.md) | Transition specificity, `will-change` usage |
Outer radius = inner radius + padding. Mismatched radii on nested elements is the most common thing that makes interfaces feel off.
When geometric centering looks off, align optically. Buttons with icons, play triangles, and asymmetric icons all need manual adjustment.
Layer multiple transparent `box-shadow` values for natural depth. Shadows adapt to any background; solid borders don't.
Use CSS transitions for interactive state changes — they can be interrupted mid-animation. Reserve keyframes for staged sequences that run once.
Don't animate a single container. Break content into semantic chunks and stagger each with ~100ms delay.
Use a small fixed `translateY` instead of full height. Exits should be softer than enters.
Animate icons with `opacity`, `scale`, and `blur` instead of toggling visibility. Use exactly these values: scale from `0.25` to `1`, opacity from `0` to `1`, blur from `4px` to `0px`. If the project has `motion` or `framer-motion` in `package.json`, use `transition: { type: "spring", duration: 0.3, bounce: 0 }` — bounce must always be `0`. If no motion library is installed, keep both icons in the DOM (one absolute-positioned) and cross-fade with CSS transitions using `cubic-bezier(0.2, 0, 0, 1)` — this gives both enter and exit animations without any dependency.
Apply `-webkit-font-smoothing: antialiased` to the root layout on macOS for crisper text.
Use `font-variant-numeric: tabular-nums` for any dynamically updating numbers to prevent layout shift.
Use `text-wrap: balance` on headings. Use `text-wrap: pretty` for body text to avoid orphans.
Add a subtle `1px` outline with low opacity to images for consistent depth.
A subtle `scale(0.96)` on click gives buttons tactile feedback. Always use `0.96`. Never use a value smaller than `0.95` — anything below feels exaggerated. Add a `static` prop to disable it when motion would be distracting.
Use `initial={false}` on `AnimatePresence` to prevent enter animations on first render. Verify it doesn't break intentional entrance animations.
Always specify exact properties: `transition-property: scale, opacity`. Tailwind's `transition-transform` covers `transform, translate, scale, rotate`.
Only for `transform`, `opacity`, `filter` — properties the GPU can composite. Never use `will-change: all`. Only add when you notice first-frame stutter.
Interactive elements need at least 40×40px hit area. Extend with a pseudo-element if the visible element is smaller. Never let hit areas of two elements overlap.
| Mistake | Fix | | --- | --- | | Same border radius on parent and child | Calculate `outerRadius = innerRadius + padding` | | Icons look off-center | Adjust optically with padding or fix SVG directly | | Hard borders between sections | Use layered `box-shadow` with transparency | | Jarring enter/exit animations | Split, stagger, and keep exits subtle | | Numbers cause layout shift | Apply `tabular-nums` | | Heavy text on macOS | Apply `antialiased` to root | | Animation plays on page load | Add `initial={false}` to `AnimatePresence` | | `transition: all` on elements | Specify exact properties | | First-frame animation stutter | Add `will-change: transform` (sparingly) | | Tiny hit areas on small controls | Extend with pseudo-element to 40×40px |
GSD Pi is a local-first coding agent for planning, implementing, verifying, and tracking project work from the command line.
Repo: open-gsd/gsd-pi
Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent…
Audit and improve web accessibility following WCAG 2.1 guidelines. Use when asked to "improve…
Browser automation CLI for AI agents. Use when interacting with websites — navigating pages,…
Design or review an HTTP/REST/GraphQL API for versioning, pagination, error shapes,…
Apply modern web development best practices for security, compatibility, and code quality.…
Ask a quick side question about your current work without derailing the main task. Answers…