This document provides guidelines for AI coding agents working in this repository.
This is a Tauri 2.x desktop application with:
- Frontend: Angular 20 (TypeScript) + Tailwind CSS v4
- Backend: Rust (Tauri native backend)
- Styling: Neobrutalism theme with light/dark mode support
- Platform: Cross-platform desktop app (Windows, macOS, Linux)
| Directory | Purpose |
|---|---|
src/ |
Angular frontend source code |
src/app/components/ |
Reusable UI components (sidenav, theme-toggle) |
src/app/layouts/ |
Layout components (main-layout) |
src/app/pages/ |
Page components (dashboard, accounts, quotas) |
src/app/services/ |
Angular services (theme.service) |
src/styles/ |
Global styles (theme_light, theme_dark, theme) |
src/assets/ |
Static assets (images, SVGs) |
src-tauri/ |
Rust/Tauri backend source code |
# Development
npm run start # Angular dev server (port 1420)
npm run tauri dev # Full Tauri dev mode (Angular + native window)
npm run watch # Angular watch mode
# Production
npm run build # Build Angular frontend
npm run tauri build # Build complete Tauri application
# Rust (from src-tauri/)
cargo build # Build Rust backend
cargo build --release # Build release version# Angular tests
npm test # Run all tests
ng test --include=**/my-component.spec.ts # Single test file
ng test --include=**/file.spec.ts -- --grep="desc" # Single test case
# Rust tests (from src-tauri/)
cargo test # Run all tests
cargo test test_name # Run specific test
cargo test -- --nocapture # Run with output# TypeScript/Angular
npm run lint # Lint TypeScript
npx prettier --write . # Format with Prettier
# Rust (from src-tauri/)
cargo fmt # Format Rust code
cargo clippy # Run Rust linter
cargo clippy -- -D warnings # Clippy with warnings as errorsThis project uses Tailwind CSS v4 with CSS-first configuration (no tailwind.config.js).
| File | Purpose |
|---|---|
src/styles/theme_light.css |
Light mode CSS variables (:root) |
src/styles/theme_dark.css |
Dark mode CSS variables (.dark class) |
src/styles/theme.css |
Tailwind imports, @theme inline, base styles |
src/styles.css |
Main entry point, imports all theme files |
Component CSS files must use @reference to access Tailwind utilities:
@reference "../../../styles.css"; /* Adjust path based on component location */
.my-class {
@apply flex items-center gap-2;
@apply bg-background text-foreground;
}/* Available theme colors (defined in theme.css) */
bg-background, bg-secondary-background, bg-main
text-foreground, text-main-foreground
border-border
shadow-shadowStrict mode enabled: strict, noImplicitReturns, strictTemplates
// 1. Angular packages
import { Component, inject, signal, input } from "@angular/core";
// 2. External libraries
import { LucideAngularModule, Sun, Moon } from "lucide-angular";
// 3. Local imports
import { ThemeService } from "../../services/theme.service";| Construct | Convention | Example |
|---|---|---|
| Files | kebab-case | theme-toggle.component.ts |
| Classes | PascalCase | ThemeToggleComponent |
| Variables/Functions | camelCase | isDark, toggleTheme |
| Component selectors | kebab-case | app-theme-toggle |
| Signals | camelCase | isCollapsed = signal(false) |
// Use signals for reactive state
isCollapsed = signal(false);
// Use input() for component inputs (Angular 17+)
collapsed = input(false);
// Use inject() for dependency injection
private themeService = inject(ThemeService);
// Use explicit return types
toggle(): void {
this.themeService.toggleTheme();
}- Indentation: 2 spaces
- Quotes: Double quotes
- Semicolons: Required
- Trailing commas: Required in multi-line
- Create directory:
src/app/components/{name}/ - Create files:
{name}.component.ts,{name}.component.html,{name}.component.css - Use standalone components with explicit imports
- Add
@referencein CSS for Tailwind utilities
import { Component } from "@angular/core";
@Component({
selector: "app-my-component",
standalone: true,
imports: [],
templateUrl: "./my-component.component.html",
styleUrl: "./my-component.component.css",
})
export class MyComponent {}import { LucideAngularModule, Sun, Moon } from "lucide-angular";
@Component({
imports: [LucideAngularModule],
})
export class MyComponent {
readonly Sun = Sun;
readonly Moon = Moon;
}<lucide-icon [img]="Sun" [size]="20" />- Dev server port: 1420 (configured in
angular.json) - Build output:
dist/os-app/browser/ - App identifier:
com.ken.os-app - Sidenav width: 300px expanded, 64px collapsed
- Dark mode: Toggle via
.darkclass on<html>element
tauri-apps.tauri-vscode- Tauri extensionrust-lang.rust-analyzer- Rust language supportangular.ng-template- Angular Language Servicebradlc.vscode-tailwindcss- Tailwind CSS IntelliSense