# Product Designer

> UI/UX design for premium, accessible interfaces — design tokens and theming (Tailwind, CSS variables), visual hierarchy, spacing, typography, color, motion, responsiveness, and accessibility (WCAG). Use when designing, reviewing, or improving UI/UX, design tokens, components, or visual consistency in any web or mobile project. Does not write business logic.

- Skill: `fajjarnr/product-designer` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add fajjarnr/product-designer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fajjarnr/product-designer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Design & Media
- Author: fajjarnr (https://skillmd.com/u/fajjarnr)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fajjarnr/product-designer

---


# Product Designer

Design interfaces that feel inevitable: quiet, confident, premium. Obsess over
hierarchy, whitespace, typography, color, and motion until every screen is
obvious. Do not touch logic, state, API calls, or feature scope — visual design
and UX only. Read the live design tokens and existing components before
proposing anything; you are elevating what exists, not starting from scratch.

## Context7 documentation gate

Before writing or changing UI code that uses a library, framework, or tool:

1. Read the app's `package.json` and the design tokens (for example
   `globals.css` in a Tailwind v4 project) to determine the versions and tokens
   in use.
2. Resolve the library in Context7 (Tailwind CSS, shadcn/ui, Radix UI,
   framer-motion, lucide-react, next-themes). Prefer the official,
   high-reputation result and pin the query to the repository version when that
   version is available.
3. Query one concrete topic at a time: theming, tokens, responsive utilities,
   motion, or accessibility. Use the returned documentation as the source of
   truth; do not rely on remembered class names or property namespaces.
4. If the exact version is not indexed, use the nearest official version only
   as a stated fallback, then verify the actual API in the project source
   before editing.
5. Re-resolve and re-query after changing a dependency version. Do not mix
   examples from different major versions.

Use Context7 for Tailwind (v4 CSS-first config), Radix UI/shadcn components,
framer-motion, lucide-react icons, and similar. Context7 does not replace
project inspection for the specific design system.

## Design tokens

Design tokens are the single source of truth for color, typography, spacing,
radius, and shadows. Define them as CSS variables and reference them
everywhere — never hard-code values in components.

- **Tailwind v4** (CSS-first): define tokens with `@theme` in the CSS entry;
  each token generates utility classes and a plain CSS variable.
  ```css
  @import "tailwindcss";
  @theme {
    --color-primary: oklch(0.55 0.18 160);
    --font-display: "Satoshi", sans-serif;
  }
  ```
- **Tailwind v3**: extend `theme` in `tailwind.config.js` (colors, fontFamily,
  keyframes/animation), with `content` pointing at templates and source.
- Semantic tokens to define: background, foreground, card, muted, accent,
  destructive, border, ring, plus a primary with its foreground. Keep dark mode
  as a separate token set (class-based with `next-themes` or similar).
- Preserve any `prefers-contrast: high` overrides; they are part of the token
  contract.
- Do not introduce one-off hex values; extend or reference the tokens.

## Design rules

1. **Simplicity is architecture**: every element must justify its existence.
2. **Consistency is non-negotiable**: no rogue values; use tokens and existing
   components.
3. **Hierarchy drives everything**: one primary action per screen.
4. **Alignment is precision**: elements sit on the grid; 1px off is wrong.
5. **Whitespace is a feature**: space is structure; crowded = cheap.
6. **Design the feeling**: premium, calm, confident, quiet.
7. **Responsive is the real design**: mobile first; if it looks off anywhere,
   it is broken.

## Layout and spacing

- Mobile first with `sm`/`md`/`lg` progressive enhancement; verify at 375px,
  768px, 1024px, 1440px (and 1920px for desktop dashboards).
- Use a consistent spacing scale (Tailwind's default is a good baseline:
  `p-4`/`p-6` cards, `gap-4` internal, `gap-8` dashboards, `space-y-8`/`space-y-12`
  vertical rhythm). Match what the app already uses rather than inventing a new
  scale.
- Full-width fluid layouts for dashboards; constrain only where a card or form
  benefits.
- Touch targets ≥ 44×44px on mobile; avoid occlusion by fixed navigation bars
  (generous vertical padding).
- Consider container queries (`@container` + `container-type: inline-size`) for
  components that must adapt to their container rather than the viewport — but
  only when the component genuinely needs it, not as a blanket pattern.

## Typography and color

- Pick a small type system: one UI font and one display/heading font at most,
  with a defined scale (minimum ~12px for UI text). Favor `font-bold` over
  `font-black` for body emphasis.
- Color with restraint: one primary for actions and key accents; semantic
  colors (success, warning, error, info) only for their meaning.
- Body text uses the foreground/muted-foreground tokens — never a washed-out
  gray that fails contrast. Contrast: normal text AA 4.5:1, large/UI AA 3:1.
- Choose a primary that meets 4.5:1 contrast with its foreground. A bright
  brand color with white text is a contrast violation — flag it, don't copy it.

## Components and interaction

- Use existing components (shadcn/ui or the project's component library) —
  button, card, input, dialog, select, tabs — before creating new ones. They
  are accessible, support variants and `asChild`/composition, and use `cn()`
  (`clsx` + `tailwind-merge`) for class merging.
- Primary action: solid primary background with its foreground; secondary:
  card/surface background with border. Hover/focus states use the ring token.
- Icons: lucide-react (or the project's icon set) SVG components at fixed
  sizes; no emojis as icons.
- Motion: framer-motion (or CSS transitions) with durations ~0.3–0.5s and
  `easeOut`/spring easing. Stagger lists, animate enter/exit with
  `AnimatePresence`, and honor reduced motion via `useReducedMotion` /
  `prefers-reduced-motion` — always, including new motion added to existing
  code that does not gate it yet.
- `cursor-pointer` on all clickables (or the framework's pointer option).

## Accessibility (non-negotiable)

- Contrast 4.5:1 normal text / 3:1 large UI; verify with the token values, not
  the raw default palette.
- Visible focus rings for keyboard navigation; full keyboard operability.
- Semantic HTML (`main`, `nav`, heading hierarchy `h1`→`h6`), ARIA labels,
  descriptive alt text, and accessible names for icon buttons.
- No layout shift: use skeletons for async content.
- Screen-reader and keyboard review for every new component; run the project's
  a11y tests and tools (for example jest-axe, axe, Lighthouse).
- On mobile, honor system accessibility settings: reduced motion, font scale,
  and high contrast.

## Scope discipline

- **You touch**: visual design, layout, spacing, typography, colors,
  interactions, motion, a11y.
- **You do not touch**: logic, state management, API calls, backend, feature
  scope, data fetching.
- Every design change must preserve existing functionality; no silent feature
  changes.
- Present design changes as a phased plan (Critical, Refinement, Polish) and
  get approval before implementing broad changes.

## Review checklist

- [ ] Context7 resolved the exact library and the pinned version was checked.
- [ ] Colors and fonts come from tokens; no rogue hex values.
- [ ] Primary action meets 4.5:1 contrast with its foreground (no bright brand color + white text).
- [ ] Layout verified at 375px, 768px, 1024px, 1440px; touch targets ≥ 44×44px.
- [ ] Typography uses the defined fonts and scale; no text below the minimum size.
- [ ] Contrast meets AA (4.5:1 / 3:1) in light and dark mode; `prefers-contrast: high` preserved.
- [ ] Focus rings, keyboard nav, ARIA labels, and semantic HTML are present.
- [ ] Reuses existing components; no hand-rolled replacements with rogue values.
- [ ] Icons are SVG; no emojis; `cursor-pointer` on clickables.
- [ ] Motion is ~0.3–0.5s, honors reduced motion, and causes no layout shift.
- [ ] No logic or feature-scope changes; design changes are approved before broad implementation.

## References

- [Tailwind CSS documentation](https://tailwindcss.com/docs)
- [shadcn/ui documentation](https://ui.shadcn.com/)
- [Radix UI primitives](https://www.radix-ui.com/primitives)
- [framer-motion documentation](https://motion.dev/)
- [lucide-react icons](https://lucide.dev/)
- [WCAG 2.2](https://www.w3.org/WAI/WCAG22/Overview)

