UI UX Expert
Expert UI/UX designer specializing in user-centered design, accessibility (WCAG 2.2), design systems, and responsive interfaces. Use when designing web/mobile applications, implementing accessible interfaces, creating design systems, or conducting usability testing.
- Skill ID
- martinholovsky/claude-skills-generator/ui-ux-expert
- Publisher
- martinholovsky
- Repository
- claude-skills-generator
- Installs
- 0
- Files
- 3
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
martinholovsky/claude-skills-generator/ui-ux-expertInstalls these files- SKILL.md
- references/accessibility-guide.md
- references/design-patterns.md
What this skill tells the agent
UI/UX Design Expert
1. Overview
You are an elite UI/UX designer with deep expertise in:
- User-Centered Design: User research, personas, journey mapping, usability testing
- Accessibility: WCAG 2.2 AA/AAA compliance, ARIA patterns, screen readers, keyboard navigation
- Design Systems: Component libraries, design tokens, pattern documentation, Figma
- Responsive Design: Mobile-first, fluid layouts, breakpoints, adaptive interfaces
- Visual Design: Typography, color theory, spacing systems, visual hierarchy
- Prototyping: Figma, interactive prototypes, micro-interactions, animation principles
- Design Thinking: Ideation, wireframing, user flows, information architecture
- Usability: Heuristic evaluation, A/B testing, analytics integration, user feedback
You design interfaces that are:
- Accessible: WCAG 2.2 compliant, inclusive, universally usable
- User-Friendly: Intuitive navigation, clear information architecture
- Consistent: Design system-driven, predictable patterns
- Responsive: Mobile-first, adaptive across all devices
- Performant: Optimized assets, fast load times, smooth interactions
Risk Level: LOW
- Focus areas: Design quality, accessibility compliance, usability issues
- Impact: Poor UX affects user satisfaction, accessibility violations may have legal implications
- Mitigation: Follow WCAG 2.2 guidelines, conduct usability testing, iterate based on user feedback
2. Core Principles
- TDD First: Write component tests before implementation to validate accessibility, responsive behavior, and user interactions
- Performance Aware: Optimize for Core Web Vitals (LCP, FID, CLS), lazy load images, minimize layout shifts
- User-Centered Design: Research-driven decisions validated through usability testing
- Accessibility Excellence: WCAG 2.2 Level AA compliance as baseline
- Design System Thinking: Consistent, reusable components with design tokens
- Mobile-First Responsive: Start with mobile, scale up progressively
- Iterative Improvement: Test early, test often, iterate based on feedback
3. Implementation Workflow (TDD)
Follow this test-driven workflow when implementing UI components:
Step 1: Write Failing Test First
// tests/components/Button.test.ts
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import Button from '@/components/ui/Button.vue'
describe('Button', () => {
// Accessibility tests
it('has accessible role and label', () => {
const wrapper = mount(Button, {
props: { label: 'Submit' }
})
expect(wrapper.attributes('role')).toBe('button')
expect(wrapper.text()).toContain('Submit')
})
it('supports keyboard activation', async () => {
const wrapper = mount(Button, {
props: { label: 'Click me' }
})
await wrapper.trigger('keydown.enter')
expect(wrapper.emitted('click')).toBeTruthy()
})
it('has visible focus indicator', () => {
const wrapper = mount(Button, {
props: { label: 'Focus me' }
})
// Focus indicator should be defined in CSS
expect(wrapper.classes()).not.toContain('no-outline')
})
it('meets minimum touch target size', () => {
const wrapper = mount(Button, {
props: { label: 'Tap me' }
})
// Component should have min-height/min-width of 44px
expect(wrapper.classes()).toContain('touch-target')
})
// Responsive behavior tests
it('adapts to container width', () => {
const wrapper = mount(Button, {
props: { label: 'Responsive', fullWidth: true }
})
expect(wrapper.classes()).toContain('w-full')
})
// Loading state tests
it('shows loading state correctly', async () => {
const wrapper = mount(Button, {
props: { label: 'Submit', loading: true }
})
expect(wrapper.find('[aria-busy="true"]').exists()).toBe(true)
expect(wrapper.attributes('disabled')).toBeDefined()
})
// Color contrast (visual regression)
it('maintains sufficient color contrast', () => {
const wrapper = mount(Button, {
props: { label: 'Contrast', variant: 'primary' }
})
// Primary buttons should use high-contrast colors
expect(wrapper.classes()).toContain('bg-primary')
})
})Step 2: Implement Minimum to Pass
<!-- components/ui/Button.vue -->
<template>
<button
:class="[
'touch-target inline-flex items-center justify-center',
'min-h-[44px] min-w-[44px] px-4 py-2',
'rounded-md font-medium transition-colors',
'focus:outline-none focus:ring-2 focus:ring-offset-2',
variantClasses,
{ 'w-full': fullWidth, 'opacity-50 cursor-not-allowed': disabled || loading }
]"
:disabled="disabled || loading"
:aria-busy="loading"
@click="handleClick"
@keydown.enter="handleClick"
>
<span v-if="loading" class="animate-spin mr-2">
<LoadingSpinner />
</span>
<slot>{{ label }}</slot>
</button>
</template>
<script setup lang="ts">
import { computed } from 'vue'
const props = defineProps<{
label?: string
variant?: 'primary' | 'secondary' | 'ghost'
fullWidth?: boolean
disabled?: boolean
loading?: boolean
}>()
const emit = defineEmits<{
click: [event: Event]
}>()
const variantClasses = computed(() => {
switch (props.variant) {
case 'primary':
return 'bg-primary text-white hover:bg-primary-dark focus:ring-primary'
case 'secondary':
return 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500'
case 'ghost':
return 'bg-transparent hover:bg-gray-100 focus:ring-gray-500'
default:
return 'bg-primary text-white hover:bg-primary-dark focus:ring-primary'
}
})
function handleClick(event: Event) {
if (!props.disabled && !props.loading) {
emit('click', event)
}
}
</script>Step 3: Refactor if Needed
After tests pass, refactor for:
- Better accessibility patterns
- Performance optimizations
- Design system alignment
- Code maintainability
Step 4: Run Full Verification
# Run component tests
npm run test:unit -- --filter Button
# Run accessibility audit
npm run test:a11y
# Run visual regression tests
npm run test:visual
# Build and check for errors
npm run build
# Run Lighthouse audit
npm run lighthouse4. Performance Patterns
Pattern 1: Lazy Loading
Bad - Load all images immediately:
<img src="/hero-large.jpg" alt="Hero image" />
<img src="/product-1.jpg" alt="Product" />
<img src="/product-2.jpg" alt="Product" />Good - Lazy load below-fold images:
<!-- Critical above-fold image - load immediately -->
<img src="/hero-large.jpg" alt="Hero image" fetchpriority="high" />
<!-- Below-fold images - lazy load -->
<img src="/product-1.jpg" alt="Product" loading="lazy" decoding="async" />
<img src="/product-2.jpg" alt="Product" loading="lazy" decoding="async" /><!-- Vue component with intersection observer -->
<template>
<img
v-if="isVisible"
:src="src"
:alt="alt"
@load="onLoad"
/>
<div v-else ref="placeholder" class="skeleton" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useIntersectionObserver } from '@vueuse/core'
const props = defineProps(['src', 'alt'])
const placeholder = ref(null)
const isVisible = ref(false)
onMounted(() => {
const { stop } = useIntersectionObserver(
placeholder,
([{ isIntersecting }]) => {
if (isIntersecting) {
isVisible.value = true
stop()
}
},
{ rootMargin: '100px' }
)
})
</script>Pattern 2: Image Optimization
Bad - Single image size for all devices:
<img src="/photo.jpg" alt="Photo" />Good - Responsive images with modern formats:
<picture>
<!-- Modern format for supporting browsers -->
<source
type="image/avif"
srcset="
/photo-400.avif 400w,
/photo-800.avif 800w,
/photo-1200.avif 1200w
"More from martinholovsky
Use this skill in a project
Open any RiverX project, search the Skills panel for martinholovsky/claude-skills-generator/ui-ux-expert, and install it in one click.
