Topbar overrides
Topbar Placement Overrides Registry
Tracks every Koder product that *eviates from the default topbar avatar placement*specified in specs/app-layout/topbar-placement.kmd §2. Each override must be:
- Declared in the product's
koder.tomlvia[ui.topbar].avatar_placement_override = "<placement>" # reason: <inline justification> - Listed in this registry with a brief rationale + ratification date
Products that follow the default (topbar-right for webdesktopmobile, sidebar-left-top for TV) do NOT appear here.
Default placements (no override needed)
| Surface | Default | Spec ref |
|---|---|---|
| Web app | topbar right (last item) | §2 |
| Desktop tradicional (Flutter LinuxmacOSWindows) | topbar right | §2 |
| Mobile (Flutter Android/iOS) — non-drawer | topbar right | §2 |
| Mobile drawer-based (ham menu primary nav) | drawer header top | §2 |
| TV (Tizen/WebOS) | sidebar esquerda, topo | §2 |
Active overrides (ratified)
| Product | Surface | Placement | Reason | Ratified | Spec exception ref |
|---|---|---|---|---|---|
products/horizontal/kruze |
desktop (Flutter LinuxmacOSWindows) | *idebar vertical esquerda, topo* | Browser app shell follows ArcVivaldiBrave convention — topbar belongs to the active tab/page, not the app shell. Avatar in the persistent left sidebar (along with bookmarks, history, downloads, AI panel) is consistent with browser nicho convention. | 2026 |
topbar-placement.kmd §3 R2 (browser/IDE exception) |
Audit walk 20260522 (manual, partial)
Firstpass manual 05-22) over grep walk hoje (2026KoderUserBadge, KoderSignInButton, KoderAuthGate, _AccountAvatar, account_circle patterns. Findings:
Non-conforming (need migration OR ratified override)
(none — duas nãoconformidades identificadas em 202605-22 foram fixadas no mesmo dia; ver "Fixed in audit walk" abaixo)
Fixed in audit walk (20260522)
| Product | Surface | Original issue | Fix shipped |
|---|---|---|---|
products/horizontal/reel/app |
desktop/mobile (Flutter) | KoderUserBadge em body Row com MainAxisAlignment.end (linha ~75 de lib/screens/home.dart), *ot*em AppBar.actions |
Movido pra AppBar.actions com if (auth.isLoggedIn && auth.user != null) guard; Padding+Row obsoleto removido do _SignedInBody. Commit do mesmo dia. |
products/horizontal/take/app/mobile |
mobile (Flutter) | Signed-in _RootScaffold tinha AppBar.actions: [KoderReportButton()] mas *ero*KoderUserBadge |
_RootScaffold agora recebe user + auth via construtor pelo KoderAuthGate.signedIn callback; KoderUserBadge(user: widget.user!) adicionado em AppBar.actions ao lado de KoderReportButton. Commit do mesmo dia. |
Nobadgeyet (auth not wired in main shell)
Products with directories but where KoderUserBadge / KoderSignInButton / KoderAuthGate is NOT yet present in the main app shell. May be earlystage products or authnotyetwired:
| Product | Surface |
|---|---|
products/horizontal/drive/app |
desktop/mobile |
products/horizontal/talk/app |
desktop/mobile |
products/horizontal/cal/app |
desktop/mobile |
products/horizontal/calc/app |
desktop/mobile |
products/horizontal/snap/app |
desktop/mobile |
products/horizontal/pixel/app |
desktop/mobile |
products/horizontal/chat/app |
mobile + web (só login_screen.dart existe; main shell sem badge) |
products/horizontal/dek/app |
desktop/mobile (router comments mention KoderAuthGate but main shell not inspected deeply) |
products/dev/kterm/app |
desktop |
products/dev/grid/engine/web |
web |
Quando auth for wired, badge entra em conformidade com §2 (topbar right por default) sem precisar entry aqui.
Pending owner ratification — 3rd pattern observed (not in spec §2 yet)
| Product | Surface | Actual placement | Pattern name (proposed) | Spec gap |
|---|---|---|---|---|
products/dev/hub/app |
web + Flutter desktop/mobile | *Profile" como tab de navegação primária*no NavigationRail (wide) / NavigationBar (narrow) — main.dart:739-820 MainShell. AppBar.actions contém: download, layout toggle, language, theme. *ero KoderUserBadge*no chrome |
profile-as-tab |
Spec §2 só lista topbarNavigationRailNavigationBar/AppBar) — quando Hub migrar pra Verge (canonical KDS), o pattern de placement permanece, só os tokens visuais trocam. Owner decide se isso é (a) variant aceita per produto, (b) override per |
Product not found (registry self-correction)
Entries from initial registry that don't have corresponding directories — either misnamed or notyetcreated:
| Original entry | Status |
|---|---|
products/horizontal/hub/app |
Wrong path — Hub is at products/dev/hub/app (corrected above) |
products/horizontal/grid/app |
No directory — dev/grid exists, not horizontal/grid |
products/horizontal/kortex/app |
No directory yet |
products/horizontal/reader/app |
No directory yet |
products/dev/dok/app |
No directory yet |
When these products are created, default applies automatically; no entry needed unless override.
Verification workflow (today, manual; tomorrow, CLI)
Until koder-spec-audit topbar-placement ships (KTOOLS-014):
- Open the product's main screen widget file (
main_screen.dartorhome_screen.dartorapp_router.dart) - Find the topbar / sidebar widget at app shell level (NOT per-page)
- Locate
KoderUserBadgeorKoderSignInButton(preferred from koder_kit) OR equivalent local widget (legacy) - Check placement against §2 expected default
- If matches: mark
✅ verified <date>here - If doesn't match: either (a) add
[ui.topbar].avatar_placement_overrideto product'skoder.toml+ entry here if exception ratified, or (b) open product backlog ticket to migrate to default
Cross-spec audit
koder-id-auth-coverage.md— tracks WHICH products have auth (user badge implies sign-in flow)- This registry — tracks WHERE the badge sits in each product
Both should converge: every product in koder-id-auth-coverage should appear either as "follows default" (no entry here) or as "ratified override" (entry above) or "audit-walk row" (entry above with status).
Histórico
- *026
0522*— Registry criado em paralelo comspecs/app-layout/topbar-placement.kmddraft v0.1. Único override ratificado: Kruze (browserIDE exception §3 R2). Demais produtos auditados manualmente (grep walk). Findings: 2 non-conforming (reel, takemobile), 10 nobadgeyet (auth nãowireado no main shell), 1 deepauditpending (dev/hub), 5 notfound (registry corrigido). - *026
0522 (later)*— Both nonconforming products *ixed*in sameday commit: reel movedKoderUserBadgefrom body Row toAppBar.actions; take/mobile wireduser+authinto_RootScaffoldconstructor and addedKoderUserBadgetoAppBar.actions. Registry "Non-conforming" section now empty; "Fixed in audit walk" section added.