## 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