react-admin-panel
Provides structure and implementation guidance for the Game Critique admin interface.
Install
mkdir -p .claude/skills/react-admin-panel && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/10489" && unzip -o skill.zip -d .claude/skills/react-admin-panel && rm skill.zipInstalls to .claude/skills/react-admin-panel
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
React admin panel using Vite, TanStack Router, TanStack Query, and Tailwind CSS. Use this skill when working with the web admin interface in apps/web, creating admin features, forms, or data tables.Key capabilities
- →Manage data tables
- →Implement file-based routing
- →Handle server state
- →Build accessible forms
How it works
Provides a standardized structure for admin panels using TanStack Router for navigation and TanStack Query for data management.
Inputs & outputs
When to use react-admin-panel
- →Create a new admin data table
- →Implement a new route with TanStack Router
- →Build a form with React Hook Form
About this skill
React Admin Panel Skill
Overview
This skill covers the React-based admin panel for managing users, games, and system data in the Game Critique project.
Technology Stack
- Framework: React 18.3.1 with TypeScript 5.6.3
- Build Tool: Vite 5.4.11
- Router: TanStack Router 1.121.24 (type-safe file-based routing)
- Server State: TanStack Query 5.62.2 (React Query)
- UI Framework: Tailwind CSS 3.4.16 with PostCSS
- Components: Radix UI primitives
- Forms: React Hook Form 7.54.1 with Zod 3.24.1
- GraphQL: Code generation with custom fetcher
- Authentication: Auth0 React SDK 2.2.4
- Icons: Lucide React 0.468.0
- Fonts: Geist font family
Project Structure
apps/web/src/
├── main.tsx # App entry point
├── globals.css # Global Tailwind styles
├── types.ts # GraphQL base types
├── routeTree.gen.ts # Auto-generated route tree
├── routes/ # TanStack Router routes
│ ├── __root.tsx # Root layout
│ ├── _layout/ # Nested layouts
│ └── _layout.tsx # Layout component
├── features/ # Feature modules
│ ├── admin/ # Admin-specific features
│ │ └── users/ # User management
│ ├── auth/ # Authentication
│ │ └── use_verify/ # User verification
│ └── layouts/ # Layout components
│ └── providers/ # App providers
├── packages/ # Shared packages
│ └── user_roles/ # User role management
├── lib/ # Utilities
│ └── utils.ts # Helper functions
├── codegen/ # GraphQL codegen config
│ └── fetcher.ts # Custom GraphQL fetcher
└── assets/ # Images, fonts, static files
TanStack Router
File-Based Routing
Routes are automatically generated from the file structure with full TypeScript support.
// routes/__root.tsx - Root layout
import { createRootRoute, Outlet } from '@tanstack/react-router';
import { TanStackRouterDevtools } from '@tanstack/router-devtools';
export const Route = createRootRoute({
component: () => (
<>
<Outlet />
<TanStackRouterDevtools />
</>
),
});
Protected Routes with Auth Context
// main.tsx - Router setup with auth context
import { createRouter, RouterProvider } from '@tanstack/react-router';
import { routeTree } from './routeTree.gen';
const router = createRouter({
routeTree,
context: {
auth: undefined!,
},
});
declare module '@tanstack/react-router' {
interface Register {
router: typeof router;
}
}
function MainApp() {
const { isAuthenticated } = useAuth0();
const { data } = useVerifyUserQuery(undefined, {
enabled: isAuthenticated,
});
return (
<RouterProvider
router={router}
context={{
auth: {
isAuthenticated: data?.verify.authorized || false,
role: data?.verify.role || null,
},
}}
/>
);
}
Creating Routes
// routes/admin/users.tsx
import { createFileRoute } from '@tanstack/react-router';
import { z } from 'zod';
// Search params validation
const searchSchema = z.object({
page: z.number().optional().default(1),
search: z.string().optional(),
});
export const Route = createFileRoute('/admin/users')({
validateSearch: searchSchema,
beforeLoad: ({ context }) => {
// Check auth
if (!context.auth.isAuthenticated || context.auth.role !== 'ADMIN') {
throw redirect({ to: '/' });
}
},
component: UsersPage,
});
function UsersPage() {
const { page, search } = Route.useSearch();
return (
<div>
{/* Page content */}
</div>
);
}
Navigation
import { Link, useNavigate } from '@tanstack/react-router';
export function Navigation() {
const navigate = useNavigate();
const handleClick = () => {
navigate({
to: '/admin/users',
search: { page: 1, search: 'john' },
});
};
return (
<nav>
<Link to="/admin/users" search={{ page: 1 }}>
Users
</Link>
<button onClick={handleClick}>Navigate</button>
</nav>
);
}
TanStack Query (React Query)
Setup with Providers
// features/layouts/providers/providers.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { Auth0Provider } from '@auth0/auth0-react';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5 minutes
retry: 1,
},
},
});
export function Providers({ children }) {
return (
<Auth0Provider
domain={process.env.VITE_AUTH0_DOMAIN}
clientId={process.env.VITE_AUTH0_CLIENT_ID}
authorizationParams={{
redirect_uri: window.location.origin,
}}
>
<QueryClientProvider client={queryClient}>
{children}
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</Auth0Provider>
);
}
GraphQL Integration with Custom Fetcher
// codegen/fetcher.ts
import { useAuth0 } from '@auth0/auth0-react';
export async function fetchData<TData, TVariables>(
query: string,
variables?: TVariables,
token?: string
): Promise<TData> {
const response = await fetch('http://localhost:3001/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(token && { Authorization: `Bearer ${token}` }),
},
body: JSON.stringify({
query,
variables,
}),
});
const json = await response.json();
if (json.errors) {
throw new Error(json.errors[0].message);
}
return json.data;
}
Using Generated Hooks
# features/auth/use_verify/verify_user.graphql
query VerifyUser {
verify {
authorized
role
}
}
// Auto-generated hook usage
import { useVerifyUserQuery } from './verify_user.generated';
export function AuthCheck() {
const { data, isLoading, error } = useVerifyUserQuery(undefined, {
enabled: isAuthenticated,
staleTime: 1000 * 60 * 10, // 10 minutes
});
if (isLoading) return <Spinner />;
if (error) return <ErrorMessage error={error} />;
return (
<div>
{data?.verify.authorized ? 'Authorized' : 'Unauthorized'}
{data?.verify.role && <span>Role: {data.verify.role}</span>}
</div>
);
}
Mutations
# packages/user_roles/use_update_user_role/update_user_role.graphql
mutation UpdateUserRole($userId: Int!, $role: String!) {
updateUserRole(userId: $userId, role: $role) {
success
message
}
}
import { useUpdateUserRoleMutation } from './update_user_role.generated';
import { useQueryClient } from '@tanstack/react-query';
export function UpdateRoleButton({ userId, newRole }) {
const queryClient = useQueryClient();
const { mutate, isPending } = useUpdateUserRoleMutation({
onSuccess: () => {
// Invalidate queries to refetch
queryClient.invalidateQueries({ queryKey: ['Users'] });
toast.success('Role updated successfully');
},
onError: (error) => {
toast.error(error.message);
},
});
const handleUpdate = () => {
mutate({ userId, role: newRole });
};
return (
<button onClick={handleUpdate} disabled={isPending}>
{isPending ? 'Updating...' : 'Update Role'}
</button>
);
}
Tailwind CSS & Styling
Configuration
// tailwind.config.js
export default {
darkMode: ['class'],
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
colors: {
border: 'hsl(var(--border))',
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))',
},
// ... more colors
},
},
},
plugins: [require('tailwindcss-animate')],
};
Utility Function
// lib/utils.ts
import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
Component Styling
import { cn } from '@/lib/utils';
export function Card({ className, ...props }) {
return (
<div
className={cn(
'rounded-lg border bg-card text-card-foreground shadow-sm',
className
)}
{...props}
/>
);
}
Radix UI Components
Building Composable Components
// components/ui/dropdown-menu.tsx
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { cn } from '@/lib/utils';
export function DropdownMenu(props) {
return <DropdownMenuPrimitive.Root {...props} />;
}
export function DropdownMenuTrigger({ className, ...props }) {
return (
<DropdownMenuPrimitive.Trigger
className={cn('outline-none', className)}
{...props}
/>
);
}
export function DropdownMenuContent({ className, ...props }) {
return (
<DropdownMenuPrimitive.Portal>
<DropdownMenuPrimitive.Content
className={cn(
'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 shadow-md',
className
)}
{...props}
/>
</DropdownMenuPrimitive.Portal>
);
}
// Usage
export function UserMenu() {
return (
<DropdownMenu>
<DropdownMenuTrigger>
<Button variant="ghost">Options</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
---
*Content truncated.*
When not to use it
- →When building non-admin interfaces
- →When using a different UI framework
Prerequisites
Limitations
- →Requires strict adherence to project structure
- →Limited to the specified technology stack
How it compares
Uses type-safe file-based routing and Zod-based form management instead of manual route and state handling.
Compared to similar skills
react-admin-panel side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| react-admin-panel (this skill) | 0 | 6mo | Review | Intermediate |
| web-artifacts-builder | 49 | 3mo | Review | Intermediate |
| ui-ux-expert-skill | 91 | 9mo | Review | Advanced |
| frontend-ui-dark-ts | 4 | 3mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
web-artifacts-builder
anthropics
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
ui-ux-expert-skill
fercracix33
Technical workflow for implementing accessible React user interfaces with shadcn/ui, Tailwind CSS, and TanStack Query. Includes 6-phase process with mandatory Style Guide compliance, Context7 best practices consultation, Chrome DevTools validation, and WCAG 2.1 AA accessibility standards. Use after Test Agent, Implementer, and Supabase agents complete their work.
frontend-ui-dark-ts
microsoft
Build dark-themed React applications using Tailwind CSS with custom theming, glassmorphism effects, and Framer Motion animations. Use when creating dashboards, admin panels, or data-rich interfaces with a refined dark aesthetic.
designer-skills
llama-farm
Designer subsystem patterns for LlamaFarm. Covers React 18, TanStack Query, TailwindCSS, and Radix UI.
react-skills
alexander-kastil
Build clean, accessible React components with TypeScript and Fluent UI. Use when creating new React components, converting designs to code, building reusable UI patterns, optimizing component performance, implementing accessibility guidelines, or structuring React projects. Supports component scaffo
frontend-ui-engineering
PM4-SmartFinance
Builds production-quality React 19 UIs that match SmartFinance conventions. Use when creating or modifying components, layouts, forms, charts, or any user-facing interface. Use when accessibility, semantic HTML, or design-token compliance is at risk.