Skip to main content Skills Marketplace Découvrez et explorez les compétences IA créées par la communauté.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Copier le promptAfficher les détails du prompt Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
npx skills add https://github.com/gmackie/agent-skills --skill react-ui-shadcn-tailwindLa commande reste sur une seule ligne. Faites défiler horizontalement pour la vérifier avant de la copier.
Vous préférez une copie locale ? Téléchargez les fichiers actuellement disponibles dans SkillsMP.
Télécharger Zip Téléchargement... Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.
EAS service (paid). Deploy Expo apps to the app stores with EAS - build and submit to the iOS App Store, Google Play Store, and TestFlight, configure eas.json build and submit profiles, manage app versions and build numbers, and publish App Store metadata and ASO. Use whenever the user wants to deploy, release, or ship an app to production or the app stores, is preparing a production build, running eas build or eas submit, shipping to TestFlight, bumping version or build numbers, or setting up store listing metadata. For deploying an Expo website or API routes, use the eas-hosting skill.
Métiers associés SOC
Basé sur la classification professionnelle SOC
Explorateur de fichiers
2 fichiers name react-ui-shadcn-tailwind description Generate modern React UI components using shadcn/ui and Tailwind CSS. Create forms, dashboards, data tables, and interactive components with consistent design patterns. allowed-tools fs_read fs_write execute_bash metadata {"tags":"design,react,ui,webapp","groups":"react","invocation":"model","author":"kiro-cli","version":"1.0","category":"frontend","compatibility":"Requires React, Tailwind CSS, shadcn/ui installed"}
React UI Generation with shadcn/ui and Tailwind
Instructions
1. Set up shadcn/ui and Tailwind
Initialize shadcn/ui in existing React project:
npx shadcn-ui@latest init
Install additional components:
npx shadcn-ui@latest add button card form input label select textarea
npx shadcn-ui@latest add table dialog sheet toast tabs badge
npx shadcn-ui@latest add dropdown-menu avatar separator progress
2. Form components with validation
Advanced form with react-hook-form:
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import * as z from "zod"
import { Button } from "@/components/ui/button"
import { Form , FormControl , FormField , FormItem , FormLabel , FormMessage } from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { Select , SelectContent , SelectItem , SelectTrigger , SelectValue } from "@/components/ui/select"
import { Textarea } from "@/components/ui/textarea"
import { Card , CardContent , CardHeader , CardTitle } from "@/components/ui/card"
const formSchema = z.object ({
name : z.string ().min (2 , "Name must be at least 2 characters" ),
email : z.string ().email ("Invalid email address" ),
role : z.string ().min (1 , "Please select a role" ),
bio : z.string ().max (500 , "Bio must be less than 500 characters" ),
})
export function UserProfileForm ( ) {
const form = useForm<z.infer <typeof formSchema>>({
resolver : zodResolver (formSchema),
defaultValues : {
name : "" ,
email : "" ,
role : "" ,
bio : "" ,
},
})
function onSubmit (values : z.infer<typeof formSchema> ) {
console .log (values)
}
return (
<Card className ="w-full max-w-2xl mx-auto" >
<CardHeader >
<CardTitle > User Profile</CardTitle >
</CardHeader >
<CardContent >
<Form {...form }>
<form onSubmit ={form.handleSubmit(onSubmit)} className ="space-y-6" >
<FormField
control ={form.control}
name ="name"
render ={({ field }) => (
<FormItem >
<FormLabel > Name</FormLabel >
<FormControl >
<Input placeholder ="Enter your name" {...field } />
</FormControl >
<FormMessage />
</FormItem >
)}
/>
<FormField
control ={form.control}
name =
= }) => (
Email
)}
/>
(
Role
Admin
User
Moderator
)}
/>
(
Bio
)}
/>
Save Profile
)
}
3. Data table with sorting and filtering
Advanced data table component:
import { useState } from "react"
import { Table , TableBody , TableCell , TableHead , TableHeader , TableRow } from "@/components/ui/table"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Badge } from "@/components/ui/badge"
import { DropdownMenu , DropdownMenuContent , DropdownMenuItem , DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import { Card , CardContent , CardHeader , CardTitle } from "@/components/ui/card"
import { MoreHorizontal , Search , Filter } from "lucide-react"
interface User {
id : string
name : string
email : string
:
: |
:
}
: [] = [
{ : , : , : , : , : , : },
{ : , : , : , : , : , : },
]
( ) {
[users, setUsers] = useState< []>(mockUsers)
[searchTerm, setSearchTerm] = ( )
[statusFilter, setStatusFilter] = useState< >( )
filteredUsers = users. ( {
matchesSearch = user. . (). (searchTerm. ()) ||
user. . (). (searchTerm. ())
matchesStatus = statusFilter === || user. === statusFilter
matchesSearch && matchesStatus
})
(
)
}
4. Dashboard layout with metrics
Dashboard with cards and charts:
import { Card , CardContent , CardHeader , CardTitle } from "@/components/ui/card"
import { Progress } from "@/components/ui/progress"
import { Badge } from "@/components/ui/badge"
import { Tabs , TabsContent , TabsList , TabsTrigger } from "@/components/ui/tabs"
import { Users , DollarSign , Activity , TrendingUp } from "lucide-react"
export function Dashboard ( ) {
return (
<div className ="p-6 space-y-6" >
<div className ="flex items-center justify-between" >
<h1 className ="text-3xl font-bold" > Dashboard</h1 >
<Badge variant ="outline" > Last updated: 2 min ago</Badge >
{/* Metrics Cards */}
Total Revenue
$45,231.89
+20.1% from last month
Active Users
2,350
+180.1% from last month
Sales
12,234
+19% from last month
Active Now
573
+201 since last hour
{/* Detailed Analytics */}
Overview
Analytics
Reports
Recent Activity
New user registered
2 minutes ago
Payment received
5 minutes ago
Progress
Monthly Goal
75%
Weekly Target
60%
)
}
5. Modal dialogs and sheets
Reusable modal patterns:
import { useState } from "react"
import { Dialog , DialogContent , DialogHeader , DialogTitle , DialogTrigger } from "@/components/ui/dialog"
import { Sheet , SheetContent , SheetHeader , SheetTitle , SheetTrigger } from "@/components/ui/sheet"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
export function CreateUserModal ( ) {
const [open, setOpen] = useState (false )
return (
<Dialog open ={open} onOpenChange ={setOpen} >
<DialogTrigger asChild >
<Button > Create User</Button >
</ >
Create New User
Name
Email
setOpen(false)}>Cancel
setOpen(false)}>Create
)
}
( ) {
(
)
}
Examples
Quick UI generation commands
"Create a user registration form with validation"
"Generate a data table for products with search and filters"
"Build a dashboard with revenue metrics and charts"
"Create a settings modal with theme switcher"
"Generate a responsive navigation with mobile menu"
Custom component patterns
export function LoadingCard ({ title, children, isLoading }: {
title: string
children: React.ReactNode
isLoading?: boolean
} ) {
return (
<Card >
<CardHeader >
<CardTitle > {title}</CardTitle >
</CardHeader >
<CardContent >
{isLoading ? (
<div className ="flex items-center justify-center h-32" >
<div className ="animate-spin rounded-full h-8 w-8 border-b-2 border-primary" > </div >
</div >
) : (
children
)}
</CardContent >
</Card >
)
}
Troubleshooting
Components not styled : Verify Tailwind CSS is properly configured and imported
shadcn/ui components missing : Run npx shadcn-ui@latest add [component-name]
Form validation not working : Check zod schema and react-hook-form setup
Table sorting broken : Implement proper sort state management
Modal not closing : Ensure proper state management with open/onOpenChange
Responsive issues : Use Tailwind responsive prefixes (sm:, md:, lg:, xl:)
"email"
render
{({
field
<FormItem >
<FormLabel >
</FormLabel >
<FormControl >
<Input type ="email" placeholder ="Enter your email" {...field } />
</FormControl >
<FormMessage />
</FormItem >
<FormField
control ={form.control}
name ="role"
render ={({ field }) =>
<FormItem >
<FormLabel >
</FormLabel >
<Select onValueChange ={field.onChange} defaultValue ={field.value} >
<FormControl >
<SelectTrigger >
<SelectValue placeholder ="Select a role" />
</SelectTrigger >
</FormControl >
<SelectContent >
<SelectItem value ="admin" >
</SelectItem >
<SelectItem value ="user" >
</SelectItem >
<SelectItem value ="moderator" >
</SelectItem >
</SelectContent >
</Select >
<FormMessage />
</FormItem >
<FormField
control ={form.control}
name ="bio"
render ={({ field }) =>
<FormItem >
<FormLabel >
</FormLabel >
<FormControl >
<Textarea
placeholder ="Tell us about yourself"
className ="resize-none"
{...field }
/>
</FormControl >
<FormMessage />
</FormItem >
<Button type ="submit" className ="w-full" >
</Button >
</form >
</Form >
</CardContent >
</Card >
role
string
status
"active"
"inactive"
lastLogin
string
const
mockUsers
User
id
"1"
name
"John Doe"
email
"john@example.com"
role
"admin"
status
"active"
lastLogin
"2024-01-15"
id
"2"
name
"Jane Smith"
email
"jane@example.com"
role
"user"
status
"inactive"
lastLogin
"2024-01-10"
export
function
UsersTable
const
User
const
useState
""
const
string
"all"
const
filter
user =>
const
name
toLowerCase
includes
toLowerCase
email
toLowerCase
includes
toLowerCase
const
"all"
status
return
return
<Card >
<CardHeader >
<CardTitle > Users Management</CardTitle >
<div className ="flex gap-4" >
<div className ="relative flex-1" >
<Search className ="absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" />
<Input
placeholder ="Search users..."
value ={searchTerm}
onChange ={(e) => setSearchTerm(e.target.value)}
className="pl-8"
/>
</div >
<DropdownMenu >
<DropdownMenuTrigger asChild >
<Button variant ="outline" >
<Filter className ="mr-2 h-4 w-4" />
Status: {statusFilter}
</Button >
</DropdownMenuTrigger >
<DropdownMenuContent >
<DropdownMenuItem onClick ={() => setStatusFilter("all")}>All</DropdownMenuItem >
<DropdownMenuItem onClick ={() => setStatusFilter("active")}>Active</DropdownMenuItem >
<DropdownMenuItem onClick ={() => setStatusFilter("inactive")}>Inactive</DropdownMenuItem >
</DropdownMenuContent >
</DropdownMenu >
</div >
</CardHeader >
<CardContent >
<Table >
<TableHeader >
<TableRow >
<TableHead > Name</TableHead >
<TableHead > Email</TableHead >
<TableHead > Role</TableHead >
<TableHead > Status</TableHead >
<TableHead > Last Login</TableHead >
<TableHead className ="w-[100px]" > Actions</TableHead >
</TableRow >
</TableHeader >
<TableBody >
{filteredUsers.map((user) => (
<TableRow key ={user.id} >
<TableCell className ="font-medium" > {user.name}</TableCell >
<TableCell > {user.email}</TableCell >
<TableCell >
<Badge variant ={user.role === "admin" ? "default " : "secondary "}>
{user.role}
</Badge >
</TableCell >
<TableCell >
<Badge variant ={user.status === "active" ? "default " : "destructive "}>
{user.status}
</Badge >
</TableCell >
<TableCell > {user.lastLogin}</TableCell >
<TableCell >
<DropdownMenu >
<DropdownMenuTrigger asChild >
<Button variant ="ghost" className ="h-8 w-8 p-0" >
<MoreHorizontal className ="h-4 w-4" />
</Button >
</DropdownMenuTrigger >
<DropdownMenuContent align ="end" >
<DropdownMenuItem > Edit</DropdownMenuItem >
<DropdownMenuItem > Delete</DropdownMenuItem >
</DropdownMenuContent >
</DropdownMenu >
</TableCell >
</TableRow >
))}
</TableBody >
</Table >
</CardContent >
</Card >
</div >
<div className ="grid gap-4 md:grid-cols-2 lg:grid-cols-4" >
<Card >
<CardHeader className ="flex flex-row items-center justify-between space-y-0 pb-2" >
<CardTitle className ="text-sm font-medium" >
</CardTitle >
<DollarSign className ="h-4 w-4 text-muted-foreground" />
</CardHeader >
<CardContent >
<div className ="text-2xl font-bold" >
</div >
<p className ="text-xs text-muted-foreground" >
</p >
</CardContent >
</Card >
<Card >
<CardHeader className ="flex flex-row items-center justify-between space-y-0 pb-2" >
<CardTitle className ="text-sm font-medium" >
</CardTitle >
<Users className ="h-4 w-4 text-muted-foreground" />
</CardHeader >
<CardContent >
<div className ="text-2xl font-bold" >
</div >
<p className ="text-xs text-muted-foreground" >
</p >
</CardContent >
</Card >
<Card >
<CardHeader className ="flex flex-row items-center justify-between space-y-0 pb-2" >
<CardTitle className ="text-sm font-medium" >
</CardTitle >
<TrendingUp className ="h-4 w-4 text-muted-foreground" />
</CardHeader >
<CardContent >
<div className ="text-2xl font-bold" >
</div >
<p className ="text-xs text-muted-foreground" >
</p >
</CardContent >
</Card >
<Card >
<CardHeader className ="flex flex-row items-center justify-between space-y-0 pb-2" >
<CardTitle className ="text-sm font-medium" >
</CardTitle >
<Activity className ="h-4 w-4 text-muted-foreground" />
</CardHeader >
<CardContent >
<div className ="text-2xl font-bold" >
</div >
<p className ="text-xs text-muted-foreground" >
</p >
</CardContent >
</Card >
</div >
<Tabs defaultValue ="overview" className ="space-y-4" >
<TabsList >
<TabsTrigger value ="overview" >
</TabsTrigger >
<TabsTrigger value ="analytics" >
</TabsTrigger >
<TabsTrigger value ="reports" >
</TabsTrigger >
</TabsList >
<TabsContent value ="overview" className ="space-y-4" >
<div className ="grid gap-4 md:grid-cols-2 lg:grid-cols-7" >
<Card className ="col-span-4" >
<CardHeader >
<CardTitle >
</CardTitle >
</CardHeader >
<CardContent className ="space-y-4" >
<div className ="flex items-center space-x-4" >
<div className ="w-2 h-2 bg-blue-500 rounded-full" >
</div >
<div className ="flex-1" >
<p className ="text-sm font-medium" >
</p >
<p className ="text-xs text-muted-foreground" >
</p >
</div >
</div >
<div className ="flex items-center space-x-4" >
<div className ="w-2 h-2 bg-green-500 rounded-full" >
</div >
<div className ="flex-1" >
<p className ="text-sm font-medium" >
</p >
<p className ="text-xs text-muted-foreground" >
</p >
</div >
</div >
</CardContent >
</Card >
<Card className ="col-span-3" >
<CardHeader >
<CardTitle >
</CardTitle >
</CardHeader >
<CardContent className ="space-y-4" >
<div className ="space-y-2" >
<div className ="flex items-center justify-between text-sm" >
<span >
</span >
<span >
</span >
</div >
<Progress value ={75} />
</div >
<div className ="space-y-2" >
<div className ="flex items-center justify-between text-sm" >
<span >
</span >
<span >
</span >
</div >
<Progress value ={60} />
</div >
</CardContent >
</Card >
</div >
</TabsContent >
</Tabs >
</div >
DialogTrigger
<DialogContent className ="sm:max-w-[425px]" >
<DialogHeader >
<DialogTitle >
</DialogTitle >
</DialogHeader >
<div className ="grid gap-4 py-4" >
<div className ="grid grid-cols-4 items-center gap-4" >
<Label htmlFor ="name" className ="text-right" >
</Label >
<Input id ="name" className ="col-span-3" />
</div >
<div className ="grid grid-cols-4 items-center gap-4" >
<Label htmlFor ="email" className ="text-right" >
</Label >
<Input id ="email" type ="email" className ="col-span-3" />
</div >
</div >
<div className ="flex justify-end gap-2" >
<Button variant ="outline" onClick ={() =>
</Button >
<Button onClick ={() =>
</Button >
</div >
</DialogContent >
</Dialog >
export
function
SettingsSheet
return
<Sheet >
<SheetTrigger asChild >
<Button variant ="outline" > Settings</Button >
</SheetTrigger >
<SheetContent >
<SheetHeader >
<SheetTitle > Settings</SheetTitle >
</SheetHeader >
<div className ="py-4 space-y-4" >
<div className ="space-y-2" >
<Label > Theme</Label >
<select className ="w-full p-2 border rounded" >
<option > Light</option >
<option > Dark</option >
<option > System</option >
</select >
</div >
</div >
</SheetContent >
</Sheet >