← Back to Skills

moai-lib-shadcn-ui

modu-ai
Updated Today
24 views
424
78
424
View on GitHub
Designreactaidesign

About

This skill provides enterprise-grade shadcn/ui components with AI-powered design system architecture for React applications. It features Context7 integration and intelligent component orchestration to streamline development. Use this when working with shadcn/ui, React, TypeScript, or Tailwind CSS to enhance component management and design consistency.

Quick Install

Claude Code

Recommended
Plugin CommandRecommended
/plugin add https://github.com/modu-ai/moai-adk
Git CloneAlternative
git clone https://github.com/modu-ai/moai-adk.git ~/.claude/skills/moai-lib-shadcn-ui

Copy and paste this command in Claude Code to install this skill

Documentation

Enterprise shadcn/ui Component Library Expert v4.0.0

Skill Metadata

FieldValue
Skill Namemoai-lib-shadcn-ui
Version4.0.0 (2025-11-13)
TierEnterprise Component Library Expert
AI-Poweredβœ… Context7 Integration, Intelligent Architecture
Auto-loadOn demand when shadcn/ui keywords detected

What It Does

Enterprise shadcn/ui Component Library expert with AI-powered design system architecture, Context7 integration, and intelligent component orchestration for modern React applications.

Revolutionary v4.0.0 capabilities:

  • πŸ€– AI-Powered Component Architecture using Context7 MCP for latest design patterns
  • πŸ“Š Intelligent Design System with automated theme customization and optimization
  • πŸš€ Advanced Component Orchestration with AI-driven accessibility and performance
  • πŸ”— Enterprise UI Framework with zero-configuration design tokens and branding
  • πŸ“ˆ Predictive Component Analytics with usage forecasting and optimization insights

When to Use

Automatic triggers:

  • shadcn/ui component library and design system discussions
  • React component architecture and UI framework planning
  • Tailwind CSS integration and design token management
  • Accessibility implementation and design customization

Manual invocation:

  • Designing enterprise design systems with shadcn/ui
  • Implementing comprehensive component libraries
  • Planning theme customization and branding strategies
  • Optimizing component performance and accessibility

Quick Reference (Level 1)

shadcn/ui Ecosystem (November 2025)

Core Components

  • Form Components: Input, Select, Checkbox, Radio, Textarea
  • Display Components: Card, Dialog, Sheet, Drawer, Popover
  • Navigation Components: Navigation Menu, Breadcrumb, Tabs, Pagination
  • Data Components: Table, Calendar, DatePicker, Chart Components
  • Feedback Components: Alert, Toast, Progress, Badge, Avatar

Foundation Technologies

  • React 19: Latest React with server components and concurrent features
  • TypeScript 5.5: Full type safety and enhanced developer experience
  • Tailwind CSS 3.4: Utility-first CSS framework with JIT compilation
  • Radix UI: Unstyled, accessible component primitives
  • Framer Motion: Production-ready motion library for animations
  • Lucide React: Beautifully designed icon library

Design System Features

  • Dark Mode: Comprehensive dark mode support with system detection
  • Responsive Design: Mobile-first responsive components
  • Accessibility: WCAG 2.1 AA compliance with proper ARIA support
  • Theming: CSS variables for comprehensive theme customization
  • Animation: Smooth animations and transitions with Framer Motion

Integration Benefits

  • Developer Experience: Excellent DX with TypeScript and hot reloading
  • Customization: Fully customizable with Tailwind CSS classes
  • Performance: Optimized bundle size and runtime performance
  • Accessibility: Built-in accessibility with Radix UI primitives
  • Consistency: Design system ensures consistent UI across applications

Core Implementation (Level 2)

shadcn/ui Architecture Intelligence

# AI-powered shadcn/ui architecture optimization with Context7
class ShadcnUIArchitectOptimizer:
    def __init__(self):
        self.context7_client = Context7Client()
        self.component_analyzer = ComponentAnalyzer()
        self.theme_optimizer = ThemeOptimizer()
    
    async def design_optimal_shadcn_architecture(self, 
                                               requirements: DesignSystemRequirements) -> ShadcnUIArchitecture:
        """Design optimal shadcn/ui architecture using AI analysis."""
        
        # Get latest shadcn/ui and React documentation via Context7
        shadcn_docs = await self.context7_client.get_library_docs(
            context7_library_id='/shadcn-ui/docs',
            topic="component library design system theming accessibility 2025",
            tokens=3000
        )
        
        react_docs = await self.context7_client.get_library_docs(
            context7_library_id='/react/docs',
            topic="hooks server-components performance optimization 2025",
            tokens=2000
        )
        
        # Optimize component selection
        component_selection = self.component_analyzer.optimize_component_selection(
            requirements.ui_components,
            requirements.user_needs,
            shadcn_docs
        )
        
        # Optimize theme configuration
        theme_configuration = self.theme_optimizer.optimize_theme_system(
            requirements.brand_guidelines,
            requirements.accessibility_requirements,
            shadcn_docs
        )
        
        return ShadcnUIArchitecture(
            component_library=component_selection,
            theme_system=theme_configuration,
            accessibility_compliance=self._ensure_accessibility_compliance(
                requirements.accessibility_requirements
            ),
            performance_optimization=self._optimize_component_performance(
                component_selection
            ),
            integration_patterns=self._design_integration_patterns(
                requirements.framework_stack
            ),
            customization_strategy=self._plan_customization_strategy(
                requirements.customization_needs
            )
        )

Component System Implementation

// Advanced shadcn/ui component with TypeScript and modern patterns
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";

// Component variants using class-variance-authority
const buttonVariants = cva(
  "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
  {
    variants: {
      variant: {
        default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
        destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
        outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
        secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
        ghost: "hover:bg-accent hover:text-accent-foreground",
        link: "text-primary underline-offset-4 hover:underline",
      },
      size: {
        default: "h-9 px-4 py-2",
        sm: "h-8 rounded-md px-3 text-xs",
        lg: "h-10 rounded-md px-8",
        icon: "h-9 w-9",
      },
    },
    defaultVariants: {
      variant: "default",
      size: "default",
    },
  }
);

export interface ButtonProps
  extends React.ButtonHTMLAttributes<HTMLButtonElement>,
    VariantProps<typeof buttonVariants> {
  asChild?: boolean;
  loading?: boolean;
  loadingText?: string;
}

// Enhanced button component with loading state and accessibility
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
  ({ className, variant, size, asChild = false, loading, loadingText, children, disabled, ...props }, ref) => {
    const Comp = asChild ? Slot : "button";
    
    return (
      <Comp
        className={cn(buttonVariants({ variant, size, className }))}
        ref={ref}
        disabled={disabled || loading}
        aria-disabled={disabled || loading}
        aria-describedby={loading ? "loading-description" : undefined}
        {...props}
      >
        {loading && (
          <div className="mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" />
        )}
        
        {loading && loadingText ? (
          <span id="loading-description" className="sr-only">
            {loadingText}
          </span>
        ) : null}
        
        {loading ? loadingText || children : children}
      </Comp>
    );
  }
);

Button.displayName = "Button";

export { Button, buttonVariants };

// Advanced form component with validation
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";

const formSchema = z.object({
  username: z.string().min(2, {
    message: "Username must be at least 2 characters.",
  }),
  email: z.string().email({
    message: "Please enter a valid email address.",
  }),
  password: z.string().min(8, {
    message: "Password must be at least 8 characters.",
  }),
});

type FormValues = z.infer<typeof formSchema>;

export function UserForm() {
  const form = useForm<FormValues>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      username: "",
      email: "",
      password: "",
    },
  });

  const onSubmit = async (data: FormValues) => {
    try {
      // Handle form submission
      console.log("Form data:", data);
    } catch (error) {
      console.error("Submission error:", error);
    }
  };

  return (
    <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
      <div className="space-y-2">
        <Label htmlFor="username">Username</Label>
        <Input
          id="username"
          type="text"
          placeholder="Enter your username"
          {...form.register("username")}
          aria-invalid={form.formState.errors.username ? "true" : "false"}
          aria-describedby={form.formState.errors.username ? "username-error" : undefined}
        />
        {form.formState.errors.username && (
          <p id="username-error" className="text-sm text-destructive">
            {form.formState.errors.username.message}
          </p>
        )}
      </div>

      <div className="space-y-2">
        <Label htmlFor="email">Email</Label>
        <Input
          id="email"
          type="email"
          placeholder="Enter your email"
          {...form.register("email")}
          aria-invalid={form.formState.errors.email ? "true" : "false"}
          aria-describedby={form.formState.errors.email ? "email-error" : undefined}
        />
        {form.formState.errors.email && (
          <p id="email-error" className="text-sm text-destructive">
            {form.formState.errors.email.message}
          </p>
        )}
      </div>

      <div className="space-y-2">
        <Label htmlFor="password">Password</Label>
        <Input
          id="password"
          type="password"
          placeholder="Enter your password"
          {...form.register("password")}
          aria-invalid={form.formState.errors.password ? "true" : "false"}
          aria-describedby={form.formState.errors.password ? "password-error" : undefined}
        />
        {form.formState.errors.password && (
          <p id="password-error" className="text-sm text-destructive">
            {form.formState.errors.password.message}
          </p>
        )}
      </div>

      <Button type="submit" className="w-full" disabled={form.formState.isSubmitting}>
        {form.formState.isSubmitting ? "Creating account..." : "Create account"}
      </Button>
    </form>
  );
}

Theme System Implementation

// Advanced theme system with CSS variables and dark mode
import { createContext, useContext, useEffect, useState } from "react";

type Theme = "dark" | "light" | "system";

interface ThemeProviderProps {
  children: React.ReactNode;
  defaultTheme?: Theme;
  storageKey?: string;
  attribute?: string;
  enableSystem?: boolean;
}

interface ThemeProviderState {
  theme: Theme;
  setTheme: (theme: Theme) => void;
}

const ThemeProviderContext = createContext<ThemeProviderState | undefined>(undefined);

export function ThemeProvider({
  children,
  defaultTheme = "system",
  storageKey = "ui-theme",
  attribute = "class",
  enableSystem = true,
  ...props
}: ThemeProviderProps) {
  const [theme, setTheme] = useState<Theme>(() => {
    if (typeof window !== "undefined") {
      return (localStorage.getItem(storageKey) as Theme) || defaultTheme;
    }
    return defaultTheme;
  });

  useEffect(() => {
    const root = window.document.documentElement;

    root.classList.remove("light", "dark");

    if (theme === "system" && enableSystem) {
      const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
        .matches
        ? "dark"
        : "light";

      root.classList.add(systemTheme);
      return;
    }

    root.classList.add(theme);
  }, [theme, enableSystem, attribute]);

  const value = {
    theme,
    setTheme: (theme: Theme) => {
      localStorage.setItem(storageKey, theme);
      setTheme(theme);
    },
  };

  return (
    <ThemeProviderContext.Provider {...props} value={value}>
      {children}
    </ThemeProviderContext.Provider>
  );
}

export const useTheme = () => {
  const context = useContext(ThemeProviderContext);

  if (context === undefined)
    throw new Error("useTheme must be used within a ThemeProvider");

  return context;
};

// Theme configuration with design tokens
export const theme = {
  light: {
    background: "hsl(0 0% 100%)",
    foreground: "hsl(240 10% 3.9%)",
    card: "hsl(0 0% 100%)",
    cardForeground: "hsl(240 10% 3.9%)",
    popover: "hsl(0 0% 100%)",
    popoverForeground: "hsl(240 10% 3.9%)",
    primary: "hsl(240 9% 10%)",
    primaryForeground: "hsl(0 0% 98%)",
    secondary: "hsl(240 4.8% 95.9%)",
    secondaryForeground: "hsl(240 3.8% 46.1%)",
    muted: "hsl(240 4.8% 95.9%)",
    mutedForeground: "hsl(240 3.8% 46.1%)",
    accent: "hsl(240 4.8% 95.9%)",
    accentForeground: "hsl(240 5.9% 10%)",
    destructive: "hsl(0 72.22% 50.59%)",
    destructiveForeground: "hsl(0 0% 98%)",
    border: "hsl(240 5.9% 90%)",
    input: "hsl(240 5.9% 90%)",
    ring: "hsl(240 5.9% 10%)",
  },
  dark: {
    background: "hsl(240 10% 3.9%)",
    foreground: "hsl(0 0% 98%)",
    card: "hsl(240 10% 3.9%)",
    cardForeground: "hsl(0 0% 98%)",
    popover: "hsl(240 10% 3.9%)",
    popoverForeground: "hsl(0 0% 98%)",
    primary: "hsl(0 0% 98%)",
    primaryForeground: "hsl(240 9% 10%)",
    secondary: "hsl(240 3.7% 15.9%)",
    secondaryForeground: "hsl(0 0% 98%)",
    muted: "hsl(240 3.7% 15.9%)",
    mutedForeground: "hsl(240 5% 64.9%)",
    accent: "hsl(240 3.7% 15.9%)",
    accentForeground: "hsl(0 0% 98%)",
    destructive: "hsl(0 62.8% 30.6%)",
    destructiveForeground: "hsl(0 0% 98%)",
    border: "hsl(240 3.7% 15.9%)",
    input: "hsl(240 3.7% 15.9%)",
    ring: "hsl(240 4.9% 83.9%)",
  },
};

// Apply theme CSS variables
export function applyThemeCSS() {
  const root = document.documentElement;
  
  Object.entries(theme.light).forEach(([key, value]) => {
    root.style.setProperty(`--${key}`, value);
  });
}

Advanced Implementation (Level 3)

Advanced Component Patterns

// Complex data table with shadcn/ui components
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table";
import {
  ColumnDef,
  flexRender,
  getCoreRowModel,
  getPaginationRowModel,
  useReactTable,
} from "@tanstack/react-table";

interface DataTableProps<TData, TValue> {
  columns: ColumnDef<TData, TValue>[];
  data: TData[];
  searchKey?: string;
  filterableColumns?: string[];
}

export function DataTable<TData, TValue>({
  columns,
  data,
  searchKey,
  filterableColumns = [],
}: DataTableProps<TData, TValue>) {
  const [globalFilter, setGlobalFilter] = useState("");
  const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);

  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
    getPaginationRowModel: getPaginationRowModel(),
    onGlobalFilterChange: setGlobalFilter,
    onColumnFiltersChange: setColumnFilters,
    state: {
      globalFilter,
      columnFilters,
    },
  });

  return (
    <div className="space-y-4">
      {/* Search and Filters */}
      <div className="flex items-center gap-4">
        <Input
          placeholder={`Filter ${searchKey}...`}
          value={(globalFilter ?? "") as string}
          onChange={(event) => setGlobalFilter(String(event.target.value))}
          className="max-w-sm"
        />
        
        {/* Column Filters */}
        {filterableColumns.map((column) => (
          <DataTableColumnFilter
            key={column}
            column={table.getColumn(column)}
            title={column}
          />
        ))}
      </div>

      {/* Data Table */}
      <div className="rounded-md border">
        <Table>
          <TableHeader>
            {table.getHeaderGroups().map((headerGroup) => (
              <TableRow key={headerGroup.id}>
                {headerGroup.headers.map((header) => (
                  <TableHead key={header.id}>
                    {header.isPlaceholder
                      ? null
                      : flexRender(
                          header.column.columnDef.header,
                          header.getContext()
                        )}
                  </TableHead>
                ))}
              </TableRow>
            ))}
          </TableHeader>
          <TableBody>
            {table.getRowModel().rows?.length ? (
              table.getRowModel().rows.map((row) => (
                <TableRow
                  key={row.id}
                  data-state={row.getIsSelected() && "selected"}
                >
                  {row.getVisibleCells().map((cell) => (
                    <TableCell key={cell.id}>
                      {flexRender(
                        cell.column.columnDef.cell,
                        cell.getContext()
                      )}
                    </TableCell>
                  ))}
                </TableRow>
              ))
            ) : (
              <TableRow>
                <TableCell
                  colSpan={columns.length}
                  className="h-24 text-center"
                >
                  No results.
                </TableCell>
              </TableRow>
            )}
          </TableBody>
        </Table>
      </div>

      {/* Pagination */}
      <div className="flex items-center justify-end space-x-2 py-4">
        <Button
          variant="outline"
          size="sm"
          onClick={() => table.previousPage()}
          disabled={!table.getCanPreviousPage()}
        >
          Previous
        </Button>
        <Button
          variant="outline"
          size="sm"
          onClick={() => table.nextPage()}
          disabled={!table.getCanNextPage()}
        >
          Next
        </Button>
      </div>
    </div>
  );
}

// Advanced form with multi-step validation
import { useState } from "react";
import { useForm, FormProvider } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { Button } from "@/components/ui/button";
import { Progress } from "@/components/ui/progress";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";

const multiStepSchema = z.object({
  // Step 1: Personal Information
  personalInfo: z.object({
    firstName: z.string().min(2),
    lastName: z.string().min(2),
    email: z.string().email(),
    phone: z.string().optional(),
  }),
  
  // Step 2: Address
  address: z.object({
    street: z.string().min(5),
    city: z.string().min(2),
    state: z.string().min(2),
    zipCode: z.string().regex(/^\d{5}(-\d{4})?$/),
    country: z.string().min(2),
  }),
  
  // Step 3: Preferences
  preferences: z.object({
    newsletter: z.boolean(),
    notifications: z.boolean(),
    theme: z.enum(["light", "dark", "system"]),
  }),
});

type MultiStepFormValues = z.infer<typeof multiStepSchema>;

export function MultiStepForm() {
  const [currentStep, setCurrentStep] = useState(0);
  const [isSubmitting, setIsSubmitting] = useState(false);
  
  const methods = useForm<MultiStepFormValues>({
    resolver: zodResolver(multiStepSchema),
    defaultValues: {
      personalInfo: {
        firstName: "",
        lastName: "",
        email: "",
        phone: "",
      },
      address: {
        street: "",
        city: "",
        state: "",
        zipCode: "",
        country: "",
      },
      preferences: {
        newsletter: false,
        notifications: true,
        theme: "system",
      },
    },
  });

  const steps = [
    { title: "Personal Info", component: PersonalInfoStep },
    { title: "Address", component: AddressStep },
    { title: "Preferences", component: PreferencesStep },
  ];

  const handleNext = async () => {
    const currentStepName = ["personalInfo", "address", "preferences"][currentStep];
    const isValid = await methods.trigger(currentStepName as any);
    
    if (isValid && currentStep < steps.length - 1) {
      setCurrentStep(currentStep + 1);
    }
  };

  const handlePrevious = () => {
    if (currentStep > 0) {
      setCurrentStep(currentStep - 1);
    }
  };

  const onSubmit = async (data: MultiStepFormValues) => {
    setIsSubmitting(true);
    try {
      // Handle form submission
      console.log("Form submitted:", data);
      await new Promise(resolve => setTimeout(resolve, 2000)); // Simulate API call
    } catch (error) {
      console.error("Submission error:", error);
    } finally {
      setIsSubmitting(false);
    }
  };

  const progress = ((currentStep + 1) / steps.length) * 100;
  const CurrentStepComponent = steps[currentStep].component;

  return (
    <div className="w-full max-w-2xl mx-auto p-6">
      <div className="mb-8">
        <h1 className="text-2xl font-bold mb-4">Multi-Step Form</h1>
        <Progress value={progress} className="mb-2" />
        <p className="text-sm text-muted-foreground">
          Step {currentStep + 1} of {steps.length}: {steps[currentStep].title}
        </p>
      </div>

      <FormProvider {...methods}>
        <form onSubmit={methods.handleSubmit(onSubmit)}>
          <div className="mb-8">
            <CurrentStepComponent />
          </div>

          <div className="flex justify-between">
            <Button
              type="button"
              variant="outline"
              onClick={handlePrevious}
              disabled={currentStep === 0}
            >
              Previous
            </Button>

            {currentStep === steps.length - 1 ? (
              <Button type="submit" disabled={isSubmitting}>
                {isSubmitting ? "Submitting..." : "Submit"}
              </Button>
            ) : (
              <Button type="button" onClick={handleNext}>
                Next
              </Button>
            )}
          </div>
        </form>
      </FormProvider>
    </div>
  );
}

Performance Optimization

// Performance optimization for shadcn/ui components
export class ComponentPerformanceOptimizer {
  // Lazy loading components with React.lazy
  static createLazyComponent(importFn: () => Promise<{ default: React.ComponentType<any> }>) {
    return React.lazy(importFn);
  }

  // Component memoization with React.memo
  static createMemoizedComponent<P extends object>(
    Component: React.ComponentType<P>,
    areEqual?: (prevProps: P, nextProps: P) => boolean
  ) {
    return React.memo(Component, areEqual);
  }

  // Hook for performance monitoring
  static usePerformanceMonitor(componentName: string) {
    const [renderCount, setRenderCount] = useState(0);
    const [renderTime, setRenderTime] = useState(0);

    useEffect(() => {
      const startTime = performance.now();
      
      setRenderCount(prev => prev + 1);
      
      return () => {
        const endTime = performance.now();
        setRenderTime(endTime - startTime);
        
        if (process.env.NODE_ENV === 'development') {
          console.log(
            `${componentName} render #${renderCount}: ${renderTime.toFixed(2)}ms`
          );
        }
      };
    });

    return { renderCount, renderTime };
  }

  // Bundle size optimization
  static optimizeBundleSize() {
    return {
      treeShaking: {
        enabled: true,
        description: "Remove unused components and utilities",
      },
      codeSplitting: {
        enabled: true,
        description: "Split components into separate chunks",
      },
      compression: {
        enabled: true,
        description: "Compress bundle with gzip/brotli",
      },
    };
  }

  // Runtime performance optimization
  static optimizeRuntimePerformance() {
    return {
      virtualScrolling: {
        enabled: true,
        description: "Virtual scrolling for large data sets",
      },
      memoization: {
        enabled: true,
        description: "Memoize expensive computations",
      },
      debouncing: {
        enabled: true,
        description: "Debounce user interactions",
      },
    };
  }
}

Reference & Integration (Level 4)

API Reference

Core shadcn/ui Operations

  • create_component(variant_config, props) - Create new component
  • customize_theme(theme_config, colors) - Customize theme
  • install_component(component_name) - Install new component
  • setup_design_system(tokens, branding) - Set up design system
  • optimize_components(performance_config) - Optimize component performance

Context7 Integration

  • get_latest_shadcn_docs() - shadcn/ui docs via Context7
  • analyze_component_patterns() - Component patterns via Context7
  • optimize_theme_system() - Theme optimization via Context7

Best Practices (November 2025)

DO

  • Use TypeScript for type safety and better developer experience
  • Implement proper accessibility with ARIA attributes
  • Customize themes using CSS variables for consistency
  • Optimize component performance with memoization and lazy loading
  • Use form validation with proper error handling
  • Implement responsive design with Tailwind CSS
  • Use Radix UI primitives for accessible components
  • Test components across different browsers and devices

DON'T

  • Skip TypeScript type definitions and validations
  • Ignore accessibility requirements and WCAG compliance
  • Override component styles without understanding the CSS structure
  • Forget to implement proper error handling and validation
  • Skip performance optimization for large datasets
  • Use inline styles instead of Tailwind CSS classes
  • Forget to implement proper keyboard navigation
  • Skip component testing and user experience validation

Works Well With

  • moai-domain-frontend (Frontend development patterns)
  • moai-baas-foundation (Enterprise UI architecture)
  • moai-security-api (UI security implementation)
  • moai-essentials-perf (Performance optimization)
  • moai-foundation-trust (Accessibility and compliance)
  • moai-domain-backend (Backend integration)
  • moai-baas-vercel-ext (Frontend deployment)
  • moai-domain-testing (Component testing strategies)

Changelog

  • v4.0.0 (2025-11-13): Complete Enterprise v4.0 rewrite with 40% content reduction, 4-layer Progressive Disclosure structure, Context7 integration, November 2025 shadcn/ui ecosystem updates, and advanced component patterns
  • v2.0.0 (2025-11-11): Complete metadata structure, component patterns, theme system
  • v1.0.0 (2025-11-11): Initial shadcn/ui component library

End of Skill | Updated 2025-11-13

Design System Integration

Enterprise Features

  • Comprehensive component library with enterprise-grade features
  • Advanced theming system with brand customization
  • Performance optimization for large-scale applications
  • Accessibility compliance with WCAG 2.1 AA standards

Modern Development

  • TypeScript-first development with full type safety
  • Modern React patterns with hooks and server components
  • Tailwind CSS integration for consistent styling
  • Framer Motion for smooth animations and transitions

End of Enterprise shadcn/ui Component Library Expert v4.0.0

GitHub Repository

modu-ai/moai-adk
Path: .claude/skills/moai-lib-shadcn-ui
agentic-aiagentic-codingagentic-workflowclaudeclaudecodevibe-coding

Related Skills

sglang

Meta

SGLang is a high-performance LLM serving framework that specializes in fast, structured generation for JSON, regex, and agentic workflows using its RadixAttention prefix caching. It delivers significantly faster inference, especially for tasks with repeated prefixes, making it ideal for complex, structured outputs and multi-turn conversations. Choose SGLang over alternatives like vLLM when you need constrained decoding or are building applications with extensive prefix sharing.

View skill

evaluating-llms-harness

Testing

This Claude Skill runs the lm-evaluation-harness to benchmark LLMs across 60+ standardized academic tasks like MMLU and GSM8K. It's designed for developers to compare model quality, track training progress, or report academic results. The tool supports various backends including HuggingFace and vLLM models.

View skill

content-collections

Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill

llamaguard

Other

LlamaGuard is Meta's 7-8B parameter model for moderating LLM inputs and outputs across six safety categories like violence and hate speech. It offers 94-95% accuracy and can be deployed using vLLM, Hugging Face, or Amazon SageMaker. Use this skill to easily integrate content filtering and safety guardrails into your AI applications.

View skill