TL;DR
Документация по миграции с v6 на v7
BREAKING CHANGE
Tip
Чтобы упростить переход на новую мажорную версию, можно воспользоваться инструментом по автоматической миграции ваших компонентов
Подробную информацию можно найти на этой странице.
⚙️ Сборка
Глобальные настройки
- Подняты минимальные версии браузеров (#7568)
ChromeAndroid >= 63 iOS >= 12 Chrome >= 63 Firefox >= 55 Edge >= 79 Opera >= 50 Safari >= 12 Samsung >= 8.2
- Импортирование теперь ограничено свойством
"exports"
вpackage.json
. Если вам нужен какой-то внутренний функционал, то следует создать issues на его экспорт, чтобы мы рассмотрели такую возможность. (#7611)
CSS-бандл
-
Если вы завязывались на CSS-классы компонентов, то необходимо пройтись по таким местам и проверить классы на соответствие, т.к. теперь за их формирование отвечает CSS Modules. (#7655)
⚠️ Мы всё ещё не рекомендуем завязываться на CSS-классы компонентов – в любой момент они могут измениться.
JS-бандл
-
Поднята целевая версия
ECMAScript
для компиляции доes2017
(#7568) -
Были добавлены use client директивы (#7702)
-
Удалена CommonJS сборка – теперь библиотека поставляется только как ESM. В зависимости от вашего инструмента для сборки, потребуется настроить трансформацию для пакета
@vkontakte/vkui
. (#7611)Возможные проблемы в Jest <= 29
Jest пока не умеет в поле
"exports"
и ориентируется на поле"main"
, которого уже нет в VKUI.Как Workaround, можно написать свой
jest-resolver.js
(см. jestjs/jest#9771 (comment)).const DEPENDENCIES_WITH_NO_MAIN_FIELD = ['@vkontakte/vkui']; module.exports = (path, options) => options.defaultResolver(path, { ...options, packageFilter: (pkg) => DEPENDENCIES_WITH_NO_MAIN_FIELD.includes(pkg.name) ? { ...pkg, main: pkg.module } : pkg, });
Возможные проблемы в Vitets
Может падать с ошибкой
SyntaxError: Named export 'IconAppearanceProvider' not found. The requested module '@vkontakte/icons' is a CommonJS module, which may not support all module.exports as named exports.
.Чтобы исправить это, нужно добавить
@vkontakte/vkui
в параметрtest.server.deps.inline
в конфигеvitest.config.*
.import { defineConfig } from 'vite'; export default defineConfig(({ mode }) => { return { resolve: {}, test: { server: { deps: { inline: [/@vkontakte\/vkui/] } } }, }; });
🌗 Appearance
→ ColorScheme
Название Appearance
для указания светлой или тёмной темы совпадало с названием параметров некоторых компонентов, что могло путать,
поэтому пришли к названию ColorScheme
, также как свойство в CSS.
Это привело к следующим изменениям:
-
Константа
Appearance
переименована вColorScheme
(#7728)Пример миграции
- export const Appearance = { + export const ColorScheme = { DARK: 'dark', LIGHT: 'light', } as const; - const apperance = Appearance.DARK + const colorScheme = ColorScheme.DARK
-
Тип
AppearanceType
переименован вColorSchemeType
(#7728)Пример миграции
- const appearance: ApperanceType = Appearance.DARK; + const colorScheme: ColorSchemeType = ColorScheme.DARK;
-
AppearanceProvider
переименован вColorSchemeProvider
,AppearanceProviderProps
переименован вColorSchemeProviderProps
(#7728)Пример миграции
- const props: AppearanceProviderProps = { + const props: ColorSchemeProviderProps = { value: 'dark' }
Пример миграции
- <AppearanceProvider value={colorScheme}> + <ColorSchemeProvider value={colorScheme}> <AdaptivityProvider sizeY="regular"> <Div style={{ padding: 10 }}> <Textarea id="textarea" /> </Div> </AdaptivityProvider> - </AppearanceProvider> + </ColorSchemeProvider>
-
Хук
useAppearance
переименован вuseColorScheme
(#7728)Пример миграции
- const appearance = useAppearance(); + const colorScheme = useColorScheme();
-
В
ConfigProvider
иConfigProviderProps
свойствоappearance
переименовано вcolorScheme
(#7728)Пример миграции
<ConfigProvider platform="vkcom" - appearance="light" + colorScheme="light" > <AdaptivityProvider viewWidth={ViewWidth.DESKTOP} hasPointer> <Div>Content</Div> </AdaptivityProvider> </ConfigProvider>
-
В
ConfigProviderContext
свойствоappearance
переименовано вcolorScheme
(#7728)Пример миграции
<ConfigProviderContext.Provider value={{ ...configContext, - appearance: 'light' + colorScheme: 'light' }}> {children} </ConfigProviderContext.Provider>
Пример миграции
const { ...args, - appearance + colorScheme } = useConfigProvider();
🖼️ Layout
-
- переработана логика автоматического добавления классов, необходимых для работы VKUI, на документ. Постарались максимально уменьшить их количество. (#7739)
В режимеmode="full"
на html-элемент добавляется класс.vkui
и класс токенов темы, которая сейчас используется. На точку монтирования приложения добавляется класс.vkui__root
.
В режимеmode="embedded"
на точку монтирования добавляются классы.vkui__root
и.vkui__root--embedded
.
В режимеmode="partial"
дополнительные классы не добавляются.
Добавление классов можно отключить с помощью нового свойстваdisableSettingVKUIClassesInRuntime
. Это отключит добавление всех классов, кроме класса токенов.
SSR. Для того, чтобы минимизировать затраты браузера на рендер страницы нужно на стороне сервера проставить все классы самостоятельно. - по умолчанию все плавающие элементы (модальные окна, попапы) рендеряться в
document.body
. Раньше в VKUI дополнительно создавался контейнер для порталов. Мы его убрали, чтобы при старте приложения дополнительно не создавать контейнер вdocument.body
, который может быть не нужен. Переопределить контейнер для рендера порталов всё также можно с помощьюportalRoot
. (#7739)
- переработана логика автоматического добавления классов, необходимых для работы VKUI, на документ. Постарались максимально уменьшить их количество. (#7739)
-
SplitLayout: свойства
popout
иmodal
помечены как@deprecated
(#7739)Теперь что
ModalRoot
, что элементыAlert
,ScreenSpinner
иActionSheet
больше нет необходимости объявлять на верхнем уровне и передавать вSplitLayout
. Такие элементы будут по умолчанию рендерится вdocument.body
. Если хочется вернуть старое поведение, то нужно точечно отключить
функцию портала, передав, например, вModalRoot
передатьusePortal={false}
.Пример миграции
<SplitLayout - modal={<ModalRoot>...</ModalRoot>} > <SplitCol>...</SplitCol> + <ModalRoot usePortal={false}>...</ModalRoot> </SplitLayout>
-
ModalRoot: удалена реализация контекста через
React.cloneElement
, которая требовала передаватьsettlingHeight
иdynamicContentHeight
в обёртки надModalPage
/ModalCard
.Пример миграции (перенос `settlingHeight` / `dynamicContentHeight`)
const SomeWrapper = ({ id }) => ( <ModalPage id={id} + settlingHeight={100} // или dynamicContentHeight /> ); <ModalRoot activeModal="m"> <SomeWrapper id="m" - settlingHeight={100} // или dynamicContentHeight /> </ModalRoot>
Пример миграции (пробрасывание `settlingHeight` / `dynamicContentHeight`)
- const SomeWrapper = ({ id }) => ( + const SomeWrapper = (props) => ( <ModalPage - id={id} + {...props} /> ); <ModalRoot activeModal="m"> <SomeWrapper id="m" settlingHeight={100} // или dynamicContentHeight /> </ModalRoot>
🎨 Синхронизация параметров с дизайном
Чтобы улучшить разработческий опыт при общении с дизайном, в этом релизе разом сократили расхождения по названиям параметров React с Figma.
-
Пример миграции
<ActionSheet onClose={() => {}} - header="Вы действительно хотите удалить это видео из Ваших видео?" + title="Вы действительно хотите удалить это видео из Ваших видео?" - text="Данное действие реально удалит видео, подумайте!" + description="Данное действие реально удалит видео, подумайте!" > <ActionSheetItem mode="destructive">Удалить видео</ActionSheetItem> </ActionSheet>
-
Пример миграции
<Alert - header="Подтвердите действие" + title="Подтвердите действие" - text="Вы уверены, что хотите лишить пользователя права на модерацию контента?" + description="Вы уверены, что хотите лишить пользователя права на модерацию контента?" actionsAlign="left" actionsLayout="horizontal" />
-
- свойство
subheader
переименовано вsubtitle
(#7773) - свойство
text
переименовано вextraSubtitle
(#7773) - свойство
header
переименовано вtitle
(#7773)
Пример миграции
<Banner before={<Avatar size={48} src={'user_lihachyov'} />} - header="Сегодня день рождения Михаила Лихачёва" + title="Сегодня день рождения Михаила Лихачёва" - subheader="Подарите подарок" + subtitle="Подарите подарок" - text="Дополнительный текст" + extraSubtitle="Дополнительный текст" />
- свойство
-
свойство
asideMode
переименовано наafter
(#7793)Пример миграции
<Banner before={<Avatar size={48} src={'user_lihachyov'} />} title="Сегодня день рождения Михаила Лихачёва" subtitle="Подарите подарок" extraSubtitle="Дополнительный текст" - asideMode="dismiss" + after="dismiss" />
-
CardGrid: свойство
spaced
переименовано наpadding
(#7804)Пример миграции
<CardGrid size="s" - spaced + padding > <Card> <div style={{ paddingBottom: '66%' }} /> </Card> </CardGrid>
-
CardScroll: свойство
noSpaces
заменено наpadding
(#7788)Пример миграции
<CardScroll size="s" - noSpaces + padding={false} > <Card> <div style={{ paddingBottom: '66%' }} /> </Card> </CardScroll>
-
Cell: свойство
expandable
переименовано наchevron
(#7787)Пример миграции
<Cell onClick={() => {}} - expandable="auto" + chevron="auto" indicator="При использовании" > Геолокация </Cell>
-
-
свойство
subhead
переименовано вoverTitle
(#7861)Пример миграции
<CellButton onClick={() => {}} - subhead="Subhead" + overTitle="Subhead" indicator="При использовании" > Геолокация </CellButton>
-
свойство
expandable
переименовано вchevron
(#7787)Пример миграции
<CellButton onClick={() => {}} - expandable="auto" + chevron="auto" indicator="При использовании" > Геолокация </CellButton>
-
-
- свойство
header
переименовано вtitle
(#7771) - свойство
subtitle
переименовано вoverTitle
(#7771) - свойство
text
переименовано вdescription
(#7771) - свойство
headerComponent
переименовано вtitleComponent
(#7771)
Пример миграции
<ContentCard - subtitle="VKUI" + overTitle="VKUI" - header="ContentCard example" + title="ContentCard example" - headerComponent="h4" + titleComponent="h4" caption="VKUI Styleguide > Blocks > ContentCard" - text="Badlands is the story about dreams and cruel reality..." + description="Badlands is the story about dreams and cruel reality..." />
- свойство
-
FormStatus: свойство
header
переименовано вtitle
(#7773)Пример миграции
<FormStatus - header="Некорректный мобильный номер" + title="Некорректный мобильный номер" mode="error" > Необходимо корректно ввести номер в международном формате </FormStatus>
-
Gallery: значение
arrowSize="l"
удалено, используйтеarrowSize="m"
, а вместоarrowSize="m"
используйтеarrowSize="s"
.Пример миграции
- <Gallery arrowSize="m"> + <Gallery arrowSize="s"> - <Gallery arrowSize="l"> + <Gallery arrowSize="m">
-
Header: свойство
aside
переименовано вafter
(#7764)Пример миграции
<Header mode="primary" subtitle="SOHN — Conrad" subtitleComponent="h3" - aside={ + after={ <Link> Показать все {<Icon12ChevronOutline />} </Link> } />
-
HorizontalCellShowMore: значение
size="l"
удалено, используйтеsize="m"
(#7807)Пример миграции
- <HorizontalCellShowMore size="l"> + <HorizontalCellShowMore size="m">
-
HorizontalScroll: значение
arrowSize="l"
удалено, используйтеarrowSize="m"
, а вместоarrowSize="m"
используйтеarrowSize="s"
.Пример миграции
- <HorizontalScroll arrowSize="m"> + <HorizontalScroll arrowSize="s"> - <HorizontalScroll arrowSize="l"> + <HorizontalScroll arrowSize="m">
-
MiniInfoCell: свойство
expandable
переименовано наchevron
(#7787)Пример миграции
<MiniInfoCell before={<Icon20WorkOutline />} mode="add" onClick={() => console.log('Указать место учёбы')} textWrap="short" - expandable + chevron > Укажите место учёбы </MiniInfoCell>
-
- свойство
header
переименовано вtitle
(#7782) - свойство
subheader
переименовано вdescription
(#7782) - свойство
headerComponent
переименовано вtitleComponent
(#7782) - свойство
subheaderComponent
переименовано вdescriptionComponent
(#7782)
Пример миграции
<ModalCard dismissButtonMode="inside" dismissLabel="Закрыть" - header="Десктопная и планшетная версии с крестиком внутри" + title="Десктопная и планшетная версии с крестиком внутри" - headerComponent="h1" + titleComponent="h1" - subheader="Сверху будет безопасный отступ до иконки" + description="Сверху будет безопасный отступ до иконки" - subheaderComponent="span" + descriptionComponent="span" actions={ <React.Fragment> <Button size="l" mode="primary" stretched> Некая кнопка </Button> </React.Fragment> } />
- свойство
-
OnboardingTooltip: переименованы свойства
text
наdescription
,header
наtitle
(#7765)Пример миграции
<OnboardingTooltip placement="right" - header="Header" + title="Header" - text="Привет" + description="Привет" > <Button style={{ margin: 20 }}>Наведи</Button> </OnboardingTooltip>
-
PanelHeaderContent: свойство
status
переименовано наsubtitle
(#7781)Пример миграции
<PanelHeaderContent - status="был в сети сегодня, в 18:46" + subtitle="был в сети сегодня, в 18:46" before={<Avatar size={36} src={'user_va'} />} > Влад Анесов </PanelHeaderContent>
-
-
свойство
header
переименовано наtitle
Пример миграции
<Placeholder icon={<Icon56UsersOutline />} - header={<Button size="m">Подключить сообщества</Button>} + title={<Button size="m">Подключить сообщества</Button>} > Подключите сообщества, от которых Вы хотите получать уведомления </Placeholder>
-
подкомпонент
Header
переименован наTitle
,Text
переименован наDescription
Пример миграции
<Placeholder.Container> - <Placeholder.Header> + <Placeholder.Title> Find friends - </Placeholder.Header> + </Placeholder.Title> - <Placeholder.Text> + <Placeholder.Description> The people you add as your friends will be displayed here - </Placeholder.Text> + </Placeholder.Description> </Placeholder.Container>
-
-
-
свойство
text
переименовано вsubtitle
(#7719)Пример миграции
<RichCell - text="Санкт-Петербург" + subtitle="Санкт-Петербург" />
-
свойство
caption
переименовано вextraSubtitle
(#7719)Пример миграции
<RichCell - caption="сегодня в 18:00" + extraSubtitle="сегодня в 18:00" />
-
свойство
subhead
переименовано вoverTitle
(#7719)Пример миграции
<RichCell - subhead="онлайн" + overTitle="онлайн" />
-
-
ScreenSpinner: свойство
caption
переименовано наlabel
(#7790)Пример миграции
<ScreenSpinner state="loading" - caption="Caption" + label="Caption" /> <ScreenSpinner.Container - caption="Caption" + label="Caption" > <ScreenSpinner.Loader /> <ScreenSpinner.SwapIcon /> </ScreenSpinner.Container>
-
ScrollArrow: значение
size="l"
удалено, используйтеsize="m"
, а вместоsize="m"
используйтеsize="s"
(#7807)Пример миграции
- <ScrollArrow size="m"> + <ScrollArrow size="s"> - <ScrollArrow size="l"> + <ScrollArrow size="m">
-
TabbarItem: свойство
text
переименовано наlabel
(#7783)Пример миграции
<Tabbar style={{ position: 'static', margin: '10px 0' }}> <TabbarItem selected={true} - text="Новости" + label="Новости" > <Icon28NewsfeedOutline /> </TabbarItem> </Tabbar>
-
-
свойство
subhead
переименовано вoverTitle
(#7861)Пример миграции
<SimpleCell onClick={() => {}} - subhead="Subhead" + overTitle="Subhead" indicator="При использовании" > Геолокация </SimpleCell>
-
свойство
expandable
переименовано наchevron
(#7787)Пример миграции
<SimpleCell onClick={() => {}} - expandable="auto" + chevron="auto" indicator="При использовании" > Геолокация </SimpleCell>
-
-
SubnavigationButton: свойство
expandable
переименовано наchevron
(#7787)Пример миграции
<SubnavigationButton - expandable={true} + chevron={true} selected={true} onClick={() => {}} > Button </SubnavigationButton>
-
SubnavigationBar: свойство
mode
заменено на флагfixed
(#7792)Пример миграции
<SubnavigationBar - mode="fixed" + fixed /> <SubnavigationBar - mode="overflow" />
-
Tooltip: переименованы свойства
text
наdescription
,header
наtitle
(#7765)Пример миграции
<Tooltip placement="right" - header="Header" + title="Header" - text="Привет" + description="Привет" > <Button style={{ margin: 20 }}>Наведи</Button> </Tooltip>
-
UsersStack: свойство
direction
заменено наavatarsPosition
со значениями'inline-start' | 'inline-end' | 'block-start'
(#7666)Пример миграции
- <UsersStack direction="row" /> + <UsersStack avatarsPosition="inline-start" /> - <UsersStack direction="row-reverse" /> + <UsersStack avatarsPosition="block-start" /> - <UsersStack direction="column" /> + <UsersStack avatarsPosition="inline-end" />
📐 Унификация формата размеров
-
Header: изменен формат
size
с'regular' | 'large'
на'm' | 'l'
(#7567)Пример миграции
- <Header mode="primary" size="large"> + <Header mode="primary" size="l"> Большой заголовок </Header>
-
PanelSpinner: изменен формат
size
с'small' | 'regular' | 'medium' | 'large'
на's' | 'm' | 'l' | 'xl'
.Пример миграции
- <PanelSpinner size="large" /> + <PanelSpinner size="xl" /> - <PanelSpinner size="medium" /> + <PanelSpinner size="l" /> - <PanelSpinner size="regular" /> + <PanelSpinner size="m" /> - <PanelSpinner size="small" /> + <PanelSpinner size="s" />
-
Spinner: изменен формат
size
с'small' | 'regular' | 'medium' | 'large'
на's' | 'm' | 'l' | 'xl'
(#7567)Пример миграции
- <Spinner size="large" /> + <Spinner size="xl" /> - <Spinner size="medium" /> + <Spinner size="l" /> - <Spinner size="regular" /> + <Spinner size="m" /> - <Spinner size="small" /> + <Spinner size="s" />
🧩 Остальные изменения в компонентах
-
Типографика: теперь используется
useAccentWeight = false
по умолчанию. Когда дополнительно требуется переопределить тип начертания текста с помощью свойстваweight
-VKUI
использует токеныfontWeightBase*
. Чтобы включитьfontWeightAccent*
токены, нужно использовать свойствоuseAccentWeight
(#7633) -
-
изменен цвет компонента при
appearance="overlay"
иmode="secondary"
(#7661) -
изменен цвет компонента в состоянии
mode="primary"
иappearance="neutral"
, при миграции рекомендуется выставлятьmode="secondary"
приappearance="neutral"
(#7802)Пример миграции
<Button appearance="neutral" + mode="secondary" />
-
-
Card: изменен тег используемый по умолчанию для ренедеринга компонента с
div
наli
(#7520) -
CardGrid: изменен тег используемый по умолчанию для ренедеринга компонента с
div
наul
(#7520) -
CardScroll: изменен тег используемый по умолчанию для ренедеринга компонента с
div
наul
(#7520) -
ContentCard: изменен тег используемый по умолчанию для ренедеринга компонента с
div
наli
(#7520) -
CellButton: свойство
mode
заменено наappearance
со значениями'accent' | 'neutral' | 'negative'
, также дляappearance="accent"
(a.k.amode="primary"
) возвращён токен--vkui--color_text_accent
, а вот при комбинации сcentered
применяется--vkui--color_text_accent_themed
(#7684)Пример миграции
<CellButton - mode="danger" + appearance="negative" > Создать что-нибудь </CellButton> <CellButton - mode="primary" + appearance="accent" > Создать что-нибудь </CellButton>
-
FormItem: у под-компонента
FormItem.TopLabel
свойствоmultiline
было удалено, теперь свойствоtopMultiline
устанавливается у компонентFormItem
(#7578)Пример миграции
<FormItem + topMultiline top={ <FormItem.Top> - <FormItem.TopLabel htmlFor="about" multiline>Дополнительная информация</FormItem.TopLabel> + <FormItem.TopLabel htmlFor="about">Дополнительная информация</FormItem.TopLabel> <FormItem.TopAside>0/100</FormItem.TopAside> </FormItem.Top> } > <div/> </FormItem>
-
Flex: изменена последовательность отступов в свойстве
gap
на[row, column]
(#7550)Пример миграции
<Flex direction="column" - gap={[20, 10]} + gap={[10, 20]} align="center" > <div/> <div/> </Flex>
-
Header: свойство
mode
было удалено. Логика удаления свойстваmode
(#7863)Таблица миграции значений
v6 v7 size="l" mode="primary"
size="xl"
size="m" mode="primary"
size="m"
mode="tertiary"
size="m"
mode="secondary"
size="s"
-
HorizontalScroll: свойство
inline
удалено и теперь применяется по умолчанию. Если вы использовали дополнительные обертки, чтобы выравнивать ячейки внутри компонента, просьба пересмотреть их использование (#7582) -
HorizontalCellShowMore: свойство
compensateLastCellIndent
удалено. Если вы использовали дополнительные обертки внутриHorizontalScroll
, чтобы выравнивать ячейки внутри компонента, просьба пересмотреть их использование и размещатьHorizontalCellShowMore
на том же уровне вложенности, что и остальные ячейки вHorizontalScroll
(#7582) -
Image: у под-компонента
Image.Overlay
свойствоdisableInteractive
было удалено, вместо него теперь можно просто не прокидывать свойствоonClick
(#7628) -
ScreenSpinner: удалено свойство
size
(#7523)Пример миграции
<ScreenSpinner state="loading" - size="regular" /> <ScreenSpinner.Container> - <ScreenSpinner.Loader size="small" /> + <ScreenSpinner.Loader /> <ScreenSpinner.SwapIcon /> </ScreenSpinner.Container>
-
SimpleGrid: изменена последовательность отступов в свойстве
gap
на[row, column]
(#7550)Пример миграции
<SimpleGrid columns={2} - gap={[20, 10]} + gap={[10, 20]} align="center" > <div/> <div/> </SimpleGrid>
-
Spacing: удален вариант значения пропа size
3xs
, вместо него можно использовать2xs
, совпадающий по значению (#7634)Пример миграции
- <Spacing size="3xs" /> + <Spacing size="2xs" />
💅 CustomScrollView: JS → CSS
Так как дизайн не документирует поведение ползунка и полосы прокрутки, было решено перейти на использование системного поведения
и тем самым облегчить компонент за счёт стилизации прокрутки полностью через CSS (Firefox < 64 стилизация останется браузерной) (#7703).
Note
Если по какой-то причине вам всё же нужна JS-реализация, то советуем присмотреться к готовой библиотеке react-custom-scrollbars или к другим альтернативам.
В связи с этим:
-
удалены свойства
windowResize
,autoHideScrollbar
,autoHideScrollbar
(#7703)Пример миграции
<CustomScrollView className={"className"} - windowResize - autoHideScrollbar - autoHideScrollbarDelay={1000} enableHorizontalScroll > ... </CustomScrollView>
-
удалено свойство
boxRef
, вместо него можно использовать свойствоgetRootRef
(#7703)Пример миграции
<CustomScrollView className={"className"} - boxRef={ref} + getRootRef={ref} enableHorizontalScroll > ... </CustomScrollView>
-
добавлено свойство
scrollbarHidden
для скрытия скроллбара (#7703) -
CustomSelect: удалены свойства
autoHideScrollbar
,autoHideScrollbar
(#7703)Пример миграции
<CustomSelect id="select-type-select-id" value={selectType} placeholder="Не задан" options={selectTypes} - autoHideScrollbar - autoHideScrollbarDelay={1500} onChange={(e) => setSelectType(e.target.value)} />
-
ChipsSelect: удалены свойства
autoHideScrollbar
,autoHideScrollbar
(#7703)Пример миграции
<ChipsSelect id="colors" value={selectedColors} onChange={setSelectedColors} options={colors} - autoHideScrollbar - autoHideScrollbarDelay={1500} placeholder="Не выбраны" creatable="Добавить цвет" allowClearButton={true} />
-
Select: удалены свойства
autoHideScrollbar
,autoHideScrollbar
(#7703)Пример миграции
<Select id="select-type-select-id" value={selectType} placeholder="Не задан" options={selectTypes} - autoHideScrollbar - autoHideScrollbarDelay={1500} onChange={(e) => setSelectType(e.target.value)} />
🧩 Остальные изменения в компонентах
-
Типографика: теперь используется
useAccentWeight = false
по умолчанию. Когда дополнительно требуется переопределить тип начертания текста с помощью свойстваweight
-VKUI
использует токеныfontWeightBase*
. Чтобы включитьfontWeightAccent*
токены, нужно использовать свойствоuseAccentWeight
(#7633) -
Button: изменен цвет компонента при
appearance="overlay"
иmode="secondary"
(#7661)
-
Calendar: свойство
onClose
переименовано наonDoneButtonClick
(#7880)Пример миграции
<Calendar - onClose={() => void 0} + onDoneButtonClick={() => void 0} />
-
CellButton: свойство
mode
заменено наappearance
со значениями'accent' | 'neutral' | 'negative'
, также дляappearance="accent"
(a.k.amode="primary"
) возвращён токен--vkui--color_text_accent
, а вот при комбинации сcentered
применяется--vkui--color_text_accent_themed
(#7684)Пример миграции
<CellButton - mode="danger" + appearance="negative" > Создать что-нибудь </CellButton> <CellButton - mode="primary" + appearance="accent" > Создать что-нибудь </CellButton>
-
Counter: изменены значения свойства
mode
(#7919)Таблица миграции значений
v6 v7 mode="inherit"
без изменений mode="primary"
mode="primary" appearance="accent"
mode="secondary"
mode="primary" appearance="neutral"
mode="prominent"
mode="primary" appearance="accent-red"
mode="contrast"
mode="contrast" appearance="accent"
-
PanelHeader: теперь не переопределяет цвет компонента
Spinner
, поэтому, если вы использовали компонентSpinner
внутриPanelHeader
, передавайте<Spinner noColor />
(#7820) -
Flex: изменена последовательность отступов в свойстве
gap
на[row, column]
(#7550)Пример миграции
<Flex
direction="column"
- gap={[20, 10]}
+ gap={[10, 20]}
align="center"
>
<div/>
<div/>
</Flex>
-
FormItem: у под-компонента
FormItem.TopLabel
свойствоmultiline
было удалено, теперь свойствоtopMultiline
устанавливается у компонентFormItem
(#7578)Пример миграции
<FormItem + topMultiline top={ <FormItem.Top> - <FormItem.TopLabel htmlFor="about" multiline>Дополнительная информация</FormItem.TopLabel> + <FormItem.TopLabel htmlFor="about">Дополнительная информация</FormItem.TopLabel> <FormItem.TopAside>0/100</FormItem.TopAside> </FormItem.Top> } > <div/> </FormItem>
-
HorizontalScroll: свойство
inline
удалено и теперь применяется по умолчанию. Если вы использовали дополнительные обертки, чтобы выравнивать ячейки внутри компонента, просьба пересмотреть их использование (#7582) -
HorizontalCellShowMore: свойство
compensateLastCellIndent
удалено. Если вы использовали дополнительные обертки внутриHorizontalScroll
, чтобы выравнивать ячейки внутри компонента, просьба пересмотреть их использование и размещатьHorizontalCellShowMore
на том же уровне вложенности, что и остальные ячейки вHorizontalScroll
(#7582) -
Image: у под-компонента
Image.Overlay
свойствоdisableInteractive
было удалено, вместо него теперь можно просто не прокидывать свойствоonClick
(#7628) -
Link: теперь для передачи иконок следует использовать параметры
before
иafter
, CSS свойства, которые через каскад задавались переданным иконкам вchildren
, удалены (#7957)Пример миграции
<Link href="#" + after={<Icon12Example />} > Текст ссылки - <Icon12Example /> </Link>
-
- у пресета
PanelHeaderClose
удалено свойствоchildren
. Теперь для прокидывания текста дляa11y
нужно прокидывать его в свойствоlabel
(#7874) - у пресета
PanelHeaderSubmit
удалено свойствоchildren
. Теперь для прокидывания текста дляa11y
нужно прокидывать его в свойствоlabel
(#7874) - у пресета
PanelHeaderEdit
удалены свойстваchildren
иlabel
. Вместоlabel
можно использовать свойстваdoneLabel
иeditLabel
. Свойствоchildren
не использовалось. (#7874) - у пресета
PanelHeaderBack
удалено свойствоchildren
. Теперь для прокидывания текста дляa11y
нужно прокидывать его в свойствоlabel
. Логика отображенияlabel
осталась как была, в отличие от других пресетов. Также для более точно настройкиlabel
были добавлены свойстваhideLabelOnVKCom
иhideLabelOnIOS
, чтобы можно было скрыватьlabel
на соответствующей платформе.
- у пресета
-
Select: для указания невыбранного состояния теперь необходимо использовать
null
вместоundefined
или пустой строки. То же самое относится и к CustomSelect и NativeSelect (#7822) -
-
удалено свойство
size
(#7523)Пример миграции
<ScreenSpinner state="loading" - size="regular" /> <ScreenSpinner.Container> - <ScreenSpinner.Loader size="small" /> + <ScreenSpinner.Loader /> <ScreenSpinner.SwapIcon /> </ScreenSpinner.Container>
-
удалён
a11y
-текст по умолчанию, передавайте нужный текст вchildren
илиlabel
свойства (#7821)
-
-
SimpleGrid: изменена последовательность отступов в свойстве
gap
на[row, column]
(#7550)Пример миграции
<SimpleGrid columns={2} - gap={[20, 10]} + gap={[10, 20]} align="center" > <div/> <div/> </SimpleGrid>
-
Spacing: удален вариант значения пропа size
3xs
, вместо него можно использовать2xs
, совпадающий по значению (#7634)Пример миграции
- <Spacing size="3xs" /> + <Spacing size="2xs" />
Новые компоненты
- Добавлен экспорт
FloatingArrow
, использующийся компонентамиPopover
,Tooltip
,Popper
(#7977)
Улучшения
-
Добавлен экспорт
AppRootPortal
(#7996) -
Добавлен экспорт типа
FloatingPlacementWithAuto
(#7810) -
Checkbox: добавлена возможность передавать альтернативные иконки (#7608, спасибо @fuel-coffee ❤️)
-
ChipsInput: импортированы типы
ChipOptionValue
иChipOptionLabel
(#7892) -
CustomScrollView: импортирован тип
CustomScrollViewProps
(#7892) -
Flex:
-
Header: добавлены значения для свойства size:
's'
и'xl'
(#7863) -
- добавлено новое свойство
TitleComponent
, для изменения типографического элементаtitle
(#8001) - значения
size
расширены до's' | 'm' | 'l' | 'xl' | 'auto' | number
(#7807) - добавлено свойство
textAlign
для выравнивания типографических элементов (#7980) - добавлено свойство
noPadding
, отключающее отступы у крайних элементов (#7980)
- добавлено новое свойство
-
- теперь можно использовать без
ModalRoot
(для рендера в портале можно обернуть вAppRootPortal
); (#6759) - изменилось значение по умолчанию у свойств
settlingHeight
–75
→50
; (#6759) - добавлено свойство
keepMounted
; (#6759) - добавлено свойство
footer
; (#6759) - добавлено свойство
disableContentPanningGestureProp
; (#6759) - расширен тип
onClose
до(reason: ModalPageCloseReason, event?: UIEvent<HTMLElement>) => void
. (#6759)
- теперь можно использовать без
-
EllipsisText: у компонента был добавлен атрибут
title
, который отображает весь текст, переданный в компонент. Его также можно отключить, передав параметрdisableNativeTitle
(#7681) -
updateModalHeight()
помечен как@depreacted
, т.к. в нём больше нет необходимости –ModalPage
, приdynamicContentHeight
, теперь автоматически подстраиваются под контент; (#6759)registerModal()
помечен как@depreacted
, т.к. изменилась логика работы компонента – теперьModalPage
иModalCard
ориентируется на контекст, создаваемыйModalRoot
; (#6759)- добавлено свойство
usePortal
. (#6759)
-
Link: появился параметр
noUnderline
, отключающий подчеркивание при наведении (#7957) -
Popover: расширен тип свойства
restoreFocus
доboolean | 'anchor-element' | HTMLElement
для указания на какой элемент будет возвращен фокус после закрытияPopover
. Полезно для кейса сPopover
сtrigger="hover"
, при установкеrestoreFocus="anchor-element"
фокус всегда будет возвращаться в якорный элемент (#7806) -
ScreenSpinner: добавлена возможность прокинуть иконку для
state="custom"
с помощью свойстваcustomIcon
(#7523) -
Select: в колбэк
onChange
помимо ChangeEvent теперь прокидывается новое значение вторым аргументом. Рекомендуется использовать именно второй аргумент. То же самое относится и к CustomSelect и NativeSelect (#7822)Пример
<Select id="select-type-select-id" value={selectType} placeholder="Не задан" options={selectTypes} - onChange={e => setSelectType(e.target.value)} + onChange={(_, newType) => setSelectType(newType)} />
-
SimpleGrid: свойства теперь наследуются из
RootComponentProps
(#7700) -
Spacing: добавлена возможность передать
css
-переменную вsize
(#7955)
Хуки
useScrollLock
: теперь при<AppRoot scroll="global" />
в<html>
добавляетсяoverscroll-behavior: none
, чтобы избегать pull-to-refresh (#7881)useOrientationChange()
- Добавлен экспорт
usePatchChildren()
– хук позволяет пропатчить переданный компонент так, чтобы можно было получить ссылку на его DOM-элемент. Также есть возможность прокинуть в компонент дополнительные параметры. (#7812)
Исправления
- Исправлены ошибки в
Content Security Policy (CSP)
связанные с тем, что вCustomResizeObserver
создавалсяiframe
сsrc="javascript:void(0)"
, теперьiframe
создается без явного указанияsrc
, что позволяет браузеру самостоятельно заполнить это поле. Значение по умолчанию для браузеров:src="about:blank"
(#7933) - При использовании нескольних компонентов блокирующих прокрутку, на демонтировании одного из них могло происходить разблокирование прокрутки (#7817)
- Поправлена проблема с
Avatar.Overlay
для Next.JS (#7984) - В некоторых компонентах свойство
style
имело мало приоритетности (#7854) - Button: кнопка со свойством
loading
была кликабельна (#7830) - Calendar: исправлены
active
/hover
-состояния у дня календаря (#7738) - CalendarRange: поправлены моргания промежутка при выборе (#7750)
- CustomSelect: Исправлена проблема с элементами списка у которых
value=""
issue #7696 (#7822) - DateInput: инициализируем секунды и миллисекунды (часы и минуты при вводе без времени) нулевыми значениями при ручном вводе даты (#7872)
- EllipsisText: не срабатывал параметр
Component
(#7909) - Gallery:
- исправлена ошибка при отсутствии слайдов в режиме
looped
(#7686) - исправлено мерцание при переключении слайдов (#7842)
- не работало переключение слайдов в условиях, когда общая ширина слайдов меньше контейнера, но за счёт отступа из-за выравнивания по центру (
align="center"
) слайды немного не помещаются в контейнере. (#7862) - теперь во время
drag
происходит остановка автопереключения слайдов (#7877) - исправлена ошибка при отсутствии слайдов в режиме
looped
(#7686)
- исправлена ошибка при отсутствии слайдов в режиме
- Group: исправлено отображение сепаратора на iPhone 15 (#7930)
- HorizontalCell: добавлено корректное вычисление ширины внутреннего контента (#7916)
- HorizontalScroll: исправлена проблема с отсутствием скрола при наведении на стрелки (#7882)
- Placeholder: при
stretched
режиме больше не выставляетсяpadding-block: inherit
(#7583) - RichCell: поправлена проблема с длинным текстом и выходом за границы компонента (#7730)
- Search: исправлен отступ при
Group
в режимеmode="plain"
(#7962) - SimpleCell : стили
SimpleCell
перебивают стилиCellButton
в cssm сборке (#7737) - Tappable:
Документация
- Дополнен блок о переопределение темы через
AppearanceProvider
информацией о тонкостях работы некоторых компонентов (#7584) - Раздел CSS Modules дополнен информацией про использование пакета с
'css-loader' >= 7.0.0
(#7668) - Flex: добавили возможность не задавать свойство
gap
(#7899)
Зависимости
- date-fns обновлён с 4.0.0 до 4.1.0 (#7645)
- @vkontakte/vkui-floating-ui обновлён с 2.1.1 до 2.1.3 (#7649)
- @vkontakte/vkui-tokens обновлён с 4.53.3 до 4.56.1 (#7800, #7991, #8024)
- @vkonktate/vkjs обновлён с 1.3.0 до 2.0.1 (#7939)