Claude Code Plugins

Community-maintained marketplace

Feedback
0
0

Review and write React/Next.js components for Diamond Fysio project. Use when reviewing components, adding features, or checking code quality. Enforces project patterns like Tailwind CSS, accessibility, Contentful integration, and i18n.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name diamond-fysio-frontend
description Review and write React/Next.js components for Diamond Fysio project. Use when reviewing components, adding features, or checking code quality. Enforces project patterns like Tailwind CSS, accessibility, Contentful integration, and i18n.
allowed-tools Read, Grep, Glob, Edit, Write

Diamond Fysio Frontend Skill

This skill ensures consistency with the Diamond Fysio project's frontend patterns and best practices.

Project Overview

  • Framework: Next.js 16 with Pages Router (primary) + App Router (new routes)
  • React: v19
  • TypeScript: Mixed (TSX and JSX components)
  • Styling: Tailwind CSS
  • CMS: Contentful with GraphQL
  • Icons: Heroicons, FontAwesome, React Icons
  • Forms: React Hook Form
  • Animation: Framer Motion
  • i18n: Dutch (nl) and English (en) locales

Code Review Checklist

When reviewing or writing components, verify:

1. Accessibility (Critical)

  • ARIA labels: All interactive elements must have aria-label attributes
  • Keyboard navigation: Use tabIndex={0} for focusable elements
  • Focus states: Apply focus:outline-none focus-visible:ring-2 focus-visible:ring-teal-500
  • Semantic HTML: Use proper heading hierarchy (h1, h2, h3)
  • Alt text: All images must have meaningful alt attributes

Example from Button.jsx:

<p className={btnType} role="button" aria-label={title} tabIndex={0}>
  {title}
</p>

2. Styling Patterns

  • Use Tailwind CSS exclusively (no inline styles or CSS modules)
  • Gradient buttons: Follow the pattern bg-gradient-to-r from-teal-500 to-cyan-600
  • Hover states: hover:from-teal-400 hover:to-cyan-500
  • Responsive design: Use md:, lg: prefixes for breakpoints
  • Consistent spacing: Use Tailwind spacing scale (px-8, py-3, etc.)

Common button classes:

const btnType =
  'w-full inline-flex items-center justify-center px-8 py-3 text-base font-medium rounded-md text-white bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-400 hover:to-cyan-500 md:py-4 md:text-lg md:px-10 shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-teal-500';

3. Internationalization (i18n)

  • Support both nl and en locales
  • Use router locale: const locale = router?.locale || 'nl'
  • Provide fallback defaults for all translated strings
  • Structure: Create defaults object with nl/en keys

Example pattern:

const router = useRouter();
const locale = router?.locale || 'nl';
const isEn = locale === 'en';

const defaults = {
  nl: { title: 'Nederlandse tekst', ... },
  en: { title: 'English text', ... }
};

const t = {
  title: i18n?.title || defaults[locale].title
};

4. Next.js Routing

  • Internal links: Use next/link with <Link href={path}>
  • External links: Use <a href={url} rel="noopener noreferrer">
  • Locale awareness: Check router.locale for current language
  • Pages structure: Components in /components, pages in /pages

5. React Patterns

  • Hooks: Use modern hooks (useState, useRouter, etc.)
  • Props destructuring: ({ title, type, internal_link }) => {}
  • Default props: Use ES6 defaults extra_classes = ''
  • No React import needed: Next.js handles this automatically

6. Contentful Integration

  • GraphQL queries: Store in /lib/query/
  • Content types: Check /components/contentTypes/ for type definitions
  • Rich text: Use @contentful/rich-text-react-renderer
  • Image optimization: Use Next.js <Image> component when possible

7. Form Handling

  • Use React Hook Form for complex forms
  • Validation: Implement client-side validation
  • Error states: Show user-friendly error messages in both languages
  • Loading states: Display loading indicators during submission
  • Success feedback: Use CheckCircleIcon from Heroicons for success states

8. Component Structure

  • File organization:
    • Simple components: Single file in /components/ComponentName.jsx
    • Complex components: Directory /components/ComponentName/ with sub-components
  • Export pattern: Use export default ComponentName
  • Naming: PascalCase for component files and names

9. Code Quality

  • ESLint compliance: Follow the project's ESLint config
    • React hooks rules enforced
    • jsx-a11y warnings enabled
    • Promise handling patterns
  • No unused variables: Clean up unused imports and variables
  • Consistent formatting: Use Prettier (runs via Husky pre-commit)

10. Performance Considerations

  • Lazy loading: Use dynamic imports for heavy components
  • Image optimization: Leverage Next.js Image component
  • Memoization: Use React.memo for expensive renders (when needed)
  • Avoid unnecessary re-renders: Check useEffect dependencies

Common Issues to Flag

  1. Missing accessibility attributes (aria-label, alt text, tabIndex)
  2. Inline styles instead of Tailwind classes
  3. Missing i18n translations (only Dutch or only English)
  4. Incorrect link components (using <a> for internal links)
  5. Missing focus states on interactive elements
  6. Non-semantic HTML (divs instead of buttons, missing headings)
  7. Hard-coded text that should be translatable
  8. Missing error handling in forms or API calls

Project-Specific Patterns

Gradient Colors

Primary gradient: from-teal-500 to-cyan-600 Hover gradient: from-teal-400 to-cyan-500 Focus ring: focus-visible:ring-teal-500

Icons

  • Heroicons: @heroicons/react/solid or @heroicons/react/outline
  • FontAwesome: @fortawesome/react-fontawesome
  • React Icons: react-icons

Layout

  • Use <Layout> wrapper from /components/Layout/Layout.jsx
  • Headers: Different header types in /components/Headers/
  • Footer: Consistent footer from /components/Layout/Footer.jsx

Example Code Reviews

Good Example ✅

import Link from 'next/link';

const Button = ({ title, internal_link, external_link, extra_classes = '' }) => {
  const btnType =
    'inline-flex items-center px-8 py-3 rounded-md bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-400 hover:to-cyan-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-teal-500';

  return internal_link ? (
    <Link href={internal_link}>
      <p className={btnType} role="button" aria-label={title} tabIndex={0}>
        {title}
      </p>
    </Link>
  ) : (
    <a href={external_link} className={btnType} aria-label={title} rel="noopener noreferrer">
      {title}
    </a>
  );
};

export default Button;

Issues to Fix ❌

// Missing: Next.js Link, accessibility, Tailwind classes
const Button = ({ title, link }) => {
  return (
    <a href={link} style={{ backgroundColor: 'teal' }}>
      {' '}
      {/* inline style! */}
      {title} {/* no aria-label! */}
    </a>
  );
};

When Adding New Features

  1. Check existing components for similar patterns first
  2. Maintain accessibility from the start
  3. Support both languages (nl/en)
  4. Use Tailwind utilities instead of custom CSS
  5. Test keyboard navigation and focus states
  6. Follow the gradient/color scheme for consistency
  7. Add proper error handling and loading states
  8. Document complex logic with comments if needed

Testing Considerations

  • Verify accessibility with keyboard navigation
  • Test both Dutch and English versions
  • Check mobile responsiveness (Tailwind breakpoints)
  • Validate form submissions
  • Test with Contentful data (staging and production)

Deployment & Testing URLs

When testing features, always verify on the live site to ensure proper deployment.

Resources

  • Tailwind config: /tailwind.config.js
  • ESLint config: /eslint.config.js
  • TypeScript config: /tsconfig.json
  • Documentation: /docs/ folder