Skip to content
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

Group "plain" and "card" modes #1065

Merged
merged 17 commits into from
Oct 21, 2020
Merged

Group "plain" and "card" modes #1065

merged 17 commits into from
Oct 21, 2020

Conversation

danakt
Copy link
Contributor

@danakt danakt commented Oct 9, 2020

<Group mode="plain|card">

mode зависит от места нахождения:

В модалке всегда plain
Вне модалки зависит от sizeX: при REGULAR = card, при COMPACT = plain
Можно переопределить вручную передав проп

@danakt danakt changed the base branch from master to v4 October 9, 2020 14:04
@danakt danakt added the v4 label Oct 9, 2020
@ArthurStam ArthurStam marked this pull request as ready for review October 20, 2020 11:56
@ArthurStam ArthurStam requested a review from a team as a code owner October 20, 2020 11:56
@ArthurStam ArthurStam merged commit 2c1555c into v4 Oct 21, 2020
@ArthurStam ArthurStam deleted the feature/group-plain-card branch November 5, 2020 16:07
andrey-medvedev-vk added a commit that referenced this pull request Nov 28, 2024
…html elements (#7739)

На текущий момент при монтировании приложения в режиме `full/embedded` происходит автоматическое добавление классов:
- на `html` элемент добавляются классы:
  - токенов текущей темы,
  - класс `.vkui`, 
  - класс `layout` режима,
  - класс режима адаптивности.
  - добавляются css-переменные для задания [safeAreaInsets](https://developer.mozilla.org/en-US/docs/Web/CSS/env)
- на точку монтирования добавляется:
  - класс `.vkui__root`
  - класс `.vkui__embedded` для режима `embedded`
  - класс `layout` режима,
  - класс режима адаптивности.

В том числе при старте приложения в `body` тут же добавляется контейнер для монтирования плавающих элементов и в режиме `embedded` на него также вешаются css-переменные для задания [safeAreaInsets](https://developer.mozilla.org/en-US/docs/Web/CSS/env)

Всё это мешает нормальной работе `SSR`.

Требуется минимизировать кол-во изменений в DOM в рантайме при старте приложения. 
В идеале совсем исключить автоматическое добавление классов, или добавить возможность контролировать эту логику.

Решение
Перенести все классы и стили внутрь приложения, желательно на уровень `AppRoot` и ниже, чтобы реакт занимался добавлением этих классов, и DOM не менялся в процессе гидратации.

В процессе переноса открылись причины установки большинства классов на html:
  - для правильной установки цветовой схемы нам мало только задать правильный фон и цвета элементов в рамках AppRoot. 
  Для темной/светлой темы также нужный правильные цвета у системного скроллбара. А задать его можно лишь повесив на html элемент свойство `color-scheme` со значением токена `vkui`.
- А также нужен верный цвет фона у html элеменета:
   - для правильного фона при скролее в SplitLayout,
   - для того, чтобы при bounce эффекте при оверскролле на мобильных устройствах, или Safari появление html элемента не было заметно (так как по умолчанию у него цвет заданные браузером по умолчанию в зависимости от color-scheme)

Изменения
- Классы `.vkui` и `.vkui__root--embedded` теперь всегда выставляют фон.

 https://github.com/VKCOM/VKUI/blob/15120965bc40fa5a3a561dfacd10548eafc8d125/packages/vkui/src/styles/common.css#L31-L39
https://github.com/VKCOM/VKUI/blob/15120965bc40fa5a3a561dfacd10548eafc8d125/packages/vkui/src/styles/common.css#L48-L50
  Раньше это делалось только в режиме адаптивности `regular`, чтобы у `Group` в `regular` в режиме `card` был правильный фон. (добавлено было в этом PR #1065)
  https://github.com/VKCOM/VKUI/blob/b86be10e08bc392abb5537706c3712f55316e967/src/styles/styles.css#L126-L128
  Сейчас в этом для `Group` нету необходимости, так как фоном для `Group` управляет `Panel`
  https://github.com/VKCOM/VKUI/blob/3abc6371424e93bae3452812c74f6e8c86acf51e/packages/vkui/src/components/Panel/Panel.module.css#L91-L104
  Но совсем убрать фон у `.vkui `нельзя, так как в многоколоночном режиме `SplitLayout` видно фон `html` элемента , если чуть проскролить контент. Это потому, что все вложенные в `SplitLayout` компоненты вплоть до `Panel` имеют  `height: 100%`, то есть фон в итоге применяется только на 100% высоты экрана, а ниже фона уже нет. Это можно исправить заменив везде `height: 100%` на `min-height: 100%`, но тут нет гарантий, что ещё чего-нибудь не выстрелит, поэтому я бы этот рефакторинг сделал бы отдельно.
  
⚠️  Из-за этого изменения многие скриншотные тесты, в которых оберткой тестируемых компонентов был лишь `AppRoot` (без `View`, `Panel`), пришлось перезаписать, так как фон `html` поменялся с дефолтного цвета браузера на токены `.vkui`.

- В `AppRoot` c помощью свойства `disableSettingVKUIClassesInRuntime` появилась возможность отключить автоматическое выставление классов `.vkui`  на `html` и `.vkui__root/.vkui__root--embedded` на точке монтирования приложения в режиме `full/embedded`

Использовать это свойство стоит в режиме `SSR`, чтобы в рантайме `VKUI` этим на занимался.
Но можно и не отключать это поведение, главное, чтобы при SSR эти классы уже стояли там куда их выставляет `VKUI`, чтобы при гидратации изменений в классах страницы не произошло и браузеру не нужно было бы пересчитывать DOM и CSSOM.

В режиме `full` `.vkui` класс навешивается на `html` элемент, а `.vkui__root` на точку монтирования приложения.
В режиме `embedded` `.vkui__root` и `.vkui__root--embedded` навешиваются на точку монтирования приложения.

- Все остальные классы и токены, требуемые `VKUI`, которые раньше вешались на `html` или точку монтирования приложения, теперь вешаются на контейнер `AppRoot`. Так как `AppRoot` это точка входа в `VKUI` приложение, то такой подход приемлем.

  Чтобы компоненты, рендерящиеся через порталы вне `DOM` дерева `AppRoot`, тоже имели доступ к токенам и стилям `AppRoot` был создан компонент `AppRootStyleContainer`. Он используется как в `AppRoot`, так и как обертка для порталов (а значит модалок и попапов), в компоненте `AppRootPortal`.
  `AppRootStyleContainer` через контекст знает какой сейчас режим (`mode`), какой `appearance`, поэтому в модалках и других плавающих элементах всегда будет применена верная цветовая схема и токены.

- `AppRootPortal` был переработан

Упрощены проверки cвязанные с `usePortal` свойством.

`portalRoot`, контейнер для порталов всех плавающих элементов больше не создается при первом рендере.
  Теперь по умолчанию все плавающие элементы рендерятся в `document.body` через `createPortal`.
  Это возможно за счёт обертки `AppRootStyleContainer`, которая прокидывается в портал вместе с плавающим элементом и гарантирует наличи нужных токенов и классов у плавающих элементов.
В `AppRoot` всё также можно передать свой `portalRoot` как `ref`, так и как `HTML` элемент.

- Пропы `popout` и `modal` из `SplitLayout` помечены как `@deprecated`.

  Так как мы теперь можем обернуть плавающие элементы в токены и классы `AppRoot` при рендере через портал, то отпадает надобность в жесткой привязке `modal/popout `компонентов к `SplitLayout` (`Alert`, `ScreenSpinner`, `ActionSheet`)
  По умолчанию модалки/попапы будут рендерится в` document.body`.
   Это позволяет избавить пользователей от необходимости обязательно передавать `ModalRoot` в `SplitLayout` и держать стейт переключения модалок на уровне `SplitLayout`.
   Теперь `ModalRoot` можно объявить в любой части приложения, как и `Alert`, `ScreenSpinner` и `ActionSheet`.
   Также можно иметь несколько `ModalRoot` если требудется по смыслу разделить модалки. (Есть ограничение на одновременный рендер модалок из разных `ModalRoot`, так как будет две подложки, их цвета будут складываться и подложка будет темнее.

   Тем не менее всё ещё можно рендерить модалки/попапы как раньше используся popout/modal свойства.
   Но по умолчанию `ModalRoot` и `Popout` будут рендерится в `document.body`. Чтобы это изменить можно
   передать в них `usePortal={false}`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants