@vkontakte/vkui 6.5.0 → 6.5.2
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/cjs/components/Button/Button.js +1 -1
- package/dist/cjs/components/Button/Button.js.map +1 -1
- package/dist/cjs/components/Cell/Cell.d.ts.map +1 -1
- package/dist/cjs/components/Cell/Cell.js +10 -14
- package/dist/cjs/components/Cell/Cell.js.map +1 -1
- package/dist/cjs/components/ChipsInputBase/Chip/Chip.js +2 -2
- package/dist/cjs/components/ChipsInputBase/Chip/Chip.js.map +1 -1
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +9 -9
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/Clickable/Clickable.d.ts.map +1 -1
- package/dist/cjs/components/Clickable/Clickable.js +1 -1
- package/dist/cjs/components/Clickable/Clickable.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +3 -13
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +45 -70
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts +4 -2
- package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelectInput.js +19 -24
- package/dist/cjs/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/cjs/components/CustomSelect/helpers.d.ts +8 -0
- package/dist/cjs/components/CustomSelect/helpers.d.ts.map +1 -0
- package/dist/cjs/components/CustomSelect/helpers.js +76 -0
- package/dist/cjs/components/CustomSelect/helpers.js.map +1 -0
- package/dist/cjs/components/CustomSelect/types.d.ts +12 -0
- package/dist/cjs/components/CustomSelect/types.d.ts.map +1 -0
- package/dist/cjs/components/CustomSelect/types.js +6 -0
- package/dist/cjs/components/CustomSelect/types.js.map +1 -0
- package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
- package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -14
- package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/cjs/components/DateInput/DateInput.d.ts +1 -1
- package/dist/cjs/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/cjs/components/DateInput/DateInput.js.map +1 -1
- package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts +1 -1
- package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/cjs/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cjs/components/Flex/FlexItem/FlexItem.d.ts +6 -4
- package/dist/cjs/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
- package/dist/cjs/components/Flex/FlexItem/FlexItem.js.map +1 -1
- package/dist/cjs/components/Footer/Footer.d.ts +1 -1
- package/dist/cjs/components/Footer/Footer.d.ts.map +1 -1
- package/dist/cjs/components/Footer/Footer.js +7 -3
- package/dist/cjs/components/Footer/Footer.js.map +1 -1
- package/dist/cjs/components/FormItem/FormItem.js +2 -2
- package/dist/cjs/components/FormItem/FormItem.js.map +1 -1
- package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
- package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js +3 -3
- package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
- package/dist/cjs/components/Group/Group.d.ts.map +1 -1
- package/dist/cjs/components/Group/Group.js +3 -2
- package/dist/cjs/components/Group/Group.js.map +1 -1
- package/dist/cjs/components/Link/Link.d.ts +1 -1
- package/dist/cjs/components/Link/Link.d.ts.map +1 -1
- package/dist/cjs/components/Link/Link.js +3 -5
- package/dist/cjs/components/Link/Link.js.map +1 -1
- package/dist/cjs/components/Removable/Removable.d.ts +5 -1
- package/dist/cjs/components/Removable/Removable.d.ts.map +1 -1
- package/dist/cjs/components/Removable/Removable.js +8 -5
- package/dist/cjs/components/Removable/Removable.js.map +1 -1
- package/dist/cjs/components/RootComponent/RootComponent.d.ts +1 -1
- package/dist/cjs/components/RootComponent/RootComponent.d.ts.map +1 -1
- package/dist/cjs/components/RootComponent/RootComponent.js +1 -1
- package/dist/cjs/components/RootComponent/RootComponent.js.map +1 -1
- package/dist/cjs/components/Search/Search.d.ts.map +1 -1
- package/dist/cjs/components/Search/Search.js +3 -2
- package/dist/cjs/components/Search/Search.js.map +1 -1
- package/dist/cjs/components/Select/Select.d.ts.map +1 -1
- package/dist/cjs/components/Select/Select.js +1 -2
- package/dist/cjs/components/Select/Select.js.map +1 -1
- package/dist/cjs/components/SelectTypography/SelectTypography.d.ts +2 -2
- package/dist/cjs/components/SelectTypography/SelectTypography.d.ts.map +1 -1
- package/dist/cjs/components/SelectTypography/SelectTypography.js.map +1 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.d.ts +1 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.d.ts.map +1 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.js +1 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cjs/components/Snackbar/Snackbar.js +2 -2
- package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/cjs/components/ToolButton/ToolButton.d.ts +1 -1
- package/dist/cjs/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/cjs/components/ToolButton/ToolButton.js +1 -3
- package/dist/cjs/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/cjs/components/View/View.d.ts.map +1 -1
- package/dist/cjs/components/View/View.js +16 -32
- package/dist/cjs/components/View/View.js.map +1 -1
- package/dist/cjs/hooks/useEnsuredControl.d.ts.map +1 -1
- package/dist/cjs/hooks/useEnsuredControl.js +27 -3
- package/dist/cjs/hooks/useEnsuredControl.js.map +1 -1
- package/dist/cjs/hooks/useIsClient.d.ts +1 -1
- package/dist/cjs/hooks/useIsClient.js.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/components/Button/Button.js +2 -2
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Cell/Cell.d.ts.map +1 -1
- package/dist/components/Cell/Cell.js +11 -15
- package/dist/components/Cell/Cell.js.map +1 -1
- package/dist/components/ChipsInputBase/Chip/Chip.js +3 -3
- package/dist/components/ChipsInputBase/Chip/Chip.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +9 -9
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/Clickable/Clickable.d.ts.map +1 -1
- package/dist/components/Clickable/Clickable.js +1 -1
- package/dist/components/Clickable/Clickable.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +3 -13
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +37 -62
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput.d.ts +4 -2
- package/dist/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput.js +19 -24
- package/dist/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/components/CustomSelect/helpers.d.ts +8 -0
- package/dist/components/CustomSelect/helpers.d.ts.map +1 -0
- package/dist/components/CustomSelect/helpers.js +48 -0
- package/dist/components/CustomSelect/helpers.js.map +1 -0
- package/dist/components/CustomSelect/types.d.ts +12 -0
- package/dist/components/CustomSelect/types.d.ts.map +1 -0
- package/dist/components/CustomSelect/types.js +3 -0
- package/dist/components/CustomSelect/types.js.map +1 -0
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -14
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/components/DateInput/DateInput.d.ts +1 -1
- package/dist/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/components/DateInput/DateInput.js.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/components/Flex/FlexItem/FlexItem.d.ts +6 -4
- package/dist/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
- package/dist/components/Flex/FlexItem/FlexItem.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts +1 -1
- package/dist/components/Footer/Footer.d.ts.map +1 -1
- package/dist/components/Footer/Footer.js +7 -3
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/FormItem/FormItem.js +3 -3
- package/dist/components/FormItem/FormItem.js.map +1 -1
- package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
- package/dist/components/FormLayoutGroup/FormLayoutGroup.js +4 -4
- package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
- package/dist/components/Group/Group.d.ts.map +1 -1
- package/dist/components/Group/Group.js +3 -2
- package/dist/components/Group/Group.js.map +1 -1
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/Link/Link.d.ts.map +1 -1
- package/dist/components/Link/Link.js +4 -6
- package/dist/components/Link/Link.js.map +1 -1
- package/dist/components/Removable/Removable.d.ts +5 -1
- package/dist/components/Removable/Removable.d.ts.map +1 -1
- package/dist/components/Removable/Removable.js +9 -6
- package/dist/components/Removable/Removable.js.map +1 -1
- package/dist/components/RootComponent/RootComponent.d.ts +1 -1
- package/dist/components/RootComponent/RootComponent.d.ts.map +1 -1
- package/dist/components/RootComponent/RootComponent.js +1 -1
- package/dist/components/RootComponent/RootComponent.js.map +1 -1
- package/dist/components/Search/Search.d.ts.map +1 -1
- package/dist/components/Search/Search.js +3 -2
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +1 -2
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SelectTypography/SelectTypography.d.ts +2 -2
- package/dist/components/SelectTypography/SelectTypography.d.ts.map +1 -1
- package/dist/components/SelectTypography/SelectTypography.js.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.d.ts +1 -1
- package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.js +1 -1
- package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/components/Snackbar/Snackbar.js +3 -3
- package/dist/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/components/ToolButton/ToolButton.js +2 -4
- package/dist/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/components/View/View.d.ts.map +1 -1
- package/dist/components/View/View.js +17 -33
- package/dist/components/View/View.js.map +1 -1
- package/dist/components.css +3 -3
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +260 -263
- package/dist/cssm/components/Button/Button.js +2 -2
- package/dist/cssm/components/Button/Button.js.map +1 -1
- package/dist/cssm/components/Cell/Cell.d.ts.map +1 -1
- package/dist/cssm/components/Cell/Cell.js +11 -14
- package/dist/cssm/components/Cell/Cell.js.map +1 -1
- package/dist/cssm/components/Cell/Cell.module.css +0 -4
- package/dist/cssm/components/ChipsInputBase/Chip/Chip.js +3 -3
- package/dist/cssm/components/ChipsInputBase/Chip/Chip.js.map +1 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +9 -9
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/Clickable/Clickable.d.ts.map +1 -1
- package/dist/cssm/components/Clickable/Clickable.js +1 -1
- package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +3 -13
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +36 -59
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts +4 -2
- package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.js +16 -21
- package/dist/cssm/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.module.css +74 -40
- package/dist/cssm/components/CustomSelect/helpers.d.ts +8 -0
- package/dist/cssm/components/CustomSelect/helpers.d.ts.map +1 -0
- package/dist/cssm/components/CustomSelect/helpers.js +44 -0
- package/dist/cssm/components/CustomSelect/helpers.js.map +1 -0
- package/dist/cssm/components/CustomSelect/types.d.ts +12 -0
- package/dist/cssm/components/CustomSelect/types.d.ts.map +1 -0
- package/dist/cssm/components/CustomSelect/types.js +3 -0
- package/dist/cssm/components/CustomSelect/types.js.map +1 -0
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -13
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.d.ts +1 -1
- package/dist/cssm/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cssm/components/Flex/FlexItem/FlexItem.d.ts +6 -4
- package/dist/cssm/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
- package/dist/cssm/components/Flex/FlexItem/FlexItem.js.map +1 -1
- package/dist/cssm/components/Footer/Footer.d.ts +1 -1
- package/dist/cssm/components/Footer/Footer.d.ts.map +1 -1
- package/dist/cssm/components/Footer/Footer.js +4 -2
- package/dist/cssm/components/Footer/Footer.js.map +1 -1
- package/dist/cssm/components/FormField/FormField.module.css +36 -23
- package/dist/cssm/components/FormItem/FormItem.js +3 -3
- package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
- package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
- package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +4 -4
- package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
- package/dist/cssm/components/Group/Group.d.ts.map +1 -1
- package/dist/cssm/components/Group/Group.js +3 -2
- package/dist/cssm/components/Group/Group.js.map +1 -1
- package/dist/cssm/components/ImageBase/ImageBase.module.css +0 -4
- package/dist/cssm/components/Link/Link.d.ts +1 -1
- package/dist/cssm/components/Link/Link.d.ts.map +1 -1
- package/dist/cssm/components/Link/Link.js +2 -3
- package/dist/cssm/components/Link/Link.js.map +1 -1
- package/dist/cssm/components/Removable/Removable.d.ts +5 -1
- package/dist/cssm/components/Removable/Removable.d.ts.map +1 -1
- package/dist/cssm/components/Removable/Removable.js +7 -5
- package/dist/cssm/components/Removable/Removable.js.map +1 -1
- package/dist/cssm/components/Removable/Removable.module.css +4 -0
- package/dist/cssm/components/RootComponent/RootComponent.d.ts +1 -1
- package/dist/cssm/components/RootComponent/RootComponent.d.ts.map +1 -1
- package/dist/cssm/components/RootComponent/RootComponent.js +2 -1
- package/dist/cssm/components/RootComponent/RootComponent.js.map +1 -1
- package/dist/cssm/components/RootComponent/RootComponent.module.css +10 -0
- package/dist/cssm/components/Search/Search.d.ts.map +1 -1
- package/dist/cssm/components/Search/Search.js +3 -2
- package/dist/cssm/components/Search/Search.js.map +1 -1
- package/dist/cssm/components/Select/Select.d.ts.map +1 -1
- package/dist/cssm/components/Select/Select.js +1 -1
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/SelectTypography/SelectTypography.d.ts +2 -2
- package/dist/cssm/components/SelectTypography/SelectTypography.d.ts.map +1 -1
- package/dist/cssm/components/SelectTypography/SelectTypography.js.map +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.d.ts +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.d.ts.map +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.js +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.module.css +4 -0
- package/dist/cssm/components/Snackbar/Snackbar.js +3 -3
- package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.d.ts +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.js +2 -3
- package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/cssm/components/View/View.d.ts.map +1 -1
- package/dist/cssm/components/View/View.js +17 -33
- package/dist/cssm/components/View/View.js.map +1 -1
- package/dist/cssm/hooks/useEnsuredControl.d.ts.map +1 -1
- package/dist/cssm/hooks/useEnsuredControl.js +27 -3
- package/dist/cssm/hooks/useEnsuredControl.js.map +1 -1
- package/dist/cssm/hooks/useIsClient.d.ts +1 -1
- package/dist/cssm/hooks/useIsClient.js +1 -1
- package/dist/cssm/hooks/useIsClient.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/cssm/styles/constants.css +2 -3
- package/dist/hooks/useEnsuredControl.d.ts.map +1 -1
- package/dist/hooks/useEnsuredControl.js +27 -3
- package/dist/hooks/useEnsuredControl.js.map +1 -1
- package/dist/hooks/useIsClient.d.ts +1 -1
- package/dist/hooks/useIsClient.js +1 -1
- package/dist/hooks/useIsClient.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/vkui.css +3 -3
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +260 -263
- package/package.json +1 -1
- package/src/components/Button/Button.tsx +2 -2
- package/src/components/Cell/Cell.module.css +0 -4
- package/src/components/Cell/Cell.tsx +9 -16
- package/src/components/ChipsInputBase/Chip/Chip.tsx +3 -3
- package/src/components/ChipsSelect/ChipsSelect.tsx +12 -12
- package/src/components/Clickable/Clickable.tsx +4 -1
- package/src/components/CustomSelect/CustomSelect.tsx +52 -104
- package/src/components/CustomSelect/CustomSelectInput.module.css +55 -35
- package/src/components/CustomSelect/CustomSelectInput.tsx +25 -36
- package/src/components/CustomSelect/helpers.tsx +61 -0
- package/src/components/CustomSelect/types.ts +15 -0
- package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +3 -17
- package/src/components/DateInput/DateInput.tsx +1 -1
- package/src/components/DateRangeInput/DateRangeInput.tsx +1 -1
- package/src/components/Flex/FlexItem/FlexItem.tsx +6 -4
- package/src/components/Footer/Footer.tsx +14 -2
- package/src/components/FormField/FormField.module.css +32 -21
- package/src/components/FormItem/FormItem.tsx +3 -3
- package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +4 -8
- package/src/components/Group/Group.tsx +3 -2
- package/src/components/ImageBase/ImageBase.module.css +0 -4
- package/src/components/Link/Link.tsx +1 -3
- package/src/components/Removable/Removable.module.css +4 -0
- package/src/components/Removable/Removable.tsx +12 -4
- package/src/components/RootComponent/RootComponent.module.css +10 -0
- package/src/components/RootComponent/RootComponent.tsx +12 -2
- package/src/components/Search/Search.tsx +3 -2
- package/src/components/Select/Select.tsx +0 -1
- package/src/components/SelectTypography/SelectTypography.tsx +2 -5
- package/src/components/SimpleCell/SimpleCell.module.css +4 -0
- package/src/components/SimpleCell/SimpleCell.tsx +2 -1
- package/src/components/Snackbar/Snackbar.tsx +3 -3
- package/src/components/ToolButton/ToolButton.tsx +1 -3
- package/src/components/View/View.tsx +21 -36
- package/src/hooks/useEnsuredControl.ts +38 -4
- package/src/hooks/useIsClient.ts +1 -1
- package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +1 -1
- package/src/styles/constants.css +2 -3
|
@@ -123,15 +123,11 @@ const View = (_param)=>{
|
|
|
123
123
|
onTransition,
|
|
124
124
|
scroll
|
|
125
125
|
]);
|
|
126
|
-
const
|
|
126
|
+
const handleAnimatedTargetAnimationEnd = ()=>{
|
|
127
127
|
if (prevPanel !== null) {
|
|
128
128
|
flushTransition(prevPanel, Boolean(isBack));
|
|
129
129
|
}
|
|
130
|
-
}
|
|
131
|
-
flushTransition,
|
|
132
|
-
isBack,
|
|
133
|
-
prevPanel
|
|
134
|
-
]);
|
|
130
|
+
};
|
|
135
131
|
const onSwipeBackSuccess = _react.useCallback(()=>{
|
|
136
132
|
onSwipeBack && onSwipeBack();
|
|
137
133
|
}, [
|
|
@@ -234,45 +230,33 @@ const View = (_param)=>{
|
|
|
234
230
|
}
|
|
235
231
|
}
|
|
236
232
|
};
|
|
237
|
-
const calcPanelSwipeStyles = (
|
|
238
|
-
if (!_dom.canUseDOM || !window) {
|
|
239
|
-
return {};
|
|
240
|
-
}
|
|
241
|
-
const isPrev = panelId === swipeBackPrevPanel;
|
|
242
|
-
const isNext = panelId === swipeBackNextPanel;
|
|
233
|
+
const calcPanelSwipeStyles = (isPrev, isNext)=>{
|
|
243
234
|
if (!isPrev && !isNext || swipeBackResult) {
|
|
244
235
|
return {};
|
|
245
236
|
}
|
|
246
|
-
let prevPanelTranslate = `${swipeBackShift}px`;
|
|
247
|
-
let nextPanelTranslate = `${-50 + swipeBackShift * 100 / window.innerWidth / 2}%`;
|
|
248
237
|
if (isNext) {
|
|
249
|
-
return {
|
|
250
|
-
transform: `translate3d(${
|
|
251
|
-
};
|
|
238
|
+
return window ? {
|
|
239
|
+
transform: `translate3d(${-50 + swipeBackShift * 100 / window.innerWidth / 2}%, 0, 0)`
|
|
240
|
+
} : {};
|
|
252
241
|
}
|
|
253
242
|
if (isPrev) {
|
|
254
243
|
return {
|
|
255
|
-
transform: `translate3d(${
|
|
244
|
+
transform: `translate3d(${swipeBackShift}px, 0, 0)`
|
|
256
245
|
};
|
|
257
246
|
}
|
|
258
247
|
return {};
|
|
259
248
|
};
|
|
260
|
-
const calcPanelSwipeBackOverlayStyles = (
|
|
261
|
-
if (!
|
|
262
|
-
return {};
|
|
263
|
-
}
|
|
264
|
-
const isNext = panelId === swipeBackNextPanel;
|
|
265
|
-
if (!isNext) {
|
|
249
|
+
const calcPanelSwipeBackOverlayStyles = (isNext)=>{
|
|
250
|
+
if (!window || !isNext) {
|
|
266
251
|
return {};
|
|
267
252
|
}
|
|
268
|
-
const calculatedOpacity = 1 - swipeBackShift / window.innerWidth;
|
|
269
253
|
const opacityOnSwipeEnd = swipeBackResult === 'success' ? 0 : swipeBackResult === 'fail' ? 1 : null;
|
|
270
254
|
return {
|
|
271
255
|
display: 'block',
|
|
272
|
-
opacity: opacityOnSwipeEnd === null ?
|
|
256
|
+
opacity: opacityOnSwipeEnd === null ? 1 - swipeBackShift / window.innerWidth : opacityOnSwipeEnd
|
|
273
257
|
};
|
|
274
258
|
};
|
|
275
|
-
const
|
|
259
|
+
const handleSwipeBackTargetTransitionEnd = (event)=>{
|
|
276
260
|
if (event.propertyName.includes('transform')) {
|
|
277
261
|
swipingBackTransitionEndHandler();
|
|
278
262
|
}
|
|
@@ -395,7 +379,7 @@ const View = (_param)=>{
|
|
|
395
379
|
const isAnimatedTarget = animated && (isBack ? isPanelPrev : isPanelNext);
|
|
396
380
|
const isSwipeBackPrev = panelId === swipeBackPrevPanel;
|
|
397
381
|
const isSwipeBackNext = panelId === swipeBackNextPanel;
|
|
398
|
-
const isSwipeBackTarget =
|
|
382
|
+
const isSwipeBackTarget = swipeBackResult && isSwipeBackPrev;
|
|
399
383
|
let scrollCompensateStyle = undefined;
|
|
400
384
|
if (isPanelPrev || isPanelNext && isBack || isSwipeBackPrev || isSwipeBackNext) {
|
|
401
385
|
const marginTop = scrolls.current[panelId];
|
|
@@ -407,14 +391,14 @@ const View = (_param)=>{
|
|
|
407
391
|
}
|
|
408
392
|
return /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
409
393
|
className: (0, _vkjs.classNames)("vkuiView__panel", isPanelActive && "vkuiView__panel--active", isPanelPrev && "vkuiView__panel--prev", isPanelNext && "vkuiView__panel--next", isSwipeBackPrev && "vkuiView__panel--swipe-back-prev", isSwipeBackNext && "vkuiView__panel--swipe-back-next", swipeBackResult === 'success' && "vkuiView__panel--swipe-back-success", swipeBackResult === 'fail' && "vkuiView__panel--swipe-back-failed"),
|
|
410
|
-
onTransitionEnd: isSwipeBackTarget ?
|
|
411
|
-
onAnimationEnd: isAnimatedTarget ?
|
|
394
|
+
onTransitionEnd: isSwipeBackTarget ? handleSwipeBackTargetTransitionEnd : undefined,
|
|
395
|
+
onAnimationEnd: isAnimatedTarget ? handleAnimatedTargetAnimationEnd : undefined,
|
|
412
396
|
ref: (el)=>panelId !== undefined && (panelNodes.current[panelId] = el),
|
|
413
|
-
style: calcPanelSwipeStyles(
|
|
397
|
+
style: calcPanelSwipeStyles(isSwipeBackPrev, isSwipeBackNext),
|
|
414
398
|
children: [
|
|
415
399
|
platform === 'ios' && /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
416
400
|
className: "vkuiView__panel-overlay",
|
|
417
|
-
style: calcPanelSwipeBackOverlayStyles(
|
|
401
|
+
style: calcPanelSwipeBackOverlayStyles(isSwipeBackNext)
|
|
418
402
|
}),
|
|
419
403
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
420
404
|
className: "vkuiView__panel-in",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/View/View.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { blurActiveElement, canUseDOM, useDOM } from '../../lib/dom';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HTMLAttributesWithRootRef } from '../../types';\nimport { useScroll } from '../AppRoot/ScrollContext';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { NavViewIdContext } from '../NavIdContext/NavIdContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { NavTransitionDirectionProvider } from '../NavTransitionDirectionContext/NavTransitionDirectionContext';\nimport { useSplitCol } from '../SplitCol/SplitColContext';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { useLayoutEffectCall } from './useLayoutEffectCall';\nimport {\n getSwipeBackPredicates,\n hasHorizontalScrollableElementWithScrolledToLeft,\n swipeBackExcluded,\n} from './utils';\nimport styles from './View.module.css';\n\ninterface Scrolls {\n [index: string]: number | undefined;\n}\n\ninterface ViewsScrolls {\n [index: string]: Scrolls;\n}\n\nexport let scrollsCache: ViewsScrolls = {};\n\nexport interface ViewProps extends HTMLAttributesWithRootRef<HTMLElement>, NavIdProps {\n activePanel: string;\n onTransition?: (params: { isBack: boolean; from: string; to: string }) => void;\n /**\n * callback свайпа назад\n */\n onSwipeBack?: () => void;\n /**\n * callback начала анимации свайпа назад.\n *\n * Чтобы остановить свайп назад, возвращайте `\"prevent\"`.\n */\n onSwipeBackStart?: (activePanel: string | null) => void | 'prevent';\n /**\n * callback завершения анимации отмененного пользователем свайпа\n */\n onSwipeBackCancel?: () => void;\n history?: string[];\n\n children: React.ReactElement | Iterable<React.ReactElement>;\n}\n\nconst warn = warnOnce('View');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/View\n */\nexport const View = ({\n activePanel: activePanelProp,\n history,\n nav,\n onTransition,\n onSwipeBack,\n onSwipeBackStart,\n onSwipeBackCancel: onSwipeBackCancelProp,\n children,\n className,\n ...restProps\n}: ViewProps): React.ReactNode => {\n const id = getNavId({ nav, id: restProps.id });\n const scrolls = React.useRef(scrollsCache[id as string] || {});\n const layoutEffectCall = useLayoutEffectCall();\n\n React.useEffect(() => () => {\n if (id) {\n scrollsCache[id] = scrolls.current;\n }\n });\n\n const panelNodes = React.useRef<{ [id: string]: HTMLDivElement | null }>({});\n\n const { window, document } = useDOM();\n const scroll = useScroll();\n const configProvider = useConfigProvider();\n const splitCol = useSplitCol();\n const platform = usePlatform();\n\n const [animated, setAnimated] = React.useState(false);\n\n const [visiblePanels, setVisiblePanels] = React.useState([activePanelProp]);\n const [activePanel, setActivePanel] = React.useState<string | null>(activePanelProp);\n const [isBack, setIsBack] = React.useState<boolean | undefined>(undefined);\n const [prevPanel, setPrevPanel] = React.useState<string | null>(null);\n const [nextPanel, setNextPanel] = React.useState<string | null>(null);\n\n const swipeBackPrevented = React.useRef<boolean>(false);\n const [swipingBack, setSwipingBack] = React.useState<boolean | undefined>(undefined);\n const [swipeBackStartX, setSwipeBackStartX] = React.useState<number>(0);\n const [swipeBackShift, setSwipeBackShift] = React.useState<number>(0);\n const [swipeBackNextPanel, setSwipeBackNextPanel] = React.useState<string | null>(null);\n const [swipeBackPrevPanel, setSwipeBackPrevPanel] = React.useState<string | null>(null);\n const [swipeBackResult, setSwipeBackResult] = React.useState<'success' | 'fail' | null>(null);\n\n const [browserSwipe, setBrowserSwipe] = React.useState(false);\n\n const prevActivePanel = usePrevious(activePanelProp);\n const prevSwipingBack = usePrevious(swipingBack);\n const prevBrowserSwipe = usePrevious(browserSwipe);\n const prevSwipeBackResult = usePrevious(swipeBackResult);\n const prevSwipeBackShift = usePrevious(swipeBackShift);\n const prevSwipeBackPrevPanel = usePrevious(swipeBackPrevPanel);\n const prevOnTransition = usePrevious(onTransition);\n\n const panels = (React.Children.toArray(children) as React.ReactElement[]).filter(\n (panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n\n return (\n (panelId !== undefined && visiblePanels.includes(panelId)) ||\n panelId === swipeBackPrevPanel ||\n panelId === swipeBackNextPanel\n );\n },\n );\n\n const disableAnimation =\n !configProvider.transitionMotionEnabled || !splitCol.animate || platform === 'vkcom';\n const iOSSwipeBackSimulationEnabled =\n !disableAnimation && platform === 'ios' && configProvider.isWebView && Boolean(onSwipeBack);\n\n const flushTransition = React.useCallback(\n (prevPanel: string, isBackTransition: boolean) => {\n if (isBackTransition) {\n scrolls.current[prevPanel] = 0;\n }\n setPrevPanel(null);\n setNextPanel(null);\n setVisiblePanels([activePanelProp]);\n setActivePanel(activePanelProp);\n setAnimated(false);\n setIsBack(isBackTransition);\n\n layoutEffectCall(() => {\n scroll?.scrollTo(0, isBackTransition ? scrolls.current[activePanelProp] : 0);\n onTransition &&\n onTransition({\n isBack: isBackTransition,\n from: prevPanel,\n to: activePanelProp,\n });\n });\n },\n [activePanelProp, layoutEffectCall, onTransition, scroll],\n );\n\n const onAnimationEnd = React.useCallback(() => {\n if (prevPanel !== null) {\n flushTransition(prevPanel, Boolean(isBack));\n }\n }, [flushTransition, isBack, prevPanel]);\n\n const onSwipeBackSuccess = React.useCallback(() => {\n onSwipeBack && onSwipeBack();\n }, [onSwipeBack]);\n\n const onSwipeBackCancel = React.useCallback(() => {\n onSwipeBackCancelProp && onSwipeBackCancelProp();\n setSwipeBackPrevPanel(null);\n setSwipeBackNextPanel(null);\n setSwipingBack(false);\n setSwipeBackResult(null);\n setSwipeBackStartX(0);\n setSwipeBackShift(0);\n }, [onSwipeBackCancelProp]);\n\n const swipingBackTransitionEndHandler = React.useCallback(() => {\n switch (swipeBackResult) {\n case 'fail':\n onSwipeBackCancel();\n break;\n case 'success':\n onSwipeBackSuccess();\n }\n }, [onSwipeBackCancel, onSwipeBackSuccess, swipeBackResult]);\n\n const handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext = (event: TouchEvent) => {\n if (browserSwipe) {\n return;\n }\n const { swipeBackTriggered, viewportStartEdgeTouched, viewportEndEdgeTouched } =\n getSwipeBackPredicates(event.startX, event.shiftX, window!.innerWidth);\n\n if ((viewportStartEdgeTouched || viewportEndEdgeTouched) && swipeBackTriggered) {\n setBrowserSwipe(true);\n }\n };\n\n const handleTouchMoveXForIOSSwipeBackSimulation = (event: TouchEvent) => {\n if (swipeBackPrevented.current || swipeBackExcluded(event)) {\n return;\n }\n\n const { swipedToOpposite, swipeBackTriggered, viewportStartEdgeTouched } =\n getSwipeBackPredicates(event.startX, event.shiftX, window!.innerWidth);\n\n if (animated && swipeBackTriggered) {\n return;\n }\n\n if (!swipingBack && history && history.length > 1) {\n if (swipedToOpposite) {\n swipeBackPrevented.current = true;\n return;\n }\n\n if (!swipeBackTriggered) {\n return;\n }\n\n if (\n !viewportStartEdgeTouched &&\n hasHorizontalScrollableElementWithScrolledToLeft(event.originalEvent.target as HTMLElement)\n ) {\n swipeBackPrevented.current = true;\n return;\n }\n // Начался свайп назад\n if (onSwipeBackStart) {\n const payload = onSwipeBackStart(activePanel);\n if (payload === 'prevent') {\n swipeBackPrevented.current = true;\n return;\n }\n }\n\n if (activePanel !== null) {\n // Note: вызываем закрытие клавиатуры. В iOS это нативное поведение при свайпе.\n blurActiveElement(document);\n scrolls.current[activePanel] = scroll?.getScroll().y;\n }\n\n setSwipingBack(true);\n setSwipeBackStartX(event.startX);\n setSwipeBackPrevPanel(activePanel);\n setSwipeBackNextPanel(history.slice(-2)[0]);\n }\n\n if (swipingBack) {\n if (event.shiftX < 0) {\n setSwipeBackShift(0);\n } else if (event.shiftX > window!.innerWidth - swipeBackStartX) {\n setSwipeBackShift(window!.innerWidth);\n } else {\n setSwipeBackShift(event.shiftX);\n }\n }\n };\n\n const handleTouchEndForIOSSwipeBackSimulation = (event: TouchEvent) => {\n swipeBackPrevented.current = false;\n if (swipingBack) {\n const speed = (swipeBackShift / event.duration) * 1000;\n if (swipeBackShift === 0) {\n onSwipeBackCancel();\n } else if (swipeBackShift >= (window!.innerWidth ?? 0)) {\n onSwipeBackSuccess();\n } else if (speed > 250 || swipeBackShift >= window!.innerWidth / 2) {\n setSwipeBackResult('success');\n } else {\n setSwipeBackResult('fail');\n }\n }\n };\n\n const calcPanelSwipeStyles = (panelId: string | undefined): React.CSSProperties => {\n if (!canUseDOM || !window) {\n return {};\n }\n\n const isPrev = panelId === swipeBackPrevPanel;\n const isNext = panelId === swipeBackNextPanel;\n\n if ((!isPrev && !isNext) || swipeBackResult) {\n return {};\n }\n\n let prevPanelTranslate = `${swipeBackShift}px`;\n let nextPanelTranslate = `${-50 + (swipeBackShift * 100) / window.innerWidth / 2}%`;\n\n if (isNext) {\n return {\n transform: `translate3d(${nextPanelTranslate}, 0, 0)`,\n };\n }\n if (isPrev) {\n return {\n transform: `translate3d(${prevPanelTranslate}, 0, 0)`,\n };\n }\n\n return {};\n };\n\n const calcPanelSwipeBackOverlayStyles = (panelId?: string): React.CSSProperties => {\n if (!canUseDOM || !window) {\n return {};\n }\n\n const isNext = panelId === swipeBackNextPanel;\n if (!isNext) {\n return {};\n }\n\n const calculatedOpacity = 1 - swipeBackShift / window.innerWidth;\n const opacityOnSwipeEnd =\n swipeBackResult === 'success' ? 0 : swipeBackResult === 'fail' ? 1 : null;\n\n return {\n display: 'block',\n opacity: opacityOnSwipeEnd === null ? calculatedOpacity : opacityOnSwipeEnd,\n };\n };\n\n const onTransitionEnd = (event: React.TransitionEvent<HTMLDivElement>) => {\n if (event.propertyName.includes('transform')) {\n swipingBackTransitionEndHandler();\n }\n };\n\n React.useEffect(() => {\n // Нужен переход\n if (\n prevActivePanel &&\n prevActivePanel !== activePanelProp &&\n !prevSwipingBack &&\n !prevBrowserSwipe\n ) {\n const firstLayerId = (React.Children.toArray(children) as React.ReactElement[])\n .map((panel) => getNavId(panel.props, warn))\n .find((id) => id === prevActivePanel || id === activePanelProp);\n\n const isBackTransition = firstLayerId === activePanelProp;\n scrolls.current[prevActivePanel] = scroll?.getScroll({ compensateKeyboardHeight: false }).y;\n\n if (disableAnimation) {\n flushTransition(prevActivePanel, isBackTransition);\n } else {\n blurActiveElement(document);\n\n setVisiblePanels([prevActivePanel, activePanelProp]);\n setPrevPanel(prevActivePanel);\n setNextPanel(activePanelProp);\n setActivePanel(null);\n setAnimated(true);\n setIsBack(isBackTransition);\n }\n }\n\n // Закончилась анимация свайпа назад\n if (prevActivePanel && prevActivePanel !== activePanelProp && prevSwipingBack) {\n const nextPanel = activePanelProp;\n const prevPanel = prevActivePanel;\n if (prevSwipeBackPrevPanel) {\n scrolls.current[prevSwipeBackPrevPanel] = 0;\n }\n\n setSwipeBackPrevPanel(null);\n setSwipeBackNextPanel(null);\n setSwipingBack(false);\n setSwipeBackResult(null);\n setSwipeBackStartX(0);\n setSwipeBackShift(0);\n setActivePanel(nextPanel);\n setVisiblePanels([nextPanel]);\n setIsBack(true);\n\n layoutEffectCall(() => {\n if (nextPanel !== null) {\n scroll?.scrollTo(0, scrolls.current[nextPanel]);\n }\n prevOnTransition &&\n prevOnTransition({\n isBack: true,\n from: prevPanel,\n to: nextPanel,\n });\n });\n }\n\n // Началась анимация завершения свайпа назад.\n // см. `onTransitionEnd()`\n\n // Закончился Safari свайп\n if (prevActivePanel !== activePanelProp && browserSwipe) {\n setBrowserSwipe(false);\n setNextPanel(null);\n setPrevPanel(null);\n setAnimated(false);\n setVisiblePanels([activePanelProp]);\n setActivePanel(activePanelProp);\n }\n }, [\n activePanelProp,\n activePanel,\n browserSwipe,\n children,\n disableAnimation,\n document,\n flushTransition,\n prevActivePanel,\n prevBrowserSwipe,\n prevOnTransition,\n prevSwipeBackPrevPanel,\n prevSwipeBackResult,\n prevSwipingBack,\n scroll,\n swipeBackNextPanel,\n swipeBackResult,\n layoutEffectCall,\n ]);\n\n React.useEffect(\n function restoreScrollPositionWhenSwipeBackIsCancelled() {\n // Если свайп назад отменился (когда пользователь недостаточно сильно свайпнул)\n const swipeBackCancelledInTheMiddleOfAction =\n prevSwipeBackResult === 'fail' && !swipeBackResult;\n const swipeBackCancelledByMovingPanelBackToInitialPoint =\n prevSwipingBack && !swipingBack && prevSwipeBackShift === 0;\n\n if (\n (swipeBackCancelledInTheMiddleOfAction ||\n swipeBackCancelledByMovingPanelBackToInitialPoint) &&\n activePanel !== null\n ) {\n scroll?.scrollTo(0, scrolls.current[activePanel]);\n }\n },\n [\n prevSwipeBackResult,\n swipeBackResult,\n prevSwipingBack,\n swipingBack,\n prevSwipeBackShift,\n activePanel,\n scroll,\n ],\n );\n\n return (\n <NavViewIdContext.Provider value={id}>\n <Touch\n Component=\"section\"\n {...restProps}\n className={classNames(\n styles['View'],\n platform === 'ios' && classNames(styles['View--ios'], 'vkuiInternalView--ios'),\n !disableAnimation && animated && styles['View--animated'],\n !disableAnimation && swipingBack && styles['View--swiping-back'],\n disableAnimation && styles['View--no-motion'],\n className,\n )}\n onMoveX={\n iOSSwipeBackSimulationEnabled\n ? handleTouchMoveXForIOSSwipeBackSimulation\n : platform === 'ios'\n ? handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext\n : undefined\n }\n onEnd={iOSSwipeBackSimulationEnabled ? handleTouchEndForIOSSwipeBackSimulation : undefined}\n >\n <div className={styles['View__panels']}>\n {panels.map((panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n\n const isPanelActive = panelId === activePanel;\n const isPanelPrev = panelId === prevPanel;\n const isPanelNext = panelId === nextPanel;\n const isAnimatedTarget = animated && (isBack ? isPanelPrev : isPanelNext);\n\n const isSwipeBackPrev = panelId === swipeBackPrevPanel;\n const isSwipeBackNext = panelId === swipeBackNextPanel;\n const isSwipeBackTarget = !prevSwipeBackResult && swipeBackResult && isSwipeBackNext;\n\n let scrollCompensateStyle: React.CSSProperties | undefined = undefined;\n\n if (isPanelPrev || (isPanelNext && isBack) || isSwipeBackPrev || isSwipeBackNext) {\n const marginTop = scrolls.current[panelId];\n if (marginTop !== undefined) {\n scrollCompensateStyle = { marginTop: -1 * marginTop };\n }\n }\n\n return (\n <div\n className={classNames(\n styles['View__panel'],\n\n isPanelActive && styles['View__panel--active'],\n isPanelPrev && styles['View__panel--prev'],\n isPanelNext && styles['View__panel--next'],\n\n isSwipeBackPrev && styles['View__panel--swipe-back-prev'],\n isSwipeBackNext && styles['View__panel--swipe-back-next'],\n swipeBackResult === 'success' && styles['View__panel--swipe-back-success'],\n swipeBackResult === 'fail' && styles['View__panel--swipe-back-failed'],\n )}\n onTransitionEnd={isSwipeBackTarget ? onTransitionEnd : undefined}\n onAnimationEnd={isAnimatedTarget ? onAnimationEnd : undefined}\n ref={(el) => panelId !== undefined && (panelNodes.current[panelId] = el)}\n style={calcPanelSwipeStyles(panelId)}\n key={panelId}\n >\n {platform === 'ios' && (\n <div\n className={styles['View__panel-overlay']}\n style={calcPanelSwipeBackOverlayStyles(panelId)}\n />\n )}\n <div className={styles['View__panel-in']} style={scrollCompensateStyle}>\n <NavTransitionDirectionProvider isBack={swipingBack || isBack}>\n <NavTransitionProvider\n entering={panelId === nextPanel || panelId === swipeBackNextPanel}\n >\n {panel}\n </NavTransitionProvider>\n </NavTransitionDirectionProvider>\n </div>\n </div>\n );\n })}\n </div>\n </Touch>\n </NavViewIdContext.Provider>\n );\n};\n"],"names":["View","scrollsCache","warn","warnOnce","activePanel","activePanelProp","history","nav","onTransition","onSwipeBack","onSwipeBackStart","onSwipeBackCancel","onSwipeBackCancelProp","children","className","restProps","id","getNavId","scrolls","React","useRef","layoutEffectCall","useLayoutEffectCall","useEffect","current","panelNodes","window","document","useDOM","scroll","useScroll","configProvider","useConfigProvider","splitCol","useSplitCol","platform","usePlatform","animated","setAnimated","useState","visiblePanels","setVisiblePanels","setActivePanel","isBack","setIsBack","undefined","prevPanel","setPrevPanel","nextPanel","setNextPanel","swipeBackPrevented","swipingBack","setSwipingBack","swipeBackStartX","setSwipeBackStartX","swipeBackShift","setSwipeBackShift","swipeBackNextPanel","setSwipeBackNextPanel","swipeBackPrevPanel","setSwipeBackPrevPanel","swipeBackResult","setSwipeBackResult","browserSwipe","setBrowserSwipe","prevActivePanel","usePrevious","prevSwipingBack","prevBrowserSwipe","prevSwipeBackResult","prevSwipeBackShift","prevSwipeBackPrevPanel","prevOnTransition","panels","Children","toArray","filter","panel","panelId","props","includes","disableAnimation","transitionMotionEnabled","animate","iOSSwipeBackSimulationEnabled","isWebView","Boolean","flushTransition","useCallback","isBackTransition","scrollTo","from","to","onAnimationEnd","onSwipeBackSuccess","swipingBackTransitionEndHandler","handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext","event","swipeBackTriggered","viewportStartEdgeTouched","viewportEndEdgeTouched","getSwipeBackPredicates","startX","shiftX","innerWidth","handleTouchMoveXForIOSSwipeBackSimulation","swipeBackExcluded","swipedToOpposite","length","hasHorizontalScrollableElementWithScrolledToLeft","originalEvent","target","payload","blurActiveElement","getScroll","y","slice","handleTouchEndForIOSSwipeBackSimulation","speed","duration","calcPanelSwipeStyles","canUseDOM","isPrev","isNext","prevPanelTranslate","nextPanelTranslate","transform","calcPanelSwipeBackOverlayStyles","calculatedOpacity","opacityOnSwipeEnd","display","opacity","onTransitionEnd","propertyName","firstLayerId","map","find","compensateKeyboardHeight","restoreScrollPositionWhenSwipeBackIsCancelled","swipeBackCancelledInTheMiddleOfAction","swipeBackCancelledByMovingPanelBackToInitialPoint","NavViewIdContext","Provider","value","Touch","Component","classNames","onMoveX","onEnd","div","isPanelActive","isPanelPrev","isPanelNext","isAnimatedTarget","isSwipeBackPrev","isSwipeBackNext","isSwipeBackTarget","scrollCompensateStyle","marginTop","ref","el","style","NavTransitionDirectionProvider","NavTransitionProvider","entering"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/View/View.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { blurActiveElement, useDOM } from '../../lib/dom';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HTMLAttributesWithRootRef } from '../../types';\nimport { useScroll } from '../AppRoot/ScrollContext';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { NavViewIdContext } from '../NavIdContext/NavIdContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { NavTransitionDirectionProvider } from '../NavTransitionDirectionContext/NavTransitionDirectionContext';\nimport { useSplitCol } from '../SplitCol/SplitColContext';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { useLayoutEffectCall } from './useLayoutEffectCall';\nimport {\n getSwipeBackPredicates,\n hasHorizontalScrollableElementWithScrolledToLeft,\n swipeBackExcluded,\n} from './utils';\nimport styles from './View.module.css';\n\ninterface Scrolls {\n [index: string]: number | undefined;\n}\n\ninterface ViewsScrolls {\n [index: string]: Scrolls;\n}\n\nexport let scrollsCache: ViewsScrolls = {};\n\nexport interface ViewProps extends HTMLAttributesWithRootRef<HTMLElement>, NavIdProps {\n activePanel: string;\n onTransition?: (params: { isBack: boolean; from: string; to: string }) => void;\n /**\n * callback свайпа назад\n */\n onSwipeBack?: () => void;\n /**\n * callback начала анимации свайпа назад.\n *\n * Чтобы остановить свайп назад, возвращайте `\"prevent\"`.\n */\n onSwipeBackStart?: (activePanel: string | null) => void | 'prevent';\n /**\n * callback завершения анимации отмененного пользователем свайпа\n */\n onSwipeBackCancel?: () => void;\n history?: string[];\n\n children: React.ReactElement | Iterable<React.ReactElement>;\n}\n\nconst warn = warnOnce('View');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/View\n */\nexport const View = ({\n activePanel: activePanelProp,\n history,\n nav,\n onTransition,\n onSwipeBack,\n onSwipeBackStart,\n onSwipeBackCancel: onSwipeBackCancelProp,\n children,\n className,\n ...restProps\n}: ViewProps): React.ReactNode => {\n const id = getNavId({ nav, id: restProps.id });\n const scrolls = React.useRef(scrollsCache[id as string] || {});\n const layoutEffectCall = useLayoutEffectCall();\n\n React.useEffect(() => () => {\n if (id) {\n scrollsCache[id] = scrolls.current;\n }\n });\n\n const panelNodes = React.useRef<{ [id: string]: HTMLDivElement | null }>({});\n\n const { window, document } = useDOM();\n const scroll = useScroll();\n const configProvider = useConfigProvider();\n const splitCol = useSplitCol();\n const platform = usePlatform();\n\n const [animated, setAnimated] = React.useState(false);\n\n const [visiblePanels, setVisiblePanels] = React.useState([activePanelProp]);\n const [activePanel, setActivePanel] = React.useState<string | null>(activePanelProp);\n const [isBack, setIsBack] = React.useState<boolean | undefined>(undefined);\n const [prevPanel, setPrevPanel] = React.useState<string | null>(null);\n const [nextPanel, setNextPanel] = React.useState<string | null>(null);\n\n const swipeBackPrevented = React.useRef<boolean>(false);\n const [swipingBack, setSwipingBack] = React.useState<boolean | undefined>(undefined);\n const [swipeBackStartX, setSwipeBackStartX] = React.useState<number>(0);\n const [swipeBackShift, setSwipeBackShift] = React.useState<number>(0);\n const [swipeBackNextPanel, setSwipeBackNextPanel] = React.useState<string | null>(null);\n const [swipeBackPrevPanel, setSwipeBackPrevPanel] = React.useState<string | null>(null);\n const [swipeBackResult, setSwipeBackResult] = React.useState<'success' | 'fail' | null>(null);\n\n const [browserSwipe, setBrowserSwipe] = React.useState(false);\n\n const prevActivePanel = usePrevious(activePanelProp);\n const prevSwipingBack = usePrevious(swipingBack);\n const prevBrowserSwipe = usePrevious(browserSwipe);\n const prevSwipeBackResult = usePrevious(swipeBackResult);\n const prevSwipeBackShift = usePrevious(swipeBackShift);\n const prevSwipeBackPrevPanel = usePrevious(swipeBackPrevPanel);\n const prevOnTransition = usePrevious(onTransition);\n\n const panels = (React.Children.toArray(children) as React.ReactElement[]).filter(\n (panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n\n return (\n (panelId !== undefined && visiblePanels.includes(panelId)) ||\n panelId === swipeBackPrevPanel ||\n panelId === swipeBackNextPanel\n );\n },\n );\n\n const disableAnimation =\n !configProvider.transitionMotionEnabled || !splitCol.animate || platform === 'vkcom';\n const iOSSwipeBackSimulationEnabled =\n !disableAnimation && platform === 'ios' && configProvider.isWebView && Boolean(onSwipeBack);\n\n const flushTransition = React.useCallback(\n (prevPanel: string, isBackTransition: boolean) => {\n if (isBackTransition) {\n scrolls.current[prevPanel] = 0;\n }\n setPrevPanel(null);\n setNextPanel(null);\n setVisiblePanels([activePanelProp]);\n setActivePanel(activePanelProp);\n setAnimated(false);\n setIsBack(isBackTransition);\n\n layoutEffectCall(() => {\n scroll?.scrollTo(0, isBackTransition ? scrolls.current[activePanelProp] : 0);\n onTransition &&\n onTransition({\n isBack: isBackTransition,\n from: prevPanel,\n to: activePanelProp,\n });\n });\n },\n [activePanelProp, layoutEffectCall, onTransition, scroll],\n );\n\n const handleAnimatedTargetAnimationEnd = () => {\n if (prevPanel !== null) {\n flushTransition(prevPanel, Boolean(isBack));\n }\n };\n\n const onSwipeBackSuccess = React.useCallback(() => {\n onSwipeBack && onSwipeBack();\n }, [onSwipeBack]);\n\n const onSwipeBackCancel = React.useCallback(() => {\n onSwipeBackCancelProp && onSwipeBackCancelProp();\n setSwipeBackPrevPanel(null);\n setSwipeBackNextPanel(null);\n setSwipingBack(false);\n setSwipeBackResult(null);\n setSwipeBackStartX(0);\n setSwipeBackShift(0);\n }, [onSwipeBackCancelProp]);\n\n const swipingBackTransitionEndHandler = React.useCallback(() => {\n switch (swipeBackResult) {\n case 'fail':\n onSwipeBackCancel();\n break;\n case 'success':\n onSwipeBackSuccess();\n }\n }, [onSwipeBackCancel, onSwipeBackSuccess, swipeBackResult]);\n\n const handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext = (event: TouchEvent) => {\n if (browserSwipe) {\n return;\n }\n const { swipeBackTriggered, viewportStartEdgeTouched, viewportEndEdgeTouched } =\n getSwipeBackPredicates(event.startX, event.shiftX, window!.innerWidth);\n\n if ((viewportStartEdgeTouched || viewportEndEdgeTouched) && swipeBackTriggered) {\n setBrowserSwipe(true);\n }\n };\n\n const handleTouchMoveXForIOSSwipeBackSimulation = (event: TouchEvent) => {\n if (swipeBackPrevented.current || swipeBackExcluded(event)) {\n return;\n }\n\n const { swipedToOpposite, swipeBackTriggered, viewportStartEdgeTouched } =\n getSwipeBackPredicates(event.startX, event.shiftX, window!.innerWidth);\n\n if (animated && swipeBackTriggered) {\n return;\n }\n\n if (!swipingBack && history && history.length > 1) {\n if (swipedToOpposite) {\n swipeBackPrevented.current = true;\n return;\n }\n\n if (!swipeBackTriggered) {\n return;\n }\n\n if (\n !viewportStartEdgeTouched &&\n hasHorizontalScrollableElementWithScrolledToLeft(event.originalEvent.target as HTMLElement)\n ) {\n swipeBackPrevented.current = true;\n return;\n }\n // Начался свайп назад\n if (onSwipeBackStart) {\n const payload = onSwipeBackStart(activePanel);\n if (payload === 'prevent') {\n swipeBackPrevented.current = true;\n return;\n }\n }\n\n if (activePanel !== null) {\n // Note: вызываем закрытие клавиатуры. В iOS это нативное поведение при свайпе.\n blurActiveElement(document);\n scrolls.current[activePanel] = scroll?.getScroll().y;\n }\n\n setSwipingBack(true);\n setSwipeBackStartX(event.startX);\n setSwipeBackPrevPanel(activePanel);\n setSwipeBackNextPanel(history.slice(-2)[0]);\n }\n\n if (swipingBack) {\n if (event.shiftX < 0) {\n setSwipeBackShift(0);\n } else if (event.shiftX > window!.innerWidth - swipeBackStartX) {\n setSwipeBackShift(window!.innerWidth);\n } else {\n setSwipeBackShift(event.shiftX);\n }\n }\n };\n\n const handleTouchEndForIOSSwipeBackSimulation = (event: TouchEvent) => {\n swipeBackPrevented.current = false;\n if (swipingBack) {\n const speed = (swipeBackShift / event.duration) * 1000;\n if (swipeBackShift === 0) {\n onSwipeBackCancel();\n } else if (swipeBackShift >= (window!.innerWidth ?? 0)) {\n onSwipeBackSuccess();\n } else if (speed > 250 || swipeBackShift >= window!.innerWidth / 2) {\n setSwipeBackResult('success');\n } else {\n setSwipeBackResult('fail');\n }\n }\n };\n\n const calcPanelSwipeStyles = (isPrev: boolean, isNext: boolean): React.CSSProperties => {\n if ((!isPrev && !isNext) || swipeBackResult) {\n return {};\n }\n\n if (isNext) {\n return window\n ? {\n transform: `translate3d(${-50 + (swipeBackShift * 100) / window.innerWidth / 2}%, 0, 0)`,\n }\n : {};\n }\n\n if (isPrev) {\n return { transform: `translate3d(${swipeBackShift}px, 0, 0)` };\n }\n\n return {};\n };\n\n const calcPanelSwipeBackOverlayStyles = (isNext: boolean): React.CSSProperties => {\n if (!window || !isNext) {\n return {};\n }\n const opacityOnSwipeEnd =\n swipeBackResult === 'success' ? 0 : swipeBackResult === 'fail' ? 1 : null;\n\n return {\n display: 'block',\n opacity:\n opacityOnSwipeEnd === null ? 1 - swipeBackShift / window.innerWidth : opacityOnSwipeEnd,\n };\n };\n\n const handleSwipeBackTargetTransitionEnd = (event: React.TransitionEvent<HTMLDivElement>) => {\n if (event.propertyName.includes('transform')) {\n swipingBackTransitionEndHandler();\n }\n };\n\n React.useEffect(() => {\n // Нужен переход\n if (\n prevActivePanel &&\n prevActivePanel !== activePanelProp &&\n !prevSwipingBack &&\n !prevBrowserSwipe\n ) {\n const firstLayerId = (React.Children.toArray(children) as React.ReactElement[])\n .map((panel) => getNavId(panel.props, warn))\n .find((id) => id === prevActivePanel || id === activePanelProp);\n\n const isBackTransition = firstLayerId === activePanelProp;\n scrolls.current[prevActivePanel] = scroll?.getScroll({ compensateKeyboardHeight: false }).y;\n\n if (disableAnimation) {\n flushTransition(prevActivePanel, isBackTransition);\n } else {\n blurActiveElement(document);\n\n setVisiblePanels([prevActivePanel, activePanelProp]);\n setPrevPanel(prevActivePanel);\n setNextPanel(activePanelProp);\n setActivePanel(null);\n setAnimated(true);\n setIsBack(isBackTransition);\n }\n }\n\n // Закончилась анимация свайпа назад\n if (prevActivePanel && prevActivePanel !== activePanelProp && prevSwipingBack) {\n const nextPanel = activePanelProp;\n const prevPanel = prevActivePanel;\n if (prevSwipeBackPrevPanel) {\n scrolls.current[prevSwipeBackPrevPanel] = 0;\n }\n\n setSwipeBackPrevPanel(null);\n setSwipeBackNextPanel(null);\n setSwipingBack(false);\n setSwipeBackResult(null);\n setSwipeBackStartX(0);\n setSwipeBackShift(0);\n setActivePanel(nextPanel);\n setVisiblePanels([nextPanel]);\n setIsBack(true);\n\n layoutEffectCall(() => {\n if (nextPanel !== null) {\n scroll?.scrollTo(0, scrolls.current[nextPanel]);\n }\n prevOnTransition &&\n prevOnTransition({\n isBack: true,\n from: prevPanel,\n to: nextPanel,\n });\n });\n }\n\n // Началась анимация завершения свайпа назад.\n // см. `onTransitionEnd()`\n\n // Закончился Safari свайп\n if (prevActivePanel !== activePanelProp && browserSwipe) {\n setBrowserSwipe(false);\n setNextPanel(null);\n setPrevPanel(null);\n setAnimated(false);\n setVisiblePanels([activePanelProp]);\n setActivePanel(activePanelProp);\n }\n }, [\n activePanelProp,\n activePanel,\n browserSwipe,\n children,\n disableAnimation,\n document,\n flushTransition,\n prevActivePanel,\n prevBrowserSwipe,\n prevOnTransition,\n prevSwipeBackPrevPanel,\n prevSwipeBackResult,\n prevSwipingBack,\n scroll,\n swipeBackNextPanel,\n swipeBackResult,\n layoutEffectCall,\n ]);\n\n React.useEffect(\n function restoreScrollPositionWhenSwipeBackIsCancelled() {\n // Если свайп назад отменился (когда пользователь недостаточно сильно свайпнул)\n const swipeBackCancelledInTheMiddleOfAction =\n prevSwipeBackResult === 'fail' && !swipeBackResult;\n const swipeBackCancelledByMovingPanelBackToInitialPoint =\n prevSwipingBack && !swipingBack && prevSwipeBackShift === 0;\n\n if (\n (swipeBackCancelledInTheMiddleOfAction ||\n swipeBackCancelledByMovingPanelBackToInitialPoint) &&\n activePanel !== null\n ) {\n scroll?.scrollTo(0, scrolls.current[activePanel]);\n }\n },\n [\n prevSwipeBackResult,\n swipeBackResult,\n prevSwipingBack,\n swipingBack,\n prevSwipeBackShift,\n activePanel,\n scroll,\n ],\n );\n\n return (\n <NavViewIdContext.Provider value={id}>\n <Touch\n Component=\"section\"\n {...restProps}\n className={classNames(\n styles['View'],\n platform === 'ios' && classNames(styles['View--ios'], 'vkuiInternalView--ios'),\n !disableAnimation && animated && styles['View--animated'],\n !disableAnimation && swipingBack && styles['View--swiping-back'],\n disableAnimation && styles['View--no-motion'],\n className,\n )}\n onMoveX={\n iOSSwipeBackSimulationEnabled\n ? handleTouchMoveXForIOSSwipeBackSimulation\n : platform === 'ios'\n ? handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext\n : undefined\n }\n onEnd={iOSSwipeBackSimulationEnabled ? handleTouchEndForIOSSwipeBackSimulation : undefined}\n >\n <div className={styles['View__panels']}>\n {panels.map((panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n\n const isPanelActive = panelId === activePanel;\n const isPanelPrev = panelId === prevPanel;\n const isPanelNext = panelId === nextPanel;\n const isAnimatedTarget = animated && (isBack ? isPanelPrev : isPanelNext);\n\n const isSwipeBackPrev = panelId === swipeBackPrevPanel;\n const isSwipeBackNext = panelId === swipeBackNextPanel;\n const isSwipeBackTarget = swipeBackResult && isSwipeBackPrev;\n\n let scrollCompensateStyle: React.CSSProperties | undefined = undefined;\n\n if (isPanelPrev || (isPanelNext && isBack) || isSwipeBackPrev || isSwipeBackNext) {\n const marginTop = scrolls.current[panelId];\n if (marginTop !== undefined) {\n scrollCompensateStyle = { marginTop: -1 * marginTop };\n }\n }\n\n return (\n <div\n className={classNames(\n styles['View__panel'],\n\n isPanelActive && styles['View__panel--active'],\n isPanelPrev && styles['View__panel--prev'],\n isPanelNext && styles['View__panel--next'],\n\n isSwipeBackPrev && styles['View__panel--swipe-back-prev'],\n isSwipeBackNext && styles['View__panel--swipe-back-next'],\n swipeBackResult === 'success' && styles['View__panel--swipe-back-success'],\n swipeBackResult === 'fail' && styles['View__panel--swipe-back-failed'],\n )}\n onTransitionEnd={isSwipeBackTarget ? handleSwipeBackTargetTransitionEnd : undefined}\n onAnimationEnd={isAnimatedTarget ? handleAnimatedTargetAnimationEnd : undefined}\n ref={(el) => panelId !== undefined && (panelNodes.current[panelId] = el)}\n style={calcPanelSwipeStyles(isSwipeBackPrev, isSwipeBackNext)}\n key={panelId}\n >\n {platform === 'ios' && (\n <div\n className={styles['View__panel-overlay']}\n style={calcPanelSwipeBackOverlayStyles(isSwipeBackNext)}\n />\n )}\n <div className={styles['View__panel-in']} style={scrollCompensateStyle}>\n <NavTransitionDirectionProvider isBack={swipingBack || isBack}>\n <NavTransitionProvider\n entering={panelId === nextPanel || panelId === swipeBackNextPanel}\n >\n {panel}\n </NavTransitionProvider>\n </NavTransitionDirectionProvider>\n </div>\n </div>\n );\n })}\n </div>\n </Touch>\n </NavViewIdContext.Provider>\n );\n};\n"],"names":["View","scrollsCache","warn","warnOnce","activePanel","activePanelProp","history","nav","onTransition","onSwipeBack","onSwipeBackStart","onSwipeBackCancel","onSwipeBackCancelProp","children","className","restProps","id","getNavId","scrolls","React","useRef","layoutEffectCall","useLayoutEffectCall","useEffect","current","panelNodes","window","document","useDOM","scroll","useScroll","configProvider","useConfigProvider","splitCol","useSplitCol","platform","usePlatform","animated","setAnimated","useState","visiblePanels","setVisiblePanels","setActivePanel","isBack","setIsBack","undefined","prevPanel","setPrevPanel","nextPanel","setNextPanel","swipeBackPrevented","swipingBack","setSwipingBack","swipeBackStartX","setSwipeBackStartX","swipeBackShift","setSwipeBackShift","swipeBackNextPanel","setSwipeBackNextPanel","swipeBackPrevPanel","setSwipeBackPrevPanel","swipeBackResult","setSwipeBackResult","browserSwipe","setBrowserSwipe","prevActivePanel","usePrevious","prevSwipingBack","prevBrowserSwipe","prevSwipeBackResult","prevSwipeBackShift","prevSwipeBackPrevPanel","prevOnTransition","panels","Children","toArray","filter","panel","panelId","props","includes","disableAnimation","transitionMotionEnabled","animate","iOSSwipeBackSimulationEnabled","isWebView","Boolean","flushTransition","useCallback","isBackTransition","scrollTo","from","to","handleAnimatedTargetAnimationEnd","onSwipeBackSuccess","swipingBackTransitionEndHandler","handleTouchMoveXForNativeIOSSwipeBackOrSwipeNext","event","swipeBackTriggered","viewportStartEdgeTouched","viewportEndEdgeTouched","getSwipeBackPredicates","startX","shiftX","innerWidth","handleTouchMoveXForIOSSwipeBackSimulation","swipeBackExcluded","swipedToOpposite","length","hasHorizontalScrollableElementWithScrolledToLeft","originalEvent","target","payload","blurActiveElement","getScroll","y","slice","handleTouchEndForIOSSwipeBackSimulation","speed","duration","calcPanelSwipeStyles","isPrev","isNext","transform","calcPanelSwipeBackOverlayStyles","opacityOnSwipeEnd","display","opacity","handleSwipeBackTargetTransitionEnd","propertyName","firstLayerId","map","find","compensateKeyboardHeight","restoreScrollPositionWhenSwipeBackIsCancelled","swipeBackCancelledInTheMiddleOfAction","swipeBackCancelledByMovingPanelBackToInitialPoint","NavViewIdContext","Provider","value","Touch","Component","classNames","onMoveX","onEnd","div","isPanelActive","isPanelPrev","isPanelNext","isAnimatedTarget","isSwipeBackPrev","isSwipeBackNext","isSwipeBackTarget","scrollCompensateStyle","marginTop","onTransitionEnd","onAnimationEnd","ref","el","style","NavTransitionDirectionProvider","NavTransitionProvider","entering"],"mappings":";;;;;;;;;;;IA4DaA,IAAI;eAAJA;;IA7BFC,YAAY;eAAZA;;;;;;;;iEA/BY;sBACI;6BACC;6BACA;qBACc;0BACL;0BACZ;+BAEC;uCACQ;8BACD;sCACK;+CACS;iCACnB;uBACM;qCACE;uBAK7B;AAWA,IAAIA,eAA6B,CAAC;AAwBzC,MAAMC,OAAOC,IAAAA,kBAAQ,EAAC;AAKf,MAAMH,OAAO;QAAC,EACnBI,aAAaC,eAAe,EAC5BC,OAAO,EACPC,GAAG,EACHC,YAAY,EACZC,WAAW,EACXC,gBAAgB,EAChBC,mBAAmBC,qBAAqB,EACxCC,QAAQ,EACRC,SAAS,EAEC,WADPC;QATHX;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;;IAGA,MAAME,KAAKC,IAAAA,kBAAQ,EAAC;QAAEV;QAAKS,IAAID,UAAUC,EAAE;IAAC;IAC5C,MAAME,UAAUC,OAAMC,MAAM,CAACnB,YAAY,CAACe,GAAa,IAAI,CAAC;IAC5D,MAAMK,mBAAmBC,IAAAA,wCAAmB;IAE5CH,OAAMI,SAAS,CAAC,IAAM;YACpB,IAAIP,IAAI;gBACNf,YAAY,CAACe,GAAG,GAAGE,QAAQM,OAAO;YACpC;QACF;IAEA,MAAMC,aAAaN,OAAMC,MAAM,CAA0C,CAAC;IAE1E,MAAM,EAAEM,MAAM,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,WAAM;IACnC,MAAMC,SAASC,IAAAA,wBAAS;IACxB,MAAMC,iBAAiBC,IAAAA,wCAAiB;IACxC,MAAMC,WAAWC,IAAAA,4BAAW;IAC5B,MAAMC,WAAWC,IAAAA,wBAAW;IAE5B,MAAM,CAACC,UAAUC,YAAY,GAAGnB,OAAMoB,QAAQ,CAAC;IAE/C,MAAM,CAACC,eAAeC,iBAAiB,GAAGtB,OAAMoB,QAAQ,CAAC;QAAClC;KAAgB;IAC1E,MAAM,CAACD,aAAasC,eAAe,GAAGvB,OAAMoB,QAAQ,CAAgBlC;IACpE,MAAM,CAACsC,QAAQC,UAAU,GAAGzB,OAAMoB,QAAQ,CAAsBM;IAChE,MAAM,CAACC,WAAWC,aAAa,GAAG5B,OAAMoB,QAAQ,CAAgB;IAChE,MAAM,CAACS,WAAWC,aAAa,GAAG9B,OAAMoB,QAAQ,CAAgB;IAEhE,MAAMW,qBAAqB/B,OAAMC,MAAM,CAAU;IACjD,MAAM,CAAC+B,aAAaC,eAAe,GAAGjC,OAAMoB,QAAQ,CAAsBM;IAC1E,MAAM,CAACQ,iBAAiBC,mBAAmB,GAAGnC,OAAMoB,QAAQ,CAAS;IACrE,MAAM,CAACgB,gBAAgBC,kBAAkB,GAAGrC,OAAMoB,QAAQ,CAAS;IACnE,MAAM,CAACkB,oBAAoBC,sBAAsB,GAAGvC,OAAMoB,QAAQ,CAAgB;IAClF,MAAM,CAACoB,oBAAoBC,sBAAsB,GAAGzC,OAAMoB,QAAQ,CAAgB;IAClF,MAAM,CAACsB,iBAAiBC,mBAAmB,GAAG3C,OAAMoB,QAAQ,CAA4B;IAExF,MAAM,CAACwB,cAAcC,gBAAgB,GAAG7C,OAAMoB,QAAQ,CAAC;IAEvD,MAAM0B,kBAAkBC,IAAAA,wBAAW,EAAC7D;IACpC,MAAM8D,kBAAkBD,IAAAA,wBAAW,EAACf;IACpC,MAAMiB,mBAAmBF,IAAAA,wBAAW,EAACH;IACrC,MAAMM,sBAAsBH,IAAAA,wBAAW,EAACL;IACxC,MAAMS,qBAAqBJ,IAAAA,wBAAW,EAACX;IACvC,MAAMgB,yBAAyBL,IAAAA,wBAAW,EAACP;IAC3C,MAAMa,mBAAmBN,IAAAA,wBAAW,EAAC1D;IAErC,MAAMiE,SAAS,AAACtD,OAAMuD,QAAQ,CAACC,OAAO,CAAC9D,UAAmC+D,MAAM,CAC9E,CAACC;QACC,MAAMC,UAAU7D,IAAAA,kBAAQ,EAAC4D,MAAME,KAAK,EAAE7E;QAEtC,OACE,AAAC4E,YAAYjC,aAAaL,cAAcwC,QAAQ,CAACF,YACjDA,YAAYnB,sBACZmB,YAAYrB;IAEhB;IAGF,MAAMwB,mBACJ,CAAClD,eAAemD,uBAAuB,IAAI,CAACjD,SAASkD,OAAO,IAAIhD,aAAa;IAC/E,MAAMiD,gCACJ,CAACH,oBAAoB9C,aAAa,SAASJ,eAAesD,SAAS,IAAIC,QAAQ7E;IAEjF,MAAM8E,kBAAkBpE,OAAMqE,WAAW,CACvC,CAAC1C,WAAmB2C;QAClB,IAAIA,kBAAkB;YACpBvE,QAAQM,OAAO,CAACsB,UAAU,GAAG;QAC/B;QACAC,aAAa;QACbE,aAAa;QACbR,iBAAiB;YAACpC;SAAgB;QAClCqC,eAAerC;QACfiC,YAAY;QACZM,UAAU6C;QAEVpE,iBAAiB;YACfQ,mBAAAA,6BAAAA,OAAQ6D,QAAQ,CAAC,GAAGD,mBAAmBvE,QAAQM,OAAO,CAACnB,gBAAgB,GAAG;YAC1EG,gBACEA,aAAa;gBACXmC,QAAQ8C;gBACRE,MAAM7C;gBACN8C,IAAIvF;YACN;QACJ;IACF,GACA;QAACA;QAAiBgB;QAAkBb;QAAcqB;KAAO;IAG3D,MAAMgE,mCAAmC;QACvC,IAAI/C,cAAc,MAAM;YACtByC,gBAAgBzC,WAAWwC,QAAQ3C;QACrC;IACF;IAEA,MAAMmD,qBAAqB3E,OAAMqE,WAAW,CAAC;QAC3C/E,eAAeA;IACjB,GAAG;QAACA;KAAY;IAEhB,MAAME,oBAAoBQ,OAAMqE,WAAW,CAAC;QAC1C5E,yBAAyBA;QACzBgD,sBAAsB;QACtBF,sBAAsB;QACtBN,eAAe;QACfU,mBAAmB;QACnBR,mBAAmB;QACnBE,kBAAkB;IACpB,GAAG;QAAC5C;KAAsB;IAE1B,MAAMmF,kCAAkC5E,OAAMqE,WAAW,CAAC;QACxD,OAAQ3B;YACN,KAAK;gBACHlD;gBACA;YACF,KAAK;gBACHmF;QACJ;IACF,GAAG;QAACnF;QAAmBmF;QAAoBjC;KAAgB;IAE3D,MAAMmC,mDAAmD,CAACC;QACxD,IAAIlC,cAAc;YAChB;QACF;QACA,MAAM,EAAEmC,kBAAkB,EAAEC,wBAAwB,EAAEC,sBAAsB,EAAE,GAC5EC,IAAAA,6BAAsB,EAACJ,MAAMK,MAAM,EAAEL,MAAMM,MAAM,EAAE7E,OAAQ8E,UAAU;QAEvE,IAAI,AAACL,CAAAA,4BAA4BC,sBAAqB,KAAMF,oBAAoB;YAC9ElC,gBAAgB;QAClB;IACF;IAEA,MAAMyC,4CAA4C,CAACR;QACjD,IAAI/C,mBAAmB1B,OAAO,IAAIkF,IAAAA,wBAAiB,EAACT,QAAQ;YAC1D;QACF;QAEA,MAAM,EAAEU,gBAAgB,EAAET,kBAAkB,EAAEC,wBAAwB,EAAE,GACtEE,IAAAA,6BAAsB,EAACJ,MAAMK,MAAM,EAAEL,MAAMM,MAAM,EAAE7E,OAAQ8E,UAAU;QAEvE,IAAInE,YAAY6D,oBAAoB;YAClC;QACF;QAEA,IAAI,CAAC/C,eAAe7C,WAAWA,QAAQsG,MAAM,GAAG,GAAG;YACjD,IAAID,kBAAkB;gBACpBzD,mBAAmB1B,OAAO,GAAG;gBAC7B;YACF;YAEA,IAAI,CAAC0E,oBAAoB;gBACvB;YACF;YAEA,IACE,CAACC,4BACDU,IAAAA,uDAAgD,EAACZ,MAAMa,aAAa,CAACC,MAAM,GAC3E;gBACA7D,mBAAmB1B,OAAO,GAAG;gBAC7B;YACF;YACA,sBAAsB;YACtB,IAAId,kBAAkB;gBACpB,MAAMsG,UAAUtG,iBAAiBN;gBACjC,IAAI4G,YAAY,WAAW;oBACzB9D,mBAAmB1B,OAAO,GAAG;oBAC7B;gBACF;YACF;YAEA,IAAIpB,gBAAgB,MAAM;gBACxB,+EAA+E;gBAC/E6G,IAAAA,sBAAiB,EAACtF;gBAClBT,QAAQM,OAAO,CAACpB,YAAY,GAAGyB,mBAAAA,6BAAAA,OAAQqF,SAAS,GAAGC,CAAC;YACtD;YAEA/D,eAAe;YACfE,mBAAmB2C,MAAMK,MAAM;YAC/B1C,sBAAsBxD;YACtBsD,sBAAsBpD,QAAQ8G,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;QAC5C;QAEA,IAAIjE,aAAa;YACf,IAAI8C,MAAMM,MAAM,GAAG,GAAG;gBACpB/C,kBAAkB;YACpB,OAAO,IAAIyC,MAAMM,MAAM,GAAG7E,OAAQ8E,UAAU,GAAGnD,iBAAiB;gBAC9DG,kBAAkB9B,OAAQ8E,UAAU;YACtC,OAAO;gBACLhD,kBAAkByC,MAAMM,MAAM;YAChC;QACF;IACF;IAEA,MAAMc,0CAA0C,CAACpB;QAC/C/C,mBAAmB1B,OAAO,GAAG;QAC7B,IAAI2B,aAAa;YACf,MAAMmE,QAAQ,AAAC/D,iBAAiB0C,MAAMsB,QAAQ,GAAI;gBAGpB7F;YAF9B,IAAI6B,mBAAmB,GAAG;gBACxB5C;YACF,OAAO,IAAI4C,kBAAmB7B,CAAAA,CAAAA,qBAAAA,OAAQ8E,UAAU,cAAlB9E,gCAAAA,qBAAsB,CAAA,GAAI;gBACtDoE;YACF,OAAO,IAAIwB,QAAQ,OAAO/D,kBAAkB7B,OAAQ8E,UAAU,GAAG,GAAG;gBAClE1C,mBAAmB;YACrB,OAAO;gBACLA,mBAAmB;YACrB;QACF;IACF;IAEA,MAAM0D,uBAAuB,CAACC,QAAiBC;QAC7C,IAAI,AAAC,CAACD,UAAU,CAACC,UAAW7D,iBAAiB;YAC3C,OAAO,CAAC;QACV;QAEA,IAAI6D,QAAQ;YACV,OAAOhG,SACH;gBACEiG,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,AAACpE,iBAAiB,MAAO7B,OAAO8E,UAAU,GAAG,EAAE,QAAQ,CAAC;YAC1F,IACA,CAAC;QACP;QAEA,IAAIiB,QAAQ;YACV,OAAO;gBAAEE,WAAW,CAAC,YAAY,EAAEpE,eAAe,SAAS,CAAC;YAAC;QAC/D;QAEA,OAAO,CAAC;IACV;IAEA,MAAMqE,kCAAkC,CAACF;QACvC,IAAI,CAAChG,UAAU,CAACgG,QAAQ;YACtB,OAAO,CAAC;QACV;QACA,MAAMG,oBACJhE,oBAAoB,YAAY,IAAIA,oBAAoB,SAAS,IAAI;QAEvE,OAAO;YACLiE,SAAS;YACTC,SACEF,sBAAsB,OAAO,IAAItE,iBAAiB7B,OAAO8E,UAAU,GAAGqB;QAC1E;IACF;IAEA,MAAMG,qCAAqC,CAAC/B;QAC1C,IAAIA,MAAMgC,YAAY,CAACjD,QAAQ,CAAC,cAAc;YAC5Ce;QACF;IACF;IAEA5E,OAAMI,SAAS,CAAC;QACd,gBAAgB;QAChB,IACE0C,mBACAA,oBAAoB5D,mBACpB,CAAC8D,mBACD,CAACC,kBACD;YACA,MAAM8D,eAAe,AAAC/G,OAAMuD,QAAQ,CAACC,OAAO,CAAC9D,UAC1CsH,GAAG,CAAC,CAACtD,QAAU5D,IAAAA,kBAAQ,EAAC4D,MAAME,KAAK,EAAE7E,OACrCkI,IAAI,CAAC,CAACpH,KAAOA,OAAOiD,mBAAmBjD,OAAOX;YAEjD,MAAMoF,mBAAmByC,iBAAiB7H;YAC1Ca,QAAQM,OAAO,CAACyC,gBAAgB,GAAGpC,mBAAAA,6BAAAA,OAAQqF,SAAS,CAAC;gBAAEmB,0BAA0B;YAAM,GAAGlB,CAAC;YAE3F,IAAIlC,kBAAkB;gBACpBM,gBAAgBtB,iBAAiBwB;YACnC,OAAO;gBACLwB,IAAAA,sBAAiB,EAACtF;gBAElBc,iBAAiB;oBAACwB;oBAAiB5D;iBAAgB;gBACnD0C,aAAakB;gBACbhB,aAAa5C;gBACbqC,eAAe;gBACfJ,YAAY;gBACZM,UAAU6C;YACZ;QACF;QAEA,oCAAoC;QACpC,IAAIxB,mBAAmBA,oBAAoB5D,mBAAmB8D,iBAAiB;YAC7E,MAAMnB,YAAY3C;YAClB,MAAMyC,YAAYmB;YAClB,IAAIM,wBAAwB;gBAC1BrD,QAAQM,OAAO,CAAC+C,uBAAuB,GAAG;YAC5C;YAEAX,sBAAsB;YACtBF,sBAAsB;YACtBN,eAAe;YACfU,mBAAmB;YACnBR,mBAAmB;YACnBE,kBAAkB;YAClBd,eAAeM;YACfP,iBAAiB;gBAACO;aAAU;YAC5BJ,UAAU;YAEVvB,iBAAiB;gBACf,IAAI2B,cAAc,MAAM;oBACtBnB,mBAAAA,6BAAAA,OAAQ6D,QAAQ,CAAC,GAAGxE,QAAQM,OAAO,CAACwB,UAAU;gBAChD;gBACAwB,oBACEA,iBAAiB;oBACf7B,QAAQ;oBACRgD,MAAM7C;oBACN8C,IAAI5C;gBACN;YACJ;QACF;QAEA,6CAA6C;QAC7C,0BAA0B;QAE1B,0BAA0B;QAC1B,IAAIiB,oBAAoB5D,mBAAmB0D,cAAc;YACvDC,gBAAgB;YAChBf,aAAa;YACbF,aAAa;YACbT,YAAY;YACZG,iBAAiB;gBAACpC;aAAgB;YAClCqC,eAAerC;QACjB;IACF,GAAG;QACDA;QACAD;QACA2D;QACAlD;QACAoE;QACAtD;QACA4D;QACAtB;QACAG;QACAI;QACAD;QACAF;QACAF;QACAtC;QACA4B;QACAI;QACAxC;KACD;IAEDF,OAAMI,SAAS,CACb,SAAS+G;QACP,+EAA+E;QAC/E,MAAMC,wCACJlE,wBAAwB,UAAU,CAACR;QACrC,MAAM2E,oDACJrE,mBAAmB,CAAChB,eAAemB,uBAAuB;QAE5D,IACE,AAACiE,CAAAA,yCACCC,iDAAgD,KAClDpI,gBAAgB,MAChB;YACAyB,mBAAAA,6BAAAA,OAAQ6D,QAAQ,CAAC,GAAGxE,QAAQM,OAAO,CAACpB,YAAY;QAClD;IACF,GACA;QACEiE;QACAR;QACAM;QACAhB;QACAmB;QACAlE;QACAyB;KACD;IAGH,qBACE,qBAAC4G,8BAAgB,CAACC,QAAQ;QAACC,OAAO3H;kBAChC,cAAA,qBAAC4H,YAAK;YACJC,WAAU;WACN9H;YACJD,WAAWgI,IAAAA,gBAAU,cAEnB3G,aAAa,SAAS2G,IAAAA,gBAAU,mBAAsB,0BACtD,CAAC7D,oBAAoB5C,kCACrB,CAAC4C,oBAAoB9B,yCACrB8B,2CACAnE;YAEFiI,SACE3D,gCACIqB,4CACAtE,aAAa,QACX6D,mDACAnD;YAERmG,OAAO5D,gCAAgCiC,0CAA0CxE;sBAEjF,cAAA,qBAACoG;gBAAInI,SAAS;0BACX2D,OAAO0D,GAAG,CAAC,CAACtD;oBACX,MAAMC,UAAU7D,IAAAA,kBAAQ,EAAC4D,MAAME,KAAK,EAAE7E;oBAEtC,MAAMgJ,gBAAgBpE,YAAY1E;oBAClC,MAAM+I,cAAcrE,YAAYhC;oBAChC,MAAMsG,cAActE,YAAY9B;oBAChC,MAAMqG,mBAAmBhH,YAAaM,CAAAA,SAASwG,cAAcC,WAAU;oBAEvE,MAAME,kBAAkBxE,YAAYnB;oBACpC,MAAM4F,kBAAkBzE,YAAYrB;oBACpC,MAAM+F,oBAAoB3F,mBAAmByF;oBAE7C,IAAIG,wBAAyD5G;oBAE7D,IAAIsG,eAAgBC,eAAezG,UAAW2G,mBAAmBC,iBAAiB;wBAChF,MAAMG,YAAYxI,QAAQM,OAAO,CAACsD,QAAQ;wBAC1C,IAAI4E,cAAc7G,WAAW;4BAC3B4G,wBAAwB;gCAAEC,WAAW,CAAC,IAAIA;4BAAU;wBACtD;oBACF;oBAEA,qBACE,sBAACT;wBACCnI,WAAWgI,IAAAA,gBAAU,qBAGnBI,4CACAC,wCACAC,wCAEAE,uDACAC,uDACA1F,oBAAoB,oDACpBA,oBAAoB;wBAEtB8F,iBAAiBH,oBAAoBxB,qCAAqCnF;wBAC1E+G,gBAAgBP,mBAAmBxD,mCAAmChD;wBACtEgH,KAAK,CAACC,KAAOhF,YAAYjC,aAAcpB,CAAAA,WAAWD,OAAO,CAACsD,QAAQ,GAAGgF,EAAC;wBACtEC,OAAOvC,qBAAqB8B,iBAAiBC;;4BAG5CpH,aAAa,uBACZ,qBAAC8G;gCACCnI,SAAS;gCACTiJ,OAAOnC,gCAAgC2B;;0CAG3C,qBAACN;gCAAInI,SAAS;gCAA4BiJ,OAAON;0CAC/C,cAAA,qBAACO,6DAA8B;oCAACrH,QAAQQ,eAAeR;8CACrD,cAAA,qBAACsH,2CAAqB;wCACpBC,UAAUpF,YAAY9B,aAAa8B,YAAYrB;kDAE9CoB;;;;;uBAbFC;gBAmBX;;;;AAKV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEnsuredControl.d.ts","sourceRoot":"","sources":["../../../src/hooks/useEnsuredControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useEnsuredControl.d.ts","sourceRoot":"","sources":["../../../src/hooks/useEnsuredControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,sBAAsB,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;IACzE,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,YAAY,EAAE,CAAC,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC;CACtC;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EACrE,QAAQ,EAAE,YAAY,EACtB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAgBnD;AAED,MAAM,WAAW,4BAA4B,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,YAAY,EAAE,CAAC,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC;CACtC;AAID,wBAAgB,uBAAuB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC/C,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,QAAQ,EAAE,YAAY,GACvB,EAAE,4BAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAwEhF"}
|
|
@@ -21,6 +21,7 @@ const _object_without_properties = require("@swc/helpers/_/_object_without_prope
|
|
|
21
21
|
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
22
22
|
const _vkjs = require("@vkontakte/vkjs");
|
|
23
23
|
const _useIsomorphicLayoutEffect = require("../lib/useIsomorphicLayoutEffect");
|
|
24
|
+
const _warnOnce = require("../lib/warnOnce");
|
|
24
25
|
function useEnsuredControl(_param) {
|
|
25
26
|
var { onChange: onChangeProp, disabled } = _param, props = _object_without_properties._(_param, [
|
|
26
27
|
"onChange",
|
|
@@ -43,13 +44,26 @@ function useEnsuredControl(_param) {
|
|
|
43
44
|
onChange
|
|
44
45
|
];
|
|
45
46
|
}
|
|
47
|
+
const warn = (0, _warnOnce.warnOnce)('useCustomEnsuredControl');
|
|
46
48
|
function useCustomEnsuredControl({ value, defaultValue, disabled, onChange: onChangeProp }) {
|
|
47
49
|
const isControlled = value !== undefined;
|
|
48
50
|
const [localValue, setLocalValue] = _react.useState(defaultValue);
|
|
49
|
-
const preservedControlledValueRef = _react.useRef(
|
|
51
|
+
const preservedControlledValueRef = _react.useRef();
|
|
50
52
|
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(()=>{
|
|
51
53
|
preservedControlledValueRef.current = value;
|
|
52
54
|
});
|
|
55
|
+
/*
|
|
56
|
+
* Для ситуации, когда nextValue это пользовательская функция,
|
|
57
|
+
* и в качестве аргумента мы должны передать prevValue.
|
|
58
|
+
* Обычно в качестве prevValue используется preservedControlledValueRef, но оно может быть undefined, если
|
|
59
|
+
* некотролируемое value вдруг стало контролируемым
|
|
60
|
+
* (value = undefined ---> value = true)
|
|
61
|
+
* Если в момент вызова onChange preservedControlledValueRef ещё не был
|
|
62
|
+
* обновлён в useEffect, то мы не можем использовать preservedControlledValueRef как prevValue
|
|
63
|
+
* В качестве запасного варианта мы храним текущее значение value в currentFallbackValueRef, чтобы
|
|
64
|
+
* использовать его вместо preservedControlledValueRef.
|
|
65
|
+
*/ const currentFallbackValueRef = _react.useRef(value);
|
|
66
|
+
currentFallbackValueRef.current = value;
|
|
53
67
|
const onChange = _react.useCallback((nextValue)=>{
|
|
54
68
|
if (disabled) {
|
|
55
69
|
return;
|
|
@@ -64,8 +78,18 @@ function useCustomEnsuredControl({ value, defaultValue, disabled, onChange: onCh
|
|
|
64
78
|
return resolvedValue;
|
|
65
79
|
});
|
|
66
80
|
} else if (onChangeProp) {
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
if (process.env.NODE_ENV === 'development') {
|
|
82
|
+
if (preservedControlledValueRef.current === undefined) {
|
|
83
|
+
warn(`Похоже, что при вызове onChange с аргументом nextValue в виде коллбэка, состояние компонента было переведено из неконтролируемого ("undefined") в контролируемое. Пожалуйста, старайтесь сохранять либо неконтролируемое состояние, либо контролируемое на всём промежутке жизненного цикла компонента, чтобы получать предсказуемое значение prevValue в коллбэке nextValue((prevValue: V) => V)`, 'error');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const prevValue = preservedControlledValueRef.current === undefined ? currentFallbackValueRef.current : preservedControlledValueRef.current;
|
|
87
|
+
// В теории prevValue не может быть undefined,
|
|
88
|
+
// но лучше не вызывать nextValue с таким значением
|
|
89
|
+
if (prevValue !== undefined) {
|
|
90
|
+
const resolvedValue = nextValue(prevValue);
|
|
91
|
+
onChangeProp(resolvedValue);
|
|
92
|
+
}
|
|
69
93
|
}
|
|
70
94
|
} else {
|
|
71
95
|
if (onChangeProp) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useEnsuredControl.ts"],"sourcesContent":["import * as React from 'react';\nimport { isFunction } from '@vkontakte/vkjs';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\nexport interface UseEnsuredControlProps<V, E extends React.ChangeEvent<any>> {\n value?: V;\n defaultValue: V;\n disabled?: boolean | undefined;\n onChange?: (this: void, e: E) => any;\n}\n\nexport function useEnsuredControl<V, E extends React.ChangeEvent<any>>({\n onChange: onChangeProp,\n disabled,\n ...props\n}: UseEnsuredControlProps<V, E>): [V, (e: E) => any] {\n const [value, onChangeValue] = useCustomEnsuredControl(props);\n\n const onChange = React.useCallback(\n (e: E) => {\n if (disabled) {\n return;\n }\n\n onChangeValue(e.target.value);\n onChangeProp && onChangeProp(e);\n },\n [onChangeValue, onChangeProp, disabled],\n );\n\n return [value, onChange];\n}\n\nexport interface UseCustomEnsuredControlProps<V> {\n value?: V;\n defaultValue: V;\n disabled?: boolean | undefined;\n onChange?: (this: void, v: V) => any;\n}\n\nexport function useCustomEnsuredControl<V = any>({\n value,\n defaultValue,\n disabled,\n onChange: onChangeProp,\n}: UseCustomEnsuredControlProps<V>): [V, React.Dispatch<React.SetStateAction<V>>] {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = React.useState(defaultValue);\n const preservedControlledValueRef = React.useRef(
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useEnsuredControl.ts"],"sourcesContent":["import * as React from 'react';\nimport { isFunction } from '@vkontakte/vkjs';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../lib/warnOnce';\n\nexport interface UseEnsuredControlProps<V, E extends React.ChangeEvent<any>> {\n value?: V;\n defaultValue: V;\n disabled?: boolean | undefined;\n onChange?: (this: void, e: E) => any;\n}\n\nexport function useEnsuredControl<V, E extends React.ChangeEvent<any>>({\n onChange: onChangeProp,\n disabled,\n ...props\n}: UseEnsuredControlProps<V, E>): [V, (e: E) => any] {\n const [value, onChangeValue] = useCustomEnsuredControl(props);\n\n const onChange = React.useCallback(\n (e: E) => {\n if (disabled) {\n return;\n }\n\n onChangeValue(e.target.value);\n onChangeProp && onChangeProp(e);\n },\n [onChangeValue, onChangeProp, disabled],\n );\n\n return [value, onChange];\n}\n\nexport interface UseCustomEnsuredControlProps<V> {\n value?: V;\n defaultValue: V;\n disabled?: boolean | undefined;\n onChange?: (this: void, v: V) => any;\n}\n\nconst warn = warnOnce('useCustomEnsuredControl');\n\nexport function useCustomEnsuredControl<V = any>({\n value,\n defaultValue,\n disabled,\n onChange: onChangeProp,\n}: UseCustomEnsuredControlProps<V>): [V, React.Dispatch<React.SetStateAction<V>>] {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = React.useState(defaultValue);\n\n const preservedControlledValueRef = React.useRef<V | undefined>();\n useIsomorphicLayoutEffect(() => {\n preservedControlledValueRef.current = value;\n });\n\n /*\n * Для ситуации, когда nextValue это пользовательская функция,\n * и в качестве аргумента мы должны передать prevValue.\n * Обычно в качестве prevValue используется preservedControlledValueRef, но оно может быть undefined, если\n * некотролируемое value вдруг стало контролируемым\n * (value = undefined ---> value = true)\n * Если в момент вызова onChange preservedControlledValueRef ещё не был\n * обновлён в useEffect, то мы не можем использовать preservedControlledValueRef как prevValue\n * В качестве запасного варианта мы храним текущее значение value в currentFallbackValueRef, чтобы\n * использовать его вместо preservedControlledValueRef.\n */\n const currentFallbackValueRef = React.useRef<V | undefined>(value);\n currentFallbackValueRef.current = value;\n\n const onChange = React.useCallback(\n (nextValue: React.SetStateAction<V>) => {\n if (disabled) {\n return;\n }\n\n if (isFunction(nextValue)) {\n if (!isControlled) {\n setLocalValue((prevValue) => {\n const resolvedValue = nextValue(prevValue);\n if (onChangeProp) {\n onChangeProp(resolvedValue);\n }\n return resolvedValue;\n });\n } else if (onChangeProp) {\n if (process.env.NODE_ENV === 'development') {\n if (preservedControlledValueRef.current === undefined) {\n warn(\n `Похоже, что при вызове onChange с аргументом nextValue в виде коллбэка, состояние компонента было переведено из неконтролируемого (\"undefined\") в контролируемое. Пожалуйста, старайтесь сохранять либо неконтролируемое состояние, либо контролируемое на всём промежутке жизненного цикла компонента, чтобы получать предсказуемое значение prevValue в коллбэке nextValue((prevValue: V) => V)`,\n 'error',\n );\n }\n }\n\n const prevValue =\n preservedControlledValueRef.current === undefined\n ? currentFallbackValueRef.current\n : preservedControlledValueRef.current;\n // В теории prevValue не может быть undefined,\n // но лучше не вызывать nextValue с таким значением\n if (prevValue !== undefined) {\n const resolvedValue = nextValue(prevValue);\n onChangeProp(resolvedValue);\n }\n }\n } else {\n if (onChangeProp) {\n onChangeProp(nextValue);\n }\n if (!isControlled) {\n setLocalValue(nextValue);\n }\n }\n },\n [disabled, isControlled, onChangeProp],\n );\n\n return [isControlled ? value : localValue, onChange];\n}\n"],"names":["useCustomEnsuredControl","useEnsuredControl","onChange","onChangeProp","disabled","props","value","onChangeValue","React","useCallback","e","target","warn","warnOnce","defaultValue","isControlled","undefined","localValue","setLocalValue","useState","preservedControlledValueRef","useRef","useIsomorphicLayoutEffect","current","currentFallbackValueRef","nextValue","isFunction","prevValue","resolvedValue","process","env","NODE_ENV"],"mappings":";;;;;;;;;;;IA2CgBA,uBAAuB;eAAvBA;;IA/BAC,iBAAiB;eAAjBA;;;;;iEAZO;sBACI;2CACe;0BACjB;AASlB,SAASA,kBAAuD;QAAA,EACrEC,UAAUC,YAAY,EACtBC,QAAQ,EAEqB,GAJwC,QAGlEC,qCAHkE;QACrEH;QACAE;;IAGA,MAAM,CAACE,OAAOC,cAAc,GAAGP,wBAAwBK;IAEvD,MAAMH,WAAWM,OAAMC,WAAW,CAChC,CAACC;QACC,IAAIN,UAAU;YACZ;QACF;QAEAG,cAAcG,EAAEC,MAAM,CAACL,KAAK;QAC5BH,gBAAgBA,aAAaO;IAC/B,GACA;QAACH;QAAeJ;QAAcC;KAAS;IAGzC,OAAO;QAACE;QAAOJ;KAAS;AAC1B;AASA,MAAMU,OAAOC,IAAAA,kBAAQ,EAAC;AAEf,SAASb,wBAAiC,EAC/CM,KAAK,EACLQ,YAAY,EACZV,QAAQ,EACRF,UAAUC,YAAY,EACU;IAChC,MAAMY,eAAeT,UAAUU;IAC/B,MAAM,CAACC,YAAYC,cAAc,GAAGV,OAAMW,QAAQ,CAACL;IAEnD,MAAMM,8BAA8BZ,OAAMa,MAAM;IAChDC,IAAAA,oDAAyB,EAAC;QACxBF,4BAA4BG,OAAO,GAAGjB;IACxC;IAEA;;;;;;;;;;GAUC,GACD,MAAMkB,0BAA0BhB,OAAMa,MAAM,CAAgBf;IAC5DkB,wBAAwBD,OAAO,GAAGjB;IAElC,MAAMJ,WAAWM,OAAMC,WAAW,CAChC,CAACgB;QACC,IAAIrB,UAAU;YACZ;QACF;QAEA,IAAIsB,IAAAA,gBAAU,EAACD,YAAY;YACzB,IAAI,CAACV,cAAc;gBACjBG,cAAc,CAACS;oBACb,MAAMC,gBAAgBH,UAAUE;oBAChC,IAAIxB,cAAc;wBAChBA,aAAayB;oBACf;oBACA,OAAOA;gBACT;YACF,OAAO,IAAIzB,cAAc;gBACvB,IAAI0B,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;oBAC1C,IAAIX,4BAA4BG,OAAO,KAAKP,WAAW;wBACrDJ,KACE,CAAC,iYAAiY,CAAC,EACnY;oBAEJ;gBACF;gBAEA,MAAMe,YACJP,4BAA4BG,OAAO,KAAKP,YACpCQ,wBAAwBD,OAAO,GAC/BH,4BAA4BG,OAAO;gBACzC,8CAA8C;gBAC9C,mDAAmD;gBACnD,IAAII,cAAcX,WAAW;oBAC3B,MAAMY,gBAAgBH,UAAUE;oBAChCxB,aAAayB;gBACf;YACF;QACF,OAAO;YACL,IAAIzB,cAAc;gBAChBA,aAAasB;YACf;YACA,IAAI,CAACV,cAAc;gBACjBG,cAAcO;YAChB;QACF;IACF,GACA;QAACrB;QAAUW;QAAcZ;KAAa;IAGxC,OAAO;QAACY,eAAeT,QAAQW;QAAYf;KAAS;AACtD"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ВНИМАНИЕ: Этот подход сделает ваши компоненты медленнее, потому что они
|
|
5
5
|
* должны рендериться дважды, поэтому используйте хук с осторожностью.
|
|
6
6
|
*
|
|
7
|
-
* @see {@link https://
|
|
7
|
+
* @see {@link https://react.dev/reference/react-dom/hydrate#handling-different-client-and-server-content React Docs}
|
|
8
8
|
*/
|
|
9
9
|
export declare function useIsClient(initial?: boolean): boolean;
|
|
10
10
|
//# sourceMappingURL=useIsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useIsClient.ts"],"sourcesContent":["import * as React from 'react';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\n/**\n * Хук для two-pass рендеринга.\n *\n * ВНИМАНИЕ: Этот подход сделает ваши компоненты медленнее, потому что они\n * должны рендериться дважды, поэтому используйте хук с осторожностью.\n *\n * @see {@link https://
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useIsClient.ts"],"sourcesContent":["import * as React from 'react';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\n/**\n * Хук для two-pass рендеринга.\n *\n * ВНИМАНИЕ: Этот подход сделает ваши компоненты медленнее, потому что они\n * должны рендериться дважды, поэтому используйте хук с осторожностью.\n *\n * @see {@link https://react.dev/reference/react-dom/hydrate#handling-different-client-and-server-content React Docs}\n */\nexport function useIsClient(initial = false): boolean {\n const [isClient, setIsClient] = React.useState(initial);\n\n useIsomorphicLayoutEffect(() => {\n setIsClient(true);\n }, []);\n\n return isClient;\n}\n"],"names":["useIsClient","initial","isClient","setIsClient","React","useState","useIsomorphicLayoutEffect"],"mappings":";;;;+BAWgBA;;;eAAAA;;;;iEAXO;2CACmB;AAUnC,SAASA,YAAYC,UAAU,KAAK;IACzC,MAAM,CAACC,UAAUC,YAAY,GAAGC,OAAMC,QAAQ,CAACJ;IAE/CK,IAAAA,oDAAyB,EAAC;QACxBH,YAAY;IACd,GAAG,EAAE;IAEL,OAAOD;AACT"}
|
package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce, noop } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n onShownChanged: onShownChangedProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n onShownChanged(false, shownLocalState.reason);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n onShownChanged(true, shownLocalState.reason);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide, onShownChanged],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["useFloatingWithInteractions","whileElementsMounted","args","autoUpdateFloatingElement","elementResize","trigger","DEFAULT_TRIGGER","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","onShownChanged","onShownChangedProp","memoizedValue","React","useMemo","undefined","shownLocalState","setShownLocalState","useCustomEnsuredControl","value","defaultValue","onChange","useStableCallback","reason","noop","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","useResolveTriggerType","x","y","strategy","refs","middlewareData","useFloating","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","debounce","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","getActiveElementByAnotherElement","contains","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","useGlobalOnClickOutside","useIsomorphicLayoutEffect","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","isHTMLElement","win","getWindow","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","convertFloatingDataToReactCSSProperties","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce, noop } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n onShownChanged: onShownChangedProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo<LocalState | undefined>(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n onShownChanged(false, shownLocalState.reason);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n onShownChanged(true, shownLocalState.reason);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide, onShownChanged],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["useFloatingWithInteractions","whileElementsMounted","args","autoUpdateFloatingElement","elementResize","trigger","DEFAULT_TRIGGER","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","onShownChanged","onShownChangedProp","memoizedValue","React","useMemo","undefined","shownLocalState","setShownLocalState","useCustomEnsuredControl","value","defaultValue","onChange","useStableCallback","reason","noop","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","useResolveTriggerType","x","y","strategy","refs","middlewareData","useFloating","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","debounce","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","getActiveElementByAnotherElement","contains","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","useGlobalOnClickOutside","useIsomorphicLayoutEffect","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","isHTMLElement","win","getWindow","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","convertFloatingDataToReactCSSProperties","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
|
|
|
3
3
|
import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_properties";
|
|
4
4
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
5
|
import * as React from 'react';
|
|
6
|
-
import { classNames, hasReactNode
|
|
6
|
+
import { classNames, hasReactNode } from '@vkontakte/vkjs';
|
|
7
7
|
import { useAdaptivity } from '../../hooks/useAdaptivity';
|
|
8
8
|
import { usePlatform } from '../../hooks/usePlatform';
|
|
9
9
|
import { Spinner } from '../Spinner/Spinner';
|
|
@@ -40,7 +40,7 @@ const sizeYClassNames = {
|
|
|
40
40
|
/**
|
|
41
41
|
* @see https://vkcom.github.io/VKUI/#/Button
|
|
42
42
|
*/ export const Button = (_param)=>{
|
|
43
|
-
var { size = 's', mode = 'primary', appearance = 'accent', stretched = false, align = 'center', children, before, after, getRootRef, loading, onClick
|
|
43
|
+
var { size = 's', mode = 'primary', appearance = 'accent', stretched = false, align = 'center', children, before, after, getRootRef, loading, onClick, className, disableSpinnerAnimation, rounded } = _param, restProps = _object_without_properties(_param, [
|
|
44
44
|
"size",
|
|
45
45
|
"mode",
|
|
46
46
|
"appearance",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { HasAlign } from '../../types';\nimport { Spinner } from '../Spinner/Spinner';\nimport { Tappable, TappableProps } from '../Tappable/Tappable';\nimport '../Spinner/Spinner.module.css';\nimport styles from './Button.module.css';\n\nconst stylesSize = {\n s: styles['Button--size-s'],\n m: styles['Button--size-m'],\n l: styles['Button--size-l'],\n};\n\nconst stylesMode = {\n primary: styles['Button--mode-primary'],\n secondary: styles['Button--mode-secondary'],\n tertiary: styles['Button--mode-tertiary'],\n outline: styles['Button--mode-outline'],\n link: styles['Button--mode-link'],\n};\n\nconst stylesAppearance = {\n 'accent': styles['Button--appearance-accent'],\n 'positive': styles['Button--appearance-positive'],\n 'negative': styles['Button--appearance-negative'],\n 'neutral': styles['Button--appearance-neutral'],\n 'overlay': styles['Button--appearance-overlay'],\n 'accent-invariable': styles['Button--appearance-accent-invariable'],\n};\n\nconst stylesAlign = {\n left: styles['Button--align-left'],\n center: styles['Button--align-center'],\n right: styles['Button--align-right'],\n};\n\nconst sizeYClassNames = {\n none: styles['Button--sizeY-none'],\n ['regular']: styles['Button--sizeY-regular'],\n};\n\nexport interface VKUIButtonProps extends HasAlign {\n mode?: 'primary' | 'secondary' | 'tertiary' | 'outline' | 'link';\n appearance?: 'accent' | 'positive' | 'negative' | 'neutral' | 'overlay' | 'accent-invariable';\n size?: 's' | 'm' | 'l';\n stretched?: boolean;\n before?: React.ReactNode;\n after?: React.ReactNode;\n loading?: boolean;\n disableSpinnerAnimation?: boolean;\n rounded?: boolean;\n}\n\nexport interface ButtonProps extends Omit<TappableProps, 'size'>, VKUIButtonProps {}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Button\n */\nexport const Button = ({\n size = 's',\n mode = 'primary',\n appearance = 'accent',\n stretched = false,\n align = 'center',\n children,\n before,\n after,\n getRootRef,\n loading,\n onClick,\n className,\n disableSpinnerAnimation,\n rounded,\n ...restProps\n}: ButtonProps): React.ReactNode => {\n const hasIcons = Boolean(before || after);\n const hasIconOnly = !children && Boolean(after) !== Boolean(before);\n const { sizeY = 'none' } = useAdaptivity();\n const platform = usePlatform();\n\n return (\n <Tappable\n hoverMode={styles['Button--hover']}\n activeMode={styles['Button--active']}\n Component={restProps.href ? 'a' : 'button'}\n focusVisibleMode=\"outside\"\n {...restProps}\n onClick={loading ? undefined : onClick}\n className={classNames(\n className,\n styles.Button,\n stylesSize[size],\n stylesMode[mode],\n stylesAppearance[appearance],\n stylesAlign[align],\n sizeY !== 'compact' && sizeYClassNames[sizeY],\n platform === 'ios' && styles['Button--ios'],\n stretched && styles['Button--stretched'],\n hasIcons && styles['Button--with-icon'],\n hasIconOnly && !stretched && styles['Button--singleIcon'],\n loading && styles['Button--loading'],\n rounded && styles['Button--rounded'],\n )}\n getRootRef={getRootRef}\n >\n {loading && (\n <Spinner\n size=\"small\"\n className={styles.Button__spinner}\n disableAnimation={disableSpinnerAnimation}\n />\n )}\n <span className={styles.Button__in}>\n {hasReactNode(before) && (\n <span\n className={styles.Button__before}\n role=\"presentation\"\n data-testid={process.env.NODE_ENV === 'test' ? 'before' : undefined}\n >\n {before}\n </span>\n )}\n {hasReactNode(children) && (\n <span\n className={styles.Button__content}\n data-testid={process.env.NODE_ENV === 'test' ? 'children' : undefined}\n >\n {children}\n </span>\n )}\n {hasReactNode(after) && (\n <span\n className={styles.Button__after}\n role=\"presentation\"\n data-testid={process.env.NODE_ENV === 'test' ? 'after' : undefined}\n >\n {after}\n </span>\n )}\n </span>\n </Tappable>\n );\n};\n"],"names":["React","classNames","hasReactNode","useAdaptivity","usePlatform","Spinner","Tappable","stylesSize","s","m","l","stylesMode","primary","secondary","tertiary","outline","link","stylesAppearance","stylesAlign","left","center","right","sizeYClassNames","none","Button","size","mode","appearance","stretched","align","children","before","after","getRootRef","loading","onClick","className","disableSpinnerAnimation","rounded","restProps","hasIcons","Boolean","hasIconOnly","sizeY","platform","hoverMode","activeMode","Component","href","focusVisibleMode","undefined","disableAnimation","span","role","data-testid","process","env","NODE_ENV"],"mappings":";;;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AAEtD,SAASC,OAAO,QAAQ,qBAAqB;AAC7C,SAASC,QAAQ,QAAuB,uBAAuB;AAI/D,MAAMC,aAAa;IACjBC,CAAC;IACDC,CAAC;IACDC,CAAC;AACH;AAEA,MAAMC,aAAa;IACjBC,OAAO;IACPC,SAAS;IACTC,QAAQ;IACRC,OAAO;IACPC,IAAI;AACN;AAEA,MAAMC,mBAAmB;IACvB,QAAQ;IACR,UAAU;IACV,UAAU;IACV,SAAS;IACT,SAAS;IACT,mBAAmB;AACrB;AAEA,MAAMC,cAAc;IAClBC,IAAI;IACJC,MAAM;IACNC,KAAK;AACP;AAEA,MAAMC,kBAAkB;IACtBC,IAAI;IACJ,CAAC,UAAU;AACb;AAgBA;;CAEC,GACD,OAAO,MAAMC,SAAS;QAAC,EACrBC,OAAO,GAAG,EACVC,OAAO,SAAS,EAChBC,aAAa,QAAQ,EACrBC,YAAY,KAAK,EACjBC,QAAQ,QAAQ,EAChBC,QAAQ,EACRC,MAAM,EACNC,KAAK,EACLC,UAAU,EACVC,OAAO,EACPC,OAAO,EACPC,SAAS,EACTC,uBAAuB,EACvBC,OAAO,EAEK,WADTC;QAdHd;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,MAAME,WAAWC,QAAQV,UAAUC;IACnC,MAAMU,cAAc,CAACZ,YAAYW,QAAQT,WAAWS,QAAQV;IAC5D,MAAM,EAAEY,QAAQ,MAAM,EAAE,GAAGxC;IAC3B,MAAMyC,WAAWxC;IAEjB,qBACE,MAACE;QACCuC,SAAS;QACTC,UAAU;QACVC,WAAWR,UAAUS,IAAI,GAAG,MAAM;QAClCC,kBAAiB;OACbV;QACJJ,SAASD,UAAUgB,YAAYf;QAC/BC,WAAWnC,WACTmC,yBAEA7B,UAAU,CAACkB,KAAK,EAChBd,UAAU,CAACe,KAAK,EAChBT,gBAAgB,CAACU,WAAW,EAC5BT,WAAW,CAACW,MAAM,EAClBc,UAAU,aAAarB,eAAe,CAACqB,MAAM,EAC7CC,aAAa,4BACbhB,sCACAY,qCACAE,eAAe,CAACd,uCAChBM,kCACAI;QAEFL,YAAYA;;YAEXC,yBACC,KAAC7B;gBACCoB,MAAK;gBACLW,SAAS;gBACTe,kBAAkBd;;0BAGtB,MAACe;gBAAKhB,SAAS;;oBACZlC,aAAa6B,yBACZ,KAACqB;wBACChB,SAAS;wBACTiB,MAAK;wBACLC,eAAaC,QAAQC,GAAG,CAACC,QAAQ,KAAK,SAAS,WAAWP;kCAEzDnB;;oBAGJ7B,aAAa4B,2BACZ,KAACsB;wBACChB,SAAS;wBACTkB,eAAaC,QAAQC,GAAG,CAACC,QAAQ,KAAK,SAAS,aAAaP;kCAE3DpB;;oBAGJ5B,aAAa8B,wBACZ,KAACoB;wBACChB,SAAS;wBACTiB,MAAK;wBACLC,eAAaC,QAAQC,GAAG,CAACC,QAAQ,KAAK,SAAS,UAAUP;kCAExDlB;;;;;;AAMb,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cell.d.ts","sourceRoot":"","sources":["../../../src/components/Cell/Cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAG3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAa,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAc,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAK9E,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EACzC,cAAc,EACd,UAAU,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5D;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;IACvC,QAAQ,EAAE,OAAO,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Cell.d.ts","sourceRoot":"","sources":["../../../src/components/Cell/Cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAG3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAa,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAc,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAK9E,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EACzC,cAAc,EACd,UAAU,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5D;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;IACvC,QAAQ,EAAE,OAAO,YAAY,CAAC;CAsI/B,CAAC"}
|