From 267272ad70e082b2a60a627057c33aae6286023e Mon Sep 17 00:00:00 2001 From: Alesya Volosach Date: Mon, 19 Oct 2026 16:14:02 +0300 Subject: [PATCH 1/5] =?UTF-8?q?feat(tag):=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20API,=20=D0=B8=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-tokens/input/tokens.json | 10 +- src/components/Tag/Tag.stories.ts | 17 +- src/components/Tag/Tag.tsx | 94 ++- src/components/Tag/__tests__/Tag.test.tsx | 208 +++++-- .../__tests__/__snapshots__/Tag.test.tsx.snap | 539 ------------------ src/theme/tokens/components/dark.json | 8 +- src/theme/tokens/components/light.json | 2 +- 7 files changed, 260 insertions(+), 618 deletions(-) delete mode 100644 src/components/Tag/__tests__/__snapshots__/Tag.test.tsx.snap diff --git a/design-tokens/input/tokens.json b/design-tokens/input/tokens.json index 2fd926ba..3324965e 100644 --- a/design-tokens/input/tokens.json +++ b/design-tokens/input/tokens.json @@ -4819,14 +4819,14 @@ }, "primary": { "background": "{color.bg.brand.strong.default}", - "color": "{color.fg.inverse.default}" + "color": "{color.fg.default}" }, "secondary": { - "background": "{color.bg.neutral.strong.hover}", - "color": "{color.fg.inverse.default}" + "background": "{color.bg.neutral.medium.default}", + "color": "{color.fg.default}" }, "success": { - "background": "{color.bg.brand.strong.hover}", + "background": "{color.bg.status.success.strong.hover}", "color": "{color.fg.on.status.success.default}" }, "warn": { @@ -4837,7 +4837,7 @@ }, "root": { "fontSize": "{fonts.fontSize.100}", - "fontWeight": "{fonts.fontWeight.regular}", + "fontWeight": "{fonts.fontWeight.demibold}", "padding": "{dimension.space.100} {dimension.space.200}", "gap": "{dimension.space.100}", "borderRadius": "{dimension.borderRadius.200}", diff --git a/src/components/Tag/Tag.stories.ts b/src/components/Tag/Tag.stories.ts index e46ee0e5..313d9b54 100644 --- a/src/components/Tag/Tag.stories.ts +++ b/src/components/Tag/Tag.stories.ts @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react' import { IconAlertTriangle, IconCheck, + IconCircleCheck, IconCircleX, IconInfoCircle, } from '@tabler/icons-react-native' @@ -10,26 +11,24 @@ import { Tag } from './Tag' const icons = { IconCheck, + IconCircleCheck, IconInfoCircle, IconAlertTriangle, IconCircleX, - none: undefined, + default: undefined, } const meta: Meta = { title: 'Misc/Tag', component: Tag, - args: { - text: 'Tag', - rounded: false, - severity: 'basic', - showIcon: true, - Icon: IconCheck, - }, + args: { text: 'Tag', rounded: false, severity: 'primary', showIcon: true }, argTypes: { + text: { control: 'text' }, + rounded: { control: 'boolean' }, + showIcon: { control: 'boolean' }, severity: { control: 'radio', - options: ['basic', 'info', 'success', 'warning', 'danger', 'secondary'], + options: ['primary', 'info', 'success', 'warning', 'danger', 'secondary'], }, Icon: { control: 'radio', options: Object.keys(icons), mapping: icons }, }, diff --git a/src/components/Tag/Tag.tsx b/src/components/Tag/Tag.tsx index 8bd6f913..0ed27085 100644 --- a/src/components/Tag/Tag.tsx +++ b/src/components/Tag/Tag.tsx @@ -1,8 +1,16 @@ +import { + IconAlertTriangle, + IconCheck, + IconCircleCheck, + IconCircleX, + IconInfoCircle, +} from '@tabler/icons-react-native' import { memo } from 'react' import { View, Text, type ViewStyle, + type TextStyle, type StyleProp, type AccessibilityProps, type ViewProps, @@ -10,9 +18,11 @@ import { import { StyleSheet } from 'react-native-unistyles' -import type { ComponentTokens } from '../../theme/tokens/index' import { type SvgSource, SvgUniversal } from '../../utils/SvgUniversal' +/** @deprecated Используйте primary. Будет удалён в 2.0 после миграции SuperApp */ +type DeprecatedTagSeverity = 'basic' + export interface TagProps extends AccessibilityProps, Pick { /** Текст */ @@ -23,9 +33,16 @@ export interface TagProps /** * Выбор варианта стиля компонента - * @default 'basic' + * @default 'primary' */ - severity?: 'basic' | 'info' | 'success' | 'warning' | 'danger' | 'secondary' + severity?: + | 'primary' + | 'info' + | 'success' + | 'warning' + | 'danger' + | 'secondary' + | DeprecatedTagSeverity /** * Показать или скрыть иконку внутри компонента @@ -36,39 +53,49 @@ export interface TagProps /** Дополнительная стилизация для контейнера компонента */ style?: StyleProp - /** SVG-иконка */ + /** SVG-иконка. Заменяет стандартную иконку выбранного severity */ Icon?: SvgSource } -type TagSeverity = NonNullable +type TagSeverity = Exclude< + NonNullable, + DeprecatedTagSeverity +> -const tagIconColor: Record string> = { - basic: (t) => t.tag.colorScheme.primary.color, - info: (t) => t.tag.colorScheme.info.color, - success: (t) => t.tag.colorScheme.success.color, - warning: (t) => t.tag.colorScheme.warn.color, - danger: (t) => t.tag.colorScheme.danger.color, - secondary: (t) => t.tag.colorScheme.secondary.color, +const tagIcons: Record = { + primary: IconCheck, + info: IconInfoCircle, + success: IconCircleCheck, + warning: IconAlertTriangle, + danger: IconCircleX, + secondary: IconCircleX, } /** * Используется для маркировки элементов интерфейса - * @see https://www.figma.com/design/4TYeki0MDLhfPGJstbIicf/UI-kit-PrimeFace-(DS)?node-id=484-4921 - * @see https://www.figma.com/design/Q1BWgZ7zoV5UzlBOnjW0cM/UI-Kit--DS--v2.1?node-id=24043-13865 + * Внутри интерактивного родителя задавайте доступное имя родителю, + * оставляя Tag без собственного accessibilityLabel + * @see https://www.figma.com/design/Q1BWgZ7zoV5UzlBOnjW0cM/UI-Kit--DS--v2.1?node-id=21-1238 */ export const Tag = memo( ({ text, rounded, - severity = 'basic', + severity = 'primary', showIcon = true, style, Icon, testID, collapsable, + accessibilityLabel, ...rest }) => { - tagStyles.useVariants({ severity }) + const resolvedSeverity = severity === 'basic' ? 'primary' : severity + const colorSchemeKey = + resolvedSeverity === 'warning' ? 'warn' : resolvedSeverity + const hasAccessibilityLabel = accessibilityLabel !== undefined + + tagStyles.useVariants({ severity: resolvedSeverity }) return ( ( style={style} testID={testID || TagTestId.root} {...rest} + accessibilityLabel={accessibilityLabel} + accessibilityRole={hasAccessibilityLabel ? 'text' : undefined} + accessible={hasAccessibilityLabel} > - {showIcon && Icon ? ( + {showIcon ? ( { - return { color: tagIconColor[severity](components) } - }} + uniProps={({ components }) => ({ + color: components.tag.colorScheme[colorSchemeKey].color, + width: components.tag.icon.size, + height: components.tag.icon.size, + })} /> ) : null} ({ borderRadius: components.tag.root.borderRadius, variants: { severity: { - basic: { + primary: { backgroundColor: components.tag.colorScheme.primary.background, }, info: { backgroundColor: components.tag.colorScheme.info.background }, @@ -136,16 +177,17 @@ const tagStyles = StyleSheet.create(({ components, fonts }) => ({ }, }, roundedContainer: { borderRadius: components.tag.root.roundedBorderRadius }, - icon: { width: components.tag.icon.size, height: components.tag.icon.size }, text: { flexShrink: 1, fontSize: components.tag.root.fontSize, includeFontPadding: false, verticalAlign: 'middle', - fontFamily: fonts.fontFamily.heading, + fontFamily: fonts.fontFamily.base, + fontWeight: components.tag.root.fontWeight as TextStyle['fontWeight'], + lineHeight: fonts.lineHeight[250], variants: { severity: { - basic: { color: components.tag.colorScheme.primary.color }, + primary: { color: components.tag.colorScheme.primary.color }, info: { color: components.tag.colorScheme.info.color }, success: { color: components.tag.colorScheme.success.color }, warning: { color: components.tag.colorScheme.warn.color }, diff --git a/src/components/Tag/__tests__/Tag.test.tsx b/src/components/Tag/__tests__/Tag.test.tsx index 9d1b0282..f94eac39 100644 --- a/src/components/Tag/__tests__/Tag.test.tsx +++ b/src/components/Tag/__tests__/Tag.test.tsx @@ -1,40 +1,180 @@ import { IconCheck } from '@tabler/icons-react-native' -import { render } from '@testing-library/react-native' +import { + isHiddenFromAccessibility, + render, + screen, + userEvent, +} from '@testing-library/react-native' +import { Pressable } from 'react-native' +import Svg, { type SvgProps } from 'react-native-svg' -import { Tag, type TagProps } from '../Tag' +import { Tag, TagTestId } from '../Tag' + +const CustomIcon = (props: SvgProps) => ( + +) describe('Tag', () => { - const defaultProps: TagProps = { text: 'Tag' } - const snapshotCases: Array<[string, Partial]> = [ - ['default', {}], - [ - 'severity = secondary, rounded = false, showIcon = true, with Icon', - { - severity: 'secondary', - rounded: false, - showIcon: true, - Icon: IconCheck, - }, - ], - [ - 'severity = basic, rounded = true, with Icon', - { severity: 'basic', rounded: true, Icon: IconCheck }, - ], - [ - 'severity = info, showIcon = false, with Icon', - { severity: 'info', Icon: IconCheck }, - ], - [ - 'severity = success, with custom styles', - { severity: 'success', style: { margin: 10 } }, - ], - ['severity = warning', { severity: 'warning' }], - ['severity = danger', { severity: 'danger' }], - ] - - test.each(snapshotCases)('snapshot: %s', (_, props) => { - const { toJSON } = render() - - expect(toJSON()).toMatchSnapshot() + test.each([ + { name: 'алиасе basic', severity: 'basic' }, + { name: 'severity warning', severity: 'warning' }, + ] as const)( + 'отображает текст и стандартную иконку при $name', + ({ severity }) => { + render() + + expect(screen.getByRole('text', { name: 'Доставлен' })).toBeOnTheScreen() + expect( + screen.getAllByTestId(TagTestId.icon, { includeHiddenElements: true }) + .length + ).toBeGreaterThan(0) + } + ) + + test('заменяет стандартную иконку через Icon и восстанавливает её после удаления пропа', () => { + const { rerender } = render() + + expect( + screen.getAllByTestId(TagTestId.icon, { includeHiddenElements: true }) + .length + ).toBeGreaterThan(0) + + rerender() + + expect( + screen.getAllByTestId('CustomTagIcon', { includeHiddenElements: true }) + .length + ).toBeGreaterThan(0) + expect( + screen.queryByTestId(TagTestId.icon, { includeHiddenElements: true }) + ).toBeNull() + + rerender() + + expect( + screen.getAllByTestId(TagTestId.icon, { includeHiddenElements: true }) + .length + ).toBeGreaterThan(0) + expect( + screen.queryAllByTestId('CustomTagIcon', { includeHiddenElements: true }) + ).toHaveLength(0) + expect(screen.getByRole('text', { name: 'В пути' })).toBeOnTheScreen() + }) + + test('скрывает переданную иконку при showIcon=false', () => { + render() + + expect( + screen.queryByTestId(TagTestId.icon, { includeHiddenElements: true }) + ).toBeNull() + expect(screen.getByRole('text', { name: 'Доставлен' })).toBeOnTheScreen() + }) + + test('скрывает стандартную иконку и восстанавливает её при изменении showIcon', () => { + const { rerender } = render() + + expect( + screen.queryByTestId(TagTestId.icon, { includeHiddenElements: true }) + ).toBeNull() + + rerender() + + expect( + screen.getAllByTestId(TagTestId.icon, { includeHiddenElements: true }) + .length + ).toBeGreaterThan(0) + }) + + test('передаёт testID, collapsable и accessibilityHint корневому контейнеру', () => { + render( + + ) + + const root = screen.getByRole('text', { name: 'Статус заказа' }) + + expect(root).toBe(screen.getByTestId('OrderStatus')) + expect(root).toHaveProp('collapsable', false) + expect(root).toHaveProp('accessibilityHint', 'Текущий этап доставки') + }) + + test('оставляет видимый текст единственным доступным текстовым элементом без accessibilityLabel', () => { + render() + + expect(screen.getAllByRole('text')).toHaveLength(1) + expect(screen.getByRole('text', { name: 'Доставлен' })).toBeOnTheScreen() + expect(screen.getByTestId(TagTestId.root)).toHaveProp('accessible', false) + }) + + test('использует accessibilityLabel как единое имя и скрывает дочерний текст', () => { + const { rerender } = render( + + ) + + expect(screen.getAllByRole('text')).toHaveLength(1) + expect(screen.getByRole('text', { name: 'Статус заказа: доставлен' })).toBe( + screen.getByTestId(TagTestId.root) + ) + expect(screen.queryByRole('text', { name: 'Доставлен' })).toBeNull() + expect( + screen.getByText('Доставлен', { includeHiddenElements: true }) + ).toBeOnTheScreen() + + rerender() + + expect(screen.getAllByRole('text')).toHaveLength(1) + expect(screen.getByRole('text', { name: 'Доставлен' })).toBeOnTheScreen() + expect( + screen.queryByRole('text', { name: 'Статус заказа: доставлен' }) + ).toBeNull() + }) + + test('скрывает декоративную иконку от accessibility', () => { + render() + + const icons = screen.getAllByTestId(TagTestId.icon, { + includeHiddenElements: true, + }) + + for (const icon of icons) { + expect(isHiddenFromAccessibility(icon)).toBeTrue() + } + + expect(screen.queryByTestId(TagTestId.icon)).toBeNull() + expect(screen.getAllByRole('text')).toHaveLength(1) + }) + + test('позволяет интерактивному родителю задавать имя и обрабатывать нажатие', async () => { + const onPress = jest.fn() + const user = userEvent.setup() + + render( + + + + ) + + await user.press( + screen.getByRole('button', { name: 'Открыть заказ: доставлен' }) + ) + + expect(onPress).toHaveBeenCalledOnce() + expect(screen.getByTestId(TagTestId.root)).toHaveProp('accessible', false) + expect(screen.getByTestId(TagTestId.root)).not.toHaveProp( + 'accessibilityLabel' + ) }) }) diff --git a/src/components/Tag/__tests__/__snapshots__/Tag.test.tsx.snap b/src/components/Tag/__tests__/__snapshots__/Tag.test.tsx.snap deleted file mode 100644 index ff2517c9..00000000 --- a/src/components/Tag/__tests__/__snapshots__/Tag.test.tsx.snap +++ /dev/null @@ -1,539 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Tag snapshot: default 1`] = ` - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = basic, rounded = true, with Icon 1`] = ` - - - - - - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = danger 1`] = ` - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = info, showIcon = false, with Icon 1`] = ` - - - - - - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = secondary, rounded = false, showIcon = true, with Icon 1`] = ` - - - - - - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = success, with custom styles 1`] = ` - - - - Tag - - - -`; - -exports[`Tag snapshot: severity = warning 1`] = ` - - - - Tag - - - -`; diff --git a/src/theme/tokens/components/dark.json b/src/theme/tokens/components/dark.json index 4d27a39b..8202d1a9 100644 --- a/src/theme/tokens/components/dark.json +++ b/src/theme/tokens/components/dark.json @@ -2581,14 +2581,14 @@ "contrast": { "background": "#2b2e33", "color": "#ffffff" }, "danger": { "background": "#8d2218", "color": "#fff0f0" }, "info": { "background": "#18538d", "color": "#f0f9ff" }, - "primary": { "background": "#44e858", "color": "#2b2e33" }, - "secondary": { "background": "#e2e2e4", "color": "#2b2e33" }, - "success": { "background": "#77f48a", "color": "#f0fff3" }, + "primary": { "background": "#44e858", "color": "#ffffff" }, + "secondary": { "background": "#404348", "color": "#ffffff" }, + "success": { "background": "#1dc831", "color": "#f0fff3" }, "warn": { "background": "#9d6d0e", "color": "#fff9f0" } }, "root": { "fontSize": 12, - "fontWeight": 400, + "fontWeight": 600, "paddingTop": 4, "paddingRight": 8, "paddingBottom": 4, diff --git a/src/theme/tokens/components/light.json b/src/theme/tokens/components/light.json index 8c63f0dc..02f92575 100644 --- a/src/theme/tokens/components/light.json +++ b/src/theme/tokens/components/light.json @@ -2588,7 +2588,7 @@ }, "root": { "fontSize": 12, - "fontWeight": 400, + "fontWeight": 600, "paddingTop": 4, "paddingRight": 8, "paddingBottom": 4, From b70ca62565bd304762314a416e3b894fe807f9be Mon Sep 17 00:00:00 2001 From: Alesya Volosach Date: Tue, 20 Oct 2026 12:23:41 +0300 Subject: [PATCH 2/5] =?UTF-8?q?fix(tag):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B0=20=D1=88=D1=80=D0=B8?= =?UTF-8?q?=D1=84=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Tag/Tag.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Tag/Tag.tsx b/src/components/Tag/Tag.tsx index 0ed27085..6b513526 100644 --- a/src/components/Tag/Tag.tsx +++ b/src/components/Tag/Tag.tsx @@ -9,6 +9,7 @@ import { memo } from 'react' import { View, Text, + useWindowDimensions, type ViewStyle, type TextStyle, type StyleProp, @@ -90,6 +91,8 @@ export const Tag = memo( accessibilityLabel, ...rest }) => { + // На iOS пересоздание Text сбрасывает измерения при смене масштаба шрифта. + const { fontScale } = useWindowDimensions() const resolvedSeverity = severity === 'basic' ? 'primary' : severity const colorSchemeKey = resolvedSeverity === 'warning' ? 'warn' : resolvedSeverity @@ -134,6 +137,7 @@ export const Tag = memo( Date: Tue, 20 Oct 2026 13:26:46 +0300 Subject: [PATCH 3/5] =?UTF-8?q?docs(tag):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ src/components/Tag/Tag.md | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/components/Tag/Tag.md diff --git a/README.md b/README.md index bf4be666..32e3dd0e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ Репозиторий UI kit на основе Prime Faces, Prime Flex для React Native +Документация компонентов: + +- [Tag](src/components/Tag/Tag.md) + ## Installation **Yarn** diff --git a/src/components/Tag/Tag.md b/src/components/Tag/Tag.md new file mode 100644 index 00000000..62feef69 --- /dev/null +++ b/src/components/Tag/Tag.md @@ -0,0 +1,40 @@ +# Tag + +Текстовая метка для статуса или категории с необязательной иконкой. + +## Использование + +```tsx +import { Tag } from '@cdek-it/react-native-ui-kit' + +export function DeliveryStatus() { + return +} +``` + +## Props + +- `text` — обязательный текст метки +- `severity` — `primary | info | success | warning | danger | secondary`; по + умолчанию `primary`. Определяет оформление и стандартную иконку. Устаревший + `basic` поддерживается как алиас `primary` +- `rounded` — полное скругление углов; по умолчанию `false` +- `showIcon` — показывает иконку; по умолчанию `true` +- `Icon` — SVG типа `SvgSource`, переопределяющая стандартную иконку + +Полный контракт — [TagProps](./Tag.tsx). + +## Доступность + +Текст масштабируется с системным шрифтом и остаётся однострочным; при нехватке +ширины сокращается многоточием. + +Скринридер озвучивает видимый текст или заданный `accessibilityLabel` без +дублирования. Иконка декоративная. + +Для обработки нажатия используйте интерактивного родителя. Доступное имя и роль +задавайте родителю, оставляя Tag без собственного `accessibilityLabel`. + +## Макет + +[Tag в Figma](https://www.figma.com/design/Q1BWgZ7zoV5UzlBOnjW0cM/UI-Kit--DS--v2.1?node-id=21-1238&m=dev) From cd98e75906fc9f6b8bfadffdd5c000b59d13860c Mon Sep 17 00:00:00 2001 From: Alesya Volosach Date: Tue, 20 Oct 2026 16:18:36 +0300 Subject: [PATCH 4/5] =?UTF-8?q?fix(tag):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=86=D0=B2=D0=B5=D1=82=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=B2=20=D1=82=D1=91=D0=BC?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D1=82=D0=B5=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-tokens/input/tokens.json | 4 ++-- src/theme/tokens/components/dark.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/design-tokens/input/tokens.json b/design-tokens/input/tokens.json index 3324965e..78aa41d6 100644 --- a/design-tokens/input/tokens.json +++ b/design-tokens/input/tokens.json @@ -4777,7 +4777,7 @@ "light": { "primary": { "background": "{color.bg.brand.strong.default}", - "color": "{color.fg.default}" + "color": "{color.fg.on.brand.default}" }, "secondary": { "background": "{color.bg.neutral.medium.default}", @@ -4819,7 +4819,7 @@ }, "primary": { "background": "{color.bg.brand.strong.default}", - "color": "{color.fg.default}" + "color": "{color.fg.on.brand.default}" }, "secondary": { "background": "{color.bg.neutral.medium.default}", diff --git a/src/theme/tokens/components/dark.json b/src/theme/tokens/components/dark.json index 8202d1a9..ad42b6ff 100644 --- a/src/theme/tokens/components/dark.json +++ b/src/theme/tokens/components/dark.json @@ -2581,7 +2581,7 @@ "contrast": { "background": "#2b2e33", "color": "#ffffff" }, "danger": { "background": "#8d2218", "color": "#fff0f0" }, "info": { "background": "#18538d", "color": "#f0f9ff" }, - "primary": { "background": "#44e858", "color": "#ffffff" }, + "primary": { "background": "#44e858", "color": "#2b2e33" }, "secondary": { "background": "#404348", "color": "#ffffff" }, "success": { "background": "#1dc831", "color": "#f0fff3" }, "warn": { "background": "#9d6d0e", "color": "#fff9f0" } From 3a4539ab303cc0ab9e9b9a6211e04a68423ac1fb Mon Sep 17 00:00:00 2001 From: Alesya Volosach Date: Tue, 20 Oct 2026 17:56:40 +0300 Subject: [PATCH 5/5] =?UTF-8?q?fix(fonts):=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D1=82=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app.config.ts b/app.config.ts index 0f258318..5da91aef 100644 --- a/app.config.ts +++ b/app.config.ts @@ -23,6 +23,7 @@ const internalFontsPlugin = [ fontFamily: 'Noto Sans', fontDefinitions: [ { path: './assets/fonts/NotoSans-Bold.ttf', weight: 700 }, + { path: './assets/fonts/NotoSans-SemiBold.ttf', weight: 600 }, { path: './assets/fonts/NotoSans-Regular.ttf', weight: 400 }, ], }, @@ -34,6 +35,7 @@ const internalFontsPlugin = [ './assets/fonts/TTFellows-DemiBoldItalic.ttf', './assets/fonts/TTFellows-Regular.ttf', './assets/fonts/NotoSans-Regular.ttf', + './assets/fonts/NotoSans-SemiBold.ttf', './assets/fonts/NotoSans-Bold.ttf', ], },