@vkontakte/vkui 7.0.0-dev-efd91c.3 → 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.
- package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
- package/dist/components/ActionSheet/ActionSheet.js +1 -3
- package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/components/AppRoot/AppRoot.d.ts +1 -1
- package/dist/components/AppRoot/AppRoot.d.ts.map +1 -1
- package/dist/components/AppRoot/AppRoot.js +16 -10
- package/dist/components/AppRoot/AppRoot.js.map +1 -1
- package/dist/components/AppRoot/AppRootPortal.js +1 -1
- package/dist/components/AppRoot/AppRootPortal.js.map +1 -1
- package/dist/components/AppRoot/{AppRootStyleContainer.d.ts → AppRootStyleContainer/AppRootStyleContainer.d.ts} +3 -3
- package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.d.ts.map +1 -0
- package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js +45 -0
- package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
- package/dist/components/AppRoot/helpers.d.ts +7 -0
- package/dist/components/AppRoot/helpers.d.ts.map +1 -1
- package/dist/components/AppRoot/helpers.js +20 -4
- package/dist/components/AppRoot/helpers.js.map +1 -1
- package/dist/components/Clickable/Clickable.d.ts.map +1 -1
- package/dist/components/Clickable/Clickable.js +2 -83
- package/dist/components/Clickable/Clickable.js.map +1 -1
- package/dist/components/Clickable/RealClickable.d.ts +6 -0
- package/dist/components/Clickable/RealClickable.d.ts.map +1 -0
- package/dist/components/Clickable/RealClickable.js +90 -0
- package/dist/components/Clickable/RealClickable.js.map +1 -0
- package/dist/components/HorizontalCell/HorizontalCell.d.ts +6 -1
- package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
- package/dist/components/HorizontalCell/HorizontalCell.js +4 -15
- package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
- package/dist/components/ModalCard/ModalCardInternal.js +1 -1
- package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
- package/dist/components/ModalPage/ModalPage.d.ts +1 -1
- package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
- package/dist/components/ModalPage/ModalPage.js +53 -5
- package/dist/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/components/ModalPage/ModalPageInternal.d.ts +5 -2
- package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
- package/dist/components/ModalPage/ModalPageInternal.js +5 -4
- package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/components/ModalRoot/types.d.ts.map +1 -1
- package/dist/components/ModalRoot/types.js.map +1 -1
- package/dist/components/ModalRoot/useModalManager.d.ts +2 -0
- package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
- package/dist/components/ModalRoot/useModalManager.js +4 -1
- package/dist/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.d.ts.map +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.js +2 -2
- package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner/Spinner.js +11 -43
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Spinner/SpinnerAnimation.d.ts +7 -0
- package/dist/components/Spinner/SpinnerAnimation.d.ts.map +1 -0
- package/dist/components/Spinner/SpinnerAnimation.js +36 -0
- package/dist/components/Spinner/SpinnerAnimation.js.map +1 -0
- package/dist/components/SplitLayout/SplitLayout.d.ts +4 -4
- package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.js +1 -3
- package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cssm/components/AppRoot/AppRoot.js +14 -9
- package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
- package/dist/cssm/components/AppRoot/AppRoot.module.css +17 -0
- package/dist/cssm/components/AppRoot/AppRootPortal.js +1 -1
- package/dist/cssm/components/AppRoot/AppRootPortal.js.map +1 -1
- package/dist/cssm/components/AppRoot/{AppRootStyleContainer.js → AppRootStyleContainer/AppRootStyleContainer.js} +12 -23
- package/dist/cssm/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
- package/dist/cssm/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -31
- package/dist/cssm/components/AppRoot/helpers.js +17 -1
- package/dist/cssm/components/AppRoot/helpers.js.map +1 -1
- package/dist/cssm/components/Button/Button.module.css +6 -6
- package/dist/cssm/components/Card/Card.module.css +12 -6
- package/dist/cssm/components/Clickable/Clickable.js +2 -55
- package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
- package/dist/cssm/components/Clickable/RealClickable.js +61 -0
- package/dist/cssm/components/Clickable/RealClickable.js.map +1 -0
- package/dist/cssm/components/FormField/FormField.module.css +2 -0
- package/dist/cssm/components/FormItem/FormItem.module.css +6 -6
- package/dist/cssm/components/Group/Group.module.css +1 -0
- package/dist/cssm/components/Header/Header.module.css +10 -4
- package/dist/cssm/components/HorizontalCell/HorizontalCell.js +2 -12
- package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
- package/dist/cssm/components/IconButton/IconButton.module.css +12 -3
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
- package/dist/cssm/components/ModalCard/ModalCardInternal.js +1 -1
- package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
- package/dist/cssm/components/ModalPage/ModalPage.js +50 -4
- package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
- package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
- package/dist/cssm/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
- package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cssm/components/ModalRoot/types.js.map +1 -1
- package/dist/cssm/components/ModalRoot/useModalManager.js +4 -1
- package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +10 -4
- package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
- package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +2 -3
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/cssm/components/Removable/Removable.module.css +7 -2
- package/dist/cssm/components/Spinner/Spinner.js +11 -43
- package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
- package/dist/cssm/components/Spinner/SpinnerAnimation.js +36 -0
- package/dist/cssm/components/Spinner/SpinnerAnimation.js.map +1 -0
- package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
- package/dist/cssm/components/View/View.module.css +2 -2
- package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
- package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
- package/dist/cssm/index.js.map +1 -1
- package/dist/cssm/lib/adaptivity/functions.js +1 -7
- package/dist/cssm/lib/adaptivity/functions.js.map +1 -1
- package/dist/cssm/lib/animation/useReducedMotion.js +4 -7
- package/dist/cssm/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js +22 -37
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js +1 -9
- package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
- package/dist/cssm/lib/sheet/index.js +1 -1
- package/dist/cssm/lib/sheet/index.js.map +1 -1
- package/dist/cssm/lib/sheet/useBottomSheet.js +12 -15
- package/dist/cssm/lib/sheet/useBottomSheet.js.map +1 -1
- package/dist/cssm/styles/common.css +10 -4
- package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts +3 -2
- package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts.map +1 -1
- package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
- package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/adaptivity/functions.d.ts +0 -1
- package/dist/lib/adaptivity/functions.d.ts.map +1 -1
- package/dist/lib/adaptivity/functions.js +1 -7
- package/dist/lib/adaptivity/functions.js.map +1 -1
- package/dist/lib/animation/useReducedMotion.d.ts +1 -1
- package/dist/lib/animation/useReducedMotion.d.ts.map +1 -1
- package/dist/lib/animation/useReducedMotion.js +4 -7
- package/dist/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.d.ts +8 -8
- package/dist/lib/sheet/controllers/BottomSheetController.d.ts.map +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js +22 -37
- package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/lib/sheet/controllers/CSSTransitionController.d.ts +1 -1
- package/dist/lib/sheet/controllers/CSSTransitionController.d.ts.map +1 -1
- package/dist/lib/sheet/controllers/CSSTransitionController.js +1 -9
- package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
- package/dist/lib/sheet/index.d.ts +2 -1
- package/dist/lib/sheet/index.d.ts.map +1 -1
- package/dist/lib/sheet/index.js +1 -1
- package/dist/lib/sheet/index.js.map +1 -1
- package/dist/lib/sheet/useBottomSheet.d.ts +6 -5
- package/dist/lib/sheet/useBottomSheet.d.ts.map +1 -1
- package/dist/lib/sheet/useBottomSheet.js +12 -15
- package/dist/lib/sheet/useBottomSheet.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +2 -2
- package/src/components/ActionSheet/ActionSheet.tsx +1 -4
- package/src/components/AppRoot/AppRoot.module.css +17 -0
- package/src/components/AppRoot/AppRoot.tsx +24 -11
- package/src/components/AppRoot/AppRootPortal.tsx +1 -1
- package/src/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -24
- package/src/components/AppRoot/{AppRootStyleContainer.tsx → AppRootStyleContainer/AppRootStyleContainer.tsx} +11 -29
- package/src/components/AppRoot/helpers.ts +17 -1
- package/src/components/Button/Button.module.css +6 -6
- package/src/components/Card/Card.module.css +8 -6
- package/src/components/Clickable/Clickable.tsx +4 -103
- package/src/components/Clickable/RealClickable.tsx +99 -0
- package/src/components/FormField/FormField.module.css +2 -0
- package/src/components/FormItem/FormItem.module.css +6 -6
- package/src/components/Group/Group.module.css +1 -0
- package/src/components/Header/Header.module.css +8 -4
- package/src/components/HorizontalCell/HorizontalCell.tsx +8 -20
- package/src/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
- package/src/components/IconButton/IconButton.module.css +10 -3
- package/src/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
- package/src/components/ModalCard/ModalCardInternal.tsx +1 -1
- package/src/components/ModalPage/ModalPage.tsx +57 -3
- package/src/components/ModalPage/ModalPageInternal.tsx +14 -5
- package/src/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
- package/src/components/ModalRoot/ModalRoot.tsx +0 -1
- package/src/components/ModalRoot/types.ts +0 -1
- package/src/components/ModalRoot/useModalManager.tsx +5 -3
- package/src/components/PanelHeader/PanelHeader.module.css +8 -4
- package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
- package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +1 -1
- package/src/components/PopoutWrapper/PopoutWrapper.tsx +1 -4
- package/src/components/Removable/Removable.module.css +6 -2
- package/src/components/Spinner/Spinner.tsx +10 -48
- package/src/components/Spinner/SpinnerAnimation.tsx +42 -0
- package/src/components/SplitLayout/SplitLayout.tsx +4 -4
- package/src/components/View/View.module.css +2 -2
- package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +13 -4
- package/src/index.ts +2 -2
- package/src/lib/adaptivity/functions.ts +1 -8
- package/src/lib/animation/useReducedMotion.ts +6 -13
- package/src/lib/sheet/controllers/BottomSheetController.ts +32 -50
- package/src/lib/sheet/controllers/CSSTransitionController.ts +1 -8
- package/src/lib/sheet/index.ts +3 -0
- package/src/lib/sheet/useBottomSheet.ts +21 -17
- package/src/styles/common.css +12 -4
- package/dist/components/AppRoot/AppRootStyleContainer.d.ts.map +0 -1
- package/dist/components/AppRoot/AppRootStyleContainer.js +0 -57
- package/dist/components/AppRoot/AppRootStyleContainer.js.map +0 -1
- package/dist/cssm/components/AppRoot/AppRootStyleContainer.js.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useReducedMotion } from '../../lib/animation';
|
|
4
|
+
import { type SpinnerProps } from './Spinner';
|
|
5
|
+
|
|
6
|
+
interface SpinnerAnimationProps {
|
|
7
|
+
size: SpinnerProps['size'];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function SpinnerAnimation({ size = 'm' }: SpinnerAnimationProps) {
|
|
11
|
+
const isReducedMotion = useReducedMotion();
|
|
12
|
+
|
|
13
|
+
if (isReducedMotion === undefined) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (isReducedMotion) {
|
|
18
|
+
return (
|
|
19
|
+
<animate
|
|
20
|
+
attributeName="opacity"
|
|
21
|
+
keyTimes="0; 0.5; 1"
|
|
22
|
+
values="1; 0.1; 1"
|
|
23
|
+
begin="0s"
|
|
24
|
+
dur="2s"
|
|
25
|
+
repeatCount="indefinite"
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const center = { s: 8, m: 12, l: 16, xl: 22 }[size];
|
|
31
|
+
return (
|
|
32
|
+
<animateTransform
|
|
33
|
+
attributeType="XML"
|
|
34
|
+
attributeName="transform"
|
|
35
|
+
type="rotate"
|
|
36
|
+
from={`0 ${center} ${center}`}
|
|
37
|
+
to={`360 ${center} ${center}`}
|
|
38
|
+
dur="0.7s"
|
|
39
|
+
repeatCount="indefinite"
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -12,17 +12,17 @@ export interface SplitLayoutProps
|
|
|
12
12
|
/**
|
|
13
13
|
* Свойство для отрисовки `Alert`, `ActionSheet` и `ScreenSpinner`.
|
|
14
14
|
*
|
|
15
|
-
* @deprecated будет
|
|
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 будет
|
|
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 {
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
20
|
+
setReducedMotion(match.matches);
|
|
28
21
|
/* istanbul ignore next: на текущий момент, покрытие данного кейса неинтересно */
|
|
29
22
|
const handleMediaQueryChange = (event: MediaQueryListEvent) => {
|
|
30
23
|
/* istanbul ignore next */
|
|
31
|
-
|
|
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
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
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(
|
|
47
|
+
init(snapPoint: SnapPoint) {
|
|
80
48
|
this.isInitialized = true;
|
|
81
49
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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 (
|
|
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(
|
|
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
|
|
package/src/lib/sheet/index.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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] есть возможность открывать до определенного размера (см. `
|
|
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] при `
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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(
|
|
143
|
+
bsController.init(snapPoint);
|
|
140
144
|
}
|
|
141
145
|
},
|
|
142
|
-
[
|
|
146
|
+
[snapPoint, bsController],
|
|
143
147
|
);
|
|
144
148
|
|
|
145
149
|
useIsomorphicLayoutEffect(
|
package/src/styles/common.css
CHANGED
|
@@ -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"}
|