import { ledgerThemeAccents, type CurrencyCode, type LedgerThemeId } from "@cents/domain"; export const ledgerThemes: ReadonlyArray<{ id: LedgerThemeId; name: string; accent: string; gradient: string; }> = [ { id: "jade", name: "翡翠", accent: ledgerThemeAccents.jade, gradient: "linear-gradient(135deg, #118b79 0%, #087f72 48%, #285765 100%)" }, { id: "ocean", name: "海湾", accent: ledgerThemeAccents.ocean, gradient: "linear-gradient(135deg, #167b93 0%, #3459a4 52%, #4b3f7f 100%)" }, { id: "coral", name: "晚霞", accent: ledgerThemeAccents.coral, gradient: "linear-gradient(135deg, #c94f45 0%, #ad4869 54%, #6e4d82 100%)" }, { id: "berry", name: "莓果", accent: ledgerThemeAccents.berry, gradient: "linear-gradient(135deg, #a84378 0%, #71468d 52%, #40578a 100%)" }, { id: "meadow", name: "森野", accent: ledgerThemeAccents.meadow, gradient: "linear-gradient(135deg, #25805f 0%, #4e794b 54%, #766b35 100%)" }, { id: "graphite", name: "暮色", accent: ledgerThemeAccents.graphite, gradient: "linear-gradient(135deg, #35585d 0%, #4e556e 52%, #303f55 100%)" }, ]; export function ledgerTheme(themeId?: string) { return ledgerThemes.find((theme) => theme.id === themeId) ?? ledgerThemes[0]; } export type LedgerRecord = { id: string; name: string; color: string; theme: LedgerThemeId; defaultCurrency: CurrencyCode; createdAt: string; updatedAt: string; archivedAt: string | null; role?: "owner" | "member"; isPersonal: boolean; }; export type UserPreference = { id: string; userId: string; key: "currentLedgerId"; value: string; updatedAt: string; }; export function currentLedgerPreferenceId(userId: string) { return `${userId}:currentLedgerId`; } export function createDefaultLedgers(): LedgerRecord[] { const now = new Date().toISOString(); return [ { id: "local-ledger", name: "家庭日常", color: "#087f72", theme: "jade", defaultCurrency: "CNY", createdAt: now, updatedAt: now, archivedAt: null, isPersonal: true, }, { id: "travel-ledger", name: "旅行账本", color: "#3478e5", theme: "ocean", defaultCurrency: "CNY", createdAt: now, updatedAt: now, archivedAt: null, isPersonal: false, }, ]; }