-
Notifications
You must be signed in to change notification settings - Fork 185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BREAKING CHANGE] feat: SSR, AppRoot: get rid of body classes mutations #7739
base: master
Are you sure you want to change the base?
Conversation
Reuse AppRoot styles in AppRootPortal to share same tokens
We don't need to use it on portals as modals will disappear
Simplify logic of helper functions like shouldUsePortal resolvePortalContainer
As it creates unnesessary rerender and can't work with creation of portalRoot dom element on demand
To avoid rendering modal/popout in SplitLayout during SSR and after hydration
We keep render ModalRoot in the SplitLayout container right after content, but now we use portal for it. It means now, that users can put ModalRoot anywhere in the app, they are not limited by SplitLayout modal prop Styles from PopoutRoot about modal fixed layout and z-index are moved directly to ModalRoot AppPortalWrapper from SplitLayout
In full mode we render Modal/Popout right after content In other modes we render Modal/Popout as a child of the body
Components like Alert/ScreenSpinner/ActionSheet and ModalRootDesktop
size-limit report 📦
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
e2e tests
|
👀 Docs deployed
Commit 84d05ce |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #7739 +/- ##
==========================================
- Coverage 95.14% 95.12% -0.02%
==========================================
Files 383 385 +2
Lines 11343 11338 -5
Branches 3718 3720 +2
==========================================
- Hits 10792 10785 -7
- Misses 551 553 +2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
Описание
Убираем мутацию body из AppRoot.
В том числе избавляемся от добавления в body
portalRoot
при первом рендере.Изменения
AppRoot
больше не выставляет самостоятельно классы.vkui
наhtml
теге и.vkui__root
на точке монтированияVKUI
.Вместо этого предлагается выставлять эти теги пользователю самостоятельно, либо применить стили, подобные которым мы теперь используем в
.vkui
и.vkui__root
. В основном они нужны для того, чтобы уbody
убрать браузерные отступы и сделать так, чтобыVKUI
занимало всё пространство контейнера.VKUI/packages/vkui/src/styles/common.css
Lines 1 to 17 in 84d05ce
VKUI
, которые раньше вешались на body теперь вешаются на контейнерAppRoot
. Так какAppRoot
это точка входа вVKUI
приложение такой подход приемлем.Чтобы компоненты, рендерящиеся через порталы вне
DOM
дереваAppRoot
, тоже имели доступ к токенам и стилямAppRoot
был создан компонентAppRootStyleContainer
. Он используется как вAppRoot
, так и как обертка для порталов, в компонентеAppRootPortal
.AppRootStyleContainer
через контекст знает какой сейчас режим (mode
), какойappearance
, поэтому в модалках и других плавающих элементах всегда будет применена верная цветовая схема и токены.usePortal
свойством.portalRoot
контейнер для модалок в режимеembedded
, лежащий как последний дочерний элементbody
, больше не создается при первом рендере. Он создаётся вbody
только если модалку или поповер надо отрендерить, и продолжает жить вDOM
покаAppRoot
не размонтируется. Используется как точка монтирования всем модалками и поповерами, если надо отредерить что-то внеDOM
дереваAppRoot
.full
. Они теперь всегда рендеряться по умолчанию через портал в специальный контейнер внутриSplitLayout
, после основного контента. Рендер через портал позволяет избавится от ещё одно появляющегося при первом рендере DOM элемента, если необходимо использовать модалки.popout
иmodal
изSplitLayout
.Так как модалки и попауты (
Alert
,ScreenSpinner
,ActionSheet
) рендеряться через портал в то же место что и раньше, то надобность в явной передачеModalRoot
иpopout
вSplitLayout
отпадает.Это позволяет избавить пользователей от необходимости обязательно передавать
ModalRoot
вSplitLayout
и держать стейт переключения модалок на уровнеSplitLayout
.Теперь
ModalRoot
можно объявить в любой части приложения, как иAlert
,ScreenSpinner
иActionSheet
.Также можно иметь несколько
ModalRoot
если требудется по смыслу разделить модалки.usePortal
для рендеринга через портал в SplitLayout за контентом.Release notes