# Crewli Cursor Rules > Migration phase: this file is updated in F2 of RFC-WS-FRONTEND-PRIMEVUE > and continues to evolve as F4 progresses. Authoritative UI-framework > reference is `dev-docs/PRIMEVUE_COMPONENTS.md`. ## Stack PHP 8.2 + Laravel 12 | TypeScript + Vue 3 + PrimeVue + Tailwind v4 (target) / Vuetify (legacy, un-migrated surfaces) | Pinia + TanStack Query ## Laravel - Resource controllers, form requests, API resources — always - `HasUlids` on business models, `HasFactory`, `SoftDeletes` where documented - Global scope `OrganisationScope` on event-related models - Policies for authorization — never inline role checks ## UI framework strategy (migration-aware) - Always read `dev-docs/PRIMEVUE_COMPONENTS.md` first — it's the authoritative reference for component selection, theming, forms, and DataTable conventions - On migrated / new surfaces: PrimeVue + Tailwind v4; forms via `@primevue/forms` + Zod resolver through `` (RFC-WS-FRONTEND-PRIMEVUE Appendix A) - On un-migrated surfaces (during F4): match surrounding Vuetify code; pre-F2 Vuexy reference recoverable via `git show 1c449ff6204cae6371da08c34ea8934d6b2ffcb8:dev-docs/VUEXY_COMPONENTS.md` - Never mix PrimeVue and Vuetify inside one form or one surface ("no back-porting") ## Vuexy reference path (legacy surfaces only) - When extending an un-migrated surface, the Vuexy template reference is at: `resources/vuexy-admin-v10.11.1/vue-version/typescript-version/full-version/` - Never reference `javascript-version/` or `starter-kit/` variants ## Vue 3 - `