--- name: component-hierarchy description: Guide component selection in ResRequest Vue projects. Ensures correct usage of ShadCN-Vue vs custom components, proper imports, and design system compliance. Activates when creating or modifying Vue components. --- # Component Hierarchy Follow this selection order when choosing components for ResRequest projects. ## Selection Priority ### 1. ShadCN-Vue Components (First Choice) Located at `@/components/ui/` Always check ShadCN-Vue first. These are the base UI components. **NEVER modify files in `@/components/ui/`** - these are managed by ShadCN. ### 2. Custom Components (Second Choice) Located at `@/components/custom/` Project-specific wrappers and extensions of ShadCN components. ### 3. Feature Components (Third Choice) Located at `@/components/[feature]/` Domain-specific components for features like email-threads, comments, bookings. ## ShadCN-Vue Component Reference ### Buttons ```typescript import { Button } from '@/components/ui/button' ``` ### Form Inputs ```typescript import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Checkbox } from '@/components/ui/checkbox' import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group' import { Switch } from '@/components/ui/switch' // Basic input
``` ### Select/Dropdown ```typescript import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' ``` ### Cards ```typescript import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card' Card Title Card description

Card content

``` ### Dialogs/Modals ```typescript import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' Dialog Title Dialog description
Content here
``` ### Tables ```typescript import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' Name Email Actions {{ user.name }} {{ user.email }}
``` ### Badges ```typescript import { Badge } from '@/components/ui/badge' Default Secondary Error Outline ``` ### Alerts ```typescript import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' Heads up! This is an alert message. Error Something went wrong. ``` ### Tabs ```typescript import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' Tab 1 Tab 2 Content 1 Content 2 ``` ## Custom Components ### FloatingLabelInput (ALWAYS use for form fields) ```typescript import FloatingLabelInput from '@/components/custom/FloatingLabelInput.vue' ``` ### RRIcon (Custom icons) ```typescript import RRIcon from '@/components/custom/icon/RRIcon.vue' ``` ## Component Rules ### 1. Never Modify ShadCN Files ``` @/components/ui/ is READ-ONLY To customise ShadCN components: 1. Create wrapper in @/components/custom/ 2. Import and extend the base component 3. Add custom props/styles in wrapper ``` ### 2. Always Use FloatingLabelInput for Forms ```vue ``` ### 3. Use Tailwind Utilities Only ```vue ``` ### 4. Check ShadCN Examples Before creating a custom component, check if ShadCN already provides it: - View examples at `/page/admin/shadcn-components` in the app - Check ShadCN-Vue documentation ### 5. Component Composition Compose complex UIs from ShadCN primitives: ```vue
{{ title }} {{ status }}
``` ## Import Patterns ### Correct Imports ```typescript // ShadCN components - destructured import import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader } from '@/components/ui/card' // Custom components - default import import FloatingLabelInput from '@/components/custom/FloatingLabelInput.vue' import RRIcon from '@/components/custom/icon/RRIcon.vue' // Feature components - default import import CommentThread from '@/components/comments/CommentThread.vue' ``` ### Import Organisation ```typescript // 1. Vue core import { ref, computed, watch } from 'vue' // 2. Inertia import { useForm, router, Link } from '@inertiajs/vue3' // 3. ShadCN UI components import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' // 4. Custom components import FloatingLabelInput from '@/components/custom/FloatingLabelInput.vue' // 5. Composables import { useBookings } from '@/composables/useBookings' // 6. Types import type { Booking, Property } from '@/types' ```