Three visual directions (Skärgård, Kvitto, Kalas) as self-contained HTML pages with every SPEC §13.3 screen in light and dark, Swedish, plus PNG exports and the exporter script. Direction-independent docs: ia.md, screens.md, flows.md, components.md, tokens.md (values for all three directions), strings.csv (key,en,sv,notes), and the comparison with a recommendation in directions/README.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 KiB
Kvitt: screens
Status: U1 proposal (2026-10-17), direction-independent. What each screen contains, in which order, in which states, and what each action does. How it looks is the chosen direction's job (directions/); the exact words are in strings.csv. Rules (rounding, allocation order, sync, limits) are the spec's and are referenced, never restated as new rules.
Conventions:
- States per SPEC §13.3: loaded, empty, loading (first sync only), offline (with pending changes), error (a failed online action), long content (long Swedish names, 7-digit amounts, 200 % font scale).
- "Kräver anslutning" = the action is disabled while offline per §9.9, with that text as a supporting line or tooltip, never a silent disabled control.
- "Kunde inte nå servern" = an online action failed with a network error; nothing changed locally (§9.9). Shown as a snackbar on the screen that triggered it, with "Försök igen" when the action is repeatable.
- Server error codes (§14.3.2) map to inline text where a field is at fault (
name_takenon the name field) and to a snackbar otherwise. Copy keys instrings.csvprefixerror_. - Amounts: tabular figures, right-aligned in lists, never ellipsized; at 200 % they move under the description instead. Direction is always words plus colour (§13.1).
- Pending-sync marker: a small
cloud_upload(orschedule) icon with TalkBack label "Väntar på synk" on every row and detail whosepending == true. - Every screen reads local data, so after the first sync there is no loading state except where noted.
S-1 Pairing (Para ihop)
Purpose: connect this phone to the household with an invite code (US-1, US-2, AC-2.6, AC-2.7).
Content, in priority order:
- App name "Kvitt" and the one-line purpose "Delade utgifter för två".
- Invite code field: 12 characters, displayed and typed in groups of 4 (
7K3M-QX9D-2HPA); input is uppercased and normalised per §8.3 as the user types (hyphens inserted automatically,O→0,I/L→1). Trailing "Klistra in" button (reads the clipboard; accepts a full link and extracts the code and server). - Explanation: "Koden får du av Jacob: från en länk eller från Inställningar › Bjud in partner." For the admin's first run: "Koden skrivs ut när servern sätts upp."
- "Ditt namn" field (1–40, §9.6), required on a first pairing: AC-2.4 sends the display name with the accept call and the app cannot know the invite kind beforehand (the server ignores it for
deviceinvites). Hidden in the "Para ihop telefonen igen" variant. The partner confirms it again on S-2. - Server address field, prefilled
https://icehack.asuscomm.com:8443(release), collapsed under "Serveradress" as a secondary row since it rarely changes; expanded automatically when the link carried a different server. - Primary button "Para ihop".
States:
- Loaded/empty: code field focused, keyboard open (uppercase letters and digits).
- From link: both fields filled, focus on "Para ihop".
- Loading: button shows progress "Parar ihop…", fields read-only. After success: full sync runs (S-4 loading state), then the notification permission prompt (AC-2.9).
- Error (inline under the code field, button enabled again):
invite_invalid"Koden fungerar inte. Den kan ha gått ut eller redan använts. Be Jacob om en ny." · network "Kunde inte nå servern. Kontrollera adressen och anslutningen." ·rate_limited"För många försök. Vänta en stund och försök igen." ·http://in release (AC-2.8) "Adressen måste börja med https://" on the server field. - Unrecognised variant (§14.4.8): header "Para ihop telefonen igen" and a line "Dina utgifter finns kvar på telefonen."
- Offline: the button stays enabled; tapping it gives the network error (pairing never queues).
- Long content: single column, scrolls; at 200 % the code field wraps to two lines of groups.
Actions: Para ihop (primary); Klistra in. No FAB, no bottom nav.
S-2 Partner profile step (Din profil)
Purpose: the partner confirms their name and optionally adds a picture before entering the app (AC-2.10).
Content: 1. "Du går med i Jacobs hushåll" with Jacob's avatar and name; 2. own avatar (initials on avatar-2 until a picture is chosen) with "Lägg till bild" (Android photo picker, AC-4.3); 3. display name field prefilled from the pairing call (1–40 characters, §9.6); 4. "Fortsätt".
States: uploading picture (progress on the avatar; Continue waits); error image_invalid / unsupported_media_type / payload_too_large as a snackbar "Bilden kunde inte användas" with the reason; network "Kunde inte nå servern" — the user may continue without the picture; validation empty name blocks Continue with "Skriv ett namn".
Actions: Fortsätt (primary, saves name if changed); Lägg till bild / Byt bild / Ta bort bild.
S-3 Waiting for partner (Väntar på din partner)
Purpose: the admin's Home until the partner has joined (AC-5.1).
Content: illustration-free empty state on the Home destination: title "Väntar på din partner"; body "Kvitt behöver er båda innan ni kan börja. Bjud in din partner med en länk."; if an invite is pending: "Inbjudan gäller till mån 19 okt. 21:40"; primary "Bjud in partner" (→ S-21, creates a partner invite; if one is pending S-21 shows it and offers a new one). Bottom nav visible; no FAB; no balance; no "Nytt konto".
States: offline "Bjud in partner" disabled with "Kräver anslutning". Partner joins while the screen is open: the next sync replaces it with S-4 (empty state "Skapa ert första konto").
S-4 Home (Översikt)
Purpose: answer "who owes whom" in one glance and start the two most common actions: add an expense and settle up (US-6, AC-10.1, AC-10.2).
Content, in priority order:
- Update banner (only when
UpdateStateisAvailable,Downloading,FailedorNeedsInstallPermission; S-17). - Balance hero: both avatars; wording per §9.3 from the viewer's side: "Anna är skyldig dig", "Du är skyldig Anna", or "Ni är kvitt"; the amount (
amount-hero) on its own line; "Gör upp" button when the global balance ≠ 0. TalkBack reads one sentence: "Du är skyldig Anna 3 250,00 kronor". - Sync line, small, under the hero: "Synkad för 3 min sedan" (relative time per §9.8); appended "· 2 ändringar väntar på synk" when
pendingCount > 0; "Offline" prefix when offline; "Synkar…" while running; warning style with "· 1 ändring synkades inte" whenrejectedCount > 0or "Telefonens klocka går fel" whenclockSkew. Tap → S-16. Never a blocking banner. - Konton section header with trailing "Nytt konto" (text button; "Kräver anslutning" offline).
- Active accounts in
created_atorder (AC-6.6): name (ellipsize at one line, 2 lines at 200 %), wording ("Anna är skyldig dig", "Du är skyldig Anna", "Kvitt"), amount (omitted when Kvitt), "11 utgifter i oktober" (plural, current month name). Tap → S-5. - "Arkiverade (1)" collapsed row; expands in place to the archived accounts with an "Arkiverat" badge (AC-6.4).
- FAB "Lägg till utgift" (extended, collapses to icon-only while scrolling down; TalkBack "Lägg till utgift").
States:
- Loading (first sync after pairing only): hero and rows as skeletons, text "Hämtar era utgifter…"; the FAB is hidden until the first sync finishes or fails (then the local, possibly empty, state is shown).
- Empty (partner joined, no accounts): no hero amount ("Ni är kvitt" is not meaningful yet: hero shows both avatars and "Välkommen, Anna och Jacob"), empty state "Skapa ert första konto" with one line ("Ett konto samlar utgifter som hör ihop, till exempel Vardag eller Japan 2027.") and the primary button "Nytt konto". No FAB (AC-8.6 needs an account).
- Settled: hero "Ni är kvitt", no amount, no "Gör upp".
- Offline: everything works; sync line "Offline · 2 ändringar väntar på synk"; "Nytt konto" disabled with "Kräver anslutning".
- Error: not applicable (local data); a failed sync shows as the sync line in warning style ("Synk misslyckades · försök igen om en stund"), never a dialog.
- Long content: account names up to 60 characters ellipsize in one line (two at 200 %); 7-digit amounts ("1 234 567,89 kr") fit the hero on one line at 100 % and wrap under the wording at 200 %.
Actions: FAB → S-7 (account defaulted per AC-8.6); Gör upp → S-9 global; account row → S-5; Nytt konto → S-6; sync line → S-16; banner → S-17.
S-5 Account detail (Konto)
Purpose: one account's balance and its ledger; settle just this account (AC-10.3, US-8).
Content:
- Top app bar: account name (ellipsize), overflow menu: "Ändra konto" (→ S-6), "Arkivera" / "Återställ från arkiv", "Ta bort konto" (enabled only when
deletable; otherwise disabled with the reason "Kontot kan inte tas bort så länge det har utgifter, betalningar eller återkommande utgifter"). All three "Kräver anslutning" offline. - Header: default split "50 / 50 · Jacob och Anna" (names in percent order, viewer as "du" is not used here; names keep the line unambiguous); "Arkiverat" badge if archived; balance wording and amount (§9.3, account wording "Kvitt"); "Gör upp det här kontot" when non-zero.
- Ledger grouped by month, newest first: sticky month header "Oktober · 7 457,90 kr" (household spend of the month, settlements excluded); rows ordered per AC-8.10:
- Expense row: category icon on its colour container, description (one line), date ("16 okt."), amount (right), effect line (§9.2: "Du lånade ut 432,17 kr" in owed colour, "Du lånade 623,80 kr" in owing colour, "Inte inblandad" / "Betalade för dig själv" neutral), pending marker. Tap → S-8.
- Settlement row:
paymentsicon, "Anna betalade dig 800,00 kr" or "Du betalade Anna 800,00 kr", "· 2 konton" when more than one allocation (AC-11.7), date, pending marker. Tap → S-10.
- FAB "Lägg till utgift" (account preset to this account).
States: empty (new account) "Inga utgifter än" + "Lägg till den första utgiften i Vardag." (FAB still there); archived badge, "Återställ från arkiv" in the header as a tonal button, FAB still offered? No: archived accounts are hidden from the account picker for new expenses (AC-6.4), so the FAB is hidden on an archived account; settling stays available; offline rows work, overflow actions disabled; error archive/delete failures as snackbar (account_not_empty "Kontot har fortfarande utgifter, betalningar eller återkommande utgifter"); long content month totals and row amounts at 7 digits stay on one line at 100 %; at 200 % the amount moves to the line under the description.
Actions: FAB → S-7; Gör upp det här kontot → S-9 (one fixed row); row → S-8/S-10; overflow actions; archive asks no confirmation (reversible) and shows a snackbar "Vardag arkiverades" with "Ångra"; delete asks "Ta bort kontot Vardag? Det går inte att ångra." (soft delete on the server, but not restorable from the app).
S-6 Account editor (Nytt konto / Ändra konto)
Purpose: create or edit an account's name and default split (AC-6.1 to AC-6.3). Online only.
Content: 1. Name field (1–60, unique: name_taken → "Det finns redan ett konto som heter Vardag"); 2. "Standarddelning": a slider (0–100 % in steps of 1, snapping to 50) plus two percent fields "Jacob %" and "Anna %" that always sum to 100 (typing in one updates the other; two decimals allowed, comma or point); quick presets as chips "50/50", "60/40", "40/60"; 3. preview "Av 100,00 kr: Jacob 60,00 kr, Anna 40,00 kr"; 4. editing only: hint "Ändringen gäller nya utgifter. Befintliga utgifter behåller sin delning." (AC-6.3); 5. "Spara" (top app bar action and/or bottom button, per direction).
States: offline all fields disabled, banner "Kräver anslutning. Konton kan bara ändras när telefonen är online." , Spara disabled; saving progress on Spara; error network snackbar; validation inline.
Actions: Spara; Avbryt (back; asks "Slänga ändringarna?" only if something changed).
S-7 Expense editor (Ny utgift / Ändra utgift) — the add-expense flow
Purpose: record an expense in ten seconds (SPEC §13.1): open app, tap add, type amount, type description, tap save. Full screen, not a sheet (§13.2). Works offline (AC-8.2).
Layout, top to bottom
- Top app bar: close (
close, TalkBack "Avbryt"), title "Ny utgift" / "Ändra utgift", trailing "Spara" text button (enabled when valid). Edit mode adds overflow "Ta bort". - Amount (focus on open): display-size
amount-large, tabular, with "kr" suffix; input rules §9.6 (digits, one,or., max two decimals, no sign, max 10 000 000,00). Empty shows "0,00" as a hint inon-surface-variant, not as a value. - Description field "Beskrivning" (1–100), single line, IME action "Spara" (saves when valid, otherwise moves focus to the first invalid field).
- Defaults row: one chip per field, each showing its current value, each one tap to change:
- Konto: "Vardag" (AC-8.6: last used on this phone if still active, else the oldest active). Opens a picker of active accounts (bottom sheet list with balances). Changing the account in mode
defaultre-copies the ratio (AC-8.8) and changes the category default only if the user has not picked a category yet. - Kategori: icon + name of the default (AC-8.6: last used in that account on this phone if active, else Övrigt). Opens the category grid (icon + colour + name, active categories,
sort_order). - Datum: "Idag" (also "Igår", else "16 okt."); opens the Material date picker; range per §9.6.
- Betalt av: "Du" or "Anna" with the avatar; one tap toggles between the two users (no picker: there are exactly two) (AC-8.3).
- Delning: "Kontots standard 50/50" — one tap opens the split section in place (below the chips) and scrolls it into view.
- Konto: "Vardag" (AC-8.6: last used on this phone if still active, else the oldest active). Opens a picker of active accounts (bottom sheet list with balances). Changing the account in mode
- Split section (collapsed by default; expanded when the mode is not
defaultor the user tapped Delning):- Mode chooser (single-select connected buttons / segmented, wraps to two rows in Swedish): "Kontots standard 60/40" · "Egen fördelning" · "Exakta belopp" · "Allt på en person".
ratio: same control as S-6 (slider + two percent fields summing to 100).exact: two money fields; the user types one, the other is read-only "amount minus typed" (AC-8.7). Typed > amount → inline error "Andelen är större än beloppet" and Save disabled.full: choose the bearer: "Jacob" / "Anna" (two avatar toggles), independent of the payer.- Live preview for all modes, from
ExpenseRepository.preview(the domain computes it; the UI never computes shares): "Du 206,00 kr · Anna 206,00 kr", plus the effect line that the row will show ("Du lånade ut 206,00 kr"). Hidden whilepreviewreturns null.
- Anteckningar: collapsed as "Lägg till anteckning"; expands to a multi-line field (0–1000).
- Keypad / keyboard: while the amount has focus, the numeric input is shown at the bottom (each direction states whether it is an in-app keypad with a guaranteed "," key or the system keyboard with
KeyboardType.Decimal). Focus moves to the description with "Nästa"/IME or by tapping it; the system text keyboard replaces the keypad. - Edit mode only, at the end: a destructive "Ta bort utgift". (Who created the expense is shown on S-8 as the first timeline line;
ExpenseDraftcarries no creator.)
The ten-second path (binding interaction)
| Step | User does | Screen does |
|---|---|---|
| 1 | Taps FAB on S-4 | S-7 opens with amount focused, keypad up, all defaults set |
| 2 | Types 412 |
Amount shows "412", Save still disabled (description missing) |
| 3 | Taps "Beskrivning", types "Systembolaget" | Text keyboard; Save enabled |
| 4 | Taps "Spara" (app bar) or IME "Spara" | Saves locally (SaveResult.Saved), closes, snackbar "Utgiften sparades" (no "Ångra": an undo would be a create plus a delete, both audited and pushed to the partner), the new row is visible on return; sync runs after 2 s (AC-15.3) |
The split override is one tap from step 3 (the Delning chip). Payer change is one tap. Nothing else needs touching for the common case.
States
- Validation (inline, from
SaveResult.Invalidfield errors, mapped by token): amount missing "Skriv ett belopp"; amount out of range "Beloppet måste vara mellan 0,01 kr och 10 000 000,00 kr"; description empty "Skriv en beskrivning"; date out of range "Datumet ligger för långt fram"; exact mismatch as above. - Offline: no difference; after saving, the snackbar says "Sparad. Synkas när du är online."
- No accounts: the editor is not reachable (no FAB). Only archived accounts: same (FAB hidden; AC-6.4).
- Edit mode for an expense the other user created: same editor, no warning; the save records the change in the timeline ("Du ändrade …").
- Discard: close with changes asks "Slänga utgiften?" (Släng / Fortsätt redigera).
- Long content: 7-digit amount scales down one type step rather than wrapping; at 200 % the chips wrap to several rows and the split section scrolls; Spara stays in the app bar so it is always reachable.
S-8 Expense detail (Utgift)
Purpose: everything about one expense and who changed what (US-13, AC-12.4).
Content: 1. amount (large) and description; category chip; 2. facts list: Konto, Datum ("fredag 16 oktober 2026"), Betalt av (avatar + name), Delning (mode label, e.g. "Kontots standard 50/50", "Egen fördelning 70/30", "Exakta belopp", "Allt på Anna") and each user's share ("Du 623,80 kr · Anna 623,80 kr"), the effect line; "Återkommande: Hyra" when recurringTemplateName != null (AC-8.11); notes (full text); 3. Historik timeline, oldest first, newest last (AC-12.4): actor avatar, sentence, "· 16 okt. 19:40"; create line "Anna skapade den här"; update lines one per changed field ("Du ändrade beloppet från 1 147,60 kr till 1 247,60 kr"; split changes as "Du ändrade delningen från 50/50 till 70/30"); recurring source "Skapad automatiskt (återkommande)"; import source "Importerad från Splitwise"; pending last line "Din ändring väntar på synk" (AC-12.5).
Actions: "Ändra" (→ S-7 edit), "Ta bort" (confirm "Ta bort utgiften? Den försvinner för er båda." → soft delete, returns to the previous screen with snackbar "Utgiften togs bort").
States: deleted (opened from a deletion notification or the row was deleted while open): banner "Anna tog bort den här utgiften · 17 okt. 09:12", content muted, no Edit/Delete; pending marker next to the amount; missing (entity not in the database yet): "Utgiften finns inte på telefonen än" with "Synka nu"; offline fully readable, edit and delete allowed.
S-9 Settle up (Gör upp)
Purpose: record a payment between the two users and spread it over accounts (US-7, US-8, AC-11.3 to AC-11.6). Works offline.
Content, in order:
- Direction: "Du betalar Anna" with a swap control "Byt riktning" (TalkBack). Default per AC-11.3 / AC-11.4.
- Amount (large money field), default = absolute global (or account) balance, empty when zero.
- Fördelning list, one row per account from
SettleState.lines: account name; "Skuld 3 084,50 kr" (the payer's debt in that account,payerNetOre, words: "Du är skyldig 3 084,50 kr" / "Anna är skyldig dig 1 184,50 kr" when the payer is owed there); editable allocated amount; per-row remove; over-settle warning row text "Det här reglerar mer än som är skyldigt i Japan 2027" (AC-11.5) in warning colour withwarningicon. - "Kvar att fördela 0,00 kr" live indicator; when negative: "250,00 kr för mycket"; colour plus words.
- "Lägg till konto" → picker of all non-deleted accounts not yet listed (active and archived, AC-11.3).
- Info line when an account is left non-zero because the payer is owed there (§9.4 consequence): "Vardag påverkas inte: där är Anna skyldig dig 1 184,50 kr."
- Datum (Idag), Anteckning (0–200).
- Bekräfta (primary, enabled only when
canConfirm), Avbryt.
Behaviour: editing the total amount re-runs the proposal (recompute with allocations = null) unless the user has edited a row, in which case it keeps the rows and updates "Kvar att fördela" (the user can tap "Föreslå igen" to re-run). Swap direction re-runs the proposal. Confirming with any warned row shows a dialog repeating the warning(s) (one line per warned row, the same text as on the row: "Det här reglerar mer än som är skyldigt i Japan 2027") with "Bekräfta ändå" / "Ändra".
Per-account variant (from S-5): one fixed row for that account (not removable), no "Lägg till konto", no info line.
States: no accounts cannot occur (button hidden); zero balance amount empty, rows appear after typing; editing title "Ändra betalning", proposal computed with this settlement excluded (AC-11.6); offline identical; long content at 200 % each row stacks name / debt / field vertically.
S-10 Settlement detail (Betalning)
Content: "Anna betalade dig 800,00 kr" headline with both avatars and an arrow from payer to recipient; Datum ("tisdag 6 oktober 2026"); Anteckning; Fördelning per account with amounts; Historik timeline as in S-8 (diff lines "Du ändrade beloppet …", "… ändrade fördelningen"). Actions: Ändra (→ S-9 editing), Ta bort (confirm "Ta bort betalningen? Saldona räknas om för er båda."). States: deleted, pending, missing as S-8.
S-11 Analytics (Statistik)
Purpose: how much the household spends, when, on what and in which account (US-11, FR-14).
Content:
- Filters (sticky under the app bar, wrap on two rows in Swedish):
- Period chip "Senaste 6 mån" → menu with the presets of AC-14.2 (Denna månad, Senaste 3 mån, Senaste 6 mån, Senaste 12 mån, I år, All tid, Anpassad…); Anpassad opens the Material date range picker; the resolved range is shown under the chips ("1 maj – 17 okt. 2026").
- Three binary toggles (connected buttons): Månad / Vecka · Hushållet / Min del · Kategori / Konto.
- Totalt for the range ("178 211,40 kr"), with the measure in words ("Hushållets utgifter" / "Din del").
- Utgifter över tid: stacked bars, one per bucket (all buckets, empty ones as zero, AC-14.7), stacked by group (category colours or account colours), y-axis in kronor (no decimals on the axis), x-axis "maj, jun …" or "v. 35"; legend below (group colour + name, only groups present); tap a bar → S-12 for that bucket; horizontally scrollable when there are more buckets than fit (weeks), newest at the right and scrolled into view.
- Per kategori: horizontal bars sorted descending, each row: icon, name, bar, amount, percent (one decimal, half-up, AC-14.10); tap → S-12.
- Per konto: same form; archived accounts included with "Arkiverat" badge (AC-14.9).
Grouping applies to chart 1 only; charts 2 and 3 are always shown (AC-14.6). Settlements never count (AC-14.6).
Accessibility: each chart has a content description that summarises it in one sentence ("Utgifter över tid, sex månader: högst i september med 41 484 kronor, lägst i maj med 24 710 kronor") and the bars are focusable one by one ("September: 41 484 kronor, Resor största kategori"). Breakdown rows are ordinary list items.
States: empty "Inga utgifter i den här perioden" with "Byt period" (charts hidden, filters remain); loading none (local); offline identical; long content category names ellipsize in breakdown rows, amounts never; at 200 % the breakdown row puts the bar on its own line.
No FAB on Statistik.
S-12 Analytics drill-down
Content: title naming the filter ("Mat & hushåll, oktober 2026", "v. 41, Vardag", "Japan 2027, senaste 6 mån"), the measure ("Hushållet"/"Min del") as subtitle, total, then expense rows exactly as in S-5 (with the account name added to the row's secondary line, since rows come from several accounts), newest first. Tap → S-8. Empty cannot occur (only reachable from a non-zero number); if data changed meanwhile: "Inga utgifter längre".
S-13 Settings hub (Inställningar)
Content: 1. household card: own avatar, name, "Du · Administratör" / "Du"; partner's avatar and name ("Anna · Partner"); 2. rows with leading icons and chevrons: Profil (person), Kategorier (category), Återkommande utgifter (event_repeat), Enheter (devices), Bjud in partner (person_add, admin before join) or Para ihop en enhet (qr_code/add_link, admin after join), Synkstatus (sync, with trailing "2 väntar" when pending), Om Kvitt (info, trailing "Uppdatering finns" when available). Rows that lead to online-only screens stay enabled; the screens themselves show their offline state.
S-14 Profile (Profil)
Content: large avatar with "Byt bild" and "Ta bort bild" (when a picture exists); display name field (1–40); Spara. Picture changes apply immediately on success (no Save needed); name needs Spara. States: offline (all disabled, "Kräver anslutning"), uploading (progress over the avatar), error codes as in S-2.
S-15 Categories (Kategorier)
List: active categories in sort_order: drag handle (long-press to drag, plus "Flytta upp"/"Flytta ned" TalkBack actions), icon on colour container, name (custom name or localised default), chevron; "Arkiverade (n)" collapsed section; app bar action "Ny kategori". Reorder saves on drop (online; offline: drag handles hidden and a line "Kräver anslutning för att ändra").
Editor (pushed): name field (1–40; for a default category, empty name means "use the default name"; "Återställ namn" button shown when a custom name exists, AC-7.4); live preview chip; icon grid of the 30 icons of §9.7 (6 per row at 411 dp, 48 dp targets, selected with outline + check); colour swatches of the 12 tokens (each 48 dp, selected with check, TalkBack names "Grön", "Orange" …); Spara; overflow "Arkivera" / "Återställ från arkiv"; "Ta bort kategori" only when allowed, otherwise disabled with the reason: default "Standardkategorier kan inte tas bort, bara arkiveras", in use "Kategorin används av utgifter eller återkommande utgifter. Arkivera den i stället."
S-16 Sync status (Synkstatus)
Content: 1. status headline: "Synkad för 3 min sedan" / "Synkar…" / "Offline"; 2. clock-skew warning card when clockSkew ("Telefonens klocka går fel. Rätta den och synka igen.") — shown first; 3. "Väntande ändringar (2)" list of pending ledger rows (as in S-5, with "ny"/"ändrad"/"borttagen" tag), tap → S-8/S-10; 4. "Ändringar som inte synkades" list from rejections: summary (description · amount), the reason text per §14.4.6, the time; tap opens the current version (read-only S-8/S-10); "Ta bort från listan" per item; 5. "Synka nu" (primary; disabled with progress while running; offline "Kräver anslutning").
Empty: "Allt är synkat" with the last sync time.
S-17 Update available (Uppdatering)
- Banner on S-4 (top of content, dismissible for the session): "Version 1.2 finns" + "Uppdatera" / "Senare".
- First time only, before downloading (
NeedsInstallPermissionor not yet granted): dialog "Tillåt installation" — "Android frågar en gång om Kvitt får installera appar. Välj Tillåt från den här källan och gå tillbaka." — buttons "Fortsätt" (opens the system setting) / "Avbryt". - Downloading: banner shows "Laddar ner… 64 %" with a linear progress indicator (determinate); the app stays usable.
- Verified: the system installer appears (out of our hands).
- Failed (AC-16.4): banner "Nedladdningen misslyckades. Försök igen." + "Försök igen".
- Offline: "Uppdatera" disabled with "Kräver anslutning".
S-18 Device removed (Telefonen har tagits bort)
Full screen, no navigation: icon phonelink_erase; title "Den här telefonen har tagits bort"; body "Åtkomsten togs bort och allt Kvitt-data på telefonen har raderats. Be Jacob om en ny kod för att para ihop den igen." (member) / "…Skapa en ny kod på servern med kvitt-server pair-device." (admin, rare); primary "Para ihop igen" → S-1.
S-19 Recurring expenses (Återkommande utgifter)
List: rows: description, amount, account, "Varje månad den 25:e", "Nästa: 25 okt." (next_occurrence_date) or "Pausad" badge, payer avatar; app bar "Ny"; empty state "Inga återkommande utgifter" + "Hyra, el och streaming kan läggas in automatiskt varje månad." + "Ny återkommande utgift".
Editor (pushed): the S-7 fields without date (amount, description, Konto (active accounts), Kategori, Betalt av, Delning, Anteckningar) plus "Dag i månaden" (1–31 picker; for 29–31 a hint "I kortare månader används sista dagen"), "Första månad" (month picker, default per AC-9.8, back to 12 months), "Sista månad (valfritt)", "Pausad" switch; Spara; overflow "Ta bort" (confirm "Ta bort Hyra? Utgifter som redan skapats finns kvar."). Hint under the fields when editing: "Ändringen gäller kommande utgifter." (AC-9.4). Online only (offline state as S-6).
S-20 Devices (Enheter)
Rows per AC-3.1: device name, owner avatar and name, "Parad 3 okt.", "Senast sedd nyss", "Kvitt 1.1", "Den här enheten" tag; trailing "Ta bort" (not on the current device). Confirmation dialog: "Ta bort Galaxy S26+? Telefonen loggas ut och dess Kvitt-data raderas nästa gång den ansluter." → "Ta bort" / "Avbryt". States: loading (online fetch: progress), offline ("Kräver anslutning" + nothing listed; this list is not stored locally), error cannot_revoke_current_device cannot be triggered from the UI.
S-21 Invites (Bjud in partner / Para ihop en enhet)
Admin only. Content: actions "Bjud in partner" (only while one user exists, AC-2.1) and "Para ihop en enhet" with a choice "För mig" / "För Anna" (AC-2.2). Created invite: the code very large in groups of 4 (7K3M-QX9D-2HPA, mono/tabular, selectable), the link, "Gäller till tis 20 okt. 14:02", "Dela" (Android share sheet with a Swedish message: "Gå med i vårt hushåll i Kvitt: <länk> Koden är 7K3M-QX9D-2HPA."), "Kopiera kod". Pending invites list: kind ("Partner", "Enhet för Anna"), created, expiry, "Avbryt" (confirm). The code is only visible right after creation (the server stores hashes); later rows say "Koden visas bara när den skapas". States: offline ("Kräver anslutning"), errors household_full, network.
S-22 About (Om Kvitt)
Rows: "Version 1.1 (11)", "Server: https://icehack.asuscomm.com:8443", "Serverversion 1.1.0" (or "Okänd" when /health failed), "Öppen källkod-licenser" (→ the standard licences screen), button "Sök efter uppdatering" (→ check; result as S-17 banner or a snackbar "Du har den senaste versionen"; debug builds: hidden, AC-16.5).
Notifications (not screens)
Built locally per AC-13.5 and §13.3 (copy in strings.csv, prefix notif_). Channel "Aktivitet". Small icon: the app's monochrome icon. Large icon: actor avatar if cached. Tap targets per AC-13.6.