# Cursor Rules - When merging tailwind classes, use the `cn` function. - When using Tailwind and you need to merge classes use the `cn` function if avilable. - We use Tailwind 4 (the latest version), make sure to not use outdated classes. - Instead of using the syntax`Array`, use `T[]`. - Use TypeScript `type` over `interface`. - You are forbiddent o add comments unless explicitly stated by the user. - Avoid sending JavaScript to the client. The JS send should be optional. - In prisma preffer `select` over `include` when making queries. - Import the types from prisma instead of hardcoding duplicates. - Avoid duplicating similar html code, and parametrize it when possible or create separate components. - Remember to check the prisma schema when doing things related to the database. - Avoid hardcoding enums from the database, import them from prisma. - Avoid using client-side JavaScript as much as possible. And if it has to be done, make it optional. - The admin pages can use client-side JavaScript. - Keep README.md in sync with new capabilities. - The package manager is npm. - For icons use the `Icon` component from `astro-icon/components`. - For icons use the Remix Icon library preferably. - Use the `Image` component from `astro:assets` for images. - Use the `zod` library for schema validation. - In the astro actions return, don't return success: true, or similar, just return an object with the newly created/edited objects or nothing. - When adding actions, don't create and export a new variable called actions. Notice that Astro already provides that variable from `import { actions } from 'astro:actions'`. So just add the new actions to the `server` variable in `web/src/actions/index.ts` and that's it. - Don't forget that the astro files have thre dashes (`---`) at the begining of the file and where the server js ends. I noticed that sometimes you forget them. - The admin actions go into a separate folder. - In Actro actions when throwing errors use ActionError. - @deprecated Don't import this object, use {@link actions} instead, like: `import { actions } from 'astro:actions'`. Example: ```ts import { actions } from "astro:actions"; /* CORRECT */ import { server } from "~/actions"; /* WRONG!!!! DON'T DO THIS */ import { adminAttributeActions } from "~/actions/admin/attribute.ts"; /* WRONG!!!! DON'T DO THIS */ const result = Astro.getActionResult(actions.admin.attribute.create); ``` - Always use Astro actions instead of with API routes or `if (Astro.request.method === "POST")`. - When adding clientside js do it with HTMX. - When adding HTMX, the layout component BaseLayout accepts a prop htmx to load it in that page. No need to use a cdn. - When redirecting to login use the `makeLoginUrl` function from web/src/lib/redirectUrls.ts ```ts function makeLoginUrl( currentUrl: URL, options: { redirect?: URL | string | null; error?: string | null; logout?: boolean; message?: string | null; } = {} ); ```