Description
StellarSplit invoices currently carry only generic platform branding, which makes them unsuitable for professional client-facing use. This issue adds a branding settings screen at /settings/branding where creators can upload a company logo, set a primary accent color, and write a short tagline that is rendered on the invoice view and PDF export. All brand assets must be stored securely and served via a CDN-friendly URL. Branding is scoped per user account and applies to all invoices created by that account.
Technical Context
Create app/settings/branding/page.tsx with a BrandingForm component using react-hook-form and zod validation. Logo upload should POST to app/api/settings/branding/logo/route.ts, which streams the file to an S3-compatible store (or Vercel Blob) and returns a CDN URL. Validate MIME type (image/png, image/jpeg, image/webp) and enforce a 2 MB size cap on the server. Store brand metadata (logoUrl, accentColor, tagline) in the user's settings record via app/api/settings/branding/route.ts. Extend components/invoice/InvoiceView.tsx and the PDF export pipeline to pull brand settings and inject them. The color picker must allow hex input and reject values with insufficient contrast against white (WCAG AA).
Acceptance Criteria
Description
StellarSplit invoices currently carry only generic platform branding, which makes them unsuitable for professional client-facing use. This issue adds a branding settings screen at
/settings/brandingwhere creators can upload a company logo, set a primary accent color, and write a short tagline that is rendered on the invoice view and PDF export. All brand assets must be stored securely and served via a CDN-friendly URL. Branding is scoped per user account and applies to all invoices created by that account.Technical Context
Create
app/settings/branding/page.tsxwith aBrandingFormcomponent usingreact-hook-formandzodvalidation. Logo upload should POST toapp/api/settings/branding/logo/route.ts, which streams the file to an S3-compatible store (or Vercel Blob) and returns a CDN URL. Validate MIME type (image/png,image/jpeg,image/webp) and enforce a 2 MB size cap on the server. Store brand metadata (logoUrl, accentColor, tagline) in the user's settings record viaapp/api/settings/branding/route.ts. Extendcomponents/invoice/InvoiceView.tsxand the PDF export pipeline to pull brand settings and inject them. The color picker must allow hex input and reject values with insufficient contrast against white (WCAG AA).Acceptance Criteria
/invoice/[id]and in the PDF export without pixelation at standard print resolution (300 dpi equivalent)