mirror of
https://github.com/soconnor0919/beenvoice.git
synced 2025-12-13 17:44:44 -05:00
- Replace custom invoice items table with responsive DataTable component - Fix server/client component error by creating InvoiceItemsTable client component - Merge danger zone with actions sidebar and use destructive button variant - Standardize button text sizing across all action buttons - Remove false claims from homepage (testimonials, ratings, fake user counts) - Focus homepage messaging on freelancers with honest feature descriptions - Fix dark mode support throughout app by replacing hard-coded colors with semantic classes - Remove aggressive red styling from settings, add subtle red accents only - Align import/export buttons and improve delete confirmation UX - Update dark mode background to have subtle green tint instead of pure black - Fix HTML nesting error in AlertDialog by using div instead of nested p tags This update makes the invoice view properly responsive, removes misleading marketing claims, and ensures consistent dark mode support across the entire application.
428 lines
14 KiB
Plaintext
428 lines
14 KiB
Plaintext
# beenvoice - AI Assistant Rules
|
|
|
|
## Project Overview
|
|
beenvoice is a professional invoicing application built with the T3 stack (Next.js 15, tRPC, Drizzle/LibSQL, NextAuth.js) and shadcn/ui components. This is a business-critical application where reliability, security, and professional user experience are paramount.
|
|
|
|
## Core Development Principles
|
|
|
|
### 1. Business-First Approach
|
|
- **Priority**: Reliability and security over flashy features
|
|
- **User Experience**: Professional, clean, and intuitive interface
|
|
- **Data Integrity**: Always validate and sanitize user input
|
|
- **Error Handling**: Graceful degradation with clear user feedback
|
|
|
|
### 2. Type Safety & Code Quality
|
|
- **TypeScript**: Use strict TypeScript for all new code
|
|
- **tRPC**: All API calls must go through tRPC for type safety
|
|
- **Validation**: Use Zod schemas for all input validation
|
|
- **Error Boundaries**: Implement proper error handling at all levels
|
|
|
|
## Tech Stack Guidelines
|
|
|
|
### Frontend (Next.js 15 + App Router)
|
|
- Use App Router patterns consistently
|
|
- Implement proper loading states and error boundaries
|
|
- Follow Next.js 15 best practices for performance
|
|
- Use React Server Components where appropriate
|
|
|
|
### Backend (tRPC + Drizzle)
|
|
- All business logic goes through tRPC routers
|
|
- Use Drizzle ORM for all database operations
|
|
- Implement proper transactions for multi-table operations
|
|
- Follow existing router patterns in `src/server/api/routers/`
|
|
|
|
### Database (LibSQL/SQLite)
|
|
- Use Drizzle migrations for schema changes
|
|
- Implement proper indexes for performance
|
|
- Follow existing schema patterns
|
|
- Use transactions for data consistency
|
|
|
|
### Authentication (NextAuth.js)
|
|
- Email/password authentication with bcrypt hashing
|
|
- Proper session management
|
|
- Protected routes require authentication
|
|
- Follow NextAuth.js security best practices
|
|
|
|
## Component Architecture
|
|
|
|
### UI Components (shadcn/ui)
|
|
- Use shadcn/ui components as the foundation
|
|
- Follow existing component patterns
|
|
- Use `cn()` utility for conditional className merging
|
|
- Maintain consistent spacing (4px grid system)
|
|
|
|
### Component Organization
|
|
- **Base UI Components**: `src/components/ui/` - Pure, portable shadcn/ui components
|
|
- **Project Components**: `src/components/` - Project-specific reusable components
|
|
- **Page Components**: `src/app/_components/` - Page-specific components
|
|
|
|
### UI Component Rules
|
|
|
|
#### What Belongs in `src/components/ui/` (Portable)
|
|
- **Pure shadcn/ui components**: button, input, select, dialog, etc.
|
|
- **Generic layout components**: page-layout, card, table
|
|
- **Basic form components**: input, textarea, checkbox, switch
|
|
- **Navigation components**: breadcrumb, navigation-menu
|
|
- **Feedback components**: badge, alert-dialog, toast
|
|
- **Data display**: table, skeleton, progress
|
|
- **Overlay components**: dialog, sheet, popover, dropdown-menu
|
|
|
|
#### What Should Move to `src/components/` (Project-Specific)
|
|
- **Business logic components**: address-form, status-badge, data-table
|
|
- **Domain-specific forms**: client-form, invoice-form, business-form
|
|
- **Custom layouts**: page-header, dashboard-breadcrumbs
|
|
- **Feature components**: invoice-list, client-list, editable-invoice-items
|
|
- **Navigation**: Sidebar, Navbar, navigation
|
|
- **Branding**: logo, AddressAutocomplete
|
|
|
|
#### Immediate Reorganization Needed
|
|
**Move from `src/components/ui/` to `src/components/forms/`:**
|
|
- `address-form.tsx` - Business-specific address handling
|
|
- `file-upload.tsx` - Project-specific file upload logic
|
|
|
|
**Move from `src/components/ui/` to `src/components/data/`:**
|
|
- `data-table.tsx` - Enhanced with business logic
|
|
- `status-badge.tsx` - Invoice status specific
|
|
- `stats-card.tsx` - Dashboard-specific statistics
|
|
|
|
**Move from `src/components/ui/` to `src/components/layout/`:**
|
|
- `page-layout.tsx` - Project-specific layout patterns
|
|
- `quick-action-card.tsx` - Dashboard-specific actions
|
|
- `floating-action-bar.tsx` - Project-specific floating actions
|
|
|
|
**Keep in `src/components/ui/` (Portable):**
|
|
- `button.tsx`, `input.tsx`, `select.tsx` - Pure shadcn/ui
|
|
- `dialog.tsx`, `sheet.tsx`, `popover.tsx` - Generic overlays
|
|
- `table.tsx`, `card.tsx`, `badge.tsx` - Base components
|
|
- `calendar.tsx`, `date-picker.tsx` - Generic date components
|
|
- `dropdown-menu.tsx`, `navigation-menu.tsx` - Generic navigation
|
|
- `skeleton.tsx`, `progress.tsx` - Generic loading states
|
|
|
|
#### Component Design Principles
|
|
- **High Reusability**: Components should accept props for customization
|
|
- **Composition over Inheritance**: Use children props and render props
|
|
- **Default Values**: Provide sensible defaults for all optional props
|
|
- **Type Safety**: Use TypeScript interfaces for all props
|
|
- **Accessibility**: Include proper ARIA labels and keyboard navigation
|
|
- **Responsive Design**: Mobile-first approach with responsive variants
|
|
|
|
#### Component Props Pattern
|
|
```typescript
|
|
interface ComponentProps {
|
|
// Required props
|
|
title: string;
|
|
|
|
// Optional props with defaults
|
|
variant?: "default" | "success" | "warning" | "error";
|
|
size?: "sm" | "md" | "lg";
|
|
|
|
// Styling props
|
|
className?: string;
|
|
|
|
// Event handlers
|
|
onClick?: () => void;
|
|
onChange?: (value: string) => void;
|
|
|
|
// Content
|
|
children?: React.ReactNode;
|
|
|
|
// Accessibility
|
|
"aria-label"?: string;
|
|
}
|
|
```
|
|
|
|
#### Component Reusability Guidelines
|
|
- **Configurable Content**: Use props for text, labels, and content
|
|
- **Flexible Styling**: Accept className and style props for customization
|
|
- **Variant System**: Use variant props for different visual states
|
|
- **Size Variants**: Provide consistent size options (sm, md, lg, xl)
|
|
- **Icon Support**: Accept icon props for visual customization
|
|
- **Loading States**: Include loading/skeleton variants
|
|
- **Error States**: Handle error states gracefully
|
|
- **Empty States**: Provide empty state components
|
|
|
|
#### Component Customization Examples
|
|
```typescript
|
|
// Good: Highly customizable component
|
|
interface DataTableProps<TData> {
|
|
columns: ColumnDef<TData>[];
|
|
data: TData[];
|
|
title?: string;
|
|
description?: string;
|
|
actions?: React.ReactNode;
|
|
searchKey?: string;
|
|
searchPlaceholder?: string;
|
|
showPagination?: boolean;
|
|
pageSize?: number;
|
|
className?: string;
|
|
emptyState?: React.ReactNode;
|
|
loading?: boolean;
|
|
}
|
|
|
|
// Good: Flexible form component
|
|
interface FormFieldProps {
|
|
label: string;
|
|
name: string;
|
|
type?: "text" | "email" | "password" | "number";
|
|
placeholder?: string;
|
|
required?: boolean;
|
|
error?: string;
|
|
className?: string;
|
|
leftIcon?: React.ReactNode;
|
|
rightIcon?: React.ReactNode;
|
|
disabled?: boolean;
|
|
onChange?: (value: string) => void;
|
|
}
|
|
```
|
|
|
|
#### Component File Structure
|
|
```
|
|
src/components/
|
|
├── ui/ # Portable base components
|
|
│ ├── button.tsx # Pure shadcn/ui components
|
|
│ ├── input.tsx
|
|
│ └── ...
|
|
├── forms/ # Project-specific forms
|
|
│ ├── address-form.tsx
|
|
│ ├── client-form.tsx
|
|
│ └── invoice-form.tsx
|
|
├── layout/ # Layout components
|
|
│ ├── page-header.tsx
|
|
│ ├── sidebar.tsx
|
|
│ └── navbar.tsx
|
|
├── data/ # Data display components
|
|
│ ├── data-table.tsx
|
|
│ ├── status-badge.tsx
|
|
│ └── invoice-list.tsx
|
|
├── navigation/ # Navigation components
|
|
│ ├── breadcrumbs.tsx
|
|
│ └── navigation.tsx
|
|
└── branding/ # Brand-specific components
|
|
├── logo.tsx
|
|
└── address-autocomplete.tsx
|
|
```
|
|
|
|
### Styling Guidelines
|
|
- **Primary Color**: Green (#16a34a) for branding
|
|
- **Font**: Geist font family for professional typography
|
|
- **Tailwind CSS**: Use utility classes consistently
|
|
- **Responsive Design**: Mobile-first approach
|
|
|
|
## Business Logic Patterns
|
|
|
|
### Invoice Management
|
|
- **Invoice Creation**: Multi-step process with validation
|
|
- **Line Items**: Flexible pricing with custom rates
|
|
- **Status Tracking**: draft → sent → paid/overdue
|
|
- **PDF Generation**: Professional invoice formatting
|
|
|
|
### Client Management
|
|
- **Contact Information**: Complete address and contact details
|
|
- **Search & Filter**: Efficient client lookup
|
|
- **Data Validation**: Proper email and phone validation
|
|
|
|
### Business Profile
|
|
- **Default Business**: One default business per user
|
|
- **Logo Support**: Professional branding
|
|
- **Tax Information**: Business tax details
|
|
|
|
## API Development Rules
|
|
|
|
### tRPC Router Patterns
|
|
```typescript
|
|
// Follow this pattern for all routers
|
|
export const exampleRouter = createTRPCRouter({
|
|
create: protectedProcedure
|
|
.input(z.object({ /* validation schema */ }))
|
|
.mutation(async ({ ctx, input }) => {
|
|
// Business logic here
|
|
}),
|
|
|
|
list: protectedProcedure
|
|
.input(z.object({ /* pagination/filtering */ }))
|
|
.query(async ({ ctx, input }) => {
|
|
// Query logic here
|
|
}),
|
|
});
|
|
```
|
|
|
|
### Error Handling
|
|
- Use toast notifications for user feedback
|
|
- Implement proper form validation
|
|
- Handle API errors gracefully
|
|
- Provide clear error messages
|
|
|
|
### Security
|
|
- Always validate user input with Zod
|
|
- Check user permissions for all operations
|
|
- Sanitize data before database operations
|
|
- Use proper authentication checks
|
|
|
|
## Database Schema Rules
|
|
|
|
### Table Structure
|
|
- **UUID Primary Keys**: Use `crypto.randomUUID()` for all IDs
|
|
- **Timestamps**: Include `createdAt` and `updatedAt` fields
|
|
- **User Relations**: All business data linked to users
|
|
- **Indexes**: Proper indexing for performance
|
|
|
|
### Relationships
|
|
- **Users → Clients**: One-to-many
|
|
- **Users → Businesses**: One-to-many
|
|
- **Users → Invoices**: One-to-many
|
|
- **Clients → Invoices**: One-to-many
|
|
- **Businesses → Invoices**: One-to-many
|
|
- **Invoices → Invoice Items**: One-to-many
|
|
|
|
## File Naming Conventions
|
|
|
|
### Components & Pages
|
|
- **Components**: PascalCase (e.g., `ClientList.tsx`)
|
|
- **Pages**: kebab-case (e.g., `new-client.tsx`)
|
|
- **Layouts**: `layout.tsx` (Next.js convention)
|
|
- **API Routes**: `route.ts` (Next.js convention)
|
|
|
|
### Utilities & Helpers
|
|
- **Utilities**: camelCase (e.g., `formatCurrency.ts`)
|
|
- **Constants**: UPPER_SNAKE_CASE
|
|
- **Types**: PascalCase (e.g., `InvoiceStatus`)
|
|
|
|
## Development Workflow
|
|
|
|
### Adding New Features
|
|
1. **Database Schema**: Update schema with migrations
|
|
2. **tRPC Router**: Add procedures with validation
|
|
3. **UI Components**: Create components using shadcn/ui
|
|
4. **Pages**: Implement pages with proper routing
|
|
5. **Testing**: Verify functionality and error handling
|
|
|
|
### Code Quality
|
|
- **ESLint**: Follow existing linting rules
|
|
- **Prettier**: Consistent code formatting
|
|
- **TypeScript**: Strict type checking
|
|
- **Performance**: Optimize database queries and React components
|
|
|
|
## Business Logic Specifics
|
|
|
|
### Invoice Calculations
|
|
- **Subtotal**: Sum of all line items
|
|
- **Tax**: Apply tax rate to subtotal
|
|
- **Total**: Subtotal + tax
|
|
- **Currency**: Handle decimal precision properly
|
|
|
|
### Status Management
|
|
- **Draft**: Initial state, editable
|
|
- **Sent**: Invoice sent to client
|
|
- **Paid**: Payment received
|
|
- **Overdue**: Past due date
|
|
|
|
### Data Validation
|
|
- **Email**: Proper email format validation
|
|
- **Phone**: International phone number support
|
|
- **Address**: Complete address validation
|
|
- **Currency**: Proper decimal handling
|
|
|
|
## Performance Guidelines
|
|
|
|
### Database Optimization
|
|
- Use proper indexes for frequently queried fields
|
|
- Implement pagination for large datasets
|
|
- Use transactions for data consistency
|
|
- Optimize query patterns
|
|
|
|
### Frontend Performance
|
|
- Use React.memo for expensive components
|
|
- Implement proper loading states
|
|
- Optimize bundle size
|
|
- Use Next.js Image component for images
|
|
|
|
### Caching Strategy
|
|
- Use React Query for client-side caching
|
|
- Implement proper cache invalidation
|
|
- Use Next.js caching where appropriate
|
|
|
|
## Security Considerations
|
|
|
|
### Authentication & Authorization
|
|
- All routes require proper authentication
|
|
- Check user ownership for all operations
|
|
- Implement proper session management
|
|
- Use secure password hashing
|
|
|
|
### Data Protection
|
|
- Validate all user inputs
|
|
- Sanitize data before database operations
|
|
- Implement proper error handling
|
|
- Use HTTPS in production
|
|
|
|
### Business Data Security
|
|
- User data isolation
|
|
- Proper access controls
|
|
- Audit trails for sensitive operations
|
|
- Secure API endpoints
|
|
|
|
## Testing & Quality Assurance
|
|
|
|
### Manual Testing Checklist
|
|
- [ ] Authentication flows work correctly
|
|
- [ ] Form validation provides clear feedback
|
|
- [ ] Responsive design on all screen sizes
|
|
- [ ] Database operations handle errors gracefully
|
|
- [ ] PDF generation works correctly
|
|
- [ ] Navigation and routing function properly
|
|
|
|
### Code Review Guidelines
|
|
- Check for proper error handling
|
|
- Verify type safety
|
|
- Ensure consistent styling
|
|
- Review security implications
|
|
- Test business logic accuracy
|
|
|
|
## Deployment & Production
|
|
|
|
### Environment Configuration
|
|
- Use proper environment variables
|
|
- Secure database connections
|
|
- Configure NextAuth.js properly
|
|
- Set up proper logging
|
|
|
|
### Database Management
|
|
- Use migrations for schema changes
|
|
- Backup data regularly
|
|
- Monitor database performance
|
|
- Handle database errors gracefully
|
|
|
|
## Common Patterns & Anti-Patterns
|
|
|
|
### ✅ Do's
|
|
- Use tRPC for all API calls
|
|
- Implement proper loading states
|
|
- Use toast notifications for feedback
|
|
- Follow existing component patterns
|
|
- Validate all user inputs
|
|
- Use proper TypeScript types
|
|
|
|
### ❌ Don'ts
|
|
- Don't use direct fetch calls
|
|
- Don't skip input validation
|
|
- Don't ignore error handling
|
|
- Don't hardcode business logic
|
|
- Don't use any types unnecessarily
|
|
- Don't skip proper authentication checks
|
|
|
|
## Emergency Procedures
|
|
|
|
### Critical Issues
|
|
- **Data Loss**: Immediate database backup
|
|
- **Security Breach**: Rotate all secrets
|
|
- **Performance Issues**: Database query optimization
|
|
- **User Complaints**: Prioritize user experience fixes
|
|
|
|
### Rollback Strategy
|
|
- Keep database migrations reversible
|
|
- Maintain version control for all changes
|
|
- Test rollback procedures regularly
|
|
- Document emergency procedures
|
|
|
|
## Remember
|
|
This is a business application where reliability, security, and professional user experience are critical. Every decision should prioritize these values over development convenience or flashy features. |