v7.0.0
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" />
💅 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) -
-
изменен цвет компонента при
appearance="overlay"иmode="secondary"(#7661)
-
изменен цвет компонента в состоянии
mode="primary"иappearance="neutral", при миграции рекомендуется выставлятьmode="secondary"приappearance="neutral"(#7802)
Пример миграции
<Button appearance="neutral" + mode="secondary" />
-
-
Calendar: свойство
onCloseпереименовано наonDoneButtonClick(#7880)Пример миграции
<Calendar - onClose={() => void 0} + onDoneButtonClick={() => void 0} />
-
Card: изменен тег используемый по умолчанию для ренедеринга компонента с
divнаli(#7520) -
CardGrid: изменен тег используемый по умолчанию для ренедеринга компонента с
divнаul(#7520) -
CardScroll: изменен тег используемый по умолчанию для ренедеринга компонента с
divнаul(#7520) -
ContentCard: изменен тег используемый по умолчанию для ренедеринга компонента с
divнаli(#7520) -
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" -
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) -
Link: теперь для передачи иконок следует использовать параметры
beforeиafter, CSS свойства, которые через каскад задавались переданным иконкам вchildren, удалены (#7957)Пример миграции
<Link href="#" + after={<Icon12Example />} > Текст ссылки - <Icon12Example /> </Link>
-
PanelHeader: теперь не переопределяет цвет компонента
Spinner, поэтому, если вы использовали компонентSpinnerвнутриPanelHeader, передавайте<Spinner noColor />(#7820) -
- у пресета
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на соответствующей платформе.
- у пресета
-
-
удалено свойство
size(#7523)Пример миграции
<ScreenSpinner state="loading" - size="regular" /> <ScreenSpinner.Container> - <ScreenSpinner.Loader size="small" /> + <ScreenSpinner.Loader /> <ScreenSpinner.SwapIcon /> </ScreenSpinner.Container>
-
удалён
a11y-текст по умолчанию, передавайте нужный текст вchildrenилиlabelсвойства (#7821)
-
-
Select: для указания невыбранного состояния теперь необходимо использовать
nullвместоundefinedили пустой строки. То же самое относится и к CustomSelect и NativeSelect (#7822) -
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)
- исправлена ошибка при отсутствии слайдов в режиме
- 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 обновлён с 0.2.1 до 0.2.3 (#7939)