{post.title}
{post.excerpt}
By {post.author.name}
--- name: laravel-inertia-react description: Laravel + Inertia.js + React integration patterns. Use when building Inertia page components, handling forms with useForm, managing shared data, or implementing persistent layouts. Triggers on tasks involving Inertia.js, page props, form handling, or Laravel React integration. --- # Laravel + Inertia.js + React Comprehensive patterns for building modern monolithic applications with Laravel, Inertia.js, and React. Contains 30+ rules for seamless full-stack development. ## When to Apply Reference these guidelines when: - Creating Inertia page components - Handling forms with useForm hook - Managing shared data and authentication - Implementing persistent layouts - Navigating between pages ## Rule Categories by Priority | Priority | Category | Impact | Prefix | |----------|----------|--------|--------| | 1 | Page Components | CRITICAL | `page-` | | 2 | Forms & Validation | CRITICAL | `form-` | | 3 | Navigation & Links | HIGH | `nav-` | | 4 | Shared Data | HIGH | `shared-` | | 5 | Layouts | MEDIUM | `layout-` | | 6 | File Uploads | MEDIUM | `upload-` | | 7 | Advanced Patterns | LOW | `advanced-` | ## Quick Reference ### 1. Page Components (CRITICAL) - `page-props-typing` - Type page props from Laravel - `page-component-structure` - Standard page component pattern - `page-head-management` - Title and meta tags with Head - `page-default-layout` - Assign layouts to pages ### 2. Forms & Validation (CRITICAL) - `form-useform-basic` - Basic useForm usage - `form-validation-errors` - Display Laravel validation errors - `form-processing-state` - Handle form submission state - `form-reset-preserve` - Reset vs preserve form data - `form-nested-data` - Handle nested form data - `form-transform` - Transform data before submit ### 3. Navigation & Links (HIGH) - `nav-link-component` - Use Link for navigation - `nav-preserve-state` - Preserve scroll and state - `nav-partial-reloads` - Reload only what changed - `nav-replace-history` - Replace vs push history ### 4. Shared Data (HIGH) - `shared-auth-user` - Access authenticated user - `shared-flash-messages` - Handle flash messages - `shared-global-props` - Access global props - `shared-typescript` - Type shared data ### 5. Layouts (MEDIUM) - `layout-persistent` - Persistent layouts pattern - `layout-nested` - Nested layouts - `layout-default` - Default layout assignment - `layout-conditional` - Conditional layouts ### 6. File Uploads (MEDIUM) - `upload-basic` - Basic file upload - `upload-progress` - Upload progress tracking - `upload-multiple` - Multiple file uploads ### 7. Advanced Patterns (LOW) - `advanced-polling` - Real-time polling - `advanced-prefetch` - Prefetch pages - `advanced-modal-pages` - Modal as pages - `advanced-infinite-scroll` - Infinite scrolling ## Essential Patterns ### Page Component with TypeScript ```tsx // resources/js/Pages/Posts/Index.tsx import { Head, Link } from '@inertiajs/react' interface Post { id: number title: string excerpt: string created_at: string author: { id: number name: string } } interface Props { posts: { data: Post[] links: { url: string | null; label: string; active: boolean }[] } filters: { search?: string } } export default function Index({ posts, filters }: Props) { return ( <>
{post.excerpt}
By {post.author.name}
> ) } ``` ### Form with useForm ```tsx // resources/js/Pages/Posts/Create.tsx import { Head, useForm, Link } from '@inertiajs/react' import { FormEvent } from 'react' interface Category { id: number name: string } interface Props { categories: Category[] } export default function Create({ categories }: Props) { const { data, setData, post, processing, errors, reset } = useForm({ title: '', body: '', category_id: '', }) const handleSubmit = (e: FormEvent) => { e.preventDefault() post(route('posts.store'), { onSuccess: () => reset(), }) } return ( <>
> ) } ``` ### Persistent Layout ```tsx // resources/js/Layouts/AppLayout.tsx import { Link, usePage } from '@inertiajs/react' import { ReactNode } from 'react' interface Props { children: ReactNode } export default function AppLayout({ children }: Props) { const { auth } = usePage().props as { auth: { user: { name: string } } } return (
) } // resources/js/Pages/Dashboard.tsx import AppLayout from '@/Layouts/AppLayout' export default function Dashboard() { return
}
// Assign persistent layout
Dashboard.layout = (page: ReactNode) =>
) } ``` ## How to Use Read individual rule files for detailed explanations and code examples: ``` rules/form-useform-basic.md rules/page-props-typing.md rules/layout-persistent.md ``` ## Project Structure ``` laravel-inertia-react/ ├── SKILL.md # This file - overview and examples ├── README.md # Quick reference guide ├── AGENTS.md # Integration guide for AI agents ├── metadata.json # Skill metadata and references └── rules/ ├── _sections.md # Rule categories and priorities ├── _template.md # Template for new rules ├── page-*.md # Page component patterns (6 rules) ├── form-*.md # Form handling patterns (8 rules) ├── nav-*.md # Navigation patterns (5 rules) ├── shared-*.md # Shared data patterns (4 rules) └── layout-*.md # Layout patterns (1 rule) ``` ## References - [Inertia.js Documentation](https://inertiajs.com/) - Official Inertia.js docs - [Laravel Documentation](https://laravel.com/docs) - Laravel framework docs - [React Documentation](https://react.dev/) - Official React docs - [Ziggy](https://github.com/tighten/ziggy) - Laravel route helper for JavaScript ## License MIT License Copyright (c) 2026 Asyraf Hussin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## Metadata - **Version**: 1.0.0 - **Last Updated**: 2026-01-17 - **Maintainer**: Asyraf Hussin - **Rule Count**: 24 rules across 6 categories - **Tech Stack**: Laravel 10+, Inertia.js 1.0+, React 18+, TypeScript 5+