--- name: "frontend-ui" description: "Enterprise SaaS frontend — Tailwind v4, shadcn/ui, Next.js App Router or Vite SPA, accessibility, responsive design, component patterns. Use when: React component, Next.js page, frontend UI, Tailwind, shadcn, accessibility, a11y, responsive design, form validation, server component, client component, design system, dark mode, SaaS UI, dashboard, pricing page, enterprise UI, data table, landing page, Vite, React Router, SPA, single page app." --- Enterprise-grade frontend skill for auditing and building world-class SaaS UIs. Covers Tailwind CSS v4 (CSS-first config), shadcn/ui (2026), Next.js 15+ App Router **or Vite SPA** with React 19. Production SaaS: dashboards, pricing pages, data tables, onboarding, role-based UI — with WCAG 2.1 AA accessibility and Core Web Vitals performance baked in. ## Setup: Tailwind v4 + shadcn/ui ```bash npx create-next-app@latest my-app --typescript --tailwind --eslint --app --src-dir cd my-app && npx shadcn@latest init npx shadcn@latest add button card dialog table form ``` ### Tailwind v4 — CSS-First (No tailwind.config.js) ```css /* app/globals.css */ @import "tailwindcss"; @theme inline { --color-background: oklch(1 0 0); --color-foreground: oklch(0.145 0 0); --color-primary: oklch(0.205 0.042 264.695); --color-primary-foreground: oklch(0.985 0 0); --radius-lg: 0.5rem; --radius-md: calc(var(--radius-lg) - 2px); --radius-sm: calc(var(--radius-lg) - 4px); } ``` ### Component Anatomy (shadcn/ui 2026) ```tsx import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const buttonVariants = cva( "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors", { variants: { variant: { default: "bg-primary text-primary-foreground", outline: "border border-input" }, size: { default: "h-10 px-4 py-2", sm: "h-9 px-3", lg: "h-11 px-8" }, }, defaultVariants: { variant: "default", size: "default" }, } ) // React 19: ref is a regular prop — no forwardRef // data-slot: styling hook for parent overrides function Button({ className, variant, size, ref, ...props }: React.ComponentProps<"button"> & VariantProps) { return