Record tabs
canonRecord tab row: tab strip plus „+ N další“ overflow and a personal layout; an empty tab drops out, a loading one does not.
React implementation lives in the app (record/RecordTabsRow.tsx + record-tabs.ts); it uses TabStrip internally and adds the overflow trigger and the layout menu. 14 Oct 2026 (owner "24g scvaleno", proto/zalozky-jeden-ovladac@489bb3bd6, acrm !5043): ONE icon button „Záložky" with a count badge of hidden tabs replaces „+ N další" and ⚙; its menu lists all tabs — name = open, switch = show/hide, grip/Alt+↑↓ = order; phone = bottom sheet with „Hotovo". Badge --accent-press + white, 5.73:1. Dev check 14 Oct 1440 + 390 (company Druid): badge 8, 15 switches, sheet ok.
Used in 4 files · 4 areas · 4× — components/company, pages/CompanyRecordPage, pages/ObchodDetailPage, pages/PersonRecordPage
The tab row of a record. It is the Tab strip plus three things the strip does not do: an overflow trigger („+ N další“) right after the last tab, a gear that changes the tab set for good, and counts that come from the record's own data. apps/web/src/components/record/RecordTabsRow.tsx + record-tabs.ts (app-side); classes .pr-tabsrow, .pr-tabsrow-end in apps/web/src/ds/person-record.css.
The tab set is not written per screen. A catalogue per record type is layered with the production order and then with the user's own order and hidden tabs; a tab whose count is 0 drops out unless the user asked for it. A count that is still loading is undefined, not 0, so nothing is hidden while data is on its way.
When to use
- The tab row of a person, company or deal record — anywhere the tab set is data-dependent and the user may reorder it.
When not to use
- A fixed, short set of views — that is Tab strip on its own.
- A choice the screen acts on — Segmented control.
- Navigation between records — the sidebar and the record list.
Anatomy
- Row
.pr-tabsrow: flex row with a hairline underneath; the strip does not stretch (flex: 0 1 auto) so the overflow trigger stays next to the last tab instead of drifting to the right edge (P240). - Strip:
TabStripwith{ key, label, icon, count }per shown tab. - Overflow: a
PickerMenuwhose trigger reads „+ N další“; picking a tab navigates to it. It only navigates — it never changes the set. - Layout menu
.pr-tabsrow-end: the gear, pinned to the right edge; it reorders (drag) and hides tabs, and its result is saved per user. - The active tab is always pulled into the visible part, so the underline is never off-screen.
Best practices
- Send
undefinedfor a count that is loading and0for one that is genuinely empty — the difference decides whether the tab disappears. - Keep the overflow trigger next to the last tab; it is a continuation of the strip, not a bar action.
- Let the gear own "what is in the row" and the trigger own "where do I go".
- Keep the catalogue per record type in one place, not per screen.
- Hide a tab the user pinned, even when it is empty.
- Put actions in the row — it is navigation.
- Reorder tabs on the fly by usage; the order is the user's, and it is saved.
- Duplicate the gear's job in a bar menu.
Content
- Tab labels are nouns in sentence case, the same words as the record's sections.
- The overflow trigger reads „+ N další“ — a count of what is hidden, not a list.
Related
tab-strip— the primitive underneath.record-rail,record-drawer— the rest of the record.picker-menu— the overflow menu.- Stories:
components--record-tabs--default,--variants,--states,--composition.
Source: docs/tabs/record-tabs.usage.md · GitLab