,
ol: (props) => ,
li: (props) => ,
@@ -26,7 +26,7 @@ const DEFAULT_COMPONENTS: MDXComponents = {
pre: Pre,
code: Code,
strong: (props) => ,
- wrapper: Layout,
+ wrapper: Main,
Overview,
Callout,
};
diff --git a/packages/vkui-docs-theme/src/mdx/Layout/Layout.module.css b/packages/vkui-docs-theme/src/wrappers/content/index.module.css
similarity index 56%
rename from packages/vkui-docs-theme/src/mdx/Layout/Layout.module.css
rename to packages/vkui-docs-theme/src/wrappers/content/index.module.css
index fc2d614f5a..9dcea099f4 100644
--- a/packages/vkui-docs-theme/src/mdx/Layout/Layout.module.css
+++ b/packages/vkui-docs-theme/src/wrappers/content/index.module.css
@@ -9,17 +9,16 @@
max-inline-size: var(--vkui_docs--max-width);
}
-.content {
- padding-block: 36px 60px;
+.blog {
+ max-inline-size: var(--vkui_docs_blog--max-width);
+ padding-block-start: var(--vkui--spacing_size_4xl);
+ padding-block-end: 60px;
padding-inline: 40px;
- inline-size: 100%;
- min-inline-size: 0;
- min-block-size: calc(100vh - var(--vkui_docs--navbar-height));
+ flex-direction: column;
}
-@media (--viewWidth-tablet), (--viewWidth-tabletMinus) {
- .content {
+@media (--viewWidth-smallTabletMinus) {
+ .blog {
padding-inline: var(--vkui--size_base_padding_horizontal--regular);
- padding-block-start: 32px;
}
}
diff --git a/packages/vkui-docs-theme/src/wrappers/content/index.tsx b/packages/vkui-docs-theme/src/wrappers/content/index.tsx
new file mode 100644
index 0000000000..577b3138aa
--- /dev/null
+++ b/packages/vkui-docs-theme/src/wrappers/content/index.tsx
@@ -0,0 +1,36 @@
+import type * as React from 'react';
+import { classNames } from '@vkontakte/vkui';
+import { Sidebar } from '../../components';
+import { useConfig } from '../../contexts';
+import styles from './index.module.css';
+
+export function ContentWrapper({ children }: { children: React.ReactNode }) {
+ const config = useConfig();
+ const {
+ activeThemeContext: themeContext,
+ docsDirectories,
+ flatDirectories,
+ directories,
+ } = config.normalizePagesResult;
+
+ const isFullLayout = themeContext.layout === 'full';
+ const isBlog = config.isBlog;
+ const Component = isBlog ? 'main' : 'div';
+
+ return (
+
+
+ {/* TODO [docs] (@BlackySoul): добавить компонент */}
+ {/* TODO [docs] (@BlackySoul): */}
+ {children}
+
+ );
+}
diff --git a/packages/vkui-docs-theme/src/wrappers/index.ts b/packages/vkui-docs-theme/src/wrappers/index.ts
index f95471eb62..24b59f460d 100644
--- a/packages/vkui-docs-theme/src/wrappers/index.ts
+++ b/packages/vkui-docs-theme/src/wrappers/index.ts
@@ -1 +1,2 @@
export { VKUIWrapper } from './vkui';
+export { ContentWrapper } from './content';
diff --git a/packages/vkui-docs-theme/styles/constants.css b/packages/vkui-docs-theme/styles/constants.css
index d072ad6949..493dd41df8 100644
--- a/packages/vkui-docs-theme/styles/constants.css
+++ b/packages/vkui-docs-theme/styles/constants.css
@@ -2,6 +2,7 @@
:root {
--vkui_docs--navbar-height: 60px;
--vkui_docs--max-width: 1440px;
+ --vkui_docs_blog--max-width: 1024px;
}
@media (--viewWidth-desktopPlus) {
diff --git a/website/pages/_meta.tsx b/website/pages/_meta.tsx
index 96a7b91a4f..087ed9bf24 100644
--- a/website/pages/_meta.tsx
+++ b/website/pages/_meta.tsx
@@ -1,10 +1,7 @@
export default {
- index: {
+ overview: {
type: 'page',
- title: 'Главная',
- theme: {
- layout: 'raw',
- },
+ title: 'О системе',
},
components: {
type: 'page',
@@ -22,8 +19,12 @@ export default {
href: 'https://vkcom.github.io/vkui-tokens/',
newWindow: true,
},
- overview: {
+ blog: {
type: 'page',
- title: 'О системе',
+ title: 'Блог',
+ theme: {
+ breadcrumb: false,
+ layout: 'full',
+ },
},
};
diff --git a/website/pages/blog.mdx b/website/pages/blog.mdx
new file mode 100644
index 0000000000..27dba91e8c
--- /dev/null
+++ b/website/pages/blog.mdx
@@ -0,0 +1,13 @@
+---
+type: posts
+title: Blog
+---
+
+
+# Блог
+
+Здесь мы будем делиться с вами наиболее важными новостями, планами и релизами нашей библиотеки,
+а также постараемся собирать лучшие советы и практики в цикл статей,
+которые позволят ускорить процесс разработки ваших приложений.
+
+
diff --git a/website/pages/blog/_meta.tsx b/website/pages/blog/_meta.tsx
new file mode 100644
index 0000000000..725ff3f30a
--- /dev/null
+++ b/website/pages/blog/_meta.tsx
@@ -0,0 +1,5 @@
+export default {
+ '*': {
+ display: 'hidden',
+ },
+};
diff --git a/website/pages/blog/tags/[tag].mdx b/website/pages/blog/tags/[tag].mdx
new file mode 100644
index 0000000000..b9cad002d6
--- /dev/null
+++ b/website/pages/blog/tags/[tag].mdx
@@ -0,0 +1,23 @@
+---
+type: tag
+---
+
+import { TagName, TagTitle } from '@vkontakte/vkui-docs-theme';
+
+
+
+# Посты по теме “”
+
+
+
+export { getStaticPathsTags as getStaticPaths } from '@vkontakte/vkui-docs-theme';
+
+export function getStaticProps({ params }) {
+ return {
+ props: {
+ ssg: {
+ tag: params?.tag,
+ },
+ },
+ };
+}
diff --git a/website/pages/blog/testing-vkui-apps.mdx b/website/pages/blog/testing-vkui-apps.mdx
new file mode 100644
index 0000000000..0b322803f5
--- /dev/null
+++ b/website/pages/blog/testing-vkui-apps.mdx
@@ -0,0 +1,181 @@
+---
+type: post
+title: Тестирование VKUI-приложений
+date: 2024/12/24
+description: Разберём основные принципы тестирования приложений на базе VKUI.
+tag: testing
+image: /blog/vkui-testing.png
+---
+
+## Тестирование с помощью Jest и React Testing Library
+
+Несмотря на то, что существует несколько различных инструментов по тестированию React-приложений,
+мы рекомендуем использовать `Jest` и `React Testing Library` для функционального или unit-тестирования VKUI-приложений.
+В данном руководстве мы рассмотрим основные подходы к тестированию, используя данный стек технологий.
+Его же мы применяем сами для тестирования компонентов VKUI.
+
+
+ Предполагается, что вы уже обладаете базовыми знаниями работы с выбранными инструментами, если это
+ не так, то обратитесь к документации [Jest](https://jestjs.io/) и [React Testing
+ Library](https://testing-library.com/docs/react-testing-library/intro). В данном руководстве мы
+ сосредоточимся именно на специфичных настройках под VKUI.
+
+
+### Jest
+
+Специфичной настройки `Jest` для тестирования VKUI-компонентов не требуется, но могут возникнуть трудности
+с рядом компонентов, которые опираются на браузерное API. Подробнее об этом написано в [секции ниже](#special-components).
+
+Для корректной работы VKUI-компонентов необходимо использовать обязательную обёртку, об этом упоминается
+в [Быстром старте](/overview/quick-start#step4).
+
+### React Testing Library
+
+Для того, чтобы тесты было проще поддерживать, рекомендуется избегать завязки на детали имплементации компонентов.
+Не полагаясь на внутреннее устройство, вы делаете свои тесты более устойчивыми к изменениям структуры в VKUI,
+которые могут произойти даже в рамках минорных изменений.
+В VKUI мы стараемся снабжать все компоненты функциональными ролями и атрибутами или обеспечивать их поддержку,
+поэтому в связке с `React Testing Library`, которая позволяет работает с настоящим DOM-представлением, вы можете
+взаимодействовать с компонентами максимально близко к пользовательскому опыту.
+
+Например, компонент `Checkbox` по умолчанию имеет `role="checkbox"`, поэтому вы можете найти этот компонент,
+используя специальное API, предоставляемое `React Testing Library`:
+
+```jsx
+import { render, screen } from '@testing-library/react';
+
+// ✅ - используем функциональную роль
+render(Text);
+const checkbox = screen.getByRole('checkbox');
+
+// ❌ - завязываемся на класс, который может измениться
+render(Text);
+const checkbox = document.querySelector('.CheckboxInput__input');
+```
+
+Обратите внимание, что в случае, если компонент представляет собой композицию более мелких компонентов,
+не всегда возможно опираться на функциональную роль или атрибут, поэтому в компонент есть возможность прокинуть
+`data-testid` для нужной части. Например:
+
+```jsx
+import { render, screen } from '@testing-library/react';
+
+render();
+
+const prevButton = screen.getByTestId('prevButton');
+expect(prevButton).toBeDisabled();
+```
+
+Если вы все-таки не можете протестировать нужную часть без необходимости завязываться на, например,
+внутренний класс, создайте нам [feature request](https://github.com/VKCOM/VKUI/issues/new/choose) на Github.
+
+## Особые компоненты [#special-components]
+
+### Snackbar, Spinner, SplitCol
+
+Некоторые компоненты зависят от браузерного API, которое не реализовано в окружении `Jest`, поэтому для
+тестирования подобных компонентов вам необходимо предоставить `mock`-реализацию самостоятельно.
+Подробнее читайте в [этом руководстве](https://jestjs.io/docs/manual-mocks).
+
+### Select
+
+Так как VKUI стремится к мимикрии под различные платформы, некоторые компоненты могут существенно отличаться
+в структуре. Например, это справедливо для компонента `Select`, который на мобильных платформах (`android/iOS`)
+представляет собой нативный элемент и на десктопе его кастомную реализацию.
+
+Из-за поддержки SSR мы не всегда можем заранее знать, какое представление необходимо отрисовать.
+Если попытаться отрендерить `Select` без указания платформы, то в DOM-представлении у нас окажется две реализации.
+Чтобы избежать ошибок, проще всего обернуть `Select` в `PlatformProvider` с указанием `vkcom` платформы для
+`web`-реализации или `android` для мобильной платформы.
+
+```jsx
+import { render } from '@testing-library/react';
+import { PlatformProvider, Select } from '@vkontakte/vkui';
+
+// тестируем web-представление
+render(
+
+
+ ,
+);
+
+// тестируем мобильную платформу
+render(
+
+
+ ,
+);
+```
+
+Для тестирования мобильного представления, вы можете воспользоваться стандартным API от `React Testing Library` и `Testing Library`:
+
+```jsx
+import { render, screen } from '@testing-library/react';
+import { userEvent } from './testing/helpers';
+import { PlatformProvider, Select } from '@vkontakte/vkui';
+
+render(
+
+
+ ,
+);
+
+await userEvent.selectOptions(screen.getByTestId('target'), ['0']);
+expect(screen.getByTestId('target')).toHaveValue('0');
+```
+
+
+ Обратите внимание, мы не используем функцию `userEvent` напрямую из `@testing-library/user-event`,
+ вместо этого импортируется обёртка, которая адаптирует функцию под работу в `Jest`-окружении:
+
+```jsx filename="./testing/helpers"
+import userEventLib from '@testing-library/user-event';
+/**
+ * Переконфигурируем работу userEvent под jest
+ *
+ * https://github.com/testing-library/user-event/issues/833
+ */
+export const userEvent = userEventLib.setup({ advanceTimers: jest.advanceTimersByTime });
+```
+
+
+
+Для тестирования `web`-реализации воспользуйтесь более низкоуровневым `API` от `React Testing Library`:
+
+```jsx
+import { render, fireEvent, screen } from '@testing-library/react';
+import { PlatformProvider, Select } from '@vkontakte/vkui';
+
+render(
+
+
+ ,
+);
+
+fireEvent.click(screen.getByTestId('labelTextTestId'));
+const unselectedOption = screen.getByRole('option', { selected: false, name: 'Josh' });
+fireEvent.mouseEnter(unselectedOption);
+fireEvent.click(unselectedOption);
+
+expect(screen.getByTestId('labelTextTestId').textContent).toEqual('Josh');
+```
+
+
+ Обратите внимание, выше мы используем `labelTextTestId` вместо просто `data-testid`, это позволяет
+ эмулировать работу мыши или тач-устройства и быстрее получить доступ к выбранной опции.
+
+
diff --git a/website/pages/blog/vkui-v7-release.mdx b/website/pages/blog/vkui-v7-release.mdx
new file mode 100644
index 0000000000..a03f48b669
--- /dev/null
+++ b/website/pages/blog/vkui-v7-release.mdx
@@ -0,0 +1,79 @@
+---
+type: post
+title: Релиз VKUI v7
+date: 2024/12/24
+description: Версия VKUI v7 вышла из беты и теперь доступна для широкого использования.
+tag: release
+image: /blog/v7-release.png
+---
+
+Спешим сообщить, что мы завершили бета-тестирование VKUI v7 и теперь эта версия полностью стабильна.
+Это означает, что мы прекращаем поддержку версии v6 и рекомендуем всем пользователям библиотеки обновиться,
+чтобы иметь возможность использовать новые возможности и вовремя получать исправления.
+
+## ⚙️ Сборка
+
+- библиотека теперь поставляется только в `ESM`-формате, `CommonJS` сборка была удалена. `ESM` обрёл
+ достаточно широкую поддержку, поэтому мы решили отказаться от устаревшего формата.
+
+- поднята целевая версия `ECMAScript` для компиляции до `es2017`, а также подняты минимальные версии поддерживаемых браузеров:
+
+ ```
+ ChromeAndroid >= 63
+ iOS >= 12
+ Chrome >= 63
+ Firefox >= 55
+ Edge >= 79
+ Opera >= 50
+ Safari >= 12
+ Samsung >= 8.2
+ ```
+
+ Это позволит нам использовать новое `API` без необходимости подключать полифиллы.
+
+- изменились названия `CSS`-классов, теперь они формируются на основе `CSS Modules`. В будущем мы бы хотели
+ отказаться от статичных классов, поэтому исключите их использование в своем коде.
+
+## 🧩 Компоненты
+
+У многих компонентов изменилось публичное `API`, это связано с тем, что мы стремимся улучшить
+разработческий опыт при общении с дизайном, и в этом релизе разом сократили расхождения по названиям параметров `React` с `Figma`.
+Так же мы избавились от `deprecated`-свойств и параметров и унифицировали `API` разных компонентов.
+
+### Модальные окна
+
+В новой версии мы существенно изменили подход к определению модальных окон и исправили бо́льшее количество багов.
+
+- `ModalPage`/`ModalCard` можно определять в любом месте приложения, без необходимости оборачивать в `ModalRoot`
+- `ModalRoot` теперь нужен только для последовательно открывающихся модальных окон, есть возможность создавать динамические модальные окна
+
+### SplitLayout
+
+Теперь этот компонент не является обязательным для использования при наличии в приложении всплывающих окон.
+Свойства `popout` и `modal` отмечены как `@deprecated` и будут удалены в следующем релизе.
+
+### DatePicker
+
+Данный компонент был удален в пользу `Input`, `Select` и `DateInput`. Для выбора подходящей замены мы
+рекомендуем руководствоваться следующим [обсуждением](https://github.com/VKCOM/VKUI/discussions/7070).
+
+### Типографика
+
+Мы изменили поведение по-умолчанию для всех типографических элементов - отключили использование акцентных начертаний,
+если вам необходимо вернуть прежнее поведение, то используйте `useAccentWeight={true}`.
+
+## 🌗 Светлая/темная тема
+
+Ранее для для указания светлой или тёмной темы мы использовали название `Appearance`,
+что совпадало с названием параметров некоторых компонентов (например, в компоненте `Button`), что могло путать,
+поэтому мы пришли к названию `ColorScheme` (так это свойство называется в CSS).
+
+В связи с этим изменились названия типов, хуков и провайдеров, которые отвечали за взаимодействие со светлой и темной темами.
+
+## 🚀 Хочу обновиться
+
+Если вы готовы обновиться, то рекомендуем начать с [инструкции по миграции](https://vkcom.github.io/VKUI/#/Migrations).
+Большинство изменений не придется делать вручную - у нас подготовлены автоматизации,
+о применении которых вы сможете узнать из инструкции выше.
+Если у вас возникнут какие-то сложности, вы всегда можете задать вопрос в [Дискуссиях](https://github.com/VKCOM/VKUI/discussions) на Github
+или в [публичном чате](https://vk.cc/c1CHgf) в VK Messenger.
diff --git a/website/pages/index.mdx b/website/pages/index.mdx
deleted file mode 100644
index cbfee35337..0000000000
--- a/website/pages/index.mdx
+++ /dev/null
@@ -1 +0,0 @@
-# UNDER CONSTRUCTION
diff --git a/website/public/blog/v7-release.png b/website/public/blog/v7-release.png
new file mode 100644
index 0000000000..5b507b4813
Binary files /dev/null and b/website/public/blog/v7-release.png differ
diff --git a/website/public/blog/vkui-testing.png b/website/public/blog/vkui-testing.png
new file mode 100644
index 0000000000..55df1f1b59
Binary files /dev/null and b/website/public/blog/vkui-testing.png differ