Awesome-omni-skill frontend-developer

React components, UI library, state management ve user experience geliştirmek için kullanılır. Zustand, TanStack Query, Tailwind CSS ve accessibility konularında uzman.

install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/frontend-developer-kafkaspanel1" ~/.claude/skills/diegosouzapw-awesome-omni-skill-frontend-developer && rm -rf "$T"
manifest: skills/development/frontend-developer-kafkaspanel1/SKILL.md
source content

Frontend Developer Skill

React components, UI library, state management ve user experience geliştirir.

When to Use

  • React component oluştururken veya düzenlerken
  • State management (Zustand) implementasyonu yaparken
  • Form handling (React Hook Form + Zod) eklerken
  • Data fetching (TanStack Query) implementasyonu yaparken
  • Loading states ve skeleton screens eklerken
  • Empty states ve error boundaries yazarken
  • Responsive design (Tailwind CSS) yaparken
  • PWA features geliştirirken
  • Accessibility (ARIA) iyileştirmeleri yaparken

Instructions

Görevler

  • React component development (ui, shared, features)
  • State management (Zustand stores)
  • Form handling (React Hook Form + Zod)
  • Data fetching (TanStack Query)
  • Loading states ve skeleton screens
  • Empty states ve error boundaries
  • Responsive design (Tailwind CSS)
  • PWA features (manifest, service worker)
  • Accessibility (ARIA labels, keyboard navigation)

Kurallar

  • Components functional components olmalı
  • TypeScript strict mode kullan
  • Tailwind CSS class names organized (use clsx + tailwind-merge)
  • Component props TypeScript interfaces ile tanımlı
  • No prop drilling (use Zustand or React Context)
  • Error boundaries critical components'lerde
  • Loading states tüm async operations'da
  • Turkish language strings (no hardcoded English)

Kod Kalitesi

  • Component names PascalCase
  • File names kebab-case (my-component.tsx)
  • Props destructuring
  • useMemo ve useCallback optimization için
  • Consistent naming conventions
  • Reusable components (DRY principle)
  • Accessibility best practices

Dosya Yapısı

src/components/
├── ui/              # Radix UI components
│   ├── button.tsx
│   ├── input.tsx
│   ├── dialog.tsx
│   └── ...
├── shared/          # Shared application components
│   ├── data-table.tsx
│   ├── stat-card.tsx
│   ├── empty-state.tsx
│   └── ...
└── features/        # Feature-specific components
    ├── members/
    ├── donations/
    └── social-aid/

Component Example

import { cn } from "@/lib/utils";

interface StatCardProps {
  title: string;
  value: string | number;
  description?: string;
  icon?: React.ReactNode;
  trend?: "up" | "down" | "neutral";
  className?: string;
}

export function StatCard({
  title,
  value,
  description,
  icon,
  trend,
  className,
}: StatCardProps) {
  return (
    <div
      className={cn(
        "rounded-lg border bg-card p-6 shadow-sm",
        className
      )}
    >
      <div className="flex items-center justify-between">
        <p className="text-sm font-medium text-muted-foreground">
          {title}
        </p>
        {icon && (
          <div className="text-muted-foreground">{icon}</div>
        )}
      </div>
      <div className="mt-2">
        <p className="text-2xl font-bold">{value}</p>
        {description && (
          <p className="text-xs text-muted-foreground mt-1">
            {description}
          </p>
        )}
      </div>
    </div>
  );
}

TanStack Query Example

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";

// Fetch members
export function useMembers() {
  return useQuery({
    queryKey: ["members"],
    queryFn: async () => {
      const res = await fetch("/api/members");
      if (!res.ok) throw new Error("Üyeler yüklenemedi");
      return res.json();
    },
  });
}

// Create member mutation
export function useCreateMember() {
  const queryClient = useQueryClient();
  
  return useMutation({
    mutationFn: async (data: CreateMemberInput) => {
      const res = await fetch("/api/members", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(data),
      });
      if (!res.ok) throw new Error("Üye oluşturulamadı");
      return res.json();
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["members"] });
    },
  });
}

Zustand Store Example

import { create } from "zustand";
import { persist } from "zustand/middleware";

interface SidebarState {
  isOpen: boolean;
  toggle: () => void;
  setOpen: (open: boolean) => void;
}

export const useSidebarStore = create<SidebarState>()(
  persist(
    (set) => ({
      isOpen: true,
      toggle: () => set((state) => ({ isOpen: !state.isOpen })),
      setOpen: (open) => set({ isOpen: open }),
    }),
    {
      name: "sidebar-storage",
    }
  )
);