# Settings Persistence Pattern (ShopProQuote)

## Architecture

Settings live in two places:
1. **localStorage** (`spq-settings` key) — always available, even without login
2. **PocketBase** `settings` collection — per-user JSON field (`data` field), only when logged in

## Loading order (Settings.tsx init)

1. `loadLocalSettings()` → reads localStorage, spreads over DEFAULT_SETTINGS
2. If logged in, fetch PB record → spread `{ ...DEFAULT_SETTINGS, ...data }` over the stored `data` JSON field
3. `saveLocalSettings(merged)` — overwrites localStorage with PB data so next load uses it

## Saving

- `updateSetting(key, value)` — updates local state + immediately writes to localStorage
- `saveAllSettings()` — saves to PocketBase (if logged in) + localStorage

## Type: ShopSettings (src/types.ts)

```typescript
export interface ShopSettings {
  businessName: string;
  businessAddress: string;
  businessPhone: string;
  serviceAdvisor: string;
  taxRate: number;
  taxLabel: string;
  shopChargeRate: number;
  shopChargeExplanation: string;
  headerMessage: string;
  footerMessage: string;
  quoteFooterNote: string;

  // PDF & Branding
  logoUrl?: string;
  showLogoOnPdf: boolean;
  quoteExpiryDays: number;
  quoteNumberPrefix: string;
  pdfAccentColor: string;

  // Business Ops
  businessHours?: string;
  defaultLaborRate: number;
  paymentTerms: string;
}
```

## DEFAULT_SETTINGS lives in two places

Both MUST stay in sync:
- `src/pages/Settings.tsx` (the settings UI uses this)
- `src/pages/QuoteGenerator.tsx` (the PDF generator's `loadSettings()` fallback)

When adding a new setting: add to types.ts → add to both DEFAULT_SETTINGS → add UI field → add to pdf.ts usage.
