Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
9c3b2f7
[base-trigger] updated styles
sheila-semrush Jul 22, 2026
d75c6de
[base-trigger] redesigned FilterTrigger
ilyabrower Jul 22, 2026
071e5ba
[chore] Merge remote-tracking branch 'origin/UIK-5351/add-more-variab…
ilyabrower Aug 4, 2026
e4b7ae0
Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-5581/fil…
Valeria-Zimnitskaya Aug 5, 2026
f26b78b
[base-trigger] fixed todo
ilyabrower Aug 5, 2026
f69fb5a
[base-trigger] fixed borders in focus-visible state UIK-5691
ilyabrower Aug 6, 2026
0b41d19
[base-trigger] fixed borders in focus-visible state UIK-5689
ilyabrower Aug 6, 2026
3034fbd
[base-trigger] fixed borders in focus-visible state UIK-5698
ilyabrower Aug 6, 2026
3a3e4de
[base-trigger] fixed borders in focus-visible state UIK-5691
ilyabrower Aug 6, 2026
aeaa407
[base-trigger] fixed borders in focus-visible state UIK-5689
ilyabrower Aug 6, 2026
12ee2d4
[base-trigger] fixed borders in focus-visible state UIK-5689
ilyabrower Aug 6, 2026
fb09af5
Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-5581/fil…
Valeria-Zimnitskaya Aug 6, 2026
75f80e2
[base-trigger] fixed borders in focus-visible state UIK-5705
ilyabrower Aug 6, 2026
d57f29a
[chore] Merge branch 'UIK-5581/filter-trigger-rebranding' of github.c…
ilyabrower Aug 6, 2026
d466372
[base-trigger] fixed borders in focus-visible state UIK-5704
ilyabrower Aug 6, 2026
337dc37
[base-trigger] fixed L size
ilyabrower Aug 7, 2026
6d21843
[base-trigger] fixed active bg
ilyabrower Aug 7, 2026
35f750b
[tab-line, tab-panel] redesign
ilyabrower Aug 7, 2026
269a7a0
Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-5652/tab…
Valeria-Zimnitskaya Aug 10, 2026
516f918
[chore] Merge remote-tracking branch 'origin/UIK-5351/add-more-variab…
Valeria-Zimnitskaya Aug 17, 2026
ac913a4
[chore] fix merge change
Valeria-Zimnitskaya Aug 17, 2026
fb9c7f5
[chore] update test
Valeria-Zimnitskaya Aug 17, 2026
4810e67
[tab-line] fixed typo in styles
ilyabrower Aug 18, 2026
e472f2f
[chore] Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-…
sheila-semrush Aug 19, 2026
b57b53c
[chore] update snapshots
Valeria-Zimnitskaya Aug 19, 2026
ed0ee01
[chore] update snapshots
Valeria-Zimnitskaya Aug 20, 2026
368b909
[tab-line, tab-panel] updated animation, text color
sheila-semrush Aug 20, 2026
2608b46
[docs] updated design docs
sheila-semrush Aug 20, 2026
99efcb5
[chore] Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-…
sheila-semrush Aug 20, 2026
ffc855e
[tab-line] fixed height for the bottom border
ilyabrower Aug 20, 2026
fcc306a
[tab-line] update snapshots
Valeria-Zimnitskaya Aug 24, 2026
6483c01
[chore] Merge branch 'UIK-5351/add-more-variables-to-theme' into UIK-…
sheila-semrush Aug 24, 2026
0ebdd26
[docs] removed outdated token & style mentions
sheila-semrush Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 19 additions & 19 deletions semcore/tab-line/__tests__/tab-line.browser-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,28 +47,28 @@ test.describe(`${TAG.VISUAL} `, () => {
const l_size = page.locator('[data-ui-name="TabLine"][class*="size_l"]');

await test.step('Verify tab line styles styles', async () => {
const countText = await locators.text(page).count();
for (let i = 0; i < countText - 2; i++) {
await expect(locators.text(page).nth(i)).toHaveCSS('margin-right', '8px');
}
await expect(locators.text(page).nth(countText - 2)).not.toHaveCSS('margin-right', '8px');
await expect(locators.text(page).nth(countText - 1)).not.toHaveCSS('margin-right', '8px');
// Spacing between tabs comes from the tablist gap and depends on the size
await expect(locators.tabLine(page)).toHaveCSS('column-gap', item.size === 'l' ? '20px' : '16px');

const countTabs = await locators.tabLines(page).count();
for (let i = 0; i < countTabs - 1; i++) {
await expect(locators.tabLines(page).nth(i)).toHaveCSS('margin-right', '16px');
for (let i = 0; i < countTabs; i++) {
// Spacing between an addon and the text comes from the tab gap
await expect(locators.tabLines(page).nth(i)).toHaveCSS('column-gap', '6px');
await expect(locators.tabLines(page).nth(i)).toHaveCSS('margin-right', '0px');
}
await expect(locators.tabLines(page).nth(countTabs - 1)).not.toHaveCSS('margin-right', '16px');

await expect(locators.addons(page).nth(0)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(2)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(4)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(7)).toHaveCSS('margin-right', '8px');
// Per-child margins were replaced by the gaps above and must not come back
const countText = await locators.text(page).count();
for (let i = 0; i < countText; i++) {
await expect(locators.text(page).nth(i)).toHaveCSS('margin-right', '0px');
await expect(locators.text(page).nth(i)).toHaveCSS('margin-left', '0px');
}

await expect(locators.addons(page).nth(1)).not.toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(3)).not.toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(5)).not.toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(6)).not.toHaveCSS('margin-right', '8px');
const countAddons = await locators.addons(page).count();
for (let i = 0; i < countAddons; i++) {
await expect(locators.addons(page).nth(i)).toHaveCSS('margin-right', '0px');
await expect(locators.addons(page).nth(i)).toHaveCSS('margin-left', '0px');
}
});

await test.step('Verify tab line sizes styles', async () => {
Expand Down Expand Up @@ -126,9 +126,9 @@ test.describe(`${TAG.VISUAL} `, () => {

const variablesEllipsis = [
{ w: 100, size: 'l', behavior: 'auto', hintPlacement: 'right', desc: 'default' },
{ w: 100, size: 'm', behavior: 'auto', ellipsis: { 'ellipsis:cropPosition': 'middle' }, hintPlacement: 'right', desc: 'cropPosition:middle' },
{ w: 70, size: 'm', behavior: 'auto', ellipsis: { 'ellipsis:cropPosition': 'middle' }, hintPlacement: 'right', desc: 'cropPosition:middle' },
{ w: 100, size: 'l', behavior: 'manual', hintPlacement: 'right', desc: 'default' },
{ w: 100, size: 'm', behavior: 'manual', ellipsis: { 'ellipsis:cropPosition': 'middle' }, hintPlacement: 'right', desc: 'cropPosition:middle' },
{ w: 70, size: 'm', behavior: 'manual', ellipsis: { 'ellipsis:cropPosition': 'middle' }, hintPlacement: 'right', desc: 'cropPosition:middle' },
];
variablesEllipsis.forEach((item) => {
test(`Verify ellipsis in Tab lines behavior = ${item.behavior} size = ${item.size} ellipsis = ${item.desc} styles`, {
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 17 additions & 16 deletions semcore/tab-line/src/style/tab-line.shadow.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,17 @@ STabLine {
display: flex;
width: 100%;
max-width: 100%;

&[size='m'] {
gap: var(--intergalactic-spacing-content-gap-xxlarge, 16px);
}
&[size='l'] {
gap: var(--intergalactic-spacing-content-gap-xxlarge-extended, 20px);
}
}

STabLine[underlined] {
border-bottom: 1px solid var(--intergalactic-border-primary, oklch(0.137 0.026 175.7 / 0.161)); /* TODO: --intergalactic-control-tab-line-border */
border-bottom: 1px solid var(--intergalactic-control-tab-line-border, oklch(0.137 0.026 175.7 / 0.161));
}

STabLineItem {
Expand All @@ -24,15 +31,14 @@ STabLineItem {
text-decoration: none;
-webkit-tap-highlight-color: transparent;
overflow: visible;
/*outline: 0;*/
text-align: center;
vertical-align: middle;
font-family: inherit;
cursor: pointer;
border: none;
background: transparent;
color: var(--intergalactic-text-primary, oklch(0.1 0.03 137 / 0.899));
margin-right: var(--intergalactic-spacing-4x, 16px);
gap: var(--intergalactic-spacing-content-gap-medium, 6px);
font-weight: var(--intergalactic-medium, 500);

&::-moz-focus-inner {
Expand All @@ -50,8 +56,8 @@ STabLineItem {
content: '';
position: absolute;
left: 0;
bottom: -1px;
height: 3px;
bottom: 0;
height: 2px;
width: 100%;
background-color: transparent;
}
Expand All @@ -61,28 +67,23 @@ STabLineItem {
}

&:hover::before {
background-color: var(--intergalactic-border-primary, oklch(0.137 0.026 175.7 / 0.161)); /* TODO: --intergalactic-control-tab-line-border-hover */
background-color: var(--intergalactic-control-tab-line-border-hover, oklch(0.137 0.026 175.7 / 0.161));
transition-duration: calc(var(--intergalactic-duration-extra-fast, 100) * 1ms);
Comment thread
sheila-semrush marked this conversation as resolved.
}

&[selected]::after {
bottom: -1px;
height: 3px;
transition-delay: calc(var(--intergalactic-duration-control, 200) * 1ms);
background-color: var(--intergalactic-border-info-active, oklch(0.7 0.131 275.2)); /* TODO: --intergalactic-control-tab-line-border-active */
}

& SText:not(:last-child) {
margin-right: var(--intergalactic-spacing-2x, 8px);
}

& SAddon:not(:last-child) {
margin-right: var(--intergalactic-spacing-2x, 8px);
background-color: var(--intergalactic-control-tab-line-border-active, oklch(0.23 0.01 140));
}
}

SCaret {
position: absolute;
bottom: -1px;
height: 3px;
background: var(--intergalactic-border-info-active, oklch(0.7 0.131 275.2)); /* TODO: --intergalactic-control-tab-line-border-active */
background: var(--intergalactic-control-tab-line-border-active, oklch(0.23 0.01 140));
transition: calc(var(--intergalactic-duration-control, 200) * 1ms) all ease-in-out;
}

Expand Down
28 changes: 17 additions & 11 deletions semcore/tab-panel/__tests__/tab-panel.browser-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,27 @@ test.describe(`${TAG.VISUAL} `, () => {
await expect(page).toHaveScreenshot();

await test.step('Verify tab panel styles', async () => {
const countTabs = await locators.tabPanels(page).count();
for (let i = 0; i < countTabs; i++) {
// Spacing between an addon and the text comes from the tab gap
await expect(locators.tabPanels(page).nth(i)).toHaveCSS('column-gap', '6px');
// Space around the tab content comes from its own padding
await expect(locators.tabPanels(page).nth(i)).toHaveCSS('padding-left', '12px');
await expect(locators.tabPanels(page).nth(i)).toHaveCSS('padding-right', '12px');
}

// Per-child margins were replaced by the gap and padding above and must not come back
const countText = await locators.text(page).count();
for (let i = 0; i < countText; i++) {
await expect(locators.text(page).nth(i)).toHaveCSS('margin-right', '8px');
await expect(locators.text(page).nth(i)).toHaveCSS('margin-left', '8px');
await expect(locators.text(page).nth(i)).toHaveCSS('margin-right', '0px');
await expect(locators.text(page).nth(i)).toHaveCSS('margin-left', '0px');
}

await expect(locators.addons(page).nth(0)).toHaveCSS('margin-left', '8px');
await expect(locators.addons(page).nth(2)).toHaveCSS('margin-left', '8px');
await expect(locators.addons(page).nth(4)).toHaveCSS('margin-left', '8px');
await expect(locators.addons(page).nth(7)).toHaveCSS('margin-left', '8px');

await expect(locators.addons(page).nth(1)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(3)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(5)).toHaveCSS('margin-right', '8px');
await expect(locators.addons(page).nth(6)).toHaveCSS('margin-right', '8px');
const countAddons = await locators.addons(page).count();
for (let i = 0; i < countAddons; i++) {
await expect(locators.addons(page).nth(i)).toHaveCSS('margin-right', '0px');
await expect(locators.addons(page).nth(i)).toHaveCSS('margin-left', '0px');
}
});
});

Expand Down
29 changes: 5 additions & 24 deletions semcore/tab-panel/src/style/tab-panel.shadow.css
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ STabPanelItem {
position: relative;
bottom: -1px;
display: inline-flex;
gap: var(--intergalactic-spacing-content-gap-medium, 6px);
min-width: 0;
height: 32px;
height: var(--intergalactic-form-control-m, 32px);
color: var(--intergalactic-text-secondary, oklch(0.088 0.026 147.7 / 0.583));
border: 1px solid transparent;
border-bottom: none;
Expand All @@ -29,7 +30,7 @@ STabPanelItem {
touch-action: manipulation;
user-select: none;
box-sizing: border-box;
padding: 0;
padding: 0 var(--intergalactic-spacing-content-padding-medium, 12px);
padding-bottom: 1px;
margin: 0;
box-shadow: none;
Expand Down Expand Up @@ -76,38 +77,18 @@ STabPanelItem[disabled] {
}

STabPanelItem[selected] {
color: var(--intergalactic-text-link, oklch(0.1 0.03 137 / 0.899)); /* TODO: --intergalactic-text-link-primary */
color: var(--intergalactic-text-primary, oklch(0.1 0.03 137 / 0.899));
border-color: var(--intergalactic-border-primary, oklch(0.137 0.026 175.7 / 0.161));
flex-shrink: 0;

&:hover {
color: var(--intergalactic-text-link-hover-active, oklch(0.1 0.03 137 / 0.899)); /* TODO: --intergalactic-text-link-primary-hover-active */
}
background: var(--intergalactic-bg-primary-neutral, oklch(1 0 0));

&::after {
border-bottom: none;
}
}

SText {
margin: auto var(--intergalactic-spacing-2x, 8px);
}

SAddon {
display: inline-flex;
align-items: center;
justify-content: center;
}

SAddon:not(:only-child):first-child {
margin-left: var(--intergalactic-spacing-2x, 8px);
}

SAddon:not(:only-child):last-child {
margin-right: var(--intergalactic-spacing-2x, 8px);
}

SAddon:only-child {
margin-right: var(--intergalactic-spacing-2x, 8px);
margin-left: var(--intergalactic-spacing-2x, 8px);
}
28 changes: 11 additions & 17 deletions website/docs/components/tab-line/tab-line.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ Component consists of the following:

### Sizes

- The `TabLine.Item` has a `margin-right: var(--spacing-4x)` (except for the `last-child`).
- Addons before and after the text have a margin of 8px.
TabLine has 2 sizes: M and L.

Table: TabLine sizes and margins

Expand All @@ -41,17 +40,17 @@ Table: TabLine sizes and margins

### Types

Depending on the context, you can use TabLine with or without a border-bottom. The border uses the `--border-primary` token for its color.
Depending on the context, you can use TabLine with or without `border-bottom`.

#### Tabs with border (underlined)

Use TabLine with border-bottom to visually separate navigation from the content it switches. This is particularly helpful for secondary navigation on a page.
Use TabLine with `border-bottom` to visually separate navigation from the content. This is particularly helpful for secondary navigation on a page.

![](static/tab-with-border.png)

#### Tabs without border

Use TabLine with border-bottom to visually separate navigation from the content it switches. This is particularly helpful for secondary navigation on a page.
Use TabLine without `border-bottom` for lower levels of navigation, such as switching data visualizations in widgets.

![](static/tab-without-border.png)

Expand Down Expand Up @@ -80,18 +79,13 @@ Table: Examples of addons for TabLine

Table: TabLine states

| State | Appearance example | Styles |
| --------------- | ------------------------ | ------- |
| Normal | ![](static/normal-active.png) | `color: var(--text-primary)` |
| Hover | ![](static/hover.png) | `border-bottom: 2px solid var(--border-primary)` |
| Active | ![](static/normal-active.png) | `border-bottom: 2px solid var(--border-info-active)` |
| Disabled | ![](static/disabled.png) | Use `--disabled-opacity` token. |
| Initial loading | ![](static/initial-loading.png) | When indicating that data is being loaded for the first time in the counter inside `TabLine.Item`, use Skeleton with the size of the text's line-height. |
| Loading | ![](static/loading.png) | When showing that data in the counter inside `TabLine.Item` is currently being loaded, use [Spin](/components/spin/spin) with the smallest size (same as in [Button](/components/button/button)).|

### Animation

When switching between active tabs, the border-bottom moves with an `ease` transition and a duration of `500ms`.
| State | Appearance example |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <nobr>Normal & Active</nobr> | ![](static/normal-active.png) |
| Hover | ![](static/hover.png) |
| Disabled | ![](static/disabled.png) |
| <nobr>Initial loading</nobr> | When indicating that data is being loaded for the first time in the counter inside `TabLine.Item`, use Skeleton with the size of the text's line-height. ![](static/initial-loading.png) |
| Loading | When showing that data in the counter inside `TabLine.Item` is currently being loaded, use [Spin](/components/spin/spin) with the smallest size (same as in [Button](/components/button/button)). ![](static/loading.png) |

## Placement

Expand Down
18 changes: 8 additions & 10 deletions website/docs/components/tab-panel/tab-panel.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ Component consists of the following:

### Sizes

The TabPanel.Item has a `margin-right: var(--spacing-4x)` (except for the `last-child`).
Addons before and after the text have a margin of 8px.
TabPanel has only one size.

![](static/tab-m.png)

Expand Down Expand Up @@ -61,14 +60,13 @@ We recommend adding links to tabs so that users can open different tabs of the r

Table: TabPanel states

| State | Appearance | Styles |
| --------------- | -------------- | ---------- |
| Normal | ![](static/normal-active.png) | `color: var(--text-secondary)` |
| Hover | ![](static/hover.png) | `color: var(--text-primary)` |
| Active | ![](static/normal-active.png) | `color: var(--text-link)`, `border-width: 1px 1px 0px 1px`, `border-style: solid`, `border-color: var(--border-primary)` `border-radius: 6px 6px 0px 0px` |
| Disabled | ![](static/disabled.png) | Use the `--disabled-opacity` token. |
| Initial loading | ![](static/initial-loading.png) | When indicating that data is being loaded for the first time in the counter inside `TabPanel.Item`, use [Skeleton](/components/skeleton/skeleton) with the size of the text's line-height. |
| Loading | ![](static/loading.png) | When showing that data in the counter inside `TabPanel.Item` is currently being loaded, use [Spin](/components/spin/spin) with the smallest size (same as in [Button](/components/button/button)).|
| State | Appearance |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <nobr>Normal & Active</nobr> | ![](static/normal-active.png) |
| Hover | ![](static/hover.png) |
| Disabled | ![](static/disabled.png) |
| Initial loading | When indicating that data is being loaded for the first time in the counter inside `TabPanel.Item`, use [Skeleton](/components/skeleton/skeleton) with the size of the text's line-height. ![](static/initial-loading.png) |
| Loading | When showing that data in the counter inside `TabPanel.Item` is currently being loaded, use [Spin](/components/spin/spin) with the smallest size (same as in [Button](/components/button/button)). ![](static/loading.png) |

## Usage in UX/UI

Expand Down
Loading
Loading