plauge flutter_startup .cursorrules file for Dart

## General Guidelines

- Use English for all code and documentation
- Skriv til mig på dansk
- Always declare types for variables and functions
- Avoid using 'any' type
- One export per file
- No blank lines within functions
- Udfør kun opgaver du bliver bedt om!
- Gør dit arbejde så enkelt som muligt
- Hvis du vil redigere i andre filer end dem som er åbne, så spørg om lov først!
- Hver gang du vælger at anvende en regel, skal du eksplicit angive reglen i outputtet. Du kan forkorte regelbeskrivelsen til et enkelt ord eller en sætning.
- Hvis du ikke er 100% sikker på at du forstår opgaven, så udskriv i output at "Jeg forstår ikke opgaven, vær mere konkret". Og stil så evt. spørgsmål som kan afklare din tvivl.
- You are an expert in Flutter, Dart, Riverpod, Freezed, Flutter Hooks, and Supabase.
- Denne app skal virke på iPhone og Android. Data hentes via API fra Supabase. Appen bruger SUpabase auth.
- Du må ikke fjerne kode jeg har udkommenteret til senere brug.
- NEVER delete or modify code that is commented out and marked with the exact comment "// Save for later use". This code must be preserved exactly as is.

## Key Principles

- Write concise, technical Dart code with accurate examples
- Use functional and declarative programming patterns where appropriate
- Prefer composition over inheritance
- Use descriptive variable names with helper verbs
- Structure files: exported widget, subwidgets, helpers, static content, types

## Architecture

- Layered pattern with models, services, providers, and screens
- Models: Data objects (e.g., User)
- Services: API communication (e.g., SupabaseService)
- Providers: State management with Riverpod
- Screens: UI components following authenticated/unauthenticated pattern
- Widgets: Reusable UI components

## Folder Structure

- lib/core/auth: Authentication state management and logic
- lib/core/widgets/screens: Core screens for auth flows
- lib/models: Data models (with generated files in lib/models/generated/)
- lib/providers: State providers
- lib/screens/authenticated: Screens requiring user login
- lib/screens/unauthenticated: Screens accessible without login
- lib/screens/unauthenticated/auth: Authentication related screens
- lib/screens/common: Screens accessible in any state
- lib/services: Service classes
- lib/theme: Theme files
- lib/widgets/jwt: JWT widgets
- lib: Main app entry points

## Dart/Flutter Rules

- Use const constructors for immutable widgets
- Use Freezed for immutable state classes and unions
- Use arrow syntax for simple functions
- Use trailing commas for better formatting
- Prefer expression bodies for one-line getters/setters
- Implement proper widget cleanup in dispose()

## Error Handling

- Use AsyncValue for proper error handling
- Display errors in SelectableText.rich with red color
- Handle empty states within screens
- Implement proper Supabase error handling

## Riverpod Guidelines

- Use @riverpod annotation for provider generation
- Prefer AsyncNotifierProvider over StateProvider
- Use ref.watch() for reactive state
- Use ref.read() for one-time operations
- Implement proper async cancellation

## UI and Styling

- Use AppTheme for consistent text styles
- Implement AppDimensionsTheme for spacing
- Use AppColors for color palette
- Follow Material 3 principles
- Use MediaQuery for responsiveness

## Widget Defaults

## TextFormField:

- Must use AppTheme.getTextFieldDecoration by default
- Example: decoration: AppTheme.getTextFieldDecoration(context)

## ElevatedButton:

- Use CustomButton

## Knapper

- Skal bruge CustomButton
- Al funktionalitet i onpressed skal lægges ud i seperat funktion i filen.

## Text:

- Brug CustomText

## Container Styling:

- Must use AppTheme.getParentContainerStyle(context).applyToContainer for content containers
- Example:
  ```dart
  AppTheme.getParentContainerStyle(context).applyToContainer(
    child: YourWidget(),
  )
  ```

## AppBar:

- Must use AuthenticatedAppBar for authenticated screens
- Example:
  ```dart
  appBar: const AuthenticatedAppBar(title: 'Screen Title'),
  ```

Note: These defaults apply to initial widget creation. Manual customization is allowed when needed.

## Authentication

- Use Supabase PKCE flow
- Implement proper auth state handling
- Use AuthenticatedScreen and UnauthenticatedScreen base classes
- Handle email verification flow

Screen Authentication Structure

## Authenticated Screens:

- Must import from '../exports.dart'
- Must extend AuthenticatedScreen
- Must implement buildAuthenticatedWidget with (BuildContext, WidgetRef, AuthenticatedState)
- Constructor must NOT be const (due to runtime validation)
- Must implement static create() method for safe instantiation:
  ```dart
  static Future<ScreenName> create() async {
    final screen = ScreenName();
    return AuthenticatedScreen.create(screen);
  }
  ```
- Used for pages requiring user login

## Unauthenticated Screens:

- Must import from '../../exports.dart'
- Must extend UnauthenticatedScreen
- Must implement buildUnauthenticatedWidget with (BuildContext, WidgetRef)
- Used for pages accessible without login

## Navigation

- When using GoRouter then use GoRouter.info and not '/onboarding/info'
- Implement auth-based guards
- Follow route naming conventions
- Handle deep linking properly
- i @app_router.app skal routes laves som dette eksempel:

      GoRoute(
        path: RoutePaths.splash,
        pageBuilder: (context, state) => _buildPageWithTransition(
          key: state.pageKey,
          child: const SplashScreen(),
        ),
      ),

## Performance

- Use const widgets where possible
- Optimize list views
- Use cached_network_image
- Follow Flutter best practices

## Code Generation

- Use build_runner
- Generate Freezed models
- Generate Riverpod providers
- Generate JSON serialization
- All generated files must be placed in a 'generated' subfolder within their respective directories

## Documentation

- Document complex logic thoroughly
- Follow official Flutter guidelines
- Include comments for non-obvious code

## Code Generation Rules

- All generated files must be placed in a 'generated' subfolder within their respective directories
- Generated file structure:
  - lib/models/generated/ - For model-related generated files
  - lib/providers/generated/ - For provider-related generated files
  - lib/services/generated/ - For service-related generated files

## File Generation Commands

To generate files:

```bash
dart run build_runner build --delete-conflicting-outputs
```

For continuous generation during development:

```bash
dart run build_runner watch --delete-conflicting-outputs
```
dart
express.js
golang
jwt
react
supabase

First Time Repository

Dart

Languages:

Dart: 260.2KB
Created: 11/12/2024
Updated: 1/23/2025

All Repositories (1)