@vkontakte/vkui 7.0.0-dev-efd91c.4 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
  2. package/dist/components/ActionSheet/ActionSheet.js +1 -3
  3. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  4. package/dist/components/AppRoot/AppRoot.d.ts +1 -1
  5. package/dist/components/AppRoot/AppRoot.d.ts.map +1 -1
  6. package/dist/components/AppRoot/AppRoot.js +16 -10
  7. package/dist/components/AppRoot/AppRoot.js.map +1 -1
  8. package/dist/components/AppRoot/AppRootPortal.js +1 -1
  9. package/dist/components/AppRoot/AppRootPortal.js.map +1 -1
  10. package/dist/components/AppRoot/{AppRootStyleContainer.d.ts → AppRootStyleContainer/AppRootStyleContainer.d.ts} +3 -3
  11. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.d.ts.map +1 -0
  12. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js +45 -0
  13. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
  14. package/dist/components/AppRoot/helpers.d.ts +7 -0
  15. package/dist/components/AppRoot/helpers.d.ts.map +1 -1
  16. package/dist/components/AppRoot/helpers.js +20 -4
  17. package/dist/components/AppRoot/helpers.js.map +1 -1
  18. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  19. package/dist/components/Clickable/Clickable.js +2 -83
  20. package/dist/components/Clickable/Clickable.js.map +1 -1
  21. package/dist/components/Clickable/RealClickable.d.ts +6 -0
  22. package/dist/components/Clickable/RealClickable.d.ts.map +1 -0
  23. package/dist/components/Clickable/RealClickable.js +90 -0
  24. package/dist/components/Clickable/RealClickable.js.map +1 -0
  25. package/dist/components/HorizontalCell/HorizontalCell.d.ts +4 -0
  26. package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
  27. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  28. package/dist/components/ModalCard/ModalCardInternal.js +1 -1
  29. package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
  30. package/dist/components/ModalPage/ModalPage.d.ts +1 -1
  31. package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
  32. package/dist/components/ModalPage/ModalPage.js +53 -5
  33. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  34. package/dist/components/ModalPage/ModalPageInternal.d.ts +5 -2
  35. package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
  36. package/dist/components/ModalPage/ModalPageInternal.js +5 -4
  37. package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
  38. package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  39. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  40. package/dist/components/ModalRoot/types.d.ts.map +1 -1
  41. package/dist/components/ModalRoot/types.js.map +1 -1
  42. package/dist/components/ModalRoot/useModalManager.d.ts +2 -0
  43. package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
  44. package/dist/components/ModalRoot/useModalManager.js +4 -1
  45. package/dist/components/ModalRoot/useModalManager.js.map +1 -1
  46. package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  47. package/dist/components/PopoutWrapper/PopoutWrapper.d.ts.map +1 -1
  48. package/dist/components/PopoutWrapper/PopoutWrapper.js +2 -2
  49. package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  50. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  51. package/dist/components/Spinner/Spinner.js +11 -43
  52. package/dist/components/Spinner/Spinner.js.map +1 -1
  53. package/dist/components/Spinner/SpinnerAnimation.d.ts +7 -0
  54. package/dist/components/Spinner/SpinnerAnimation.d.ts.map +1 -0
  55. package/dist/components/Spinner/SpinnerAnimation.js +36 -0
  56. package/dist/components/Spinner/SpinnerAnimation.js.map +1 -0
  57. package/dist/components/SplitLayout/SplitLayout.d.ts +4 -4
  58. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  59. package/dist/components.css +1 -1
  60. package/dist/components.css.map +1 -1
  61. package/dist/cssm/components/ActionSheet/ActionSheet.js +1 -3
  62. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  63. package/dist/cssm/components/AppRoot/AppRoot.js +14 -9
  64. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  65. package/dist/cssm/components/AppRoot/AppRoot.module.css +17 -0
  66. package/dist/cssm/components/AppRoot/AppRootPortal.js +1 -1
  67. package/dist/cssm/components/AppRoot/AppRootPortal.js.map +1 -1
  68. package/dist/cssm/components/AppRoot/{AppRootStyleContainer.js → AppRootStyleContainer/AppRootStyleContainer.js} +12 -23
  69. package/dist/cssm/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
  70. package/dist/cssm/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -31
  71. package/dist/cssm/components/AppRoot/helpers.js +17 -1
  72. package/dist/cssm/components/AppRoot/helpers.js.map +1 -1
  73. package/dist/cssm/components/Button/Button.module.css +6 -6
  74. package/dist/cssm/components/Card/Card.module.css +12 -6
  75. package/dist/cssm/components/Clickable/Clickable.js +2 -55
  76. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  77. package/dist/cssm/components/Clickable/RealClickable.js +61 -0
  78. package/dist/cssm/components/Clickable/RealClickable.js.map +1 -0
  79. package/dist/cssm/components/FormField/FormField.module.css +2 -0
  80. package/dist/cssm/components/FormItem/FormItem.module.css +6 -6
  81. package/dist/cssm/components/Group/Group.module.css +1 -0
  82. package/dist/cssm/components/Header/Header.module.css +10 -4
  83. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  84. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
  85. package/dist/cssm/components/IconButton/IconButton.module.css +12 -3
  86. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
  87. package/dist/cssm/components/ModalCard/ModalCardInternal.js +1 -1
  88. package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
  89. package/dist/cssm/components/ModalPage/ModalPage.js +50 -4
  90. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  91. package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
  92. package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
  93. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
  94. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  95. package/dist/cssm/components/ModalRoot/types.js.map +1 -1
  96. package/dist/cssm/components/ModalRoot/useModalManager.js +4 -1
  97. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
  98. package/dist/cssm/components/PanelHeader/PanelHeader.module.css +10 -4
  99. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  100. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
  101. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +2 -3
  102. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  103. package/dist/cssm/components/Removable/Removable.module.css +7 -2
  104. package/dist/cssm/components/Spinner/Spinner.js +11 -43
  105. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  106. package/dist/cssm/components/Spinner/SpinnerAnimation.js +36 -0
  107. package/dist/cssm/components/Spinner/SpinnerAnimation.js.map +1 -0
  108. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  109. package/dist/cssm/components/View/View.module.css +2 -2
  110. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
  111. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  112. package/dist/cssm/index.js.map +1 -1
  113. package/dist/cssm/lib/adaptivity/functions.js +1 -7
  114. package/dist/cssm/lib/adaptivity/functions.js.map +1 -1
  115. package/dist/cssm/lib/animation/useReducedMotion.js +4 -7
  116. package/dist/cssm/lib/animation/useReducedMotion.js.map +1 -1
  117. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js +22 -37
  118. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  119. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js +1 -9
  120. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  121. package/dist/cssm/lib/sheet/index.js +1 -1
  122. package/dist/cssm/lib/sheet/index.js.map +1 -1
  123. package/dist/cssm/lib/sheet/useBottomSheet.js +12 -15
  124. package/dist/cssm/lib/sheet/useBottomSheet.js.map +1 -1
  125. package/dist/cssm/styles/common.css +10 -4
  126. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts +3 -2
  127. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts.map +1 -1
  128. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
  129. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  130. package/dist/index.d.ts +2 -2
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js.map +1 -1
  133. package/dist/lib/adaptivity/functions.d.ts +0 -1
  134. package/dist/lib/adaptivity/functions.d.ts.map +1 -1
  135. package/dist/lib/adaptivity/functions.js +1 -7
  136. package/dist/lib/adaptivity/functions.js.map +1 -1
  137. package/dist/lib/animation/useReducedMotion.d.ts +1 -1
  138. package/dist/lib/animation/useReducedMotion.d.ts.map +1 -1
  139. package/dist/lib/animation/useReducedMotion.js +4 -7
  140. package/dist/lib/animation/useReducedMotion.js.map +1 -1
  141. package/dist/lib/sheet/controllers/BottomSheetController.d.ts +8 -8
  142. package/dist/lib/sheet/controllers/BottomSheetController.d.ts.map +1 -1
  143. package/dist/lib/sheet/controllers/BottomSheetController.js +22 -37
  144. package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  145. package/dist/lib/sheet/controllers/CSSTransitionController.d.ts +1 -1
  146. package/dist/lib/sheet/controllers/CSSTransitionController.d.ts.map +1 -1
  147. package/dist/lib/sheet/controllers/CSSTransitionController.js +1 -9
  148. package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  149. package/dist/lib/sheet/index.d.ts +2 -1
  150. package/dist/lib/sheet/index.d.ts.map +1 -1
  151. package/dist/lib/sheet/index.js +1 -1
  152. package/dist/lib/sheet/index.js.map +1 -1
  153. package/dist/lib/sheet/useBottomSheet.d.ts +6 -5
  154. package/dist/lib/sheet/useBottomSheet.d.ts.map +1 -1
  155. package/dist/lib/sheet/useBottomSheet.js +12 -15
  156. package/dist/lib/sheet/useBottomSheet.js.map +1 -1
  157. package/dist/vkui.css +1 -1
  158. package/dist/vkui.css.map +1 -1
  159. package/package.json +2 -2
  160. package/src/components/ActionSheet/ActionSheet.tsx +1 -4
  161. package/src/components/AppRoot/AppRoot.module.css +17 -0
  162. package/src/components/AppRoot/AppRoot.tsx +24 -11
  163. package/src/components/AppRoot/AppRootPortal.tsx +1 -1
  164. package/src/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -24
  165. package/src/components/AppRoot/{AppRootStyleContainer.tsx → AppRootStyleContainer/AppRootStyleContainer.tsx} +11 -29
  166. package/src/components/AppRoot/helpers.ts +17 -1
  167. package/src/components/Button/Button.module.css +6 -6
  168. package/src/components/Card/Card.module.css +8 -6
  169. package/src/components/Clickable/Clickable.tsx +4 -103
  170. package/src/components/Clickable/RealClickable.tsx +99 -0
  171. package/src/components/FormField/FormField.module.css +2 -0
  172. package/src/components/FormItem/FormItem.module.css +6 -6
  173. package/src/components/Group/Group.module.css +1 -0
  174. package/src/components/Header/Header.module.css +8 -4
  175. package/src/components/HorizontalCell/HorizontalCell.tsx +4 -1
  176. package/src/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
  177. package/src/components/IconButton/IconButton.module.css +10 -3
  178. package/src/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
  179. package/src/components/ModalCard/ModalCardInternal.tsx +1 -1
  180. package/src/components/ModalPage/ModalPage.tsx +57 -3
  181. package/src/components/ModalPage/ModalPageInternal.tsx +14 -5
  182. package/src/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
  183. package/src/components/ModalRoot/ModalRoot.tsx +0 -1
  184. package/src/components/ModalRoot/types.ts +0 -1
  185. package/src/components/ModalRoot/useModalManager.tsx +5 -3
  186. package/src/components/PanelHeader/PanelHeader.module.css +8 -4
  187. package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
  188. package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +1 -1
  189. package/src/components/PopoutWrapper/PopoutWrapper.tsx +1 -4
  190. package/src/components/Removable/Removable.module.css +6 -2
  191. package/src/components/Spinner/Spinner.tsx +10 -48
  192. package/src/components/Spinner/SpinnerAnimation.tsx +42 -0
  193. package/src/components/SplitLayout/SplitLayout.tsx +4 -4
  194. package/src/components/View/View.module.css +2 -2
  195. package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +13 -4
  196. package/src/index.ts +2 -2
  197. package/src/lib/adaptivity/functions.ts +1 -8
  198. package/src/lib/animation/useReducedMotion.ts +6 -13
  199. package/src/lib/sheet/controllers/BottomSheetController.ts +32 -50
  200. package/src/lib/sheet/controllers/CSSTransitionController.ts +1 -8
  201. package/src/lib/sheet/index.ts +3 -0
  202. package/src/lib/sheet/useBottomSheet.ts +21 -17
  203. package/src/styles/common.css +12 -4
  204. package/dist/components/AppRoot/AppRootStyleContainer.d.ts.map +0 -1
  205. package/dist/components/AppRoot/AppRootStyleContainer.js +0 -57
  206. package/dist/components/AppRoot/AppRootStyleContainer.js.map +0 -1
  207. package/dist/cssm/components/AppRoot/AppRootStyleContainer.js.map +0 -1
@@ -12,17 +12,17 @@ export interface SplitLayoutProps
12
12
  /**
13
13
  * Свойство для отрисовки `Alert`, `ActionSheet` и `ScreenSpinner`.
14
14
  *
15
- * @deprecated будет удалёно в **VKUI v8**
15
+ * @deprecated будет удалeно в **VKUI v8**.
16
16
  * Начиная с **VKUI v7** компоненты можно располагать в любом
17
- * месте приложения в пределах `AppRoot`
17
+ * месте приложения в пределах `AppRoot`.
18
18
  */
19
19
  popout?: React.ReactNode;
20
20
  /**
21
21
  * Свойство для отрисовки `ModalRoot`.
22
22
  *
23
- * @deprecated будет удалёно в **VKUI v8**
23
+ * @deprecated будет удалeно в **VKUI v8**.
24
24
  * Начиная с **VKUI v7** `ModalRoot` можно располагать в любом
25
- * месте приложения в пределах `AppRoot`
25
+ * месте приложения в пределах `AppRoot`.
26
26
  */
27
27
  modal?: React.ReactNode;
28
28
  header?: React.ReactNode;
@@ -167,9 +167,9 @@
167
167
  }
168
168
 
169
169
  /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
170
+ .ios.noMotion .panel :global(.vkuiInternalPanel__in),
170
171
  .noMotion .panel,
171
- .ios.noMotion .panel,
172
- .ios.noMotion .panel :global(.vkuiInternalPanel__in) {
172
+ .ios.noMotion .panel {
173
173
  animation: none;
174
174
  }
175
175
 
@@ -1,14 +1,18 @@
1
1
  import type * as React from 'react';
2
- import { type AppRootMode } from '../components/AppRoot/types';
2
+ import type { AppRootLayout, AppRootMode } from '../components/AppRoot/types';
3
3
  import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
4
4
 
5
+ const layoutClassNames = { card: 'vkui--layout-card', plain: 'vkui--layout-plain' };
6
+
5
7
  export function useSyncHTMLWithBaseVKUIClasses({
6
8
  appRootRef,
7
9
  mode,
8
10
  enable,
11
+ layout,
9
12
  }: {
10
13
  appRootRef: React.RefObject<HTMLElement>;
11
14
  mode: AppRootMode;
15
+ layout?: AppRootLayout;
12
16
  enable: boolean;
13
17
  }) {
14
18
  useIsomorphicLayoutEffect(() => {
@@ -19,6 +23,7 @@ export function useSyncHTMLWithBaseVKUIClasses({
19
23
  const htmlElement = appRootRef.current?.ownerDocument.documentElement;
20
24
  const parentElement = appRootRef.current?.parentElement ?? null;
21
25
 
26
+ const htmlElementClasses = ['vkui'];
22
27
  const parentElementClasses = ['vkui__root'];
23
28
 
24
29
  if (mode === 'embedded') {
@@ -26,19 +31,23 @@ export function useSyncHTMLWithBaseVKUIClasses({
26
31
  }
27
32
 
28
33
  if (mode === 'full') {
34
+ if (layout) {
35
+ htmlElementClasses.push(layoutClassNames[layout]);
36
+ }
29
37
  /* eslint-disable-next-line no-restricted-properties */
30
- htmlElement?.classList.add('vkui');
38
+ htmlElement?.classList.add(...htmlElementClasses);
31
39
  }
40
+
32
41
  /* eslint-disable-next-line no-restricted-properties */
33
42
  parentElement?.classList.add(...parentElementClasses);
34
43
 
35
44
  return () => {
36
45
  if (mode === 'full') {
37
46
  /* eslint-disable-next-line no-restricted-properties */
38
- htmlElement?.classList.remove('vkui');
47
+ htmlElement?.classList.remove(...htmlElementClasses);
39
48
  }
40
49
  /* eslint-disable-next-line no-restricted-properties */
41
50
  parentElement?.classList.remove(...parentElementClasses);
42
51
  };
43
- }, [mode, enable]);
52
+ }, [mode, enable, layout]);
44
53
  }
package/src/index.ts CHANGED
@@ -153,11 +153,11 @@ export { ModalRootContext } from './components/ModalRoot/ModalRootContext';
153
153
  export { useModalRootContext } from './components/ModalRoot/useModalRootContext';
154
154
  export { ModalPageContent } from './components/ModalPageContent/ModalPageContent';
155
155
  export { ModalPage } from './components/ModalPage/ModalPage';
156
- export type { ModalPageProps } from './components/ModalPage/types';
156
+ export type { ModalPageProps, ModalPageCloseReason } from './components/ModalPage/types';
157
157
  export { ModalPageHeader } from './components/ModalPageHeader/ModalPageHeader';
158
158
  export type { ModalPageHeaderProps } from './components/ModalPageHeader/ModalPageHeader';
159
159
  export { ModalCard } from './components/ModalCard/ModalCard';
160
- export type { ModalCardProps } from './components/ModalCard/types';
160
+ export type { ModalCardProps, ModalCardCloseReason } from './components/ModalCard/types';
161
161
  export { ModalDismissButton } from './components/ModalDismissButton/ModalDismissButton';
162
162
  export type { ModalDismissButtonProps } from './components/ModalDismissButton/ModalDismissButton';
163
163
 
@@ -1,7 +1,6 @@
1
1
  import type { Exact } from '../../types';
2
- import { getWindow } from '../dom';
3
2
  import { type PlatformType } from '../platform';
4
- import { BREAKPOINTS, MEDIA_QUERIES } from './breakpoints';
3
+ import { BREAKPOINTS } from './breakpoints';
5
4
  import {
6
5
  type SizeTypeValues,
7
6
  VIEW_WIDTH_TO_CSS_BREAKPOINT_MAP,
@@ -139,12 +138,6 @@ export function tryToCheckIsDesktop(
139
138
  return (widthIsLikeDesktop && otherParametersIsLikeDesktop) || IS_VKCOM_CRUTCH;
140
139
  }
141
140
 
142
- export function isSmallTablePlus(el: HTMLElement) {
143
- const win = getWindow(el);
144
- // eslint-disable-next-line no-restricted-properties
145
- return win ? win.matchMedia(MEDIA_QUERIES.SMALL_TABLET_PLUS).matches : false;
146
- }
147
-
148
141
  /**
149
142
  * Конвертирует `viewWidth` в CSS брейкпоинты (см. тесты для наглядности).
150
143
  *
@@ -6,17 +6,10 @@ import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect';
6
6
 
7
7
  export const REDUCE_MOTION_MEDIA_QUERY = 'screen and (prefers-reduced-motion: reduce)';
8
8
 
9
- export const useReducedMotion = (): boolean => {
9
+ export const useReducedMotion = (): boolean | undefined => {
10
10
  const { window } = useDOM();
11
- const initial = React.useMemo(
12
- () =>
13
- window
14
- ? window.matchMedia(REDUCE_MOTION_MEDIA_QUERY).matches
15
- : /* istanbul ignore next: на текущий момент, покрытие данного кейса неинтересно */
16
- false,
17
- [window],
18
- );
19
- const reducedMotion = React.useRef(initial);
11
+
12
+ const [reducedMotion, setReducedMotion] = React.useState<boolean | undefined>(() => undefined);
20
13
 
21
14
  useIsomorphicLayoutEffect(() => {
22
15
  /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */
@@ -24,15 +17,15 @@ export const useReducedMotion = (): boolean => {
24
17
  return;
25
18
  }
26
19
  const match = window.matchMedia(REDUCE_MOTION_MEDIA_QUERY);
27
- reducedMotion.current = match.matches;
20
+ setReducedMotion(match.matches);
28
21
  /* istanbul ignore next: на текущий момент, покрытие данного кейса неинтересно */
29
22
  const handleMediaQueryChange = (event: MediaQueryListEvent) => {
30
23
  /* istanbul ignore next */
31
- reducedMotion.current = event.matches;
24
+ setReducedMotion(event.matches);
32
25
  };
33
26
  matchMediaListAddListener(match, handleMediaQueryChange);
34
27
  return () => matchMediaListRemoveListener(match, handleMediaQueryChange);
35
28
  }, [window]);
36
29
 
37
- return reducedMotion.current;
30
+ return reducedMotion;
38
31
  };
@@ -1,6 +1,5 @@
1
1
  import { noop } from '@vkontakte/vkjs';
2
2
  import { clamp } from '../../../helpers/math';
3
- import { inRange } from '../../../helpers/range';
4
3
  import { rubberbandIfOutOfBounds } from '../../animation';
5
4
  import { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';
6
5
  import { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';
@@ -9,66 +8,35 @@ import {
9
8
  DRAG_THRESHOLDS,
10
9
  DYNAMIC_SNAP_POINT_DATA,
11
10
  SNAP_POINT_DETENTS,
12
- SNAP_POINT_SAFE_RANGE,
13
11
  } from '../constants';
14
12
  import type { CSSTransitionController } from './CSSTransitionController';
15
13
 
16
- export type InitialSnapPoint = 'auto' | number;
17
-
18
14
  export type SnapPointDetents = [number, number] | [number, number, number];
19
15
 
20
- export type BottomSheetControllerSnapPointData = {
21
- unit: '%' | 'px';
22
- currentSnapPoint: number;
23
- snapPointDetents: SnapPointDetents;
24
- };
16
+ export type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };
17
+
18
+ export type SnapPointChange = (snapPoint: number) => void;
25
19
 
26
20
  export type BottomSheetControllerOptions = {
27
21
  sheetScrollEl: HTMLElement | null;
28
22
  sheetTransitionController: CSSTransitionController<string>;
29
23
  backdropTransitionController: CSSTransitionController | null;
24
+ onSnapPointChange: SnapPointChange;
30
25
  onDismiss: VoidFunction;
31
26
  };
32
27
 
33
28
  export class BottomSheetController {
34
- static parseInitialSnapPoint(
35
- initialSnapPoint: InitialSnapPoint = SNAP_POINT_DETENTS.MEDIUM,
36
- ): BottomSheetControllerSnapPointData {
37
- if (initialSnapPoint === 'auto') {
38
- return {
39
- unit: 'px',
40
- currentSnapPoint: DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE,
41
- snapPointDetents: [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE],
42
- };
43
- }
44
-
45
- const currentSnapPoint = Math.min(
46
- Math.max(initialSnapPoint, SNAP_POINT_SAFE_RANGE.LOWER),
47
- SNAP_POINT_DETENTS.LARGE,
48
- );
49
-
50
- return {
51
- unit: '%',
52
- currentSnapPoint,
53
- snapPointDetents: inRange(
54
- currentSnapPoint,
55
- SNAP_POINT_SAFE_RANGE.LOWER,
56
- SNAP_POINT_SAFE_RANGE.HIGHEST,
57
- )
58
- ? [SNAP_POINT_DETENTS.MIN, currentSnapPoint, SNAP_POINT_DETENTS.LARGE]
59
- : [SNAP_POINT_DETENTS.MIN, currentSnapPoint],
60
- };
61
- }
62
-
63
29
  constructor(
64
30
  private readonly sheetEl: HTMLElement,
65
31
  {
66
32
  sheetScrollEl,
67
33
  sheetTransitionController,
68
34
  backdropTransitionController,
35
+ onSnapPointChange,
69
36
  onDismiss,
70
37
  }: BottomSheetControllerOptions,
71
38
  ) {
39
+ this.onSnapPointChange = onSnapPointChange;
72
40
  this.onDismiss = onDismiss;
73
41
  this.panGestureRecognizer = new UIPanGestureRecognizer();
74
42
  this.sheetScrollEl = sheetScrollEl;
@@ -76,15 +44,18 @@ export class BottomSheetController {
76
44
  this.backdropTransitionController = backdropTransitionController;
77
45
  }
78
46
 
79
- init(initialSnapPoint?: InitialSnapPoint) {
47
+ init(snapPoint: SnapPoint) {
80
48
  this.isInitialized = true;
81
49
 
82
- const { unit, currentSnapPoint, snapPointDetents } =
83
- BottomSheetController.parseInitialSnapPoint(initialSnapPoint);
84
-
85
- this.unit = unit;
86
- this.currentSnapPoint = currentSnapPoint;
87
- this.snapPointDetents = snapPointDetents;
50
+ if (snapPoint === 'auto') {
51
+ this.unit = 'px';
52
+ this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;
53
+ this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];
54
+ } else {
55
+ this.unit = '%';
56
+ this.currentSnapPoint = snapPoint.initial;
57
+ this.snapPointDetents = snapPoint.detents;
58
+ }
88
59
  }
89
60
 
90
61
  destroy() {
@@ -152,10 +123,6 @@ export class BottomSheetController {
152
123
  }
153
124
  break;
154
125
  case 'moving':
155
- if (event.cancelable) {
156
- event.preventDefault();
157
- }
158
-
159
126
  this.panGestureRecognizer.setEndCoords(event);
160
127
 
161
128
  const { y1, y2 } = this.panGestureRecognizer;
@@ -174,7 +141,16 @@ export class BottomSheetController {
174
141
  panEnd() {
175
142
  switch (this.panState) {
176
143
  case 'moving':
144
+ const prevCurrentSnapPoint = this.currentSnapPoint;
177
145
  this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);
146
+
147
+ if (
148
+ prevCurrentSnapPoint !== this.currentSnapPoint &&
149
+ this.currentSnapPoint > SNAP_POINT_DETENTS.MIN
150
+ ) {
151
+ this.onSnapPointChange(this.currentSnapPoint);
152
+ }
153
+
178
154
  this.calculateSnapPoint(this.currentSnapPoint);
179
155
  break;
180
156
  }
@@ -203,6 +179,7 @@ export class BottomSheetController {
203
179
  private readonly sheetTransitionController: CSSTransitionController<string>;
204
180
  private readonly backdropTransitionController: CSSTransitionController | null;
205
181
  private readonly panGestureRecognizer: UIPanGestureRecognizer;
182
+ private readonly onSnapPointChange: SnapPointChange;
206
183
  private readonly onDismiss: VoidFunction;
207
184
 
208
185
  private calculateSnapPoint(nextSnapPoint: number, immediately = false) {
@@ -307,7 +284,12 @@ export class BottomSheetController {
307
284
  }
308
285
 
309
286
  private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {
310
- if (this.pannedEl === null || this.sheetScrollEl === this.pannedEl) {
287
+ if (
288
+ /* istanbul ignore next: покрываем TypeScript */
289
+ this.pannedEl === null ||
290
+ this.pannedEl === this.sheetEl ||
291
+ this.pannedEl === this.sheetScrollEl
292
+ ) {
311
293
  return false;
312
294
  }
313
295
 
@@ -11,14 +11,7 @@ export class CSSTransitionController<V extends number | string = number> {
11
11
  return this;
12
12
  }
13
13
 
14
- unset(from?: V) {
15
- if (from !== undefined) {
16
- this.el.addEventListener('transitionend', this.handleTransitionEnd, { once: true });
17
- this.enableTransition();
18
- this.el.style.setProperty(this.property, `${from}`);
19
- return this;
20
- }
21
-
14
+ unset() {
22
15
  return this.cleanup();
23
16
  }
24
17
 
@@ -1,6 +1,8 @@
1
1
  export {
2
2
  BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,
3
3
  BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE,
4
+ SNAP_POINT_DETENTS,
5
+ SNAP_POINT_SAFE_RANGE,
4
6
  } from './constants';
5
7
  export {
6
8
  type UseBottomSheetOptions,
@@ -8,3 +10,4 @@ export {
8
10
  type UseBottomSheetResult,
9
11
  useBottomSheet,
10
12
  } from './useBottomSheet';
13
+ export type { SnapPoint, SnapPointChange } from './controllers/BottomSheetController';
@@ -12,14 +12,19 @@ import {
12
12
  import { noop } from '@vkontakte/vkjs';
13
13
  import { useStableCallback } from '../../hooks/useStableCallback';
14
14
  import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect';
15
- import { BottomSheetController, type InitialSnapPoint } from './controllers/BottomSheetController';
15
+ import {
16
+ BottomSheetController,
17
+ type SnapPoint,
18
+ type SnapPointChange,
19
+ } from './controllers/BottomSheetController';
16
20
  import { CSSTransitionController } from './controllers/CSSTransitionController';
17
21
 
18
22
  export type UseBottomSheetOptions = {
19
23
  sheetCSSProperty: string;
20
24
  backdropCSSProperty: string;
21
- initialSnapPoint?: InitialSnapPoint;
25
+ snapPoint: SnapPoint;
22
26
  blocked?: boolean;
27
+ onSnapPointChange?: SnapPointChange;
23
28
  onDismiss?: VoidFunction;
24
29
  };
25
30
 
@@ -49,7 +54,7 @@ export type UseBottomSheetResult = [
49
54
  *
50
55
  * ## Возможности
51
56
  *
52
- * - [x] есть возможность открывать до определенного размера (см. `initialSnapPoint`)
57
+ * - [x] есть возможность открывать до определенного размера (см. `snapPoint`)
53
58
  * - [x] есть возможность закрыть при сильном смахивании вниз
54
59
  * - [x] есть возможность отключить взаимодействие на определённых элементах используя data-атрибут
55
60
  * - [x] есть возможность отключить взаимодействие на определённых элементах используя stopPropagation()
@@ -57,7 +62,7 @@ export type UseBottomSheetResult = [
57
62
  * ## Анимации
58
63
  *
59
64
  * - [x] оверлей становится светлее в зависимости от процента сворачивания
60
- * - [x] при `initialSnapPoint !== 'auto'` процент высчитывается относительно переданного `initialSnapPoint`
65
+ * - [x] при `snapPoint !== 'auto'` процент высчитывается относительно переданного `snapPoint.initial`
61
66
  * - [x] при перетаскивании за пределы есть анимация натяжения
62
67
  * > note: в `ModalPage` этого эффекта нет при высоте 100% из-за `max-block-size: 100%`
63
68
  *
@@ -74,9 +79,10 @@ export const useBottomSheet = (
74
79
  enabled: boolean,
75
80
  {
76
81
  blocked,
77
- initialSnapPoint,
82
+ snapPoint,
78
83
  sheetCSSProperty,
79
84
  backdropCSSProperty,
85
+ onSnapPointChange: onSnapPointChangeProp,
80
86
  onDismiss: onDismissProp,
81
87
  }: UseBottomSheetOptions,
82
88
  ): UseBottomSheetResult => {
@@ -84,17 +90,13 @@ export const useBottomSheet = (
84
90
  const [sheetEl, setSheetEl] = useState<HTMLElement | null>(null);
85
91
  const [backdropEl, setBackdropEl] = useState<HTMLElement | null>(null);
86
92
 
87
- const initialStyle = useMemo<CSSProperties | undefined>(() => {
88
- if (!enabled) {
89
- return;
90
- }
91
-
92
- const { unit, currentSnapPoint } =
93
- BottomSheetController.parseInitialSnapPoint(initialSnapPoint);
94
-
95
- return unit === '%' ? { [sheetCSSProperty]: `${currentSnapPoint}${unit}` } : undefined;
96
- }, [enabled, initialSnapPoint, sheetCSSProperty]);
93
+ const initialStyle = useMemo<CSSProperties | undefined>(
94
+ () =>
95
+ enabled && snapPoint !== 'auto' ? { [sheetCSSProperty]: `${snapPoint.initial}%` } : undefined,
96
+ [enabled, snapPoint, sheetCSSProperty],
97
+ );
97
98
 
99
+ const onSnapPointChange = useStableCallback(onSnapPointChangeProp || noop);
98
100
  const onDismiss = useStableCallback(onDismissProp || noop);
99
101
  const bsController = useMemo<BottomSheetController | null>(() => {
100
102
  if (!enabled || sheetEl === null) {
@@ -107,6 +109,7 @@ export const useBottomSheet = (
107
109
  backdropTransitionController: backdropEl
108
110
  ? new CSSTransitionController(backdropEl, backdropCSSProperty)
109
111
  : null,
112
+ onSnapPointChange,
110
113
  onDismiss,
111
114
  });
112
115
  }, [
@@ -116,6 +119,7 @@ export const useBottomSheet = (
116
119
  sheetScrollEl,
117
120
  backdropEl,
118
121
  backdropCSSProperty,
122
+ onSnapPointChange,
119
123
  onDismiss,
120
124
  ]);
121
125
 
@@ -136,10 +140,10 @@ export const useBottomSheet = (
136
140
  useIsomorphicLayoutEffect(
137
141
  function init() {
138
142
  if (bsController) {
139
- bsController.init(initialSnapPoint);
143
+ bsController.init(snapPoint);
140
144
  }
141
145
  },
142
- [initialSnapPoint, bsController],
146
+ [snapPoint, bsController],
143
147
  );
144
148
 
145
149
  useIsomorphicLayoutEffect(
@@ -1,6 +1,6 @@
1
1
  /*
2
- * .vkui класс в режиме full необходим на элементе html
3
- * чтобы правильно устанавливалось значение color-scheme
2
+ * .vkui класс в режиме full необходим на элементе html,
3
+ * чтобы правильно устанавливалось значение color-scheme,
4
4
  * окрашивающее фон html и скроллбар в цвета текущей цветовой
5
5
  * схемы.
6
6
  * Так как color-scheme зависит от vkui токена, то в
@@ -8,13 +8,13 @@
8
8
  * быть установлен на html.
9
9
  *
10
10
  * В SSR есть проблема - чтобы на сервере правильно установить
11
- * нужный класс для токенов надо знать предпочитаемую цветовую
11
+ * нужный класс, для токенов надо знать предпочитаемую цветовую
12
12
  * схему пользователя и передать её через свойство appearance.
13
13
  * Если ошибиться со схемой на сервере, то пользователь
14
14
  * может получить не ту схему, либо может увидеть как интерфейс моргает
15
15
  * из-за переключения со светлой темы на тёмную.
16
16
  * Чтобы окончательно избавиться от этой проблемы нужно
17
- * в vkui-tokens создавать темы в которые старазу же зашиты обе цветовые схемы.
17
+ * в vkui-tokens создавать темы, в которые сразу же зашиты обе цветовые схемы.
18
18
  * А переключение между темами задавалось бы через медиа выражения
19
19
  * с помощью prefers-color-scheme.
20
20
  * */
@@ -49,6 +49,14 @@
49
49
  background: var(--vkui--color_background);
50
50
  }
51
51
 
52
+ .vkui--layout-card {
53
+ background: var(--vkui--color_background);
54
+ }
55
+
56
+ .vkui--layout-plain {
57
+ background: var(--vkui--color_background_content);
58
+ }
59
+
52
60
  /* отключаем нативный pull-to-refresh при взаимодействии с компонентом
53
61
  * PullToRefresh или при открывании модалки */
54
62
  .vkui--disable-overscroll-behavior {
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppRootStyleContainer.d.ts","sourceRoot":"","sources":["../../../src/components/AppRoot/AppRootStyleContainer.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAoBxF,wBAAgB,gBAAgB;;;EAuB/B;AAED,KAAK,0BAA0B,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAErE;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,0BAA0B,2CAUpF"}
@@ -1,57 +0,0 @@
1
- 'use client';
2
- import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
3
- import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_properties";
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- import * as React from "react";
6
- import { classNames } from "@vkontakte/vkjs";
7
- import { useAdaptivity } from "../../hooks/useAdaptivity.js";
8
- import { useTokensClassName } from "../../lib/tokens/index.js";
9
- import { useConfigProvider } from "../ConfigProvider/ConfigProviderContext.js";
10
- import { RootComponent } from "../RootComponent/RootComponent.js";
11
- import { AppRootContext } from "./AppRootContext.js";
12
- import { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from "./helpers.js";
13
- const sizeXClassNames = {
14
- none: "vkuiAppRoot__sizeXNone",
15
- regular: "vkuiAppRoot__sizeXRegular"
16
- };
17
- const sizeYClassNames = {
18
- none: "vkuiAppRoot__sizeYNone",
19
- compact: "vkuiAppRoot__sizeYCompact"
20
- };
21
- const layoutClassNames = {
22
- card: "vkuiAppRoot__layoutCard",
23
- plain: "vkuiAppRoot__layoutPlain"
24
- };
25
- export function useAppRootStyles() {
26
- const { layout, safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);
27
- const { hasPointer, sizeX = 'none', sizeY = 'none' } = useAdaptivity();
28
- const { isWebView } = useConfigProvider();
29
- const userSelectModeClassName = getUserSelectModeClassName({
30
- userSelectMode,
31
- isWebView,
32
- hasPointer
33
- });
34
- const tokensClassName = useTokensClassName();
35
- return {
36
- style: safeAreaInsets ? getSafeAreaInsetsAsCssVariables(safeAreaInsets) : undefined,
37
- className: classNames("vkuiAppRoot__host", mode === 'embedded' && "vkuiAppRoot__embedded", sizeX !== 'compact' && sizeXClassNames[sizeX], sizeY !== 'regular' && sizeYClassNames[sizeY], layout && layoutClassNames[layout], userSelectModeClassName, tokensClassName)
38
- };
39
- }
40
- /**
41
- * Специальный контейнер для переиспользования стилей, токенов и safe-area-inset в:
42
- * - точке монтирования приложения – `AppRoot`;
43
- * - точке монтирования порталов для модальных окон – `PortalRoot`.
44
- *
45
- * @private
46
- */ export function AppRootStyleContainer(_param) {
47
- var { style } = _param, props = _object_without_properties(_param, [
48
- "style"
49
- ]);
50
- const { style: appRootStyle, className: appRootClassName } = useAppRootStyles();
51
- return /*#__PURE__*/ _jsx(RootComponent, _object_spread({
52
- baseClassName: appRootClassName,
53
- style: appRootStyle ? _object_spread({}, appRootStyle, style) : style
54
- }, props));
55
- }
56
-
57
- //# sourceMappingURL=AppRootStyleContainer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/AppRoot/AppRootStyleContainer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useTokensClassName } from '../../lib/tokens';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent, type RootComponentProps } from '../RootComponent/RootComponent';\nimport { AppRootContext } from './AppRootContext';\nimport { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from './helpers';\nimport styles from './AppRootStyleContainer.module.css';\n\nconst sizeXClassNames = {\n none: styles.sizeXNone,\n regular: styles.sizeXRegular,\n};\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nconst layoutClassNames = {\n card: styles.layoutCard,\n plain: styles.layoutPlain,\n};\n\nexport function useAppRootStyles() {\n const { layout, safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);\n const { hasPointer, sizeX = 'none', sizeY = 'none' } = useAdaptivity();\n const { isWebView } = useConfigProvider();\n const userSelectModeClassName = getUserSelectModeClassName({\n userSelectMode,\n isWebView,\n hasPointer,\n });\n const tokensClassName = useTokensClassName();\n\n return {\n style: safeAreaInsets ? getSafeAreaInsetsAsCssVariables(safeAreaInsets) : undefined,\n className: classNames(\n styles.host,\n mode === 'embedded' && styles.embedded,\n sizeX !== 'compact' && sizeXClassNames[sizeX],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n layout && layoutClassNames[layout],\n userSelectModeClassName,\n tokensClassName,\n ),\n };\n}\n\ntype AppRootStyleContainerProps = RootComponentProps<HTMLDivElement>;\n\n/**\n * Специальный контейнер для переиспользования стилей, токенов и safe-area-inset в:\n * - точке монтирования приложения – `AppRoot`;\n * - точке монтирования порталов для модальных окон – `PortalRoot`.\n *\n * @private\n */\nexport function AppRootStyleContainer({ style, ...props }: AppRootStyleContainerProps) {\n const { style: appRootStyle, className: appRootClassName } = useAppRootStyles();\n\n return (\n <RootComponent\n baseClassName={appRootClassName}\n style={appRootStyle ? { ...appRootStyle, ...style } : style}\n {...props}\n />\n );\n}\n"],"names":["React","classNames","useAdaptivity","useTokensClassName","useConfigProvider","RootComponent","AppRootContext","getSafeAreaInsetsAsCssVariables","getUserSelectModeClassName","sizeXClassNames","none","regular","sizeYClassNames","compact","layoutClassNames","card","plain","useAppRootStyles","layout","safeAreaInsets","mode","userSelectMode","useContext","hasPointer","sizeX","sizeY","isWebView","userSelectModeClassName","tokensClassName","style","undefined","className","AppRootStyleContainer","props","appRootStyle","appRootClassName","baseClassName"],"mappings":"AAAA;;;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,kBAAkB,QAAQ,4BAAmB;AACtD,SAASC,iBAAiB,QAAQ,6CAA0C;AAC5E,SAASC,aAAa,QAAiC,oCAAiC;AACxF,SAASC,cAAc,QAAQ,sBAAmB;AAClD,SAASC,+BAA+B,EAAEC,0BAA0B,QAAQ,eAAY;AAGxF,MAAMC,kBAAkB;IACtBC,IAAI;IACJC,OAAO;AACT;AAEA,MAAMC,kBAAkB;IACtBF,IAAI;IACJG,OAAO;AACT;AAEA,MAAMC,mBAAmB;IACvBC,IAAI;IACJC,KAAK;AACP;AAEA,OAAO,SAASC;IACd,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,cAAc,EAAE,GAAGrB,MAAMsB,UAAU,CAAChB;IAC1E,MAAM,EAAEiB,UAAU,EAAEC,QAAQ,MAAM,EAAEC,QAAQ,MAAM,EAAE,GAAGvB;IACvD,MAAM,EAAEwB,SAAS,EAAE,GAAGtB;IACtB,MAAMuB,0BAA0BnB,2BAA2B;QACzDa;QACAK;QACAH;IACF;IACA,MAAMK,kBAAkBzB;IAExB,OAAO;QACL0B,OAAOV,iBAAiBZ,gCAAgCY,kBAAkBW;QAC1EC,WAAW9B,gCAETmB,SAAS,uCACTI,UAAU,aAAaf,eAAe,CAACe,MAAM,EAC7CC,UAAU,aAAab,eAAe,CAACa,MAAM,EAC7CP,UAAUJ,gBAAgB,CAACI,OAAO,EAClCS,yBACAC;IAEJ;AACF;AAIA;;;;;;CAMC,GACD,OAAO,SAASI,sBAAsB;QAAA,EAAEH,KAAK,EAAwC,GAA/C,QAAYI,mCAAZ;QAAEJ;;IACtC,MAAM,EAAEA,OAAOK,YAAY,EAAEH,WAAWI,gBAAgB,EAAE,GAAGlB;IAE7D,qBACE,KAACZ;QACC+B,eAAeD;QACfN,OAAOK,eAAe,mBAAKA,cAAiBL,SAAUA;OAClDI;AAGV"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/AppRoot/AppRootStyleContainer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useTokensClassName } from '../../lib/tokens';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent, type RootComponentProps } from '../RootComponent/RootComponent';\nimport { AppRootContext } from './AppRootContext';\nimport { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from './helpers';\nimport styles from './AppRootStyleContainer.module.css';\n\nconst sizeXClassNames = {\n none: styles.sizeXNone,\n regular: styles.sizeXRegular,\n};\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nconst layoutClassNames = {\n card: styles.layoutCard,\n plain: styles.layoutPlain,\n};\n\nexport function useAppRootStyles() {\n const { layout, safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);\n const { hasPointer, sizeX = 'none', sizeY = 'none' } = useAdaptivity();\n const { isWebView } = useConfigProvider();\n const userSelectModeClassName = getUserSelectModeClassName({\n userSelectMode,\n isWebView,\n hasPointer,\n });\n const tokensClassName = useTokensClassName();\n\n return {\n style: safeAreaInsets ? getSafeAreaInsetsAsCssVariables(safeAreaInsets) : undefined,\n className: classNames(\n styles.host,\n mode === 'embedded' && styles.embedded,\n sizeX !== 'compact' && sizeXClassNames[sizeX],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n layout && layoutClassNames[layout],\n userSelectModeClassName,\n tokensClassName,\n ),\n };\n}\n\ntype AppRootStyleContainerProps = RootComponentProps<HTMLDivElement>;\n\n/**\n * Специальный контейнер для переиспользования стилей, токенов и safe-area-inset в:\n * - точке монтирования приложения – `AppRoot`;\n * - точке монтирования порталов для модальных окон – `PortalRoot`.\n *\n * @private\n */\nexport function AppRootStyleContainer({ style, ...props }: AppRootStyleContainerProps) {\n const { style: appRootStyle, className: appRootClassName } = useAppRootStyles();\n\n return (\n <RootComponent\n baseClassName={appRootClassName}\n style={appRootStyle ? { ...appRootStyle, ...style } : style}\n {...props}\n />\n );\n}\n"],"names":["React","classNames","useAdaptivity","useTokensClassName","useConfigProvider","RootComponent","AppRootContext","getSafeAreaInsetsAsCssVariables","getUserSelectModeClassName","styles","sizeXClassNames","none","sizeXNone","regular","sizeXRegular","sizeYClassNames","sizeYNone","compact","sizeYCompact","layoutClassNames","card","layoutCard","plain","layoutPlain","useAppRootStyles","layout","safeAreaInsets","mode","userSelectMode","useContext","hasPointer","sizeX","sizeY","isWebView","userSelectModeClassName","tokensClassName","style","undefined","className","host","embedded","AppRootStyleContainer","props","appRootStyle","appRootClassName","baseClassName"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,kBAAkB,QAAQ,4BAAmB;AACtD,SAASC,iBAAiB,QAAQ,6CAA0C;AAC5E,SAASC,aAAa,QAAiC,oCAAiC;AACxF,SAASC,cAAc,QAAQ,sBAAmB;AAClD,SAASC,+BAA+B,EAAEC,0BAA0B,QAAQ,eAAY;AACxF,OAAOC,YAAY,qCAAqC;AAExD,MAAMC,kBAAkB;IACtBC,MAAMF,OAAOG,SAAS;IACtBC,SAASJ,OAAOK,YAAY;AAC9B;AAEA,MAAMC,kBAAkB;IACtBJ,MAAMF,OAAOO,SAAS;IACtBC,SAASR,OAAOS,YAAY;AAC9B;AAEA,MAAMC,mBAAmB;IACvBC,MAAMX,OAAOY,UAAU;IACvBC,OAAOb,OAAOc,WAAW;AAC3B;AAEA,OAAO,SAASC;IACd,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,cAAc,EAAE,GAAG5B,MAAM6B,UAAU,CAACvB;IAC1E,MAAM,EAAEwB,UAAU,EAAEC,QAAQ,MAAM,EAAEC,QAAQ,MAAM,EAAE,GAAG9B;IACvD,MAAM,EAAE+B,SAAS,EAAE,GAAG7B;IACtB,MAAM8B,0BAA0B1B,2BAA2B;QACzDoB;QACAK;QACAH;IACF;IACA,MAAMK,kBAAkBhC;IAExB,OAAO;QACLiC,OAAOV,iBAAiBnB,gCAAgCmB,kBAAkBW;QAC1EC,WAAWrC,WACTQ,OAAO8B,IAAI,EACXZ,SAAS,cAAclB,OAAO+B,QAAQ,EACtCT,UAAU,aAAarB,eAAe,CAACqB,MAAM,EAC7CC,UAAU,aAAajB,eAAe,CAACiB,MAAM,EAC7CP,UAAUN,gBAAgB,CAACM,OAAO,EAClCS,yBACAC;IAEJ;AACF;AAIA;;;;;;CAMC,GACD,OAAO,SAASM,sBAAsB,EAAEL,KAAK,EAAE,GAAGM,OAAmC;IACnF,MAAM,EAAEN,OAAOO,YAAY,EAAEL,WAAWM,gBAAgB,EAAE,GAAGpB;IAE7D,qBACE,KAACnB;QACCwC,eAAeD;QACfR,OAAOO,eAAe;YAAE,GAAGA,YAAY;YAAE,GAAGP,KAAK;QAAC,IAAIA;QACrD,GAAGM,KAAK;;AAGf"}