@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.
- 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 +4 -0
- package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
- 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.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 +4 -1
- 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
|
@@ -174,16 +174,17 @@
|
|
|
174
174
|
*
|
|
175
175
|
* TODO: Переделать отрицательные отступы https://github.com/VKCOM/VKUI/issues/3508
|
|
176
176
|
*/
|
|
177
|
-
/* stylelint-disable
|
|
177
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
178
178
|
:global(.vkuiInternalGroup--mode-plain):not(:first-of-type) > .host:first-child,
|
|
179
179
|
:global(.vkuiInternalGroup--mode-plain):not(:first-of-type)
|
|
180
180
|
> :global(.vkuiInternalTappable):first-child
|
|
181
181
|
> .host {
|
|
182
182
|
margin-block-start: -16px;
|
|
183
183
|
}
|
|
184
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
184
185
|
|
|
185
186
|
@media (--sizeX-compact) {
|
|
186
|
-
/* stylelint-disable
|
|
187
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
187
188
|
:global(.vkuiInternalGroup--sizeX-none.vkuiInternalGroup--mode-none):not(:first-of-type)
|
|
188
189
|
> .host:first-child,
|
|
189
190
|
:global(.vkuiInternalGroup--sizeX-none.vkuiInternalGroup--mode-none):not(:first-of-type)
|
|
@@ -191,18 +192,20 @@
|
|
|
191
192
|
> .host {
|
|
192
193
|
margin-block-start: -16px;
|
|
193
194
|
}
|
|
195
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
194
196
|
}
|
|
195
197
|
|
|
196
|
-
/* stylelint-disable
|
|
198
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
197
199
|
:global(.vkuiInternalGroup--mode-card) > .host:not(.sizeM):first-child,
|
|
198
200
|
:global(.vkuiInternalGroup--mode-card)
|
|
199
201
|
> :global(.vkuiInternalTappable):first-child
|
|
200
202
|
> .host:not(.sizeM) {
|
|
201
203
|
margin-block-start: calc(-1 * var(--vkui--spacing_size_xs));
|
|
202
204
|
}
|
|
205
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
203
206
|
|
|
204
207
|
@media (--sizeX-regular) {
|
|
205
|
-
/* stylelint-disable
|
|
208
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
206
209
|
:global(.vkuiInternalGroup--sizeX-none.vkuiInternalGroup--mode-none)
|
|
207
210
|
> .host:not(.sizeM):first-child,
|
|
208
211
|
:global(.vkuiInternalGroup--sizeX-none.vkuiInternalGroup--mode-none)
|
|
@@ -210,6 +213,7 @@
|
|
|
210
213
|
> .host:not(.sizeM) {
|
|
211
214
|
margin-block-start: calc(-1 * var(--vkui--spacing_size_xs));
|
|
212
215
|
}
|
|
216
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
213
217
|
}
|
|
214
218
|
|
|
215
219
|
/**
|
|
@@ -60,7 +60,10 @@ export interface HorizontalCellProps
|
|
|
60
60
|
* Актуально для использования в многострочных списках
|
|
61
61
|
*/
|
|
62
62
|
noPadding?: boolean;
|
|
63
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Позволяет передать типографический компонент, используемый для `title`.
|
|
65
|
+
* По умолчанию `Caption` для `size=s`, иначе `Subhead`.
|
|
66
|
+
*/
|
|
64
67
|
TitleComponent?: React.ElementType;
|
|
65
68
|
}
|
|
66
69
|
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
|
|
67
67
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
68
68
|
:global(.vkuiInternalTabs--withGaps) .inWrapper::after,
|
|
69
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
69
70
|
:global(.vkuiInternalTabs--withGaps) .inWrapper::before {
|
|
70
71
|
display: block;
|
|
71
72
|
inline-size: var(--vkui--size_base_padding_horizontal--regular);
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
45
45
|
.sizeYCompact :global(.vkuiIcon--16),
|
|
46
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
46
47
|
.sizeYCompact :global(.vkuiIcon--16.vkuiIcon--w-8) {
|
|
47
48
|
padding: 14px;
|
|
48
49
|
}
|
|
@@ -74,6 +75,7 @@
|
|
|
74
75
|
|
|
75
76
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
76
77
|
.sizeYNone :global(.vkuiIcon--16),
|
|
78
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
77
79
|
.sizeYNone :global(.vkuiIcon--16.vkuiIcon--w-8) {
|
|
78
80
|
padding: 14px;
|
|
79
81
|
}
|
|
@@ -97,7 +99,9 @@
|
|
|
97
99
|
*/
|
|
98
100
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
99
101
|
:global(.vkuiInternalFormItem--removable) :global(.vkuiInternalRemovable__content) > .host,
|
|
102
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
100
103
|
:global(.vkuiInternalFormLayoutGroup--removable) :global(.vkuiInternalRemovable__content) > .host,
|
|
104
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
101
105
|
:global(.vkuiInternalFormField__after) .host {
|
|
102
106
|
display: flex;
|
|
103
107
|
align-items: center;
|
|
@@ -108,12 +112,13 @@
|
|
|
108
112
|
border-radius: var(--vkui--size_border_radius--regular);
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
/* stylelint-disable
|
|
115
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
112
116
|
:global(.vkuiInternalFormField__after)
|
|
113
117
|
.host
|
|
114
118
|
:global(.vkuiIcon):global(.vkuiIcon):global(.vkuiIcon) {
|
|
115
119
|
padding: 0;
|
|
116
120
|
}
|
|
121
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
117
122
|
|
|
118
123
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
119
124
|
:global(.vkuiInternalFormField__after) .sizeYCompact {
|
|
@@ -121,13 +126,14 @@
|
|
|
121
126
|
block-size: var(--vkui--size_field_height--compact);
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
/* stylelint-disable
|
|
129
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
125
130
|
:global(.vkuiInternalFormItem--removable) :global(.vkuiInternalRemovable__content) > .sizeYCompact,
|
|
126
131
|
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
127
132
|
:global(.vkuiInternalRemovable__content)
|
|
128
133
|
> .sizeYCompact {
|
|
129
134
|
block-size: var(--vkui--size_field_height--compact);
|
|
130
135
|
}
|
|
136
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
131
137
|
|
|
132
138
|
@media (--sizeY-compact) {
|
|
133
139
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
@@ -136,13 +142,14 @@
|
|
|
136
142
|
block-size: var(--vkui--size_field_height--compact);
|
|
137
143
|
}
|
|
138
144
|
|
|
139
|
-
/* stylelint-disable
|
|
145
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
140
146
|
:global(.vkuiInternalFormItem--removable) :global(.vkuiInternalRemovable__content) > .sizeYNone,
|
|
141
147
|
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
142
148
|
:global(.vkuiInternalRemovable__content)
|
|
143
149
|
> .sizeYNone {
|
|
144
150
|
block-size: var(--vkui--size_field_height--compact);
|
|
145
151
|
}
|
|
152
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
146
153
|
}
|
|
147
154
|
|
|
148
155
|
/**
|
|
@@ -75,6 +75,7 @@
|
|
|
75
75
|
|
|
76
76
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
77
77
|
.modeAdd .middle :global(.vkuiIcon),
|
|
78
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
78
79
|
.modeMore .middle :global(.vkuiIcon) {
|
|
79
80
|
color: var(--vkui--color_icon_accent_themed);
|
|
80
81
|
}
|
|
@@ -97,7 +97,7 @@ export const ModalCardInternal = ({
|
|
|
97
97
|
bottomSheetEnabled,
|
|
98
98
|
{
|
|
99
99
|
blocked: keyboardOpened,
|
|
100
|
-
|
|
100
|
+
snapPoint: 'auto',
|
|
101
101
|
sheetCSSProperty: '--vkui_internal_ModalCard--translateY',
|
|
102
102
|
backdropCSSProperty: '--vkui_internal--modal-overlay--opacity',
|
|
103
103
|
onDismiss() {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useId } from 'react';
|
|
3
|
+
import { useId, useMemo } from 'react';
|
|
4
4
|
import { ModalContext } from '../../context/ModalContext';
|
|
5
|
+
import { inRange } from '../../helpers/range';
|
|
5
6
|
import { getNavId } from '../../lib/getNavId';
|
|
7
|
+
import { SNAP_POINT_DETENTS, SNAP_POINT_SAFE_RANGE, type SnapPoint } from '../../lib/sheet';
|
|
6
8
|
import { warnOnce } from '../../lib/warnOnce';
|
|
7
9
|
import { useModalManager } from '../ModalRoot/useModalManager';
|
|
8
10
|
import { ModalPageInternal } from './ModalPageInternal';
|
|
@@ -10,6 +12,8 @@ import type { ModalPageProps } from './types';
|
|
|
10
12
|
|
|
11
13
|
const warn = warnOnce('ModalPage');
|
|
12
14
|
|
|
15
|
+
const snapPointCache = new Map<string, Exclude<SnapPoint, 'auto'>>();
|
|
16
|
+
|
|
13
17
|
/**
|
|
14
18
|
* @see https://vkcom.github.io/VKUI/#/ModalPage
|
|
15
19
|
*/
|
|
@@ -25,13 +29,14 @@ export const ModalPage = ({
|
|
|
25
29
|
onClosed,
|
|
26
30
|
size = 's',
|
|
27
31
|
settlingHeight = 50,
|
|
32
|
+
dynamicContentHeight,
|
|
28
33
|
keepMounted = false,
|
|
29
34
|
...restProps
|
|
30
35
|
}: ModalPageProps) => {
|
|
31
36
|
const generatingId = useId();
|
|
32
37
|
const id = getNavId({ nav, id: idProp }, warn) || generatingId;
|
|
33
38
|
|
|
34
|
-
const { mounted, ...resolvedProps } = useModalManager({
|
|
39
|
+
const { mounted, shouldPreserveSnapPoint, ...resolvedProps } = useModalManager({
|
|
35
40
|
id,
|
|
36
41
|
open,
|
|
37
42
|
keepMounted,
|
|
@@ -43,6 +48,29 @@ export const ModalPage = ({
|
|
|
43
48
|
onClosed,
|
|
44
49
|
});
|
|
45
50
|
|
|
51
|
+
const snapPoint = useMemo((): SnapPoint => {
|
|
52
|
+
if (dynamicContentHeight) {
|
|
53
|
+
return 'auto';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (shouldPreserveSnapPoint) {
|
|
57
|
+
const snapPointCached = snapPointCache.get(id);
|
|
58
|
+
|
|
59
|
+
if (snapPointCached) {
|
|
60
|
+
return snapPointCached;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const nextSnapPoint = transformSettlingHeightToSnapPoint(settlingHeight);
|
|
64
|
+
snapPointCache.set(id, nextSnapPoint);
|
|
65
|
+
|
|
66
|
+
return nextSnapPoint;
|
|
67
|
+
} else {
|
|
68
|
+
snapPointCache.delete(id);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return transformSettlingHeightToSnapPoint(settlingHeight);
|
|
72
|
+
}, [id, shouldPreserveSnapPoint, dynamicContentHeight, settlingHeight]);
|
|
73
|
+
|
|
46
74
|
if (!mounted) {
|
|
47
75
|
return null;
|
|
48
76
|
}
|
|
@@ -53,10 +81,36 @@ export const ModalPage = ({
|
|
|
53
81
|
id={id}
|
|
54
82
|
size={size}
|
|
55
83
|
aria-labelledby={`${id}-label`}
|
|
56
|
-
|
|
84
|
+
snapPoint={snapPoint}
|
|
85
|
+
onSnapPointChange={
|
|
86
|
+
snapPoint !== 'auto' && shouldPreserveSnapPoint
|
|
87
|
+
? (snapPoint) => {
|
|
88
|
+
const snapPointCached = snapPointCache.get(id);
|
|
89
|
+
|
|
90
|
+
if (snapPointCached) {
|
|
91
|
+
snapPointCached.initial = snapPoint;
|
|
92
|
+
snapPointCache.set(id, snapPointCached);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
: undefined
|
|
96
|
+
}
|
|
57
97
|
{...resolvedProps}
|
|
58
98
|
{...restProps}
|
|
59
99
|
/>
|
|
60
100
|
</ModalContext.Provider>
|
|
61
101
|
);
|
|
62
102
|
};
|
|
103
|
+
|
|
104
|
+
function transformSettlingHeightToSnapPoint(settlingHeight: number): Exclude<SnapPoint, 'auto'> {
|
|
105
|
+
const currentSnapPoint = Math.min(
|
|
106
|
+
Math.max(settlingHeight, SNAP_POINT_SAFE_RANGE.LOWER),
|
|
107
|
+
SNAP_POINT_DETENTS.LARGE,
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
initial: currentSnapPoint,
|
|
112
|
+
detents: inRange(currentSnapPoint, SNAP_POINT_SAFE_RANGE.LOWER, SNAP_POINT_SAFE_RANGE.HIGHEST)
|
|
113
|
+
? [SNAP_POINT_DETENTS.MIN, currentSnapPoint, SNAP_POINT_DETENTS.LARGE]
|
|
114
|
+
: [SNAP_POINT_DETENTS.MIN, currentSnapPoint],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -7,7 +7,12 @@ import { useExternRef } from '../../hooks/useExternRef';
|
|
|
7
7
|
import { useVirtualKeyboardState } from '../../hooks/useVirtualKeyboardState';
|
|
8
8
|
import { Keys, pressedKey } from '../../lib/accessibility';
|
|
9
9
|
import { useCSSTransition, type UseCSSTransitionState } from '../../lib/animation';
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE,
|
|
12
|
+
type SnapPoint,
|
|
13
|
+
type SnapPointChange,
|
|
14
|
+
useBottomSheet,
|
|
15
|
+
} from '../../lib/sheet';
|
|
11
16
|
import type { CSSCustomProperties } from '../../types';
|
|
12
17
|
import { useScrollLock } from '../AppRoot/ScrollContext';
|
|
13
18
|
import { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';
|
|
@@ -33,8 +38,11 @@ const transitionStateClassNames: Partial<Record<UseCSSTransitionState, string>>
|
|
|
33
38
|
exited: styles['documentStateExited'],
|
|
34
39
|
};
|
|
35
40
|
|
|
36
|
-
export interface ModalPageInternalProps
|
|
41
|
+
export interface ModalPageInternalProps
|
|
42
|
+
extends Omit<ModalPageProps, 'nav' | 'keepMounted' | 'settlingHeight' | 'dynamicContentHeight'> {
|
|
43
|
+
snapPoint: SnapPoint;
|
|
37
44
|
ModalOverlay?: ComponentType<ModalOverlayProps>;
|
|
45
|
+
onSnapPointChange?: SnapPointChange;
|
|
38
46
|
}
|
|
39
47
|
|
|
40
48
|
/**
|
|
@@ -51,8 +59,8 @@ export const ModalPageInternal = ({
|
|
|
51
59
|
children,
|
|
52
60
|
className,
|
|
53
61
|
style,
|
|
54
|
-
|
|
55
|
-
|
|
62
|
+
snapPoint,
|
|
63
|
+
onSnapPointChange,
|
|
56
64
|
getModalContentRef,
|
|
57
65
|
ModalOverlay = ModalOverlayDefault,
|
|
58
66
|
modalOverlayTestId,
|
|
@@ -92,9 +100,10 @@ export const ModalPageInternal = ({
|
|
|
92
100
|
const [{ initialStyle, setSheetEl, setSheetScrollEl, setBackdropEl }, bottomSheetEventHandlers] =
|
|
93
101
|
useBottomSheet(bottomSheetEnabled, {
|
|
94
102
|
blocked: keyboardOpened,
|
|
95
|
-
|
|
103
|
+
snapPoint,
|
|
96
104
|
sheetCSSProperty: '--vkui_internal_ModalPageDocument--snapPoint',
|
|
97
105
|
backdropCSSProperty: '--vkui_internal--modal-overlay--opacity',
|
|
106
|
+
onSnapPointChange,
|
|
98
107
|
onDismiss() {
|
|
99
108
|
onClose('swipe-down');
|
|
100
109
|
},
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
20
20
|
.host :global(.vkuiIcon--dismiss_24), /* Note: <Icon24Dismiss /> по документации используется только для iOS */
|
|
21
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
21
22
|
.host :global(.vkuiIcon--cancel_24) {
|
|
22
23
|
color: var(--vkui--color_icon_secondary);
|
|
23
24
|
}
|
|
@@ -30,8 +30,8 @@ export interface UseModalManagerResolvedProps {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export type UseModalManagerResult =
|
|
33
|
-
| { mounted: false }
|
|
34
|
-
| ({ mounted: true } & UseModalManagerResolvedProps);
|
|
33
|
+
| { mounted: false; shouldPreserveSnapPoint: boolean }
|
|
34
|
+
| ({ mounted: true; shouldPreserveSnapPoint: boolean } & UseModalManagerResolvedProps);
|
|
35
35
|
|
|
36
36
|
export const useModalManager = ({
|
|
37
37
|
id,
|
|
@@ -46,6 +46,7 @@ export const useModalManager = ({
|
|
|
46
46
|
}: UseModalManager): UseModalManagerResult => {
|
|
47
47
|
const context = useContext(ModalRootContext);
|
|
48
48
|
const opened = context.isInsideModal ? context.activeModal === id : open;
|
|
49
|
+
const shouldPreserveSnapPoint = context.isInsideModal ? context.activeModal !== null : false;
|
|
49
50
|
|
|
50
51
|
const [unmounted, setUnmounted] = useState(keepMounted ? false : !opened);
|
|
51
52
|
|
|
@@ -59,12 +60,13 @@ export const useModalManager = ({
|
|
|
59
60
|
);
|
|
60
61
|
|
|
61
62
|
if (unmounted) {
|
|
62
|
-
return { mounted: false };
|
|
63
|
+
return { mounted: false, shouldPreserveSnapPoint };
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
return {
|
|
66
67
|
mounted: true,
|
|
67
68
|
open: opened,
|
|
69
|
+
shouldPreserveSnapPoint,
|
|
68
70
|
noFocusToDialog: noFocusToDialog || context.noFocusToDialog,
|
|
69
71
|
modalOverlayTestId: modalOverlayTestId || context.modalOverlayTestId,
|
|
70
72
|
ModalOverlay: context.isInsideModal ? VisuallyHiddenModalOverlay : ModalOverlay,
|
|
@@ -182,20 +182,22 @@
|
|
|
182
182
|
* CMP:
|
|
183
183
|
* SplitCol
|
|
184
184
|
*/
|
|
185
|
-
/* stylelint-disable
|
|
185
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
186
186
|
:global(.vkuiInternalSplitCol--viewWidth-tabletPlus):global(.vkuiInternalSplitCol--spaced-auto)
|
|
187
187
|
.android.noBefore:not(:global(.vkuiInternalModalPageHeader__in))
|
|
188
188
|
.content {
|
|
189
189
|
padding-inline-start: 0;
|
|
190
190
|
}
|
|
191
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
191
192
|
|
|
192
193
|
@media (--viewWidth-smallTabletPlus) {
|
|
193
|
-
/* stylelint-disable
|
|
194
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
194
195
|
:global(.vkuiInternalSplitCol--viewWidth-none):global(.vkuiInternalSplitCol--spaced-auto)
|
|
195
196
|
.android.noBefore:not(:global(.vkuiInternalModalPageHeader__in))
|
|
196
197
|
.content {
|
|
197
198
|
padding-inline-start: 0;
|
|
198
199
|
}
|
|
200
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
199
201
|
}
|
|
200
202
|
|
|
201
203
|
/* stylelint-disable selector-max-universal */
|
|
@@ -213,20 +215,22 @@
|
|
|
213
215
|
padding-inline-start: 16px;
|
|
214
216
|
}
|
|
215
217
|
|
|
216
|
-
/* stylelint-disable
|
|
218
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
217
219
|
:global(.vkuiInternalSplitCol--viewWidth-tabletPlus):global(.vkuiInternalSplitCol--spaced-auto)
|
|
218
220
|
.android.noAfter:not(:global(.vkuiInternalModalPageHeader__in))
|
|
219
221
|
.content {
|
|
220
222
|
padding-inline-end: 0;
|
|
221
223
|
}
|
|
224
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
222
225
|
|
|
223
226
|
@media (--viewWidth-smallTabletPlus) {
|
|
224
|
-
/* stylelint-disable
|
|
227
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
225
228
|
:global(.vkuiInternalSplitCol--viewWidth-none):global(.vkuiInternalSplitCol--spaced-auto)
|
|
226
229
|
.android.noAfter:not(:global(.vkuiInternalModalPageHeader__in))
|
|
227
230
|
.content {
|
|
228
231
|
padding-inline-end: 0;
|
|
229
232
|
}
|
|
233
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
230
234
|
}
|
|
231
235
|
|
|
232
236
|
.android .after:not(:empty),
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
|
|
63
63
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
64
64
|
.android :global(.vkuiIcon--24),
|
|
65
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
65
66
|
.android :global(.vkuiIcon--28) {
|
|
66
67
|
padding: 10px;
|
|
67
68
|
}
|
|
@@ -86,6 +87,7 @@
|
|
|
86
87
|
|
|
87
88
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
88
89
|
.vkcom.hover > :not(:global(.vkuiInternalCounter)):not(:global(.vkuiInternalBadge)),
|
|
90
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
89
91
|
.vkcom.active > :not(:global(.vkuiInternalCounter)):not(:global(.vkuiInternalBadge)) {
|
|
90
92
|
opacity: 1;
|
|
91
93
|
}
|
|
@@ -135,6 +137,7 @@
|
|
|
135
137
|
|
|
136
138
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
137
139
|
.host :global(.vkuiIcon--24) ~ :global(.vkuiInternalCounter),
|
|
140
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
138
141
|
.ios :global(.vkuiInternalCounter) {
|
|
139
142
|
inset-block-start: 2px;
|
|
140
143
|
inset-inline-end: 2px;
|
|
@@ -154,6 +157,7 @@
|
|
|
154
157
|
|
|
155
158
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
156
159
|
.host :global(.vkuiIcon--24) ~ :global(.vkuiInternalBadge),
|
|
160
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
157
161
|
.ios :global(.vkuiInternalBadge) {
|
|
158
162
|
inset-block-start: 6px;
|
|
159
163
|
inset-inline-end: 6px;
|
|
@@ -18,7 +18,7 @@ const platformClassNames = {
|
|
|
18
18
|
|
|
19
19
|
export interface PanelHeaderButtonProps extends Omit<TappableProps, 'label'> {
|
|
20
20
|
primary?: boolean;
|
|
21
|
-
// TODO [>=
|
|
21
|
+
// TODO [>=8]: добавить св-во `indicator`, чтобы разграничить кейсы
|
|
22
22
|
label?: React.ReactNode;
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -72,10 +72,7 @@ export const PopoutWrapper = ({
|
|
|
72
72
|
fixed && styles.fixed,
|
|
73
73
|
!noBackground && styles.masked,
|
|
74
74
|
)}
|
|
75
|
-
|
|
76
|
-
zIndex,
|
|
77
|
-
...restProps.style,
|
|
78
|
-
}}
|
|
75
|
+
baseStyle={{ zIndex }}
|
|
79
76
|
>
|
|
80
77
|
<div className={styles.container}>
|
|
81
78
|
<div className={styles.overlay} onClick={onClick} />
|
|
@@ -105,6 +105,7 @@
|
|
|
105
105
|
*/
|
|
106
106
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
107
107
|
:global(.vkuiInternalFormItem--removable) .content,
|
|
108
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
108
109
|
:global(.vkuiInternalFormLayoutGroup--removable) .content {
|
|
109
110
|
flex-wrap: wrap;
|
|
110
111
|
align-items: flex-start;
|
|
@@ -116,6 +117,7 @@
|
|
|
116
117
|
|
|
117
118
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
118
119
|
:global(.vkuiInternalFormItem--withTop) :global(.vkuiInternalFormItem__removable) ~ .offset,
|
|
120
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
119
121
|
:global(.vkuiInternalFormLayoutGroup--removable) :global(.vkuiInternalFormItem--withTop) ~ .offset {
|
|
120
122
|
order: -1;
|
|
121
123
|
display: block;
|
|
@@ -123,7 +125,7 @@
|
|
|
123
125
|
block-size: calc(2px + var(--vkui--font_subhead--line_height--regular) + 8px);
|
|
124
126
|
}
|
|
125
127
|
|
|
126
|
-
/* stylelint-disable
|
|
128
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
127
129
|
:global(.vkuiInternalFormItem--sizeY-compact):global(.vkuiInternalFormItem--withTop)
|
|
128
130
|
:global(.vkuiInternalFormItem__removable)
|
|
129
131
|
~ .offset,
|
|
@@ -132,9 +134,10 @@
|
|
|
132
134
|
~ .offset {
|
|
133
135
|
block-size: calc(2px + var(--vkui--font_subhead--line_height--compact) + 6px);
|
|
134
136
|
}
|
|
137
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
135
138
|
|
|
136
139
|
@media (--sizeY-compact) {
|
|
137
|
-
/* stylelint-disable
|
|
140
|
+
/* stylelint-disable selector-pseudo-class-disallowed-list */
|
|
138
141
|
:global(.vkuiInternalFormItem--sizeY-none):global(.vkuiInternalFormItem--withTop)
|
|
139
142
|
:global(.vkuiInternalFormItem__removable)
|
|
140
143
|
~ .offset,
|
|
@@ -143,4 +146,5 @@
|
|
|
143
146
|
~ .offset {
|
|
144
147
|
block-size: calc(2px + var(--vkui--font_subhead--line_height--compact) + 6px);
|
|
145
148
|
}
|
|
149
|
+
/* stylelint-enable selector-pseudo-class-disallowed-list */
|
|
146
150
|
}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
1
|
import * as React from 'react';
|
|
4
2
|
import { Icon16Spinner, Icon24Spinner, Icon32Spinner, Icon44Spinner } from '@vkontakte/icons';
|
|
5
3
|
import { classNames, hasReactNode } from '@vkontakte/vkjs';
|
|
6
|
-
import { useReducedMotion } from '../../lib/animation';
|
|
7
4
|
import type { HTMLAttributesWithRootRef } from '../../types';
|
|
8
5
|
import { RootComponent } from '../RootComponent/RootComponent';
|
|
9
6
|
import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
|
|
7
|
+
import { SpinnerAnimation } from './SpinnerAnimation';
|
|
10
8
|
import styles from './Spinner.module.css';
|
|
11
9
|
|
|
10
|
+
const spinnerIconMap = {
|
|
11
|
+
s: Icon16Spinner,
|
|
12
|
+
m: Icon24Spinner,
|
|
13
|
+
l: Icon32Spinner,
|
|
14
|
+
xl: Icon44Spinner,
|
|
15
|
+
};
|
|
16
|
+
|
|
12
17
|
export interface SpinnerProps extends HTMLAttributesWithRootRef<HTMLSpanElement> {
|
|
13
18
|
size?: 's' | 'm' | 'l' | 'xl';
|
|
14
19
|
disableAnimation?: boolean;
|
|
@@ -29,50 +34,7 @@ export const Spinner: React.FC<SpinnerProps> = React.memo(
|
|
|
29
34
|
noColor = false,
|
|
30
35
|
...restProps
|
|
31
36
|
}: SpinnerProps) => {
|
|
32
|
-
const
|
|
33
|
-
const SpinnerIcon = {
|
|
34
|
-
s: Icon16Spinner,
|
|
35
|
-
m: Icon24Spinner,
|
|
36
|
-
l: Icon32Spinner,
|
|
37
|
-
xl: Icon44Spinner,
|
|
38
|
-
}[size];
|
|
39
|
-
let svgAnimateElement: React.ReactNode = null;
|
|
40
|
-
|
|
41
|
-
const [isReadyForSetSVGAnimateElement, setIsReadyForSetSVGAnimateElement] = React.useState(
|
|
42
|
-
disableAnimation ? true : false,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
React.useEffect(function waitReactHydrationBeforeSetSVGAnimateElement() {
|
|
46
|
-
setIsReadyForSetSVGAnimateElement(true);
|
|
47
|
-
}, []);
|
|
48
|
-
|
|
49
|
-
if (isReadyForSetSVGAnimateElement && !disableAnimation) {
|
|
50
|
-
if (isReducedMotion) {
|
|
51
|
-
svgAnimateElement = (
|
|
52
|
-
<animate
|
|
53
|
-
attributeName="opacity"
|
|
54
|
-
keyTimes="0; 0.5; 1"
|
|
55
|
-
values="1; 0.1; 1"
|
|
56
|
-
begin="0s"
|
|
57
|
-
dur="2s"
|
|
58
|
-
repeatCount="indefinite"
|
|
59
|
-
/>
|
|
60
|
-
);
|
|
61
|
-
} else {
|
|
62
|
-
const center = { s: 8, m: 12, l: 16, xl: 22 }[size];
|
|
63
|
-
svgAnimateElement = (
|
|
64
|
-
<animateTransform
|
|
65
|
-
attributeType="XML"
|
|
66
|
-
attributeName="transform"
|
|
67
|
-
type="rotate"
|
|
68
|
-
from={`0 ${center} ${center}`}
|
|
69
|
-
to={`360 ${center} ${center}`}
|
|
70
|
-
dur="0.7s"
|
|
71
|
-
repeatCount="indefinite"
|
|
72
|
-
/>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
37
|
+
const SpinnerIcon = spinnerIconMap[size];
|
|
76
38
|
|
|
77
39
|
return (
|
|
78
40
|
<RootComponent
|
|
@@ -81,7 +43,7 @@ export const Spinner: React.FC<SpinnerProps> = React.memo(
|
|
|
81
43
|
{...restProps}
|
|
82
44
|
baseClassName={classNames(styles.host, noColor && styles.noColor)}
|
|
83
45
|
>
|
|
84
|
-
<SpinnerIcon>{
|
|
46
|
+
<SpinnerIcon>{disableAnimation ? null : <SpinnerAnimation size={size} />}</SpinnerIcon>
|
|
85
47
|
{hasReactNode(children) && <VisuallyHidden>{children}</VisuallyHidden>}
|
|
86
48
|
</RootComponent>
|
|
87
49
|
);
|
|
@@ -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
|
+
}
|