feat(ui): the preview's action is the app's extended FAB

curated gained ExtendedFab while the preview was being built: every screen's
bottom-bar action, with an enabled that borrows the disabled colours, marks the
node disabled and drops the press. The preview had chosen a Button for exactly
the reason that widget removes -- a FAB had no disabled state -- so after the
merge it was the one screen whose primary action was shaped somewhere else.
Now it is that FAB in a bottom bar, the indicator in its icon slot while the
key package is still owed, and the reason line stays in the body above it.
Hidden, bar and all, for a read-only identity.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Pulled-From: curated/curated@80735df86a
This commit is contained in:
Kgothatso Ngako
2026-09-13 13:43:20 +02:00
parent 883bf1c84c
commit e66c174b4f
2 changed files with 97 additions and 79 deletions

View File

@@ -26,6 +26,7 @@ reasoning; where the implementation chose differently the table below says so:
| `initiate()` "runs from a `LaunchedEffect`" | and is idempotent besides: a recomposition that calls it again opens no second collect, which the view-model test asserts |
| a screenshot pass under `docs/material-design-conformance.md` | five PNGs from a throwaway `jvmTest` with `captureToImage`, looked at and deleted — the found, not-found, checking, not-yet-on-Mantra and existing-chat states, at a phone's width |
| Phase 2's screen with one repository | Phase 4 adds `chatRepository` to the screen, its host entry and its tests, as the plan said it would; the Phase 2 commit is the screen without it |
| a `Button` under the block, "because a FAB has no disabled state in M3 or in the API" | **superseded on the way in**: `curated` gained `ExtendedFab` while this was built — every screen's bottom-bar action, with an `enabled` that borrows the disabled colours, marks the node disabled and drops the press — so the reason for the `Button` was gone before the branch merged. The action is that FAB in a `BottomAppBar`, the indicator in its icon slot while the key package is owed, and the reason line stays in the body above it |
One thing found on the way that is in no phase: the dialog's `Dialog` renders inside
the desktop test root, so `onNodeWithText` finds its field and its button without a
@@ -404,7 +405,8 @@ Button(onClick = {
A `Button`, not the bottom-bar `ExtendedFloatingActionButton` the invite
confirmation uses, because Phase 4 will disable it with a reason beside it, and a
FAB has no disabled state in M3 or in the API.
FAB has no disabled state in M3 or in the API. (Superseded before the merge — see the
table at the top.)
A read-only identity sees the block and no button. The screen is not reachable by
one today — the sheet is behind `canSign` — but the route will be reachable from a