Group settings into four panels and give balances one home

Settings becomes Barn & familj, Saldon, Kalender & språk and
Undantag & röda dagar, each saving on its own. A BalanceFlow
component owns fetching from Försäkringskassan and manual entry for
every parent, used by the Saldon panel and by the onboarding wizard,
which now runs without the app chrome. The red-days list and the
day-override form merge into one exceptions view, the vacation table
becomes wrapping rows that fit a phone, and the BankID modal speaks
translated status lines instead of emoji.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XBRLomdLK9jF7wU7a8AA6H
This commit is contained in:
2026-09-20 06:30:46 +02:00
parent 80b4f1cb52
commit b3fe2ac645
26 changed files with 2297 additions and 1142 deletions
+33
View File
@@ -0,0 +1,33 @@
/**
* The unified balance flow (`BalanceFlow.tsx`) — shared by Settings' "Saldon"
* panel and Onboarding's balances step. These keys used to live scattered
* across `dashboard.ts` (`fetchFromFk`/`enterManually`/`balancePickerPrompt`)
* before Dashboard stopped owning any balance UI of its own (Phase 5 removes
* the now-unused originals from `dashboard.ts`) and `onboarding.ts` (per-card
* status text), plus the QR modal's status enum, previously rendered raw and
* untranslated.
*/
export const balance = {
'balance.addDeducedPartnerButton': 'Lägg till {name}',
'balance.deducedBadge': 'Härlett från din FK-hämtning',
'balance.deducedPartnerPrompt': 'Försäkringskassan visar att den andra föräldern har {days} dagar kvar.',
'balance.dismissDeducedPartner': 'Nej, jag är ensam förälder',
'balance.enterManually': 'Ange själv',
'balance.fetchFromFk': 'Hämta från Försäkringskassan',
'balance.loading': 'Laddar saldo…',
'balance.pickerPrompt': 'Vem gäller det?',
'balance.sourceDeduced': 'Härlett {date}',
'balance.sourceManual': 'Angivet manuellt {date}',
'balance.sourceScraped': 'Från Försäkringskassan {date}',
'balance.status.authenticating': 'Autentiserar…',
'balance.status.awaiting_scan': 'Väntar på skanning',
'balance.status.cancelled': 'Avbruten',
'balance.status.done': 'Klar',
'balance.status.error': 'Fel',
'balance.status.fetching': 'Hämtar…',
'balance.status.idle': 'Väntar',
'balance.status.launching': 'Startar…',
'balance.statusLine': '{left} av {total} dagar kvar',
'balance.statusNone': 'Inga uppgifter ännu',
'balance.youBadge': '(du)',
} as const
+2
View File
@@ -1,5 +1,6 @@
import { common } from './common'
import { auth } from './auth'
import { balance } from './balance'
import { calendar } from './calendar'
import { dashboard } from './dashboard'
import { onboarding } from './onboarding'
@@ -22,6 +23,7 @@ import { tips } from './tips'
export const sv = {
...common,
...auth,
...balance,
...calendar,
...dashboard,
...onboarding,
-9
View File
@@ -1,19 +1,12 @@
export const onboarding = {
'onboarding.addChildButton': 'Lägg till barn',
'onboarding.addDeducedPartnerButton': 'Lägg till {name}',
'onboarding.addingChild': 'Lägger till...',
'onboarding.balanceStatus': '{left} av {total} dagar kvar',
'onboarding.balanceStatusNone': 'Inga uppgifter ännu',
'onboarding.birthdayLabel': 'Födelsedag',
'onboarding.childBirthDateRequired': 'Ange barnets födelsedatum',
'onboarding.childNameLabel': 'Barnets namn',
'onboarding.childNameRequired': 'Ange barnets namn',
'onboarding.continueButton': 'Fortsätt',
'onboarding.createChildError': 'Kunde inte skapa barn',
'onboarding.deducedBadge': 'Härlett från din FK-hämtning',
'onboarding.deducedPartnerPrompt': 'Försäkringskassan visar att den andra föräldern har {days} dagar kvar.',
'onboarding.dismissDeducedPartner': 'Nej, jag är ensam förälder',
'onboarding.enterManuallyButton': 'Ange själv',
'onboarding.familyCoupleDescription': 'Dagarna delas 240/240 och ni kan spara 48 dagar var efter 4 år. Partnern behöver inte skapa konto.',
'onboarding.familyCoupleTitle': 'Vi är två föräldrar',
'onboarding.familySoloDescription': 'Jag har ensam vårdnad. Alla 480 dagar och 96 sparade dagar efter 4 år är mina.',
@@ -24,7 +17,6 @@ export const onboarding = {
'onboarding.finishError': 'Något gick fel. Försök igen.',
'onboarding.finishingButton': 'Sparar...',
'onboarding.namePlaceholder': 'Namn',
'onboarding.partnerAutoFillHint': 'Fylls i automatiskt om du hämtar från FK, eller om {name} loggar in och hämtar.',
'onboarding.partnerNameLabel': 'Den andra förälderns namn',
'onboarding.partnerNameRequired': 'Ange den andra förälderns namn',
'onboarding.stepBalancesIntro': 'Du kan hoppa över och fylla i senare — vi antar då att inga dagar är uttagna.',
@@ -32,5 +24,4 @@ export const onboarding = {
'onboarding.stepChildIntro': 'Lägg till ditt första barn för att börja planera föräldraledigheten.',
'onboarding.stepChildTitle': 'Välkommen! Låt oss lägga till ditt barn',
'onboarding.stepIndicator': 'Steg {step} av {total}',
'onboarding.youBadge': 'du',
} as const
+7 -14
View File
@@ -7,7 +7,6 @@ export const settings = {
'dayOverridesInput.addingButton': 'Lägger till...',
'dayOverridesInput.charCount': '{count}/280',
'dayOverridesInput.dateLabel': 'Datum',
'dayOverridesInput.empty': 'Du har inga undantag i kalendern ännu.',
'dayOverridesInput.noteFieldLabel': 'Anteckning (valfritt)',
'dayOverridesInput.noteLabel': 'Anteckning: {note}',
'dayOverridesInput.notePlaceholder': 'T.ex. Jobbade på juldagen',
@@ -60,17 +59,16 @@ export const settings = {
'settings.addPartnerError': 'Kunde inte lägga till partner',
'settings.addPartnerSuccess': 'Partner tillagd!',
'settings.addingPartner': 'Lägger till...',
'settings.balanceButton': 'Dagar kvar',
'settings.calendarSectionTitle': 'Kalender',
'settings.balanceSectionTitle': 'Saldon',
'settings.calendarLanguageSectionTitle': 'Kalender & språk',
'settings.cancelButton': 'Avbryt',
'settings.childBirthDateLabel': 'Barnets födelsedatum',
'settings.childSectionTitle': 'Barn',
'settings.dayOverridesHelp': 'Planeraren utgår från den svenska kalendern (röda dagar, klämdagar, julafton, midsommarafton och pingstafton är normalt lediga). Här kan du ange undantag för din arbetsplats — om du måste jobba juldagen eller är ledig på annars arbetande dagar.',
'settings.dayOverridesSectionTitle': 'Undantag i kalendern',
'settings.exceptionsSectionTitle': 'Undantag & röda dagar',
'settings.familySectionTitle': 'Barn & familj',
'settings.languageAutoOption': 'Automatisk (webbläsarens språk)',
'settings.languageEnglishOption': 'English',
'settings.languageLabel': 'Välj språk / Select language',
'settings.languageSectionTitle': 'Språk / Language',
'settings.languageSwedishOption': 'Svenska',
'settings.loading': 'Laddar inställningar...',
'settings.membersLoading': 'Laddar medlemmar…',
@@ -87,7 +85,6 @@ export const settings = {
'settings.profileHelp': 'Din lönetyp och sysselsättning används för att uppskatta din SGI och planera din ledighet.',
'settings.profileSectionTitle': 'Din profil',
'settings.redDaysHelp': 'En lista över röda dagar enligt den svenska kalendern, tillsammans med dina egna undantag — fyra år i taget.',
'settings.redDaysSectionTitle': 'Röda dagar',
'settings.removeBlockerLeaveWishes': 'önskemål om ledighet',
'settings.removeBlockerParentalLeave': 'registrerad föräldrapenning',
'settings.removeBlockerPlannedLeave': 'planerade lediga dagar',
@@ -101,12 +98,9 @@ export const settings = {
'settings.removePartnerErrorSelf': 'Du kan inte ta bort dig själv från arbetsutrymmet.',
'settings.renameButton': 'Byt namn',
'settings.renamePartnerError': 'Kunde inte byta namn',
'settings.saveChildButton': 'Spara barnuppgifter',
'settings.saveChildError': 'Kunde inte spara barnets uppgifter',
'settings.saveChildSuccess': 'Barnets uppgifter sparade!',
'settings.saveProfileButton': 'Spara din profil',
'settings.saveProfileError': 'Kunde inte spara din profil',
'settings.saveProfileSuccess': 'Din profil sparades!',
'settings.saveFamilyButton': 'Spara',
'settings.saveFamilyError': 'Kunde inte spara uppgifterna',
'settings.saveFamilySuccess': 'Uppgifterna sparades!',
'settings.saveRenameButton': 'Spara namn',
'settings.saveVacationError': 'Kunde inte spara semesterdagar',
'settings.saveVacationSuccess': 'Semesterdagar för {year} sparade!',
@@ -117,7 +111,6 @@ export const settings = {
'settings.takePlOnRedDaysHelp': 'Du får betalt för lördagar, söndagar och röda dagar i planeringen — men du förbrukar dagar du annars hade sparat, eftersom semester inte kan tas ut på dessa dagar.',
'settings.title': 'Inställningar',
'settings.vacationHelp': 'Ange semesterdagar per år. Det första året är du oftast hemma mer och har färre dagar att lägga på semester, medan kommande år har din fulla årliga tilldelning. Detta styr hur mycket tid planeraren har att arbeta med.',
'settings.vacationSectionTitle': 'Semesterdagar',
'settings.youBadge': '(Du)',
'vacationDaysList.empty': 'Inga semesterdagar registrerade.',
'vacationDaysList.itemDays': '{count} dagar',