<!-- Generated by SpecStory, Markdown v2.1.0 -->

<!-- cursor Session bb9dd47e-3022-42f0-a43d-7a68295bed52 (2025-10-23 11:06Z) -->

# Generate cursor rules (2025-10-23 11:06Z)

_**User (2025-10-23 11:06Z)**_

/Generate Cursor Rules 

---

_**Agent (model default, mode Agent)**_

I'll analyze the codebase and generate comprehensive Cursor rules based on the project structure and the existing AGENTS.md guide. Let me first examine the current project structure and then create appropriate rules.


---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/AGENTS.md</summary>

</details>
</tool-use>

---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/package.json</summary>

</details>
</tool-use>

---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/next.config.ts</summary>

</details>
</tool-use>

---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/tsconfig.json</summary>

</details>
</tool-use>

---

Now let me check the middleware and some key components to understand the project better:


---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/src/middleware.ts</summary>

</details>
</tool-use>

---

<tool-use data-tool-type="read" data-tool-name="read_file">
<details><summary>Tool use: **read_file** • Read file: /home/nicholai/Documents/dev/biohazard-vfx-website/src/app/layout.tsx</summary>

</details>
</tool-use>

---

<tool-use data-tool-type="generic" data-tool-name="list_dir">
<details>
            <summary>Tool use: **list_directory** • Listed directory undefined • **0** results</summary>
        
No results found
</details>
</tool-use>

---

Now I'll create the `.cursor/rules` directory and generate comprehensive Cursor rules based on the project structure and AGENTS.md guide:


---

<tool-use data-tool-type="shell" data-tool-name="run_terminal_cmd">
<details><summary>Tool use: **command** • Run command: mkdir -p /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules</summary>

```bash
mkdir -p /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules
```
</details>
</tool-use>

---

Now I'll create comprehensive Cursor rules based on the project structure and requirements:


---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/project-structure.mdc</summary>

**Chunk 1**
Lines added: 60, lines removed: 1

```diff
@@ -1,1 +1,60 @@
- 
+ ---
+ alwaysApply: true
+ ---
+ 
+ # Biohazard VFX Website - Project Structure
+ 
+ This is a Next.js 15.5.4 VFX studio website built with React 19, TypeScript, Tailwind CSS 4, and shadcn/ui components.
+ 
+ ## Core Architecture
+ 
+ - **Framework**: Next.js 15.5.4 with App Router
+ - **Styling**: Tailwind CSS 4 + shadcn/ui components
+ - **Animation**: Framer Motion for subtle transitions
+ - **Forms**: react-hook-form + Zod validation
+ - **Deployment**: Cloudflare Workers via OpenNext
+ - **Package Manager**: npm
+ 
+ ## Project Layout
+ 
+ &#96;&#96;&#96;
+ src/
+ ├─ app/                  # App Router pages and layouts
+ │  ├─ (marketing)/       # Route groups
+ │  ├─ api/               # Route handlers
+ │  └─ layout.tsx         # Root layout with global providers
+ ├─ components/           # Reusable UI components
+ │  └─ ui/               # shadcn/ui primitives
+ ├─ data/                # JSON/TS data objects
+ ├─ lib/                 # Utilities, hooks, server actions
+ ├─ styles/              # globals.css, Tailwind utilities
+ └─ types/               # Shared TypeScript types
+ &#96;&#96;&#96;
+ 
+ ## Key Files
+ 
+ - [AGENTS.md](mdc:AGENTS.md) - Single source of truth for development guidelines
+ - [package.json](mdc:package.json) - Dependencies and scripts
+ - [next.config.ts](mdc:next.config.ts) - Next.js configuration
+ - [tsconfig.json](mdc:tsconfig.json) - TypeScript configuration with @ alias
+ - [src/middleware.ts](mdc:src/middleware.ts) - Route protection and redirects
+ - [src/app/layout.tsx](mdc:src/app/layout.tsx) - Root layout with fonts and metadata
+ 
+ ## Import Aliases
+ 
+ Always use absolute imports with &#96;@&#96; mapped to &#96;src/&#96;:
+ &#96;&#96;&#96;typescript
+ import { Component } from &#39;@/components/Component&#39;
+ import { data } from &#39;@/data/projects&#39;
+ &#96;&#96;&#96;
+ 
+ ## Development Commands
+ 
+ &#96;&#96;&#96;bash
+ npm ci                    # Install dependencies
+ npm run dev              # Development server with Turbopack
+ npm run type-check       # TypeScript validation
+ npm run lint             # ESLint validation
+ npm run build            # Production build
+ npx open-next@latest build  # OpenNext build for Cloudflare
+ &#96;&#96;&#96;
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/ui-system.mdc</summary>

**Chunk 1**
Lines added: 60, lines removed: 1

```diff
@@ -1,1 +1,60 @@
- 
+ ---
+ globs: *.tsx,*.ts,*.css
+ ---
+ 
+ # UI System Guidelines
+ 
+ ## Theme &amp; Design System
+ 
+ - **Default Theme**: Dark mode only - do not introduce light-first designs
+ - **Typography**: Use CSS variables for fonts (Geist, Geist Mono, Bebas Neue, Orbitron, etc.)
+ - **Components**: Use shadcn/ui primitives from [src/components/ui/](mdc:src/components/ui/)
+ - **Spacing**: Follow Tailwind 4 defaults, prefer utility classes over custom CSS
+ - **Animation**: Keep Framer Motion subtle and meaningful only
+ 
+ ## Component Structure
+ 
+ &#96;&#96;&#96;typescript
+ // Use shadcn/ui primitives as base
+ import { Button } from &#39;@/components/ui/button&#39;
+ import { Card } from &#39;@/components/ui/card&#39;
+ 
+ // Extend with local wrappers when needed
+ export function CustomComponent() {
+   return (
+     &lt;Card className=&quot;bg-black border-gray-800&quot;&gt;
+       &lt;Button variant=&quot;outline&quot; className=&quot;text-white&quot;&gt;
+         Action
+       &lt;/Button&gt;
+     &lt;/Card&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ## Styling Rules
+ 
+ 1. **Dark Theme**: All components must work in dark mode
+ 2. **Tailwind First**: Use utility classes before custom CSS
+ 3. **Component Variants**: Use class-variance-authority for component variants
+ 4. **Responsive**: Mobile-first responsive design
+ 5. **Accessibility**: Include proper ARIA labels and semantic HTML
+ 
+ ## Font Usage
+ 
+ Available font variables from [src/app/layout.tsx](mdc:src/app/layout.tsx):
+ - &#96;--font-geist-sans&#96; (default)
+ - &#96;--font-geist-mono&#96;
+ - &#96;--font-bebas&#96;
+ - &#96;--font-orbitron&#96;
+ - &#96;--font-inter&#96;
+ - &#96;--font-jetbrains-mono&#96;
+ - &#96;--font-space-mono&#96;
+ - &#96;--font-rajdhani&#96;
+ - &#96;--font-exo-2&#96;
+ 
+ ## Animation Guidelines
+ 
+ - Use Framer Motion sparingly for meaningful transitions
+ - Prefer CSS transitions for simple hover effects
+ - Keep animations under 300ms for UI feedback
+ - Respect &#96;prefers-reduced-motion&#96; for accessibility
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/routing-layout.mdc</summary>

**Chunk 1**
Lines added: 67, lines removed: 1

```diff
@@ -1,1 +1,67 @@
- 
+ ---
+ globs: src/app/**/*.tsx
+ ---
+ 
+ # Routing and Layout Rules
+ 
+ ## App Router Structure
+ 
+ - **Pages**: Live in &#96;src/app/&#96; directory
+ - **Server Components**: Default to server components, promote to client only when needed
+ - **Layout Hierarchy**: Root layout owns global providers, navigation, and footer
+ - **Route Groups**: Use &#96;(marketing)&#96; for grouped routes without affecting URL structure
+ 
+ ## Layout Rules
+ 
+ ### Root Layout ([src/app/layout.tsx](mdc:src/app/layout.tsx))
+ - Owns global providers and theme class
+ - Contains &#96;&lt;Navigation /&gt;&#96; and &#96;&lt;Footer /&gt;&#96; components
+ - Sets up font variables and metadata
+ - **DO NOT** duplicate these in child layouts
+ 
+ ### Page Layouts
+ - Keep server components as default
+ - Add &#96;&quot;use client&quot;&#96; only when necessary for interactivity
+ - Define unique metadata for each route
+ 
+ ## Metadata Requirements
+ 
+ Every page must have:
+ &#96;&#96;&#96;typescript
+ export const metadata: Metadata = {
+   title: &quot;Unique Page Title&quot;,
+   description: &quot;Unique description for SEO&quot;,
+   // Include Open Graph and Twitter cards
+ }
+ &#96;&#96;&#96;
+ 
+ ## Route Protection
+ 
+ The [src/middleware.ts](mdc:src/middleware.ts) currently redirects all routes to &#96;/&#96; except:
+ - Home page (&#96;/&#96;)
+ - Next.js internal routes (&#96;/_next/*&#96;)
+ - Favicon files
+ - Specific static assets (OLIVER.jpeg, OLIVER_depth.jpeg, etc.)
+ 
+ ## Static Assets
+ 
+ When adding new files to &#96;public/&#96;, update the middleware allowlist in [src/middleware.ts](mdc:src/middleware.ts) line 8 to prevent 307 redirects.
+ 
+ ## Common Patterns
+ 
+ &#96;&#96;&#96;typescript
+ // Page component
+ export default function PageName() {
+   return (
+     &lt;div className=&quot;container mx-auto px-4&quot;&gt;
+       {/* Page content */}
+     &lt;/div&gt;
+   )
+ }
+ 
+ // With metadata
+ export const metadata: Metadata = {
+   title: &quot;Page Title&quot;,
+   description: &quot;Page description&quot;
+ }
+ &#96;&#96;&#96;
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/forms-validation.mdc</summary>

**Chunk 1**
Lines added: 87, lines removed: 1

```diff
@@ -1,1 +1,87 @@
- 
+ ---
+ globs: **/*form*.tsx,**/*Form*.tsx
+ ---
+ 
+ # Forms and Validation
+ 
+ ## Form Library Stack
+ 
+ - **Forms**: react-hook-form for form state management
+ - **Validation**: Zod schemas for type-safe validation
+ - **Resolvers**: @hookform/resolvers for integration
+ 
+ ## Form Structure
+ 
+ &#96;&#96;&#96;typescript
+ import { useForm } from &#39;react-hook-form&#39;
+ import { zodResolver } from &#39;@hookform/resolvers/zod&#39;
+ import { z } from &#39;zod&#39;
+ 
+ // Define schema
+ const formSchema = z.object({
+   name: z.string().min(1, &#39;Name is required&#39;),
+   email: z.string().email(&#39;Invalid email address&#39;),
+   message: z.string().min(10, &#39;Message must be at least 10 characters&#39;)
+ })
+ 
+ type FormData = z.infer&lt;typeof formSchema&gt;
+ 
+ export function ContactForm() {
+   const form = useForm&lt;FormData&gt;({
+     resolver: zodResolver(formSchema),
+     defaultValues: {
+       name: &#39;&#39;,
+       email: &#39;&#39;,
+       message: &#39;&#39;
+     }
+   })
+ 
+   const onSubmit = (data: FormData) =&gt; {
+     // Handle form submission
+   }
+ 
+   return (
+     &lt;form onSubmit={form.handleSubmit(onSubmit)}&gt;
+       {/* Form fields with error handling */}
+     &lt;/form&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ## Error Handling Rules
+ 
+ 1. **Field-level errors**: Show validation errors under each field
+ 2. **Generic submit error**: Display general submission errors
+ 3. **Never swallow errors**: Always surface validation and submission errors
+ 4. **Loading states**: Show loading indicators during submission
+ 
+ ## Form Components
+ 
+ Use shadcn/ui form components from [src/components/ui/form.tsx](mdc:src/components/ui/form.tsx):
+ 
+ &#96;&#96;&#96;typescript
+ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from &#39;@/components/ui/form&#39;
+ import { Input } from &#39;@/components/ui/input&#39;
+ import { Button } from &#39;@/components/ui/button&#39;
+ 
+ &lt;FormField
+   control={form.control}
+   name=&quot;email&quot;
+   render={({ field }) =&gt; (
+     &lt;FormItem&gt;
+       &lt;FormLabel&gt;Email&lt;/FormLabel&gt;
+       &lt;FormControl&gt;
+         &lt;Input placeholder=&quot;your@email.com&quot; {...field} /&gt;
+       &lt;/FormControl&gt;
+       &lt;FormMessage /&gt;
+     &lt;/FormItem&gt;
+   )}
+ /&gt;
+ &#96;&#96;&#96;
+ 
+ ## Validation Patterns
+ 
+ - Use Zod for all form validation
+ - Provide clear, user-friendly error messages
+ - Validate on both client and server side
+ - Handle async validation (e.g., email uniqueness)
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/images-assets.mdc</summary>

**Chunk 1**
Lines added: 75, lines removed: 1

```diff
@@ -1,1 +1,75 @@
- 
+ ---
+ globs: **/*.tsx,**/*.ts
+ ---
+ 
+ # Images and Assets
+ 
+ ## Image Handling
+ 
+ ### Next.js Image Component
+ Always use Next.js Image component for remote images:
+ 
+ &#96;&#96;&#96;typescript
+ import Image from &#39;next/image&#39;
+ 
+ &lt;Image
+   src=&quot;https://images.unsplash.com/photo-123&quot;
+   alt=&quot;Descriptive alt text&quot;
+   width={800}
+   height={600}
+   className=&quot;rounded-lg&quot;
+ /&gt;
+ &#96;&#96;&#96;
+ 
+ ### Remote Image Domains
+ Current allowed domains in [next.config.ts](mdc:next.config.ts):
+ - &#96;images.unsplash.com&#96;
+ 
+ **When adding new external domains:**
+ 1. Add to &#96;remotePatterns&#96; in [next.config.ts](mdc:next.config.ts)
+ 2. Document the change in [AGENTS.md](mdc:AGENTS.md)
+ 
+ ## Static Assets
+ 
+ ### Public Directory
+ - Keep &#96;public/&#96; for truly static assets only
+ - Current assets: favicon files, images (OLIVER.jpeg, etc.), GIFs
+ 
+ ### Middleware Whitelist
+ **CRITICAL**: When adding new static assets to &#96;public/&#96;, update the middleware allowlist in [src/middleware.ts](mdc:src/middleware.ts) line 8:
+ 
+ &#96;&#96;&#96;typescript
+ // Add new asset paths here
+ if (pathname === &#39;/&#39; || 
+     pathname.startsWith(&#39;/_next&#39;) || 
+     pathname.startsWith(&#39;/favicon.&#39;) || 
+     pathname === &#39;/OLIVER.jpeg&#39; || 
+     pathname === &#39;/new-asset.jpg&#39; ||  // Add new assets here
+     pathname === &#39;/reel.mp4&#39;) {
+   return NextResponse.next();
+ }
+ &#96;&#96;&#96;
+ 
+ **Common symptom**: If assets return &quot;text/html&quot; Content-Type error, the path isn&#39;t whitelisted.
+ 
+ ## Asset Optimization
+ 
+ - Use appropriate image formats (WebP when possible)
+ - Provide proper alt text for accessibility
+ - Use responsive images with &#96;sizes&#96; prop
+ - Optimize file sizes for web delivery
+ 
+ ## Video Files
+ 
+ Custom headers are configured in [next.config.ts](mdc:next.config.ts) for &#96;.mp4&#96; files:
+ &#96;&#96;&#96;typescript
+ {
+   source: &quot;/:path*.mp4&quot;,
+   headers: [
+     {
+       key: &quot;Content-Type&quot;,
+       value: &quot;video/mp4&quot;,
+     },
+   ],
+ }
+ &#96;&#96;&#96;
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/deployment.mdc</summary>

**Chunk 1**
Lines added: 73, lines removed: 1

```diff
@@ -1,1 +1,73 @@
- 
+ ---
+ alwaysApply: true
+ ---
+ 
+ # Deployment and Build Process
+ 
+ ## Cloudflare Workers with OpenNext
+ 
+ This project deploys to Cloudflare Workers using OpenNext for Next.js compatibility.
+ 
+ ### Build Process
+ 
+ 1. **Quality Gates** (run before build):
+    &#96;&#96;&#96;bash
+    npm run type-check  # TypeScript validation
+    npm run lint        # ESLint validation
+    &#96;&#96;&#96;
+ 
+ 2. **Production Build**:
+    &#96;&#96;&#96;bash
+    npm run build       # Next.js build
+    &#96;&#96;&#96;
+ 
+ 3. **OpenNext Build**:
+    &#96;&#96;&#96;bash
+    npx open-next@latest build  # Generate Cloudflare-compatible build
+    &#96;&#96;&#96;
+ 
+ 4. **Deploy**:
+    &#96;&#96;&#96;bash
+    npx wrangler deploy .open-next/worker
+    &#96;&#96;&#96;
+ 
+ ### Configuration Files
+ 
+ - [wrangler.toml](mdc:wrangler.toml) - Cloudflare Workers configuration
+ - [open-next.config.ts](mdc:open-next.config.ts) - OpenNext build configuration
+ - [next.config.ts](mdc:next.config.ts) - Next.js configuration
+ 
+ ### Required wrangler.toml Settings
+ 
+ &#96;&#96;&#96;toml
+ name = &quot;site-worker&quot;
+ main = &quot;.open-next/worker/index.mjs&quot;
+ compatibility_date = &quot;2024-09-23&quot;
+ compatibility_flags = [&quot;nodejs_compat&quot;]
+ assets = { directory = &quot;.open-next/assets&quot; }
+ &#96;&#96;&#96;
+ 
+ ## Environment Variables
+ 
+ Create &#96;.env.sample&#96; and keep it synchronized. Typical keys:
+ &#96;&#96;&#96;
+ NEXT_PUBLIC_SITE_URL=
+ RESEND_API_KEY=
+ CF_PAGES_URL=
+ &#96;&#96;&#96;
+ 
+ **Security**: Never commit real secrets. Use &#96;.env&#96; locally and environment variables in production.
+ 
+ ## Build Configuration
+ 
+ - ESLint and TypeScript errors are ignored during build for deployment speed
+ - CI still gates on &#96;lint&#96; and &#96;type-check&#96; before merge
+ - Always fix errors instead of bypassing checks
+ 
+ ## Deployment Checklist
+ 
+ - [ ] Run &#96;npm run type-check&#96; and &#96;npm run lint&#96;
+ - [ ] Ensure &#96;assets.directory&#96; matches OpenNext output
+ - [ ] Keep compatibility date at or after 2024-09-23
+ - [ ] Test build locally with &#96;npm run build&#96;
+ - [ ] Verify OpenNext build artifacts in &#96;.open-next/&#96;
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/development-workflow.mdc</summary>

**Chunk 1**
Lines added: 74, lines removed: 1

```diff
@@ -1,1 +1,74 @@
- 
+ ---
+ alwaysApply: true
+ ---
+ 
+ # Development Workflow
+ 
+ ## Git Workflow
+ 
+ - **Default Branch**: &#96;main&#96; is protected
+ - **Workflow**: feature branches → PR → required checks → squash merge
+ - **Commit Format**: Conventional Commits
+   - &#96;feat: add contact form schema&#96;
+   - &#96;fix: correct Image remote pattern&#96;
+   - &#96;chore: bump dependencies&#96;
+ 
+ ## Required Checks
+ 
+ Before any merge:
+ - &#96;npm run lint&#96; - ESLint validation
+ - &#96;npm run type-check&#96; - TypeScript validation
+ - &#96;npm run build&#96; - Production build (optional locally, required in CI)
+ 
+ ## Development Commands
+ 
+ &#96;&#96;&#96;bash
+ # Setup
+ npm ci                    # Install dependencies
+ 
+ # Development
+ npm run dev              # Dev server with Turbopack
+ npm run type-check       # TypeScript validation
+ npm run lint             # ESLint validation
+ 
+ # Build &amp; Deploy
+ npm run build            # Production build
+ npm run start            # Preview production build
+ npx open-next@latest build  # OpenNext build
+ npx wrangler deploy .open-next/worker  # Deploy to Cloudflare
+ &#96;&#96;&#96;
+ 
+ ## Code Quality
+ 
+ ### TypeScript
+ - Use strict mode (enabled in [tsconfig.json](mdc:tsconfig.json))
+ - Prefer type inference over explicit types
+ - Use absolute imports with &#96;@&#96; alias
+ 
+ ### ESLint
+ - Follow Next.js ESLint config
+ - Fix all linting errors before committing
+ - Don&#39;t bypass checks in production builds
+ 
+ ## Testing Strategy
+ 
+ - **Unit Tests**: Place close to sources, name with &#96;.test.ts&#96; or &#96;.test.tsx&#96;
+ - **E2E Tests**: Optional Playwright setup
+ - **Manual Testing**: Test all user flows before deployment
+ 
+ ## Pull Request Guidelines
+ 
+ - Keep PRs small and reviewable
+ - Include screenshots for UI changes
+ - Update [AGENTS.md](mdc:AGENTS.md) if conventions change
+ - Justify new dependencies in PR description
+ - Never commit secrets or sensitive data
+ 
+ ## Common Pitfalls to Avoid
+ 
+ 1. Adding remote image domains without updating [next.config.ts](mdc:next.config.ts)
+ 2. Introducing client components unnecessarily
+ 3. Duplicating navigation in nested layouts
+ 4. Bypassing Tailwind utilities for custom CSS
+ 5. Forgetting to update middleware whitelist for new static assets
+ 6. Committing secrets instead of using environment variables
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/data-content.mdc</summary>

**Chunk 1**
Lines added: 97, lines removed: 1

```diff
@@ -1,1 +1,97 @@
- 
+ ---
+ globs: src/data/**/*.ts,src/data/**/*.json
+ ---
+ 
+ # Data and Content Management
+ 
+ ## Data Structure
+ 
+ Non-secret content belongs in &#96;src/data/&#96; as TypeScript modules or JSON files. Keep data presentation-agnostic.
+ 
+ ## Current Data Files
+ 
+ - [src/data/projects.ts](mdc:src/data/projects.ts) - Project portfolio data
+ - [src/data/services.ts](mdc:src/data/services.ts) - Service offerings data
+ 
+ ## Data Patterns
+ 
+ ### TypeScript Data Modules
+ &#96;&#96;&#96;typescript
+ // src/data/projects.ts
+ export interface Project {
+   id: string
+   title: string
+   description: string
+   category: string
+   images: string[]
+   videoUrl?: string
+ }
+ 
+ export const projects: Project[] = [
+   {
+     id: &#39;project-1&#39;,
+     title: &#39;Project Title&#39;,
+     description: &#39;Project description&#39;,
+     category: &#39;commercial&#39;,
+     images: [&#39;/image1.jpg&#39;, &#39;/image2.jpg&#39;]
+   }
+ ]
+ &#96;&#96;&#96;
+ 
+ ### JSON Data Files
+ &#96;&#96;&#96;json
+ {
+   &quot;services&quot;: [
+     {
+       &quot;id&quot;: &quot;vfx&quot;,
+       &quot;name&quot;: &quot;Visual Effects&quot;,
+       &quot;description&quot;: &quot;High-end VFX services&quot;
+     }
+   ]
+ }
+ &#96;&#96;&#96;
+ 
+ ## Data Usage Rules
+ 
+ 1. **Server Components**: Prefer server components for data fetching
+ 2. **File Imports**: Use direct imports instead of client-side fetching for static data
+ 3. **Type Safety**: Define TypeScript interfaces for all data structures
+ 4. **Separation**: Keep data separate from presentation logic
+ 
+ ## Content Guidelines
+ 
+ - Use descriptive, SEO-friendly content
+ - Include proper alt text for images
+ - Maintain consistent naming conventions
+ - Keep content up-to-date and accurate
+ 
+ ## Data Fetching Patterns
+ 
+ &#96;&#96;&#96;typescript
+ // ✅ Good: Server component with direct import
+ import { projects } from &#39;@/data/projects&#39;
+ 
+ export default function PortfolioPage() {
+   return (
+     &lt;div&gt;
+       {projects.map(project =&gt; (
+         &lt;ProjectCard key={project.id} project={project} /&gt;
+       ))}
+     &lt;/div&gt;
+   )
+ }
+ 
+ // ❌ Avoid: Client-side fetching of static data
+ &#39;use client&#39;
+ import { useEffect, useState } from &#39;react&#39;
+ 
+ export function PortfolioPage() {
+   const [projects, setProjects] = useState([])
+   
+   useEffect(() =&gt; {
+     fetch(&#39;/api/projects&#39;).then(res =&gt; res.json())
+   }, [])
+   
+   // ...
+ }
+ &#96;&#96;&#96;
```

</details>

</tool-use>

---

Now let me create a few more specialized rules for specific aspects of the project:


---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/seo-metadata.mdc</summary>

**Chunk 1**
Lines added: 78, lines removed: 1

```diff
@@ -1,1 +1,78 @@
- 
+ ---
+ globs: src/app/**/page.tsx,src/app/**/layout.tsx
+ ---
+ 
+ # SEO and Metadata
+ 
+ ## Metadata API Requirements
+ 
+ Every page must define unique metadata using the Next.js Metadata API:
+ 
+ &#96;&#96;&#96;typescript
+ import type { Metadata } from &quot;next&quot;
+ 
+ export const metadata: Metadata = {
+   title: &quot;Unique Page Title | Biohazard VFX&quot;,
+   description: &quot;Unique, descriptive page description for SEO&quot;,
+   metadataBase: new URL(&quot;https://biohazardvfx.com&quot;),
+   openGraph: {
+     title: &quot;Page Title&quot;,
+     description: &quot;Page description&quot;,
+     type: &quot;website&quot;,
+     locale: &quot;en_US&quot;,
+     siteName: &quot;Biohazard VFX&quot;,
+   },
+   twitter: {
+     card: &quot;summary_large_image&quot;,
+     title: &quot;Page Title&quot;,
+     description: &quot;Page description&quot;,
+   },
+ }
+ &#96;&#96;&#96;
+ 
+ ## Root Layout Metadata
+ 
+ The root layout in [src/app/layout.tsx](mdc:src/app/layout.tsx) includes:
+ - Global site metadata
+ - Open Graph configuration
+ - Twitter card setup
+ - JSON-LD structured data
+ - Canonical URLs
+ 
+ ## SEO Best Practices
+ 
+ 1. **Unique Titles**: Each page must have a unique, descriptive title
+ 2. **Descriptions**: Write compelling meta descriptions (150-160 characters)
+ 3. **Structured Data**: Use JSON-LD for rich snippets
+ 4. **Canonical URLs**: Set canonical URLs to prevent duplicate content
+ 5. **Open Graph**: Include OG tags for social media sharing
+ 6. **Twitter Cards**: Configure Twitter card metadata
+ 
+ ## Structured Data Example
+ 
+ &#96;&#96;&#96;typescript
+ const jsonLd = {
+   &quot;@context&quot;: &quot;https://schema.org&quot;,
+   &quot;@type&quot;: &quot;Organization&quot;,
+   name: &quot;Biohazard VFX&quot;,
+   description: &quot;Visual effects studio&quot;,
+   url: &quot;https://biohazardvfx.com&quot;,
+   logo: &quot;https://biohazardvfx.com/logo.png&quot;,
+   sameAs: [&quot;https://instagram.com/biohazardvfx&quot;],
+ }
+ &#96;&#96;&#96;
+ 
+ ## Page-Specific Metadata
+ 
+ - **Home**: Focus on main services and value proposition
+ - **Portfolio**: Highlight featured projects and capabilities
+ - **Services**: Target specific service keywords
+ - **About**: Include company information and team details
+ - **Contact**: Include location and contact information
+ 
+ ## Image SEO
+ 
+ - Use descriptive alt text for all images
+ - Optimize image file names
+ - Include image dimensions
+ - Use appropriate image formats (WebP when possible)
```

</details>

</tool-use>

---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/component-patterns.mdc</summary>

**Chunk 1**
Lines added: 159, lines removed: 1

```diff
@@ -1,1 +1,159 @@
- 
+ ---
+ globs: src/components/**/*.tsx
+ ---
+ 
+ # Component Patterns
+ 
+ ## Component Structure
+ 
+ ### File Organization
+ - Place reusable components in &#96;src/components/&#96;
+ - Use PascalCase for component files: &#96;ComponentName.tsx&#96;
+ - Group related components in subdirectories when needed
+ 
+ ### Component Template
+ &#96;&#96;&#96;typescript
+ import { cn } from &#39;@/lib/utils&#39;
+ 
+ interface ComponentProps {
+   className?: string
+   children?: React.ReactNode
+   // Other props
+ }
+ 
+ export function ComponentName({ 
+   className, 
+   children, 
+   ...props 
+ }: ComponentProps) {
+   return (
+     &lt;div className={cn(&quot;base-styles&quot;, className)} {...props}&gt;
+       {children}
+     &lt;/div&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ## shadcn/ui Integration
+ 
+ ### Using shadcn/ui Components
+ &#96;&#96;&#96;typescript
+ import { Button } from &#39;@/components/ui/button&#39;
+ import { Card, CardContent, CardHeader, CardTitle } from &#39;@/components/ui/card&#39;
+ import { Badge } from &#39;@/components/ui/badge&#39;
+ 
+ export function ProjectCard({ project }: { project: Project }) {
+   return (
+     &lt;Card className=&quot;bg-black border-gray-800&quot;&gt;
+       &lt;CardHeader&gt;
+         &lt;CardTitle className=&quot;text-white&quot;&gt;{project.title}&lt;/CardTitle&gt;
+       &lt;/CardHeader&gt;
+       &lt;CardContent&gt;
+         &lt;Badge variant=&quot;outline&quot;&gt;{project.category}&lt;/Badge&gt;
+       &lt;/CardContent&gt;
+     &lt;/Card&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ### Extending shadcn/ui Components
+ &#96;&#96;&#96;typescript
+ // Create wrapper components for common patterns
+ import { Button } from &#39;@/components/ui/button&#39;
+ import { cn } from &#39;@/lib/utils&#39;
+ 
+ interface PrimaryButtonProps extends React.ComponentProps&lt;typeof Button&gt; {
+   loading?: boolean
+ }
+ 
+ export function PrimaryButton({ 
+   loading, 
+   className, 
+   children, 
+   ...props 
+ }: PrimaryButtonProps) {
+   return (
+     &lt;Button 
+       className={cn(&quot;bg-primary hover:bg-primary/90&quot;, className)}
+       disabled={loading}
+       {...props}
+     &gt;
+       {loading ? &quot;Loading...&quot; : children}
+     &lt;/Button&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ## Animation Patterns
+ 
+ ### Framer Motion Usage
+ &#96;&#96;&#96;typescript
+ import { motion } from &#39;framer-motion&#39;
+ 
+ export function AnimatedCard({ children }: { children: React.ReactNode }) {
+   return (
+     &lt;motion.div
+       initial={{ opacity: 0, y: 20 }}
+       animate={{ opacity: 1, y: 0 }}
+       transition={{ duration: 0.3 }}
+       className=&quot;card-styles&quot;
+     &gt;
+       {children}
+     &lt;/motion.div&gt;
+   )
+ }
+ &#96;&#96;&#96;
+ 
+ ## Component Composition
+ 
+ ### Compound Components
+ &#96;&#96;&#96;typescript
+ // Parent component
+ export function Accordion({ children }: { children: React.ReactNode }) {
+   return &lt;div className=&quot;accordion-container&quot;&gt;{children}&lt;/div&gt;
+ }
+ 
+ // Child components
+ export function AccordionItem({ children }: { children: React.ReactNode }) {
+   return &lt;div className=&quot;accordion-item&quot;&gt;{children}&lt;/div&gt;
+ }
+ 
+ export function AccordionTrigger({ children }: { children: React.ReactNode }) {
+   return &lt;button className=&quot;accordion-trigger&quot;&gt;{children}&lt;/button&gt;
+ }
+ 
+ // Usage
+ &lt;Accordion&gt;
+   &lt;AccordionItem&gt;
+     &lt;AccordionTrigger&gt;Title&lt;/AccordionTrigger&gt;
+     &lt;AccordionContent&gt;Content&lt;/AccordionContent&gt;
+   &lt;/AccordionItem&gt;
+ &lt;/Accordion&gt;
+ &#96;&#96;&#96;
+ 
+ ## Props and TypeScript
+ 
+ ### Interface Patterns
+ &#96;&#96;&#96;typescript
+ // Use descriptive interface names
+ interface ProjectCardProps {
+   project: Project
+   variant?: &#39;default&#39; | &#39;featured&#39;
+   showDescription?: boolean
+   onSelect?: (project: Project) =&gt; void
+ }
+ 
+ // Use React.ComponentProps for extending HTML elements
+ interface CustomButtonProps extends React.ComponentProps&lt;&#39;button&#39;&gt; {
+   variant?: &#39;primary&#39; | &#39;secondary&#39;
+   size?: &#39;sm&#39; | &#39;md&#39; | &#39;lg&#39;
+ }
+ &#96;&#96;&#96;
+ 
+ ## Styling Guidelines
+ 
+ 1. **Tailwind First**: Use utility classes before custom CSS
+ 2. **Conditional Classes**: Use &#96;cn()&#96; utility for conditional styling
+ 3. **Responsive Design**: Mobile-first approach with responsive utilities
+ 4. **Dark Theme**: Ensure all components work in dark mode
+ 5. **Accessibility**: Include proper ARIA labels and semantic HTML
```

</details>

</tool-use>

---

Error calling tool 'write'.

---

Let me create the final rule file:


---

<tool-use data-tool-type="write" data-tool-name="write">

<details><summary>Tool use: **code_edit** • Edit file: /home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/vfx-specific.mdc</summary>

**Chunk 1**
Lines added: 99, lines removed: 1

```diff
@@ -1,1 +1,99 @@
- 
+ ---
+ description: VFX studio specific patterns and requirements
+ ---
+ 
+ # VFX Studio Specific Guidelines
+ 
+ ## Media Handling
+ 
+ ### Video Components
+ - Use [src/components/VideoPlayer.tsx](mdc:src/components/VideoPlayer.tsx) for video playback
+ - Use [src/components/ReelPlayer.tsx](mdc:src/components/ReelPlayer.tsx) for demo reels
+ - Support multiple video formats (MP4, WebM)
+ - Include proper video metadata and thumbnails
+ 
+ ### Image Components
+ - Use [src/components/DepthMap.tsx](mdc:src/components/DepthMap.tsx) for depth map visualizations
+ - Implement lazy loading for portfolio images
+ - Use Next.js Image optimization for all media
+ 
+ ## Portfolio Patterns
+ 
+ ### Project Showcase
+ &#96;&#96;&#96;typescript
+ // Use ProjectCard component for consistent project display
+ import { ProjectCard } from &#39;@/components/ProjectCard&#39;
+ import { ProjectShowcase } from &#39;@/components/ProjectShowcase&#39;
+ 
+ // Project data structure from src/data/projects.ts
+ interface Project {
+   id: string
+   title: string
+   description: string
+   category: &#39;commercial&#39; | &#39;music-video&#39; | &#39;film&#39; | &#39;animation&#39;
+   client?: string
+   year: number
+   images: string[]
+   videoUrl?: string
+   tags: string[]
+ }
+ &#96;&#96;&#96;
+ 
+ ### Service Categories
+ - Visual Effects (VFX)
+ - Motion Graphics
+ - 3D Animation
+ - Compositing
+ - Color Grading
+ - Post-Production
+ 
+ ## Client Work Patterns
+ 
+ ### Client Logo Grid
+ - Use [src/components/ClientLogoGrid.tsx](mdc:src/components/ClientLogoGrid.tsx)
+ - Display client logos with proper attribution
+ - Ensure logos are high-quality and properly sized
+ 
+ ### Project Filtering
+ - Implement category-based filtering
+ - Support tag-based search
+ - Include year-based sorting
+ 
+ ## Performance Considerations
+ 
+ ### Media Optimization
+ - Compress images and videos for web delivery
+ - Use appropriate formats (WebP for images, MP4 for videos)
+ - Implement progressive loading for large media files
+ - Use CDN for media delivery
+ 
+ ### Loading States
+ - Show skeleton loaders for media content
+ - Implement progressive image loading
+ - Use intersection observer for lazy loading
+ 
+ ## VFX-Specific UI Elements
+ 
+ ### Before/After Comparisons
+ - Implement split-screen comparisons
+ - Use slider controls for reveal effects
+ - Include toggle for before/after views
+ 
+ ### Process Showcases
+ - Show breakdowns of VFX work
+ - Include wireframe and final render comparisons
+ - Display technical specifications
+ 
+ ## Content Guidelines
+ 
+ ### Project Descriptions
+ - Include technical details (software used, techniques)
+ - Mention client and project scope
+ - Highlight challenges and solutions
+ - Use industry-standard terminology
+ 
+ ### Service Descriptions
+ - Be specific about capabilities
+ - Include typical project timelines
+ - Mention software and hardware capabilities
+ - Provide clear pricing structure (if applicable)
```

</details>

</tool-use>

---

Now let me verify the created rules and check for any linting issues:


---

<tool-use data-tool-type="generic" data-tool-name="list_dir">
<details>
            <summary>Tool use: **list_directory** • Listed directory undefined • **0** results</summary>
        
No results found
</details>
</tool-use>

---

<tool-use data-tool-type="generic" data-tool-name="read_lints">
<details>
          <summary>Tool use: **read_lints** • Read lints for 1 file</summary>
      
Lint paths:

- `/home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules`

Lint results

Lint errors for `.cursor/rules/project-structure.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD040/fenced-code-language: Fenced code blocks should have a language specified | 20:1-20:4 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 46:1-46:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 60:3-60:4 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/ui-system.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 45:1-45:32 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 60:52-60:53 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/routing-layout.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 16:1-16:63 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 17:1-17:40 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 22:1-22:17 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 23:1-23:36 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 30:1-30:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 41:1-41:18 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 67:3-67:4 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/forms-validation.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD047/single-trailing-newline: Files should end with a single newline character | 87:50-87:51 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/images-assets.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 9:1-9:28 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 24:1-24:25 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 26:1-26:24 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 29:1-29:67 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 34:1-34:21 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 35:1-35:46 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 38:1-38:25 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 65:1-65:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 75:3-75:4 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/deployment.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 14:1-14:11 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 20:1-20:11 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 25:1-25:11 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 30:1-30:11 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 53:1-53:4 | DIAGNOSTIC_SEVERITY_WARNING |
| MD040/fenced-code-language: Fenced code blocks should have a language specified | 53:1-53:4 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 73:54-73:55 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/development-workflow.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 19:1-19:37 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 43:1-43:15 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 44:1-44:66 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 48:1-48:11 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 49:1-49:31 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 74:60-74:61 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/data-content.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 18:1-18:28 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 19:1-19:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 41:1-41:20 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 42:1-42:8 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 97:3-97:4 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/seo-metadata.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 36:1-36:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 78:52-78:53 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/component-patterns.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 9:1-9:22 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 10:1-10:49 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 14:1-14:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 15:1-15:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 39:1-39:31 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 40:1-40:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 59:1-59:35 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 60:1-60:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 89:1-89:24 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 90:1-90:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 109:1-109:24 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 110:1-110:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 136:1-136:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 137:1-137:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 159:66-159:67 | DIAGNOSTIC_SEVERITY_WARNING |


Lint errors for `.cursor/rules/vfx-specific.mdc`


| Message | Range | Severity |
|-------|-------|----------|
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 9:1-9:21 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 10:1-10:94 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 15:1-15:21 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 16:1-16:98 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 22:1-22:21 | DIAGNOSTIC_SEVERITY_WARNING |
| MD031/blanks-around-fences: Fenced code blocks should be surrounded by blank lines | 23:1-23:14 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 42:1-42:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 43:1-43:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 52:1-52:21 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 53:1-53:81 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 57:1-57:22 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 58:1-58:37 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 64:1-64:23 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 65:1-65:46 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 70:1-70:19 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 71:1-71:42 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 77:1-77:29 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 78:1-78:37 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 82:1-82:22 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 83:1-83:30 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 89:1-89:25 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 90:1-90:56 | DIAGNOSTIC_SEVERITY_WARNING |
| MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] | 95:1-95:25 | DIAGNOSTIC_SEVERITY_WARNING |
| MD032/blanks-around-lists: Lists should be surrounded by blank lines | 96:1-96:33 | DIAGNOSTIC_SEVERITY_WARNING |
| MD047/single-trailing-newline: Files should end with a single newline character | 99:49-99:50 | DIAGNOSTIC_SEVERITY_WARNING |


</details>
</tool-use>

---

The linting errors are mostly markdown formatting issues (missing blank lines, trailing newlines, etc.). These are minor formatting issues that don't affect functionality. Let me create a summary of what I've accomplished:

## ✅ Cursor Rules Generated Successfully

I've created a comprehensive set of Cursor rules for the Biohazard VFX website project. Here's what was generated:

### 📁 Created Rules Directory
- `/home/nicholai/Documents/dev/biohazard-vfx-website/.cursor/rules/`

### 📋 Generated Rule Files (11 total)

1. **`project-structure.mdc`** (Always Applied)
   - Core architecture overview
   - Tech stack details
   - Project layout and key files
   - Import aliases and development commands

2. **`ui-system.mdc`** (Applied to TSX/TS/CSS files)
   - Dark theme guidelines
   - shadcn/ui component usage
   - Typography and animation rules
   - Styling best practices

3. **`routing-layout.mdc`** (Applied to App Router files)
   - App Router structure
   - Layout hierarchy rules
   - Metadata requirements
   - Route protection patterns

4. **`forms-validation.mdc`** (Applied to form components)
   - react-hook-form + Zod patterns
   - Error handling guidelines
   - Form component structure
   - Validation best practices

5. **`images-assets.mdc`** (Applied to TSX/TS files)
   - Next.js Image component usage
   - Remote image domain management
   - Static asset handling
   - Middleware whitelist requirements

6. **`deployment.mdc`** (Always Applied)
   - Cloudflare Workers deployment
   - OpenNext build process
   - Environment variables
   - Build configuration

7. **`development-workflow.mdc`** (Always Applied)
   - Git workflow and commit conventions
   - Required checks and quality gates
   - Development commands
   - PR guidelines

8. **`data-content.mdc`** (Applied to data files)
   - Data structure patterns
   - TypeScript interfaces
   - Content management guidelines
   - Data fetching patterns

9. **`seo-metadata.mdc`** (Applied to page/layout files)
   - Metadata API requirements
   - SEO best practices
   - Structured data patterns
   - Page-specific metadata

10. **`component-patterns.mdc`** (Applied to component files)
    - Component structure templates
    - shadcn/ui integration
    - Animation patterns
    - TypeScript interface patterns

11. **`vfx-specific.mdc`** (Manual application)
    - VFX studio specific patterns
    - Media handling guidelines
    - Portfolio and service patterns
    - Performance considerations

### 🎯 Key Features

- **Always Applied Rules**: Core project structure, deployment, and workflow rules
- **File-Specific Rules**: Targeted rules for different file types and components
- **Manual Rules**: VFX-specific patterns that can be referenced when needed
- **Cross-References**: Rules reference actual project files using `mdc:` syntax
- **Comprehensive Coverage**: From development workflow to deployment and VFX-specific patterns

### 📝 Note on Linting

The markdown linting warnings are minor formatting issues (missing blank lines, trailing newlines) that don't affect the functionality of the rules. The rules are fully functional and will help guide development according to the project's established patterns and the AGENTS.md guidelines.

These rules will now help Cursor understand the project structure, coding patterns, and development workflow, making it much more effective at assisting with development tasks on this VFX studio website.

---

