Filip Rut Kiddosy Design System Polski

DocsComponents

Category tabs

Each category keeps its own colour in every control.

Variants

Each category keeps its own colour: hover and selection paint with the category, never with the system accent. “All activities” is the exception: chartreuse circle on a deep-blue-50 background.

All activities · selected
Education · selected
Sports · selected
Arts · selected
Below 1280 px: icons only, the selected tab keeps its label (the others stay in the accessibility tree).
All activities 6.8:1 Events 5.0:1 Places 7.1:1 Education 6.7:1 Sports 7.4:1 Food 7.0:1 Arts 5.5:1 Health 9.5:1
Category colours: background / ink pairs with their contrast ratio.

States

Forced below for one category (Sports). The live bar above reacts to the real pointer and keyboard; selection animates the circle in over 300 ms.

Sports Rest Sports Hover Sports Focus Sports Selected Sports Selected + hover
Rest · hover (category tint 8 %) · focus (3 px ring inside) · selected · selected + hover (label turns deep blue)

API reference

Props of CategoryTabBar.

PropTypeDefaultDescription
label string – Accessible name of the nav landmark (aria-label).
items list of tabs – Each tab: href, label, category, circleSrc (24 px circle, shown when selected), glyphSrc (20 px glyph, shown otherwise), current.
items[].category "all" | "education" | "sport" | "art" | "events" | "places" | "gastronomy" | "health" – Sets data-cat on the tab: hover and selection take this category’s colour.
items[].current boolean false The tab for the current address; rendered with aria-current="page".
link link component – Router link injected by the app; each tab is a real link.
lead ReactNode – Element before the tabs, e.g. the “More filters” trigger.

Accessibility

  • A category is a part of the address, so each tab is a link with aria-current="page" inside a labelled nav, not a tablist: Back returns to the previous category, a tab opens in a new browser tab, search engines see the addresses.
  • Hidden labels below 1280 px are collapsed visually only; screen readers still read every tab name.
  • Touch target: 44 px high below 1024 px; focus ring 3 px in the ring token, drawn inside the tab.
  • Labels stay in the foreground colour on every tint (17.7–19.5:1); the selected tab on hover turns deep blue (7.4–8.1:1).
  • Category ink on category background: 5.0:1 (events) to 9.5:1 (health), all above AA for text.
  • Icons are decorative (aria-hidden); the category is named by the label.

Do and don’t

DoShow hover and selection as the category border or tint (8 / 12 %). Any control that picks a category, from tab to chip, follows this rule.
Don’tDon’t select with a full fill or with the system accent. A filled tab buries the category circle and turns a light control into a second badge.
Kiddosy Design System