Adhere to these fundamental principles in all development activities:
-
Simplicity First (KISS & YAGNI):
- Always seek the simplest practical solution.
- Prioritize Functionality Sources:
- Built-in Nuxt 3 features (auto-imports, composables, utilities).
- Functionality from installed Nuxt modules (e.g., shadcn-nuxt, PWA).
- Utilities from already installed packages (e.g.,
@vueuse/core
, zod
).
- New Dependencies (Last Resort): Only add new packages or modules if essential functionality cannot be reasonably achieved otherwise. Justify any new additions.
- Avoid unnecessary features or complexity. If you don't need it now, don't build it.
-
Client-Side Rendering (CSR) & PWA Focus:
- The application is primarily CSR. Design components and logic for the client environment.
- Server-Side Rendering (SSR) is an exception, used only for essential online-only operations like authentication (
/login
, /auth/**
).
- Prioritize fast initial load times (First Contentful Paint, Time To Interactive) and smooth client-side interactions.
- Implement robust loading states (e.g., skeleton components) and user-friendly error states for all asynchronous operations or data fetching.
-
Offline-First Design:
- Strive to make all features as functional as possible without an internet connection.
- Utilize
useSecureStorage
extensively for encrypted client-side data persistence, making user data and application state available offline.
- Implement intelligent data synchronization: load from local cache first, then update from the network when online. Keep data fresh without disrupting the user experience.
- Leverage
useDebounce
where appropriate (e.g., user input, frequent state updates) to optimize performance and reduce unnecessary operations.
- Strictly follow PWA best practices for caching, service workers, and background sync (see
pwa-rules.mdc
).
-
Reusability (DRY - Don't Repeat Yourself):
- Before creating new components, composables, or utilities, check if existing ones can be reused or adapted.
- Promote the use of shared composables in
/composables
for cross-cutting concerns.
-
Elegance & Intuitiveness (SINE):
- Write clean, readable, and maintainable code.
- Design intuitive user interfaces and application flows.
-
Security (SINE):
- Prioritize the security of user data, especially when stored client-side via
useSecureStorage
.
- Follow security best practices for API interactions and data handling.
Architecture & Structure
Maintain the established project structure and architectural patterns:
-
Project Structure:
- Adhere to the defined directory layout (
/components
, /composables
, /pages
, /server
, /types
, etc.). Place files in their designated locations.
-
UI & Styling:
- Component Library: Use
shadcn-vue
components (located in components/ui/
) as the foundation for all UI elements. These are auto-imported; do not import them manually.
- Styling: Use Tailwind CSS utility classes exclusively. Adhere to the theme variables defined in
assets/css/tailwind.css
and tailwind.config.js
.
- Theming: Ensure all components respect light/dark modes using the defined CSS variables.
- Glass Effects: Apply glass effect classes (
glass-effect
, glass-card
, etc.) consistently as defined in tailwind.css
.
- Refer to
ui-components-rules.mdc
for detailed UI guidelines.
-
Data Management & Storage:
- Database: Use Prisma ORM for server-side database operations via API endpoints.
- Media/Object Storage: Interact with Linode Object Storage (S3 compatible) only through the
useAppStorage
composable for media files.
- Persistent Client Storage: Use
useSecureStorage
for all sensitive or persistent client-side data that needs to be available offline. Data is automatically encrypted.
- Temporary Client State: Use
useMemoryStorage
or standard Vue refs/reactives (useState
for shared state) for temporary, non-sensitive UI state or draft data.
- Refer to
storage-rules.mdc
for comprehensive storage rules.
-
State Management:
- Local: Use Vue Composition API (
ref
, computed
, reactive
) within components.
- Shared (Client-side): Use Nuxt's
useState
for simple state sharing between components within the client session.
- Persistent: Use
useSecureStorage
for state that needs to persist across sessions and be available offline.
Development Practices
Follow these practices during implementation:
-
Component Design:
- Build components with a single responsibility.
- Always include appropriate loading, error, and offline states. Use skeleton loaders for a better user experience.
-
Data Fetching:
- Use the standard
useAsyncData
or $fetch
patterns optimized for CSR and offline use:
- Always use
server: false
.
- Implement cache-first logic (check
useSecureStorage
before network).
- Provide default data structures.
- Refresh data in the background when online.
- Use
lazy: true
for non-critical data.
- Refer to
pwa-rules.mdc
for detailed patterns.
-
Error Handling:
- Implement robust and user-friendly error handling throughout the application.
- Distinguish between network errors, API errors, and application errors.
- Provide clear feedback and recovery options (e.g., retry buttons).
- Handle offline scenarios gracefully.
- Refer to
error-handling-rules.mdc
.
-
API Integration:
- Interact with server API endpoints consistently.
- Design APIs and client-side logic to support offline data queuing and background synchronization.
- Refer to
api-integration-rules.mdc
.
-
Imports:
- Do Not Import Auto-Imports: Never manually import functions/components auto-imported by Nuxt 3 or Vue (e.g.,
ref
, computed
, defineNuxtConfig
, Button
, Input
).
- Use type-only imports (
import type { ... }
) where appropriate.
-
Nuxt Best Practices:
- Follow established Nuxt 3 conventions and best practices.
- Keep Nuxt 4 compatibility in mind where practical, but prioritize clean Nuxt 3 implementation.
-
Caching:
- Leverage caching at multiple levels: Service Worker (asset/API caching),
useSecureStorage
(data caching), useAsyncData
(built-in caching).
- Implement intelligent caching strategies (e.g., stale-while-revalidate) where appropriate.
-
Testing:
- Write tests as needed, focusing on critical functionality, composables, and utility functions. Utilize Vitest and related testing libraries integrated into the project.