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:

  1. Declared in the product's koder.toml via [ui.topbar].avatar_placement_override = "<placement>" # reason: <inline justification>
  2. 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. 20260522 topbar-placement.kmd §3 R2 (browser/IDE exception)

Audit walk 20260522 (manual, partial)

Firstpass manual grep walk hoje (202605-22) over KoderUserBadge, 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 topbarright / drawerheadertop / sidebarlefttop. Hub adota o UX pattern "perfil como tab de nav primária" comum em apps com 45 destinos de nav (YouTubeMapsTwitterInstagram). Implementação atual usa widgets Material do Flutter (NavigationRailNavigationBar/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 perproduto registrável, (c) refit pra default topbarright

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):

  1. Open the product's main screen widget file (main_screen.dart or home_screen.dart or app_router.dart)
  2. Find the topbar / sidebar widget at app shell level (NOT per-page)
  3. Locate KoderUserBadge or KoderSignInButton (preferred from koder_kit) OR equivalent local widget (legacy)
  4. Check placement against §2 expected default
  5. If matches: mark ✅ verified <date> here
  6. If doesn't match: either (a) add [ui.topbar].avatar_placement_override to product's koder.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

  • *0260522*— Registry criado em paralelo com specs/app-layout/topbar-placement.kmd draft 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).
  • *0260522 (later)*— Both nonconforming products *ixed*in sameday commit: reel moved KoderUserBadge from body Row to AppBar.actions; take/mobile wired user + auth into _RootScaffold constructor and added KoderUserBadge to AppBar.actions. Registry "Non-conforming" section now empty; "Fixed in audit walk" section added.

Source: ../home/koder/dev/koder/meta/docs/stack/registries/topbar-overrides.md