PanelBar
Top-of-screen row that hosts the panel chips: sigil identity on the left, wallet status on the right.
Why a dedicated bar: when two pills float above content (anchored top-left + top-right via Modifier.align), they fight the host's title row on narrow widths and the title gets squeezed. A dedicated row at the top — title moves below — guarantees breathing room for both pills and gives the host a single composable to drop in instead of two Box-and-align recipes.
Anchoring + sheet direction (mental model):
Sigil pill on the LEFT → top sheet slides DOWN from top (sheet emerges adjacent to the chip).
Wallet pill on the RIGHT → bottom sheet slides UP from bottom.
Opposite gestures, no animation collision, each chip's expansion starts near where it lives.
Usage (typical BBoard-style host):
Column {
PanelBar(network = midnightNetwork, onNetworkChange = { midnightNetwork = it })
YourHeader(...)
// ... rest of the host's content
}The bar pulls its top inset from WindowInsets.statusBars so the chips sit safely below the system status bar without each call site repeating the math.
Parameters
Initial network for the wallet panel; the panel owns the selection from then on. Host should mirror updates via onNetworkChange so contract operations target the same chain the wallet is on.
Fires when the user picks a different network in the wallet sheet's chip row. Default no-op.
Fires when the sigil panel's status transitions (None → Creating → Forged, restore, etc.). Hosts that need to gate UI on "is there a sigil?" — e.g. an onboarding banner that pushes the user to forge before they can use the dApp — mirror this into their own state. Default no-op.
Modifier applied to the bar's outer Row.