0e8698f538
- Register BillingSettingsContent in SETTINGS_SECTIONS so the settings MODAL renders Abonnemang (it was falling back to Företag — billing was only a standalone page, never a registered section). Page is now a thin wrapper over the same component. - Add GET /api/billing/status (isPaying / configured / trialEndsAt) so the client section gets state without server-only reads. - Redesign for conversion: trial days-left urgency banner, reactive monthly/yearly price with a 'Spara 2 mån' badge, full-width price-bearing CTA, Stripe trust line, design-system-compliant chrome (flat Card, no shadow/rounded-xl, on-scale spacing, serif headline). Trialing companies now see the upgrade path (not the manage button). The reported 'peach band' was not reproduced in code — no peach/salmon color exists in the app CSS and the only bottom drag-handle is in a md:hidden mobile sheet; most likely a macOS screenshot/desktop artifact. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.6 KiB
TypeScript
36 lines
1.6 KiB
TypeScript
import type { ComponentType } from 'react'
|
|
import { AccountSettingsContent } from './AccountSettingsContent'
|
|
import { CompanySettingsContent } from './CompanySettingsContent'
|
|
import { BookkeepingSettingsContent } from './BookkeepingSettingsContent'
|
|
import { TaxSettingsContent } from './TaxSettingsContent'
|
|
import { SalarySettingsContent } from './SalarySettingsContent'
|
|
import { InvoicingSettingsContent } from './InvoicingSettingsContent'
|
|
import { TemplatesSettingsContent } from './TemplatesSettingsContent'
|
|
import { BankingSettingsContent } from './BankingSettingsContent'
|
|
import { AssistantSettingsContent } from './AssistantSettingsContent'
|
|
import { ApiSettingsContent } from './ApiSettingsContent'
|
|
import { BillingSettingsContent } from './BillingSettingsContent'
|
|
|
|
/**
|
|
* Single source of truth mapping a settings section id to the component that
|
|
* renders its content. Both the per-section route (`settings/<section>/page.tsx`,
|
|
* a thin wrapper) and the routed settings modal (`SettingsModal` → `SettingsShell`)
|
|
* resolve content through this map, so there is exactly one place a section's
|
|
* composition lives.
|
|
*/
|
|
export const SETTINGS_SECTIONS: Record<string, ComponentType> = {
|
|
account: AccountSettingsContent,
|
|
company: CompanySettingsContent,
|
|
bookkeeping: BookkeepingSettingsContent,
|
|
tax: TaxSettingsContent,
|
|
salary: SalarySettingsContent,
|
|
invoicing: InvoicingSettingsContent,
|
|
templates: TemplatesSettingsContent,
|
|
banking: BankingSettingsContent,
|
|
assistant: AssistantSettingsContent,
|
|
api: ApiSettingsContent,
|
|
billing: BillingSettingsContent,
|
|
}
|
|
|
|
export type SettingsSectionId = keyof typeof SETTINGS_SECTIONS
|