@bazous/ui 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/answers/AnswerPicture.d.ts +13 -0
  4. package/dist/answers/contract.d.ts +160 -0
  5. package/dist/answers/draw.d.ts +16 -0
  6. package/dist/answers/index.d.ts +6 -0
  7. package/dist/answers/messages.d.ts +3 -0
  8. package/dist/answers.js +10 -0
  9. package/dist/answers.js.map +1 -0
  10. package/dist/canvas/index.d.ts +32 -0
  11. package/dist/canvas.js +285 -0
  12. package/dist/canvas.js.map +1 -0
  13. package/dist/contract/snapshot.d.ts +173 -0
  14. package/dist/engine/scenario.d.ts +40 -0
  15. package/dist/format/index.d.ts +37 -0
  16. package/dist/i18n/index.d.ts +25 -0
  17. package/dist/i18n/shared.d.ts +3 -0
  18. package/dist/index-yeBMtDf1.js +649 -0
  19. package/dist/index-yeBMtDf1.js.map +1 -0
  20. package/dist/index.d.ts +20 -0
  21. package/dist/index.js +1258 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/modules/Question.d.ts +18 -0
  24. package/dist/modules/available-now/index.d.ts +8 -0
  25. package/dist/modules/due-before-payday/index.d.ts +9 -0
  26. package/dist/modules/low-point/index.d.ts +12 -0
  27. package/dist/modules/margin-after-payday/index.d.ts +9 -0
  28. package/dist/modules/monthly-structure/index.d.ts +24 -0
  29. package/dist/modules/next-actions/index.d.ts +13 -0
  30. package/dist/modules/pay-cycles/index.d.ts +31 -0
  31. package/dist/modules/registry.d.ts +7 -0
  32. package/dist/modules/types.d.ts +77 -0
  33. package/dist/modules/what-if/index.d.ts +6 -0
  34. package/dist/primitives/CashflowChart.d.ts +22 -0
  35. package/dist/primitives/index.d.ts +57 -0
  36. package/dist/styles.css +1 -0
  37. package/package.json +84 -0
  38. package/schema/answers.schema.json +719 -0
  39. package/schema/canvas.json +181 -0
  40. package/schema/snapshot.schema.json +821 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-yeBMtDf1.js","sources":["../src/answers/contract.ts","../src/contract/snapshot.ts","../src/format/index.ts","../src/i18n/index.ts","../src/answers/messages.ts","../src/answers/draw.ts"],"sourcesContent":["import type { Decimal, IsoDate } from \"../contract/snapshot\";\n\n/**\n * The answers Bazous gives (`GET /api/v1/answers`, and the MCP tool `get_household_answers`),\n * as far as a view needs them. The engine computes everything, including the `visual` block:\n * the kind of picture, the figures to draw and a caption that says the answer from that angle.\n * Published as schema/answers.schema.json.\n */\n\n/** A balance at the end of a day: [iso date, balance]. */\nexport type BalancePoint = [IsoDate, Decimal];\n\ntype Visual<K extends string, T> = { kind: K; caption: string } & T;\n\n/** « Que dois-je payer avant le salaire ? » — a runway from today to payday, bills on the way. */\nexport type RunwayVisual = Visual<\"runway\", {\n today: IsoDate;\n payday: IsoDate;\n available: Decimal;\n due: Decimal;\n /** available − due: negative when something is missing. */\n gap: Decimal;\n bills: { label: string; amount: Decimal; date: IsoDate }[];\n /** Days before payday with the balance below zero. */\n short_days: number;\n}>;\n\n/** « Jusqu’où puis-je descendre ? » — the valley of the balance. */\nexport type ValleyVisual = Visual<\"valley\", {\n series: BalancePoint[];\n low: { date: IsoDate; balance: Decimal };\n days_below_zero: number;\n incomes: IsoDate[];\n}>;\n\n/** « Et si je décale un paiement ? » — before and after moving one bill (both curves by the engine). */\nexport type ShiftVisual = Visual<\"shift\", {\n before: BalancePoint[];\n after: BalancePoint[];\n move: { label: string; amount: Decimal; from: IsoDate; to: IsoDate };\n low_before: Decimal;\n low_after: Decimal;\n}>;\n\n/** « Combien de temps tiendrais-je sans revenu ? » — days of fixed costs covered, out of the advised ones. */\nexport type DaysVisual = Visual<\"days\", { covered: number; target: number; balance?: Decimal }>;\n\n/** « Qu’est-ce qui tombe à chaque salaire ? » — what comes in against what goes out in a pay cycle. */\nexport type BalanceVisual = Visual<\"balance\", { in: Decimal; out: Decimal; gap: Decimal; start: IsoDate; end: IsoDate }>;\n\n/** « Ma prime d’assurance maladie augmente-t-elle ? » — a countdown to a deadline, and the premium step. */\nexport type CountdownVisual = Visual<\"countdown\", {\n deadline: IsoDate;\n days_left: number;\n window_days: number;\n current?: Decimal | null;\n next?: Decimal | null;\n increase_per_year?: Decimal | null;\n}>;\n\n/** « Que me restera-t-il ? » — the curve to the end of the period, and where it finishes. */\nexport type HorizonVisual = Visual<\"horizon\", {\n series: BalancePoint[];\n end: { date: IsoDate; balance: Decimal };\n /** When the end is below zero: how many days of fixed costs the hole represents. */\n days_of_fixed_costs: number | null;\n}>;\n\n/** « Quelle grosse dépense de l’année arrive bientôt ? » — the next 90 days and the yearly bills in them. */\nexport type CalendarVisual = Visual<\"calendar\", {\n today: IsoDate;\n until: IsoDate;\n items: { label: string; amount: Decimal; date: IsoDate; days: number; per_month: Decimal }[];\n}>;\n\n/** « Est-ce que je paie des frais évitables ? » — what the fees add up to, year after year. */\nexport type LeakVisual = Visual<\"leak\", { per_year: Decimal; years: number; total: Decimal; items: { label: string }[] }>;\n\n/** « Ai-je mis de côté pour mes impôts ? » — twelve months to fill before the bill. */\nexport type JarVisual = Visual<\"jar\", { bill: Decimal; needed_per_month: Decimal; set_aside_per_month: Decimal; per_day: Decimal }>;\n\n/** « Puis-je encore verser sur mon 3e pilier ? » — paid and still possible, up to the legal limit, until 31.12. */\nexport type GaugeVisual = Visual<\"gauge\", {\n year: number; limit: Decimal; paid: Decimal; left: Decimal; deadline: IsoDate; days_left: number;\n}>;\n\n/** « Un contrat doit-il être résilié bientôt ? » — today, the day the letter must arrive, the renewal. */\nexport type DeadlineVisual = Visual<\"deadline\", {\n today: IsoDate;\n contracts: { name: string; ends_on: IsoDate; cancel_before: IsoDate; days_left: number }[];\n}>;\n\nexport type AnswerVisual = RunwayVisual | ValleyVisual | ShiftVisual | DaysVisual | BalanceVisual | CountdownVisual\n | HorizonVisual | CalendarVisual | LeakVisual | JarVisual | GaugeVisual | DeadlineVisual;\nexport type VisualKind = AnswerVisual[\"kind\"];\nexport const VISUAL_KINDS = [\"runway\", \"valley\", \"shift\", \"days\", \"balance\", \"countdown\",\n \"horizon\", \"calendar\", \"leak\", \"jar\", \"gauge\", \"deadline\"] as const satisfies readonly VisualKind[];\n\nexport type AnswerTone = \"risk\" | \"warn\" | \"info\";\n\nexport type Answer = {\n id: string;\n question: string;\n answer: string;\n tone: AnswerTone;\n because: string | null;\n source: \"kit\" | \"expert\";\n figures: Record<string, unknown>;\n needs: string[];\n visual?: AnswerVisual;\n};\n\nexport type Answers = {\n as_of: IsoDate;\n currency: string;\n language: string;\n headline: string;\n answers: Answer[];\n all_clear: { id: string; question: string; short: string }[];\n};\n","/**\n * The snapshot contract: the only thing this kit knows about a household.\n *\n * It is the JSON returned by the Bazous API (`GET /api/v1/cockpit`), described\n * formally in `schema/snapshot.schema.json`. Amounts are decimal strings in the\n * household base currency unless a field says otherwise; dates are ISO `YYYY-MM-DD`.\n * Nothing in this kit fetches it, stores it or recomputes the forecast from it.\n */\n\nexport type Decimal = string;\nexport type IsoDate = string;\nexport type Direction = \"inflow\" | \"outflow\";\n\nexport type CashEvent = {\n date: IsoDate;\n label: string;\n /** Amount in the base currency. */\n amount: Decimal;\n direction: Direction;\n /** Amount in the currency of the bill itself. */\n original_amount: Decimal;\n currency: string;\n kind: \"obligation\" | \"recurrence\" | string;\n ref_id: string | null;\n status: string | null;\n};\n\nexport type DailyPoint = {\n date: IsoDate;\n inflows: Decimal;\n outflows: Decimal;\n closing_balance: Decimal;\n};\n\nexport type Cycle = {\n /** `before_income`, then `cycle_1`, `cycle_2`… */\n key: string;\n start: IsoDate;\n end: IsoDate;\n total_out: Decimal;\n total_in: Decimal;\n items: CashEvent[];\n};\n\nexport type Driver = { label: string; date: IsoDate; amount: Decimal; share: Decimal };\n\n/**\n * The decision queue. Open bills are classified by the engine:\n * `overdue` (before today), `due_today`, `before_income` (on or before the next income),\n * `plan` (after it: `target` is the income date to pay on), `undated` (no due date yet).\n */\nexport type BillAction = {\n type: \"overdue\" | \"due_today\" | \"before_income\" | \"plan\" | \"undated\";\n ref_id: string;\n label: string;\n description?: string | null;\n date: IsoDate | null;\n amount: Decimal;\n currency: string;\n amount_base: Decimal;\n confidence?: Decimal | null;\n target?: IsoDate | null;\n};\n\nexport type Action =\n | BillAction\n | {\n type: \"needs_review\";\n kind: \"obligation\" | \"transaction\";\n ref_id: string;\n label: string;\n date: IsoDate | null;\n amount: Decimal;\n currency: string;\n confidence: Decimal | null;\n }\n | { type: \"missing_amounts\"; label: string; items: string[] };\n\nexport type Account = {\n id: string;\n name: string;\n account_type: string;\n currency: string;\n institution: string | null;\n balance: Decimal | null;\n balance_base: Decimal | null;\n observed_at: string | null;\n};\n\nexport type Snapshot = {\n as_of: IsoDate;\n horizon_end: IsoDate;\n next_income_date: IsoDate | null;\n second_income_date: IsoDate | null;\n base_currency: string;\n fx_rates: Record<string, Decimal>;\n opening_balance: Decimal;\n due_before_next_income: Decimal;\n /** opening_balance − due_before_next_income: negative means short before payday. */\n gap_before_next_income: Decimal;\n low_point: { date: IsoDate; balance: Decimal; days_from_now: number };\n end_of_horizon: { date: IsoDate; balance: Decimal };\n main_cycle: { start: IsoDate; end: IsoDate; total_out: Decimal; total_in: Decimal; drivers: Driver[] };\n cycles: Cycle[];\n points: DailyPoint[];\n events: CashEvent[];\n household: { id: string; name: string };\n accounts: Account[];\n structure: {\n fixed_monthly: Decimal;\n income_monthly: Decimal;\n fixed_ratio_percent: Decimal | null;\n structural_margin: Decimal | null;\n by_category: { category: string; amount: Decimal }[];\n };\n debts: {\n total_base: Decimal;\n items: { id: string; name: string; principal: Decimal; currency: string; due_day: number | null }[];\n };\n actions: Action[];\n /** Last full month of imported transactions, by category. */\n actual_vs_expected?: {\n period_start: IsoDate | null;\n period_end: IsoDate | null;\n complete: boolean;\n items: { category: string; expected: Decimal | null; actual: Decimal; delta: Decimal | null }[];\n };\n uncategorized?: { id: string; label: string; amount: Decimal; currency: string; booking_date: IsoDate; suggested_category: string | null }[];\n data_quality: {\n last_transaction_date: IsoDate | null;\n days_since_last_transaction: number | null;\n accounts_without_balance: string[];\n fx_missing: string[];\n rules_without_amount: string[];\n needs_review_count: number;\n };\n};\n\n/** Numbers travel as strings to keep cents exact; the kit only turns them into numbers to draw. */\nexport const toNumber = (value: Decimal | number | null | undefined): number => {\n if (value === null || value === undefined || value === \"\") return 0;\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : 0;\n};\n","import type { Decimal, IsoDate } from \"../contract/snapshot\";\nimport { toNumber } from \"../contract/snapshot\";\nimport type { Locale } from \"../i18n\";\n\n/**\n * Swiss figures in every language: 3’420.50 — typographic apostrophe for thousands,\n * point for decimals, true minus sign. Browsers disagree on fr-CH / it-CH grouping\n * (narrow space, none under 10’000, comma decimals), so numbers never go through Intl.\n */\nexport const THOUSANDS = \"’\";\nexport const MINUS = \"−\";\n\nexport function num(value: Decimal | number | null | undefined, digits = 0): string {\n const n = toNumber(value);\n const fixed = Math.abs(n).toFixed(digits);\n const [int = \"0\", frac] = fixed.split(\".\");\n const grouped = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, THOUSANDS);\n const body = frac ? `${grouped}.${frac}` : grouped;\n const rounded = Number(fixed);\n return n < 0 && rounded !== 0 ? `${MINUS}${body}` : body;\n}\n\n/** Always shows the sign: +1’175, −1’053, 0. */\nexport function signed(value: Decimal | number | null | undefined, digits = 0): string {\n const n = toNumber(value);\n const body = num(Math.abs(n), digits);\n if (Number(Math.abs(n).toFixed(digits)) === 0) return body;\n return n < 0 ? `${MINUS}${body}` : `+${body}`;\n}\n\n/** Amount with its ISO code after it: 2’419.58 EUR. */\nexport function money(value: Decimal | number | null | undefined, currency: string, digits = 2): string {\n return `${num(value, digits)} ${currency}`;\n}\n\nexport function parseDate(iso: IsoDate): Date {\n const [y, m, d] = iso.slice(0, 10).split(\"-\").map(Number);\n return new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1);\n}\n\nexport function isoDate(date: Date): IsoDate {\n const pad = (v: number) => String(v).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\nexport function addDays(iso: IsoDate, days: number): IsoDate {\n const d = parseDate(iso);\n d.setDate(d.getDate() + days);\n return isoDate(d);\n}\n\nexport function daysBetween(from: IsoDate, to: IsoDate): number {\n return Math.round((parseDate(to).getTime() - parseDate(from).getTime()) / 86_400_000);\n}\n\n/** 24.09 — the Swiss short date, identical in all five languages. */\nexport function shortDate(iso: IsoDate | null | undefined): string {\n if (!iso) return \"—\";\n const [, m, d] = iso.slice(0, 10).split(\"-\");\n return `${d}.${m}`;\n}\n\n/** \"05–10\" inside one month, \"30.09–07.10\" across two. */\nexport function dateSpan(from: IsoDate, to: IsoDate): string {\n if (from === to) return shortDate(from);\n const [, ma, da] = from.split(\"-\");\n const [, mb, db] = to.split(\"-\");\n return ma === mb ? `${da}–${db}` : `${da}.${ma}–${db}.${mb}`;\n}\n\nexport type Formatters = {\n locale: Locale;\n num: typeof num;\n signed: typeof signed;\n money: typeof money;\n shortDate: typeof shortDate;\n dateSpan: typeof dateSpan;\n /** \"jeudi 1 octobre\", \"Donnerstag, 1. Oktober\"… */\n longDate: (iso: IsoDate) => string;\n /** \"jeu.\", \"Do\", \"gio\"… */\n weekday: (iso: IsoDate) => string;\n};\n\n/**\n * Calendar names are written out here rather than taken from Intl: browsers ship\n * uneven data for Romansh (Chromium falls back to English), and the cockpit header\n * must read the same everywhere.\n */\nconst WEEKDAYS: Record<Locale, { short: string[]; long: string[] }> = {\n fr: { short: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"], long: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"] },\n de: { short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"], long: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"] },\n it: { short: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"], long: [\"domenica\", \"lunedì\", \"martedì\", \"mercoledì\", \"giovedì\", \"venerdì\", \"sabato\"] },\n rm: { short: [\"du\", \"gli\", \"ma\", \"me\", \"gie\", \"ve\", \"so\"], long: [\"dumengia\", \"glindesdi\", \"mardi\", \"mesemna\", \"gievgia\", \"venderdi\", \"sonda\"] },\n en: { short: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], long: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"] },\n};\nconst MONTHS: Record<Locale, string[]> = {\n fr: [\"janvier\", \"février\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"août\", \"septembre\", \"octobre\", \"novembre\", \"décembre\"],\n de: [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n it: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n rm: [\"schaner\", \"favrer\", \"mars\", \"avrigl\", \"matg\", \"zercladur\", \"fanadur\", \"avust\", \"settember\", \"october\", \"november\", \"december\"],\n en: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n};\n\nfunction writeLongDate(locale: Locale, date: Date): string {\n const wd = WEEKDAYS[locale].long[date.getDay()] ?? \"\";\n const month = MONTHS[locale][date.getMonth()] ?? \"\";\n const d = date.getDate();\n switch (locale) {\n case \"fr\":\n return `${wd} ${d === 1 ? \"1er\" : d} ${month}`;\n case \"de\":\n return `${wd}, ${d}. ${month}`;\n case \"it\":\n return `${wd} ${d} ${month}`;\n case \"rm\":\n return `${wd}, ${d} ${/^[aeiou]/.test(month) ? \"d’\" : \"da \"}${month}`;\n case \"en\":\n return `${wd} ${d} ${month}`;\n }\n}\n\nexport function createFormatters(locale: Locale): Formatters {\n const cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n return {\n locale,\n num,\n signed,\n money,\n shortDate,\n dateSpan,\n longDate: (iso) => cap(writeLongDate(locale, parseDate(iso))),\n weekday: (iso) => WEEKDAYS[locale].short[parseDate(iso).getDay()] ?? \"\",\n };\n}\n\nexport type Tone = \"neg\" | \"pos\" | \"flat\";\nexport function tone(value: Decimal | number | null | undefined): Tone {\n const n = toNumber(value);\n return n < 0 ? \"neg\" : n > 0 ? \"pos\" : \"flat\";\n}\n","/**\n * Five languages, one rule: every key exists in every language (a test enforces it).\n *\n * Messages are plain strings with `{name}` placeholders. A key may have plural\n * forms written as `key.one` / `key.other`; `t(key, { n })` picks the right one.\n */\n\nexport const LOCALES = [\"fr\", \"de\", \"it\", \"rm\", \"en\"] as const;\nexport type Locale = (typeof LOCALES)[number];\n\nexport const LOCALE_NAMES: Record<Locale, string> = {\n fr: \"Français\",\n de: \"Deutsch\",\n it: \"Italiano\",\n rm: \"Rumantsch\",\n en: \"English\",\n};\n\n/** BCP 47 tags used for calendar names. Numbers do not use Intl (see format/). */\nexport const LOCALE_TAGS: Record<Locale, string> = {\n fr: \"fr-CH\",\n de: \"de-CH\",\n it: \"it-CH\",\n rm: \"rm-CH\",\n en: \"en-CH\",\n};\n\nexport type Messages = Record<string, string>;\nexport type Catalog = Record<Locale, Messages>;\nexport type Vars = Record<string, string | number>;\nexport type Translate = (key: string, vars?: Vars) => string;\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === \"string\" && (LOCALES as readonly string[]).includes(value);\n}\n\n/** Pick a locale from a list of preferences (e.g. `navigator.languages`), French by default. */\nexport function pickLocale(preferences: readonly string[] | undefined, fallback: Locale = \"fr\"): Locale {\n for (const pref of preferences ?? []) {\n const base = pref.toLowerCase().split(/[-_]/)[0];\n if (isLocale(base)) return base;\n }\n return fallback;\n}\n\nfunction interpolate(template: string, vars?: Vars): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => (name in vars ? String(vars[name]) : match));\n}\n\n/**\n * Build `t` over one or more catalogs; later catalogs win (a module can override a shared key).\n * A missing key renders as `⟦key⟧` so it is visible in review instead of silently blank.\n */\nexport function createT(locale: Locale, ...catalogs: Catalog[]): Translate {\n const merged: Messages = Object.assign({}, ...catalogs.map((c) => c[locale]));\n const plurals = new Intl.PluralRules(LOCALE_TAGS[locale]);\n return (key, vars) => {\n if (vars && typeof vars.n === \"number\") {\n const form = `${key}.${plurals.select(vars.n)}`;\n const fallback = `${key}.other`;\n const template = merged[form] ?? merged[fallback];\n if (template !== undefined) return interpolate(template, vars);\n }\n const template = merged[key];\n return template === undefined ? `⟦${key}⟧` : interpolate(template, vars);\n };\n}\n\n/** The keys a catalog defines in one language, plural forms folded (`a.one`, `a.other` → `a`). */\nexport function catalogKeys(catalog: Catalog, locale: Locale): string[] {\n return Object.keys(catalog[locale]).sort();\n}\n","import type { Catalog } from \"../i18n\";\n\n/** The few words written inside the answer pictures. The captions themselves come from the engine. */\nexport const answerMessages: Catalog = {\n fr: {\n \"vis.today\": \"aujourd’hui\", \"vis.payday\": \"salaire\", \"vis.available\": \"dispo\", \"vis.short\": \"manque\", \"vis.left\": \"reste\",\n \"vis.in\": \"entre\", \"vis.out\": \"sort\", \"vis.until\": \"jusqu’au\", \"vis.dayUnit\": \"j\", \"vis.perMonth\": \"/ mois\",\n \"vis.before\": \"avant\", \"vis.after\": \"après\",\n \"vis.days\": \"{covered} / {target} jours\",\n \"vis.bills.one\": \"{n} facture · {total}\", \"vis.bills.other\": \"{n} factures · {total}\",\n \"vis.fixedDays\": \"= {days} j de charges fixes\", \"vis.inDays\": \"dans {days} j\", \"vis.perYear\": \"/ an\", \"vis.years.one\": \"{n} an\", \"vis.years.other\": \"{n} ans\",\n \"vis.bill\": \"bordereau\", \"vis.perDay\": \"/ jour\", \"vis.paid\": \"versé\", \"vis.limit\": \"plafond\", \"vis.letter\": \"lettre avant le\", \"vis.ends\": \"fin\",\n \"vis.renewal\": \"renouvellement\", \"vis.more\": \"+{n}\", \"vis.months\": \"12 mois\",\n },\n de: {\n \"vis.today\": \"heute\", \"vis.payday\": \"Lohn\", \"vis.available\": \"verfügbar\", \"vis.short\": \"fehlt\", \"vis.left\": \"bleibt\",\n \"vis.in\": \"rein\", \"vis.out\": \"raus\", \"vis.until\": \"bis\", \"vis.dayUnit\": \"T\", \"vis.perMonth\": \"/ Monat\",\n \"vis.before\": \"vorher\", \"vis.after\": \"nachher\",\n \"vis.days\": \"{covered} / {target} Tage\",\n \"vis.bills.one\": \"{n} Rechnung · {total}\", \"vis.bills.other\": \"{n} Rechnungen · {total}\",\n \"vis.fixedDays\": \"= {days} T Fixkosten\", \"vis.inDays\": \"in {days} T\", \"vis.perYear\": \"/ Jahr\", \"vis.years.one\": \"{n} Jahr\", \"vis.years.other\": \"{n} Jahre\",\n \"vis.bill\": \"Steuerrechnung\", \"vis.perDay\": \"/ Tag\", \"vis.paid\": \"eingezahlt\", \"vis.limit\": \"Maximum\", \"vis.letter\": \"Brief vor dem\", \"vis.ends\": \"Ende\",\n \"vis.renewal\": \"Verlängerung\", \"vis.more\": \"+{n}\", \"vis.months\": \"12 Monate\",\n },\n it: {\n \"vis.today\": \"oggi\", \"vis.payday\": \"stipendio\", \"vis.available\": \"disponibile\", \"vis.short\": \"manca\", \"vis.left\": \"resta\",\n \"vis.in\": \"entra\", \"vis.out\": \"esce\", \"vis.until\": \"fino al\", \"vis.dayUnit\": \"g\", \"vis.perMonth\": \"/ mese\",\n \"vis.before\": \"prima\", \"vis.after\": \"dopo\",\n \"vis.days\": \"{covered} / {target} giorni\",\n \"vis.bills.one\": \"{n} fattura · {total}\", \"vis.bills.other\": \"{n} fatture · {total}\",\n \"vis.fixedDays\": \"= {days} g di spese fisse\", \"vis.inDays\": \"tra {days} g\", \"vis.perYear\": \"/ anno\", \"vis.years.one\": \"{n} anno\", \"vis.years.other\": \"{n} anni\",\n \"vis.bill\": \"notifica\", \"vis.perDay\": \"/ giorno\", \"vis.paid\": \"versato\", \"vis.limit\": \"massimo\", \"vis.letter\": \"lettera prima del\", \"vis.ends\": \"fine\",\n \"vis.renewal\": \"rinnovo\", \"vis.more\": \"+{n}\", \"vis.months\": \"12 mesi\",\n },\n rm: {\n \"vis.today\": \"oz\", \"vis.payday\": \"paja\", \"vis.available\": \"disponibel\", \"vis.short\": \"manca\", \"vis.left\": \"resta\",\n \"vis.in\": \"entra\", \"vis.out\": \"sorta\", \"vis.until\": \"fin als\", \"vis.dayUnit\": \"d\", \"vis.perMonth\": \"/ mais\",\n \"vis.before\": \"avant\", \"vis.after\": \"suenter\",\n \"vis.days\": \"{covered} / {target} dis\",\n \"vis.bills.one\": \"{n} quint · {total}\", \"vis.bills.other\": \"{n} quints · {total}\",\n \"vis.fixedDays\": \"= {days} d custs fixs\", \"vis.inDays\": \"en {days} d\", \"vis.perYear\": \"/ onn\", \"vis.years.one\": \"{n} onn\", \"vis.years.other\": \"{n} onns\",\n \"vis.bill\": \"quint da taglia\", \"vis.perDay\": \"/ di\", \"vis.paid\": \"pajà\", \"vis.limit\": \"maximum\", \"vis.letter\": \"brev avant ils\", \"vis.ends\": \"fin\",\n \"vis.renewal\": \"renovaziun\", \"vis.more\": \"+{n}\", \"vis.months\": \"12 mais\",\n },\n en: {\n \"vis.today\": \"today\", \"vis.payday\": \"payday\", \"vis.available\": \"available\", \"vis.short\": \"short\", \"vis.left\": \"left\",\n \"vis.in\": \"in\", \"vis.out\": \"out\", \"vis.until\": \"until\", \"vis.dayUnit\": \"d\", \"vis.perMonth\": \"/ month\",\n \"vis.before\": \"before\", \"vis.after\": \"after\",\n \"vis.days\": \"{covered} / {target} days\",\n \"vis.bills.one\": \"{n} bill · {total}\", \"vis.bills.other\": \"{n} bills · {total}\",\n \"vis.fixedDays\": \"= {days} d of fixed costs\", \"vis.inDays\": \"in {days} d\", \"vis.perYear\": \"/ year\", \"vis.years.one\": \"{n} year\", \"vis.years.other\": \"{n} years\",\n \"vis.bill\": \"tax bill\", \"vis.perDay\": \"/ day\", \"vis.paid\": \"paid\", \"vis.limit\": \"limit\", \"vis.letter\": \"letter before\", \"vis.ends\": \"ends\",\n \"vis.renewal\": \"renewal\", \"vis.more\": \"+{n}\", \"vis.months\": \"12 months\",\n },\n};\n","import { num, shortDate } from \"../format\";\nimport { createT, type Locale, type Translate } from \"../i18n\";\nimport type {\n AnswerVisual, BalancePoint, BalanceVisual, CalendarVisual, CountdownVisual, DaysVisual, DeadlineVisual, GaugeVisual, HorizonVisual,\n JarVisual, LeakVisual, RunwayVisual, ShiftVisual, ValleyVisual,\n} from \"./contract\";\nimport { answerMessages } from \"./messages\";\n\n/**\n * One picture per kind of answer, as plain SVG: no framework, no network, only the figures of the\n * engine. Used by the kit's React component and embedded as is in the assistants' card, so the same\n * drawing shows on bazous.com, in Claude and in ChatGPT.\n *\n * Colours come from the kit's tokens (`--bz-*`), so the picture follows the theme around it.\n * Every label is set as text, never as markup. A picture that cannot be drawn returns null and the\n * answer is shown without it.\n */\n\nconst SVGNS = \"http://www.w3.org/2000/svg\";\nconst H = 130;\n/**\n * The picture is laid out at the width it is shown (one unit = one pixel), so its 11px labels stay\n * 11px on a phone instead of being shrunk with the drawing. Below 260 it is scaled down, above 320 up.\n */\nexport const MIN_WIDTH = 260;\nexport const MAX_WIDTH = 320;\n\nconst C = {\n ink: \"var(--bz-text)\",\n muted: \"var(--bz-muted)\",\n line: \"var(--bz-control-line)\",\n accent: \"var(--bz-accent)\",\n onAccent: \"var(--bz-on-accent)\",\n negative: \"var(--bz-negative)\",\n warning: \"var(--bz-warning)\",\n positive: \"var(--bz-positive)\",\n surface: \"var(--bz-surface)\",\n};\n\ntype Child = Node | null | false | undefined | Child[];\ntype Attrs = Record<string, string | number | null | undefined>;\ntype Svg = (tag: string, attrs?: Attrs, ...children: Child[]) => SVGElement;\n\nconst n = (v: string | number | null | undefined) => Number(v ?? 0);\nconst amount = (v: string | number) => num(v, 2);\n/** Long labels are shortened so they never leave the picture. */\nexport const shorten = (label: string, max = 18) => (label.length > max ? `${label.slice(0, max - 1).trimEnd()}…` : label);\n\nfunction tools(doc: Document, W: number) {\n const sv: Svg = (tag, attrs = {}, ...children) => {\n const node = doc.createElementNS(SVGNS, tag);\n for (const [k, v] of Object.entries(attrs)) if (v !== null && v !== undefined) node.setAttribute(k, String(v));\n for (const c of (children as unknown[]).flat(Infinity)) if (c) node.append(c as Node);\n return node;\n };\n const txt = (x: number, y: number, value: string, attrs: Attrs = {}) => {\n const node = sv(\"text\", { x, y, \"font-size\": 11, fill: C.muted, ...attrs });\n node.textContent = value;\n return node;\n };\n const frame = (label: string, ...children: Child[]) =>\n sv(\"svg\", { viewBox: `0 0 ${W} ${H}`, class: \"bz-answer-visual\", role: \"img\", \"aria-label\": label }, ...children) as SVGSVGElement;\n return { sv, txt, frame };\n}\n\ntype Scale = { n: number; top: number; hi: number; x: (i: number) => number; y: (v: number) => number };\n\nfunction scale(list: BalancePoint[][], W: number): Scale {\n const values = list.flat().map(([, b]) => n(b));\n const lo = Math.min(0, ...values);\n let hi = Math.max(0, ...values);\n if (lo < 0 && hi > -3 * lo) hi = -1.6 * lo; // a payday spike would flatten the valley: cut it, and say so\n const count = list[0]!.length, left = 8, right = W - 8, top = 22, bottom = H - 22;\n return {\n n: count, top, hi,\n x: (i) => left + (i * (right - left)) / Math.max(count - 1, 1),\n y: (v) => top + ((hi - Math.min(v, hi)) * (bottom - top)) / (hi - lo || 1),\n };\n}\n\nconst points = (series: BalancePoint[], sc: Scale, f = (b: number) => b) =>\n series.map(([, b], i) => `${sc.x(i).toFixed(1)},${sc.y(f(n(b))).toFixed(1)}`).join(\" \");\n\nfunction draw(v: AnswerVisual, t: Translate, doc: Document, W: number): SVGSVGElement | null {\n const { sv, txt, frame } = tools(doc, W);\n const zeroLine = (y: number) => [\n sv(\"line\", { x1: 8, x2: W - 8, y1: y, y2: y, stroke: C.line, \"stroke-dasharray\": \"3 3\" }),\n txt(W - 8, y - 4, \"0\", { \"text-anchor\": \"end\" }),\n ];\n const peaks = (series: BalancePoint[], sc: Scale) => {\n const marks: SVGElement[] = [];\n series.forEach(([, b], i) => {\n const prev = i ? n(series[i - 1]![1]) : -Infinity;\n if (n(b) > sc.hi && prev <= sc.hi && marks.length < 2)\n marks.push(txt(sc.x(i), sc.top - 8, `↑ ${amount(b)}`, { \"text-anchor\": sc.x(i) > W * 0.7 ? \"end\" : \"start\" }));\n });\n return marks;\n };\n const ends = (series: BalancePoint[]) => [\n txt(8, H - 6, shortDate(series[0]![0])),\n txt(W - 8, H - 6, shortDate(series[series.length - 1]![0]), { \"text-anchor\": \"end\" }),\n ];\n\n const runway = (r: RunwayVisual) => {\n const t0 = Date.parse(r.today), span = Math.max(Date.parse(r.payday) - t0, 1);\n const x = (iso: string) => 14 + ((Date.parse(iso) - t0) * (W - 28)) / span;\n const due = n(r.due), avail = n(r.available), gap = n(r.gap), full = W - 28;\n const aw = gap < 0 && due > 0 ? Math.min(Math.max(avail, 0) / due, 1) * full : full;\n const total = r.bills.reduce((sum, b) => sum + n(b.amount), 0);\n const label = r.bills.length === 1 ? `${shorten(r.bills[0]!.label)} ${shortDate(r.bills[0]!.date)}`\n : t(\"vis.bills\", { n: r.bills.length, total: amount(total) });\n const inside = aw > 110;\n return frame(r.caption,\n sv(\"line\", { x1: 14, x2: W - 14, y1: 30, y2: 30, stroke: C.line, \"stroke-width\": 2 }),\n sv(\"circle\", { cx: 14, cy: 30, r: 5, fill: C.ink }), txt(8, 14, t(\"vis.today\")),\n sv(\"circle\", { cx: W - 14, cy: 30, r: 6, fill: C.positive }),\n txt(W - 8, 14, `${t(\"vis.payday\")} ${shortDate(r.payday)}`, { \"text-anchor\": \"end\", fill: C.positive }),\n r.bills.map((b) => sv(\"rect\", { x: x(b.date) - 6, y: 24, width: 12, height: 12, rx: 3, fill: C.negative, stroke: C.surface, \"stroke-width\": 1 })),\n r.bills.length > 0 && txt(W / 2, 58, label, { \"text-anchor\": \"middle\", fill: C.negative }),\n sv(\"rect\", { x: 14, y: 86, width: Math.max(aw, 0), height: 20, rx: 3, fill: C.accent }),\n gap < 0 && sv(\"rect\", { x: 14 + aw, y: 86, width: full - aw, height: 20, rx: 3, fill: C.negative, \"fill-opacity\": 0.16,\n stroke: C.negative, \"stroke-dasharray\": \"4 3\" }),\n txt(inside ? 20 : 14, inside ? 100 : 80, `${t(\"vis.available\")} ${amount(avail)}`,\n { fill: inside ? C.onAccent : avail < 0 ? C.negative : C.ink, \"font-weight\": 600 }),\n gap < 0 ? txt(W - 20, 100, `${t(\"vis.short\")} ${amount(-gap)}`, { \"text-anchor\": \"end\", fill: C.negative, \"font-weight\": 600 })\n : txt(W - 20, 100, `${t(\"vis.left\")} ${amount(gap)}`, { \"text-anchor\": \"end\", fill: C.onAccent, \"font-weight\": 600 }));\n };\n\n const valley = (v2: ValleyVisual) => {\n const sc = scale([v2.series], W), zero = sc.y(0);\n const li = Math.max(0, v2.series.findIndex(([d]) => d === v2.low.date));\n const lx = sc.x(li), ly = sc.y(n(v2.low.balance)), right = lx > W * 0.6;\n return frame(v2.caption,\n sv(\"polygon\", { points: `${sc.x(0)},${zero} ${points(v2.series, sc, (b) => Math.min(b, 0))} ${sc.x(sc.n - 1)},${zero}`,\n fill: C.negative, \"fill-opacity\": 0.18 }),\n zeroLine(zero),\n sv(\"polyline\", { points: points(v2.series, sc), fill: \"none\", stroke: C.ink, \"stroke-width\": 2, \"stroke-linejoin\": \"round\" }),\n peaks(v2.series, sc),\n sv(\"circle\", { cx: lx, cy: ly, r: 5, fill: C.negative }),\n txt(lx + (right ? -9 : 9), Math.min(ly + 4, H - 26), `${amount(v2.low.balance)} · ${shortDate(v2.low.date)}`,\n { \"text-anchor\": right ? \"end\" : \"start\", fill: C.negative, \"font-weight\": 600 }),\n ends(v2.series));\n };\n\n const shift = (s: ShiftVisual) => {\n const sc = scale([s.before, s.after], W), zero = sc.y(0);\n const at = (iso: string) => { const i = s.before.findIndex(([d]) => d === iso); return sc.x(i < 0 ? sc.n - 1 : i); };\n const fx = at(s.move.from), tx = at(s.move.to), label = shorten(s.move.label, 16);\n const tag = Math.min(label.length * 6 + 14, 120);\n const tagX = Math.max(4, Math.min(fx - tag / 2, tx - tag - 12, W - 4 - tag));\n const arrow = tagX + tag + 8 < tx - 4;\n // The before/after legend goes to the side the target date leaves free; with no room on either side,\n // the date moves up next to the arrow. Widths are estimated generously (7px a character at 11px).\n const before = t(\"vis.before\"), after = t(\"vis.after\"), sw = 14, cw = 7;\n const width = sw + 4 + before.length * cw + 12 + sw + 4 + after.length * cw;\n const dateBox = 26, leftFits = 8 + width < tx - dateBox, rightFits = W - 8 - width > tx + dateBox;\n const lx = leftFits || !rightFits ? 8 : W - 8 - width, dateUp = !leftFits && !rightFits;\n const ax = lx + sw + 4 + before.length * cw + 12;\n // The move is drawn in its own band above the curves, so it never sits on them.\n return frame(s.caption,\n sv(\"defs\", {}, sv(\"marker\", { id: \"bz-arrowhead\", viewBox: \"0 0 10 10\", refX: 8, refY: 5, markerWidth: 6, markerHeight: 6, orient: \"auto\" },\n sv(\"path\", { d: \"M0 0 L10 5 L0 10z\", fill: C.accent }))),\n sv(\"rect\", { x: tagX, y: 2, width: tag, height: 16, rx: 3, fill: C.negative, \"fill-opacity\": 0.16, stroke: C.negative, \"stroke-width\": 0.5 }),\n txt(tagX + tag / 2, 14, label, { \"text-anchor\": \"middle\", fill: C.negative }),\n arrow && sv(\"line\", { x1: tagX + tag + 4, x2: tx - 4, y1: 10, y2: 10, stroke: C.accent, \"stroke-width\": 1.5, \"marker-end\": \"url(#bz-arrowhead)\" }),\n sv(\"line\", { x1: tx, x2: tx, y1: 16, y2: H - 20, stroke: C.accent, \"stroke-dasharray\": \"2 3\", \"stroke-opacity\": 0.6 }),\n zeroLine(zero),\n sv(\"polyline\", { points: points(s.before, sc), fill: \"none\", stroke: C.muted, \"stroke-width\": 1.5, \"stroke-dasharray\": \"4 3\" }),\n sv(\"polyline\", { points: points(s.after, sc), fill: \"none\", stroke: C.accent, \"stroke-width\": 2.5, \"stroke-linejoin\": \"round\" }),\n sv(\"line\", { x1: lx, x2: lx + sw, y1: H - 10, y2: H - 10, stroke: C.muted, \"stroke-width\": 1.5, \"stroke-dasharray\": \"4 3\" }),\n txt(lx + sw + 4, H - 6, before),\n sv(\"line\", { x1: ax, x2: ax + sw, y1: H - 10, y2: H - 10, stroke: C.accent, \"stroke-width\": 2.5 }),\n txt(ax + sw + 4, H - 6, after, { fill: C.accent, \"font-weight\": 600 }),\n dateUp\n ? txt(tx + 6 < W - 40 ? tx + 6 : tx - 6, 30, shortDate(s.move.to), { \"text-anchor\": tx + 6 < W - 40 ? \"start\" : \"end\", fill: C.accent, \"font-weight\": 600 })\n : txt(Math.min(Math.max(tx, 22), W - 22), H - 6, shortDate(s.move.to), { \"text-anchor\": \"middle\", fill: C.accent, \"font-weight\": 600 }));\n };\n\n const days = (d: DaysVisual) => {\n const per = 18, pitch = (W - 16) / per, lit = Math.min(d.covered, d.target), rows = Math.ceil(d.target / per);\n const color = d.covered < d.target / 3 ? C.negative : d.covered < d.target ? C.warning : C.positive;\n const cells = Array.from({ length: d.target }, (_, i) => sv(\"rect\", {\n x: 8 + (i % per) * pitch, y: 6 + Math.floor(i / per) * 19, width: pitch * 0.75, height: 15, rx: 2,\n fill: i < lit ? color : \"none\", stroke: i < lit ? null : C.line }));\n return frame(d.caption, cells,\n txt(8, 6 + rows * 19 + 14, t(\"vis.days\", { covered: d.covered, target: d.target }), { fill: color, \"font-weight\": 600, \"font-size\": 12 }));\n };\n\n const balance = (b: BalanceVisual) => {\n const inn = n(b.in), out = n(b.out), max = Math.max(inn, out) || 1, L = 8, R = W - 8, len = (v: number) => (v * (R - L)) / max;\n return frame(b.caption,\n txt(L, 20, `${t(\"vis.in\")} ${amount(inn)}`), sv(\"rect\", { x: L, y: 26, width: len(inn), height: 22, rx: 3, fill: C.positive }),\n txt(L, 76, `${t(\"vis.out\")} ${amount(out)}`),\n sv(\"rect\", { x: L, y: 82, width: len(Math.min(out, inn)), height: 22, rx: 3, fill: C.negative, \"fill-opacity\": 0.5 }),\n out > inn && sv(\"rect\", { x: L + len(inn), y: 82, width: len(out - inn), height: 22, rx: 3, fill: C.negative }),\n sv(\"line\", { x1: L + len(inn), x2: L + len(inn), y1: 24, y2: 106, stroke: C.ink, \"stroke-dasharray\": \"2 2\" }),\n txt(R, H - 6, `−${amount(b.gap)}`, { \"text-anchor\": \"end\", fill: C.negative, \"font-weight\": 600, \"font-size\": 12 }),\n txt(L, H - 6, `${shortDate(b.start)} → ${shortDate(b.end)}`));\n };\n\n const countdown = (c: CountdownVisual) => {\n const r = 38, circ = 2 * Math.PI * r, frac = Math.min(c.window_days ? c.days_left / c.window_days : 1, 1);\n const both = c.current != null && c.next != null, up = both && n(c.next) > n(c.current);\n const x0 = 118, x2 = W - 8, xm = (x0 + x2) / 2;\n return frame(c.caption,\n sv(\"circle\", { cx: 56, cy: 52, r, fill: \"none\", stroke: C.line, \"stroke-width\": 9 }),\n sv(\"circle\", { cx: 56, cy: 52, r, fill: \"none\", stroke: C.accent, \"stroke-width\": 9, \"stroke-linecap\": \"round\",\n \"stroke-dasharray\": `${(frac * circ).toFixed(1)} ${circ.toFixed(1)}`, transform: \"rotate(-90 56 52)\" }),\n txt(56, 59, `${c.days_left} ${t(\"vis.dayUnit\")}`, { \"text-anchor\": \"middle\", fill: C.ink, \"font-size\": 20, \"font-weight\": 600 }),\n txt(56, H - 6, `${t(\"vis.until\")} ${shortDate(c.deadline)}`, { \"text-anchor\": \"middle\" }),\n both && [\n sv(\"polyline\", { points: `${x0},${up ? 96 : 56} ${xm},${up ? 96 : 56} ${xm},${up ? 56 : 96} ${x2},${up ? 56 : 96}`, fill: \"none\",\n stroke: up ? C.negative : C.positive, \"stroke-width\": 2.5 }),\n txt(x0, up ? 114 : 48, `${amount(c.current!)} ${t(\"vis.perMonth\")}`),\n txt(x2, up ? 48 : 114, amount(c.next!), { \"text-anchor\": \"end\", fill: up ? C.negative : C.positive, \"font-weight\": 600 }),\n ]);\n };\n\n const horizon = (h: HorizonVisual) => {\n const sc = scale([h.series], W), zero = sc.y(0);\n const last = h.series.length - 1, ex = sc.x(last), ey = sc.y(n(h.end.balance)), below = n(h.end.balance) < 0;\n const color = below ? C.negative : C.positive;\n return frame(h.caption,\n zeroLine(zero),\n sv(\"polyline\", { points: points(h.series, sc), fill: \"none\", stroke: C.muted, \"stroke-width\": 1.5, \"stroke-linejoin\": \"round\" }),\n peaks(h.series, sc),\n // The finish line: from zero to where the period ends.\n sv(\"line\", { x1: ex, x2: ex, y1: zero, y2: ey, stroke: color, \"stroke-width\": 4, \"stroke-linecap\": \"round\" }),\n sv(\"circle\", { cx: ex, cy: ey, r: 6, fill: color }),\n txt(ex - 12, Math.min(Math.max(ey + 4, 26), H - 26), `${amount(h.end.balance)} · ${shortDate(h.end.date)}`,\n { \"text-anchor\": \"end\", fill: color, \"font-weight\": 600 }),\n h.days_of_fixed_costs != null && txt(W - 8, H - 6, t(\"vis.fixedDays\", { days: h.days_of_fixed_costs }), { \"text-anchor\": \"end\", fill: color }),\n txt(8, H - 6, shortDate(h.series[0]![0])));\n };\n\n const calendar = (c: CalendarVisual) => {\n const t0 = Date.parse(c.today), span = Math.max(Date.parse(c.until) - t0, 1), L = 10, R = W - 10;\n const x = (iso: string) => L + ((Date.parse(iso) - t0) * (R - L)) / span;\n const days = Math.round(span / 86_400_000);\n const ticks = Array.from({ length: Math.floor(days / 7) + 1 }, (_, i) =>\n sv(\"line\", { x1: L + (i * 7 * (R - L)) / days, x2: L + (i * 7 * (R - L)) / days, y1: 72, y2: 84, stroke: C.line }));\n const first = c.items[0]!, fx = x(first.date), right = fx > W * 0.6;\n return frame(c.caption,\n sv(\"line\", { x1: L, x2: R, y1: 84, y2: 84, stroke: C.line, \"stroke-width\": 2 }), ticks,\n sv(\"circle\", { cx: L, cy: 84, r: 5, fill: C.ink }),\n c.items.slice(1).map((it) => sv(\"rect\", { x: x(it.date) - 4, y: 60, width: 8, height: 24, rx: 2, fill: C.warning })),\n sv(\"rect\", { x: fx - 6, y: 38, width: 12, height: 46, rx: 3, fill: C.accent }),\n txt(fx + (right ? -10 : 10), 46, `${shorten(first.label, 20)} · ${amount(first.amount)}`, { \"text-anchor\": right ? \"end\" : \"start\", fill: C.ink, \"font-weight\": 600 }),\n txt(fx + (right ? -10 : 10), 62, t(\"vis.inDays\", { days: first.days }), { \"text-anchor\": right ? \"end\" : \"start\", fill: C.accent }),\n c.items.length > 1 && txt(W - 8, 14, t(\"vis.more\", { n: c.items.length - 1 }), { \"text-anchor\": \"end\" }),\n txt(L, H - 14, t(\"vis.today\")), txt(R, H - 14, shortDate(c.until), { \"text-anchor\": \"end\" }));\n };\n\n const leak = (l: LeakVisual) => {\n const years = Math.max(l.years, 1), gap = 6, L = 8, R = W - 8, bw = (R - L - gap * (years - 1)) / years, base = H - 26, top = 30;\n const bars = Array.from({ length: years }, (_, i) => {\n const hgt = ((i + 1) / years) * (base - top);\n return sv(\"rect\", { x: L + i * (bw + gap), y: base - hgt, width: bw, height: hgt, rx: 2,\n fill: C.negative, \"fill-opacity\": i === years - 1 ? 1 : 0.25 + (0.5 * i) / years });\n });\n return frame(l.caption, bars,\n txt(R, top - 8, amount(l.total), { \"text-anchor\": \"end\", fill: C.negative, \"font-weight\": 600 }),\n // Per year on the left, ten years on the right, both above the bars so neither crosses them.\n txt(L, top - 8, `${amount(l.per_year)} ${t(\"vis.perYear\")}`, { fill: C.ink }),\n txt(L, H - 8, t(\"vis.years\", { n: 1 })), txt(R, H - 8, t(\"vis.years\", { n: years }), { \"text-anchor\": \"end\" }));\n };\n\n const jar = (j: JarVisual) => {\n const needed = n(j.needed_per_month), aside = n(j.set_aside_per_month), ratio = needed > 0 ? Math.min(aside / needed, 1) : 1;\n const gap = 5, L = 8, R = W - 8, jw = (R - L - gap * 11) / 12, top = 34, base = 96;\n const jars = Array.from({ length: 12 }, (_, i) => {\n const x = L + i * (jw + gap);\n return [\n sv(\"rect\", { x, y: top, width: jw, height: base - top, rx: 4, fill: \"none\", stroke: C.accent, \"stroke-width\": 1.2 }),\n ratio > 0 && sv(\"rect\", { x: x + 1.5, y: base - ratio * (base - top) + 1.5, width: jw - 3, height: Math.max(ratio * (base - top) - 3, 0), rx: 3, fill: C.accent }),\n ];\n });\n return frame(j.caption, jars,\n txt(L, 20, `${t(\"vis.bill\")} ${amount(j.bill)}`, { fill: C.ink, \"font-weight\": 600 }),\n txt(R, 20, `${t(\"vis.months\")} × ${amount(j.needed_per_month)}`, { \"text-anchor\": \"end\", fill: C.accent }),\n txt(L, H - 8, `${amount(j.set_aside_per_month)} ${t(\"vis.perMonth\")}`, { fill: ratio < 1 ? C.negative : C.positive }),\n txt(R, H - 8, `${amount(j.per_day)} ${t(\"vis.perDay\")}`, { \"text-anchor\": \"end\" }));\n };\n\n const gauge = (g: GaugeVisual) => {\n const limit = n(g.limit) || 1, paid = Math.min(n(g.paid), limit), L = 8, R = W - 8, len = (v: number) => (v * (R - L)) / limit;\n return frame(g.caption,\n txt(R, 24, `${t(\"vis.limit\")} ${amount(g.limit)}`, { \"text-anchor\": \"end\" }),\n sv(\"rect\", { x: L, y: 36, width: R - L, height: 26, rx: 4, fill: \"none\", stroke: C.accent, \"stroke-dasharray\": \"4 3\" }),\n paid > 0 && sv(\"rect\", { x: L, y: 36, width: len(paid), height: 26, rx: 4, fill: C.positive }),\n txt(L, 80, `${t(\"vis.paid\")} ${amount(g.paid)}`, { fill: C.positive, \"font-weight\": 600 }),\n txt(R, 80, `${t(\"vis.left\")} ${amount(g.left)}`, { \"text-anchor\": \"end\", fill: C.accent, \"font-weight\": 600 }),\n sv(\"line\", { x1: L, x2: R, y1: 104, y2: 104, stroke: C.line, \"stroke-width\": 2 }),\n sv(\"circle\", { cx: L, cy: 104, r: 4, fill: C.ink }), sv(\"circle\", { cx: R, cy: 104, r: 5, fill: C.accent }),\n txt(L, H - 6, t(\"vis.today\")), txt(R, H - 6, `${g.days_left} ${t(\"vis.dayUnit\")} → ${shortDate(g.deadline)}`, { \"text-anchor\": \"end\", fill: C.accent }));\n };\n\n const deadline = (d: DeadlineVisual) => {\n const c = d.contracts[0]!, t0 = Date.parse(d.today), t1 = Date.parse(c.ends_on), span = Math.max(t1 - t0, 1), L = 14, R = W - 52;\n const x = (iso: string) => L + ((Date.parse(iso) - t0) * (R - L)) / span, cx = x(c.cancel_before);\n return frame(d.caption,\n txt(8, 16, shorten(c.name, 26), { fill: C.ink, \"font-weight\": 600 }),\n d.contracts.length > 1 && txt(W - 8, 16, t(\"vis.more\", { n: d.contracts.length - 1 }), { \"text-anchor\": \"end\" }),\n sv(\"line\", { x1: L, x2: cx, y1: 66, y2: 66, stroke: C.accent, \"stroke-width\": 6, \"stroke-linecap\": \"round\" }),\n sv(\"line\", { x1: cx, x2: R, y1: 66, y2: 66, stroke: C.line, \"stroke-width\": 2 }),\n sv(\"line\", { x1: R, x2: W - 8, y1: 66, y2: 66, stroke: C.negative, \"stroke-width\": 2, \"stroke-dasharray\": \"3 3\" }),\n sv(\"circle\", { cx: L, cy: 66, r: 5, fill: C.ink }),\n sv(\"rect\", { x: cx - 9, y: 57, width: 18, height: 18, rx: 3, fill: C.accent }),\n sv(\"circle\", { cx: R, cy: 66, r: 5, fill: C.negative }),\n txt(Math.max(cx, 40), 44, `${c.days_left} ${t(\"vis.dayUnit\")}`, { \"text-anchor\": \"middle\", fill: C.accent, \"font-size\": 18, \"font-weight\": 600 }),\n txt(L - 6, 96, t(\"vis.today\")),\n txt(Math.min(Math.max(cx, 70), W - 110), 96, `${t(\"vis.letter\")} ${shortDate(c.cancel_before)}`, { \"text-anchor\": \"middle\", fill: C.accent }),\n txt(W - 8, 96, `${t(\"vis.ends\")} ${shortDate(c.ends_on)}`, { \"text-anchor\": \"end\", fill: C.negative }),\n txt(W - 8, H - 8, t(\"vis.renewal\"), { \"text-anchor\": \"end\", fill: C.negative }));\n };\n\n switch (v.kind) {\n case \"runway\": return runway(v);\n case \"valley\": return valley(v);\n case \"shift\": return shift(v);\n case \"days\": return days(v);\n case \"balance\": return balance(v);\n case \"countdown\": return countdown(v);\n case \"horizon\": return horizon(v);\n case \"calendar\": return calendar(v);\n case \"leak\": return leak(v);\n case \"jar\": return jar(v);\n case \"gauge\": return gauge(v);\n case \"deadline\": return deadline(v);\n default: return null;\n }\n}\n\nexport type DrawOptions = {\n /** The width the picture is shown at, in CSS pixels (its container's width). 320 by default. */\n width?: number;\n};\n\n/** The picture of one answer, or null when there is none (or it cannot be drawn). */\nexport function drawVisual(visual: AnswerVisual | null | undefined, locale: Locale, doc: Document = document,\n options: DrawOptions = {}): SVGSVGElement | null {\n if (!visual) return null;\n const width = Math.round(Math.min(Math.max(options.width ?? MAX_WIDTH, MIN_WIDTH), MAX_WIDTH));\n try {\n return draw(visual, createT(locale, answerMessages), doc, width);\n } catch {\n return null; // a picture never breaks the answer\n }\n}\n"],"names":["VISUAL_KINDS","toNumber","value","n","THOUSANDS","MINUS","num","digits","fixed","int","frac","grouped","body","rounded","signed","money","currency","parseDate","iso","y","m","d","isoDate","date","pad","v","addDays","days","daysBetween","from","to","shortDate","dateSpan","ma","da","mb","db","WEEKDAYS","MONTHS","writeLongDate","locale","wd","month","createFormatters","cap","s","tone","LOCALES","LOCALE_NAMES","LOCALE_TAGS","isLocale","pickLocale","preferences","fallback","pref","base","interpolate","template","vars","match","name","createT","catalogs","merged","c","plurals","key","form","answerMessages","SVGNS","H","MIN_WIDTH","MAX_WIDTH","C","amount","shorten","label","max","tools","doc","W","sv","tag","attrs","children","node","k","x","scale","list","values","b","lo","hi","count","left","right","top","bottom","i","points","series","sc","f","draw","txt","frame","zeroLine","peaks","marks","prev","ends","runway","r","t0","span","due","avail","gap","full","aw","total","sum","inside","valley","v2","zero","li","lx","ly","shift","at","fx","tx","tagX","arrow","before","after","sw","cw","width","dateBox","leftFits","rightFits","dateUp","ax","pitch","lit","rows","color","cells","_","balance","inn","out","L","R","len","countdown","circ","both","up","x0","x2","xm","horizon","h","last","ex","ey","calendar","ticks","first","it","leak","l","years","bw","bars","hgt","jar","j","needed","aside","ratio","jw","jars","gauge","g","limit","paid","deadline","t1","cx","drawVisual","visual","options"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import "./styles/bazous.css";
2
+ export type * from "./contract/snapshot";
3
+ export { toNumber } from "./contract/snapshot";
4
+ export { LOCALES, LOCALE_NAMES, LOCALE_TAGS, createT, isLocale, pickLocale } from "./i18n";
5
+ export type { Catalog, Locale, Messages, Translate, Vars } from "./i18n";
6
+ export { shared as sharedMessages } from "./i18n/shared";
7
+ export * from "./format";
8
+ export * from "./primitives";
9
+ export { CashflowChart, niceTicks } from "./primitives/CashflowChart";
10
+ export { baseSeries, buildLevers, computeSeries } from "./engine/scenario";
11
+ export type { Lever, Series, SeriesPoint } from "./engine/scenario";
12
+ export { defineModule } from "./modules/types";
13
+ export type { Horizon, ModuleAction, ModuleContext, ModuleSize, QuestionModule, ViewProps } from "./modules/types";
14
+ export { MODULES, findModule } from "./modules/registry";
15
+ export { Dashboard, Question } from "./modules/Question";
16
+ export type { DashboardProps, QuestionProps } from "./modules/Question";
17
+ export type * from "./answers/contract";
18
+ export * from "./answers";
19
+ export { AnswerPicture } from "./answers/AnswerPicture";
20
+ export type { AnswerPictureProps } from "./answers/AnswerPicture";