M8b: UI fixes from the first phone test

- Invite code field (S-1): the value stays the raw normalised code and the
  grouping hyphens are a VisualTransformation with an exact OffsetMapping, so
  the cursor stays after the last typed character when a hyphen appears and a
  backspace after a hyphen removes the character before it. Unit tests.
- Category quick row and grid: the selected item's check badge is drawn in a
  layer above the clipped item, so it is no longer cut at the tile corner.
- Edge to edge: KvittTopAppBar pads for the top safe-drawing inset (status
  bar) with its fill behind it; an ancestor's inset is consumed, not doubled.
  Catalogue sample with a 24 dp inset.
- Stacked bar chart corners 4 / 2 dp (owner override of 10 / 4, proposed D-097).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-18 21:08:08 +02:00
parent e2dba84154
commit 328c4666c4
7 changed files with 183 additions and 53 deletions
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
@@ -97,7 +96,7 @@ fun WaitingContent(
KvittScaffold(
modifier = modifier,
snackbarHostState = snackbarHostState,
topBar = { KvittTopAppBar(title = null, modifier = Modifier.statusBarsPadding()) },
topBar = { KvittTopAppBar(title = null) },
bottomBar = { KvittNavigationBar(KvittDestination.Home, actions.onNavigate) },
) { padding ->
val me = state.me ?: return@KvittScaffold