@vkontakte/vkui 5.6.2 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/ActionSheet/ActionSheet.d.ts +4 -4
- package/dist/cjs/components/ActionSheet/ActionSheet.js +14 -4
- package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cjs/components/ActionSheet/ActionSheetDropdown.d.ts +1 -1
- package/dist/cjs/components/ActionSheet/ActionSheetDropdown.js.map +1 -1
- package/dist/cjs/components/ActionSheet/ActionSheetDropdownDesktop.d.ts +1 -1
- package/dist/cjs/components/ActionSheet/ActionSheetDropdownDesktop.js +5 -3
- package/dist/cjs/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
- package/dist/cjs/components/ActionSheet/types.d.ts +9 -0
- package/dist/cjs/components/ActionSheet/types.js.map +1 -1
- package/dist/cjs/components/Alert/Alert.d.ts +8 -3
- package/dist/cjs/components/Alert/Alert.js +16 -96
- package/dist/cjs/components/Alert/Alert.js.map +1 -1
- package/dist/cjs/components/Alert/AlertAction.d.ts +8 -0
- package/dist/cjs/components/Alert/AlertAction.js +52 -0
- package/dist/cjs/components/Alert/AlertAction.js.map +1 -0
- package/dist/cjs/components/Alert/AlertActions.d.ts +8 -0
- package/dist/cjs/components/Alert/AlertActions.js +54 -0
- package/dist/cjs/components/Alert/AlertActions.js.map +1 -0
- package/dist/cjs/components/Alert/AlertTypography.d.ts +8 -0
- package/dist/cjs/components/Alert/AlertTypography.js +65 -0
- package/dist/cjs/components/Alert/AlertTypography.js.map +1 -0
- package/dist/cjs/components/NativeSelect/NativeSelect.js +3 -1
- package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js +1 -1
- package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/cjs/components/Popover/Popover.js +1 -1
- package/dist/cjs/components/Popover/Popover.js.map +1 -1
- package/dist/cjs/components/PopperArrow/PopperArrow.d.ts +1 -2
- package/dist/cjs/components/PopperArrow/PopperArrow.js.map +1 -1
- package/dist/cjs/components/Progress/Progress.d.ts +5 -1
- package/dist/cjs/components/Progress/Progress.js +18 -3
- package/dist/cjs/components/Progress/Progress.js.map +1 -1
- package/dist/cjs/components/Root/Root.js +4 -4
- package/dist/cjs/components/Search/Search.d.ts +5 -1
- package/dist/cjs/components/Search/Search.js +10 -4
- package/dist/cjs/components/Search/Search.js.map +1 -1
- package/dist/cjs/components/Snackbar/Snackbar.d.ts +5 -1
- package/dist/cjs/components/Snackbar/Snackbar.js +8 -3
- package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/cjs/components/SubnavigationButton/SubnavigationButton.d.ts +2 -1
- package/dist/cjs/components/SubnavigationButton/SubnavigationButton.js +17 -10
- package/dist/cjs/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.d.ts +3 -37
- package/dist/cjs/components/Tooltip/Tooltip.js +14 -39
- package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/cjs/components/TooltipBase/TooltipBase.d.ts +49 -0
- package/dist/cjs/components/TooltipBase/TooltipBase.js +58 -0
- package/dist/cjs/components/TooltipBase/TooltipBase.js.map +1 -0
- package/dist/cjs/components/View/View.js +4 -4
- package/dist/cjs/components/View/ViewInfinite.js +4 -4
- package/dist/components/ActionSheet/ActionSheet.d.ts +4 -4
- package/dist/components/ActionSheet/ActionSheet.js +14 -4
- package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/components/ActionSheet/ActionSheetDropdown.d.ts +1 -1
- package/dist/components/ActionSheet/ActionSheetDropdown.js.map +1 -1
- package/dist/components/ActionSheet/ActionSheetDropdownDesktop.d.ts +1 -1
- package/dist/components/ActionSheet/ActionSheetDropdownDesktop.js +5 -3
- package/dist/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
- package/dist/components/ActionSheet/types.d.ts +9 -0
- package/dist/components/ActionSheet/types.js.map +1 -1
- package/dist/components/Alert/Alert.d.ts +8 -3
- package/dist/components/Alert/Alert.js +14 -94
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Alert/AlertAction.d.ts +8 -0
- package/dist/components/Alert/AlertAction.js +41 -0
- package/dist/components/Alert/AlertAction.js.map +1 -0
- package/dist/components/Alert/AlertActions.d.ts +8 -0
- package/dist/components/Alert/AlertActions.js +43 -0
- package/dist/components/Alert/AlertActions.js.map +1 -0
- package/dist/components/Alert/AlertTypography.d.ts +8 -0
- package/dist/components/Alert/AlertTypography.js +46 -0
- package/dist/components/Alert/AlertTypography.js.map +1 -0
- package/dist/components/NativeSelect/NativeSelect.js +3 -1
- package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.js +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/components/Popover/Popover.js +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/PopperArrow/PopperArrow.d.ts +1 -2
- package/dist/components/PopperArrow/PopperArrow.js.map +1 -1
- package/dist/components/Progress/Progress.d.ts +5 -1
- package/dist/components/Progress/Progress.js +18 -3
- package/dist/components/Progress/Progress.js.map +1 -1
- package/dist/components/Root/Root.js +4 -4
- package/dist/components/Search/Search.d.ts +5 -1
- package/dist/components/Search/Search.js +10 -4
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/Snackbar/Snackbar.d.ts +5 -1
- package/dist/components/Snackbar/Snackbar.js +8 -3
- package/dist/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/components/SubnavigationButton/SubnavigationButton.d.ts +2 -1
- package/dist/components/SubnavigationButton/SubnavigationButton.js +17 -10
- package/dist/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +3 -37
- package/dist/components/Tooltip/Tooltip.js +15 -40
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/TooltipBase/TooltipBase.d.ts +49 -0
- package/dist/components/TooltipBase/TooltipBase.js +51 -0
- package/dist/components/TooltipBase/TooltipBase.js.map +1 -0
- package/dist/components/View/View.js +4 -4
- package/dist/components/View/ViewInfinite.js +4 -4
- package/dist/components.css +10 -9
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +1490 -1085
- package/dist/cssm/components/ActionSheet/ActionSheet.d.ts +4 -4
- package/dist/cssm/components/ActionSheet/ActionSheet.js +12 -3
- package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.module.css +0 -1
- package/dist/cssm/components/ActionSheet/ActionSheetDropdown.d.ts +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheetDropdown.js.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheetDropdownDesktop.d.ts +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheetDropdownDesktop.js +3 -2
- package/dist/cssm/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
- package/dist/cssm/components/ActionSheet/types.d.ts +9 -0
- package/dist/cssm/components/ActionSheet/types.js.map +1 -1
- package/dist/cssm/components/Alert/Alert.d.ts +8 -3
- package/dist/cssm/components/Alert/Alert.js +11 -87
- package/dist/cssm/components/Alert/Alert.js.map +1 -1
- package/dist/cssm/components/Alert/Alert.module.css +36 -30
- package/dist/cssm/components/Alert/AlertAction.d.ts +8 -0
- package/dist/cssm/components/Alert/AlertAction.js +36 -0
- package/dist/cssm/components/Alert/AlertAction.js.map +1 -0
- package/dist/cssm/components/Alert/AlertActions.d.ts +8 -0
- package/dist/cssm/components/Alert/AlertActions.js +34 -0
- package/dist/cssm/components/Alert/AlertActions.js.map +1 -0
- package/dist/cssm/components/Alert/AlertTypography.d.ts +8 -0
- package/dist/cssm/components/Alert/AlertTypography.js +51 -0
- package/dist/cssm/components/Alert/AlertTypography.js.map +1 -0
- package/dist/cssm/components/Button/Button.module.css +1 -1
- package/dist/cssm/components/Link/Link.module.css +1 -0
- package/dist/cssm/components/NativeSelect/NativeSelect.js +3 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +1 -0
- package/dist/cssm/components/Popover/Popover.js +1 -1
- package/dist/cssm/components/Popover/Popover.js.map +1 -1
- package/dist/cssm/components/Popover/Popover.module.css +4 -0
- package/dist/cssm/components/PopperArrow/PopperArrow.d.ts +1 -2
- package/dist/cssm/components/PopperArrow/PopperArrow.js.map +1 -1
- package/dist/cssm/components/Progress/Progress.d.ts +5 -1
- package/dist/cssm/components/Progress/Progress.js +17 -1
- package/dist/cssm/components/Progress/Progress.js.map +1 -1
- package/dist/cssm/components/Search/Search.d.ts +5 -1
- package/dist/cssm/components/Search/Search.js +8 -3
- package/dist/cssm/components/Search/Search.js.map +1 -1
- package/dist/cssm/components/Search/Search.module.css +4 -1
- package/dist/cssm/components/Snackbar/Snackbar.d.ts +5 -1
- package/dist/cssm/components/Snackbar/Snackbar.js +6 -2
- package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.d.ts +2 -1
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js +16 -10
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.module.css +25 -4
- package/dist/cssm/components/Tooltip/Tooltip.d.ts +3 -37
- package/dist/cssm/components/Tooltip/Tooltip.js +13 -33
- package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/cssm/components/Tooltip/Tooltip.module.css +3 -53
- package/dist/cssm/components/TooltipBase/TooltipBase.d.ts +49 -0
- package/dist/cssm/components/TooltipBase/TooltipBase.js +37 -0
- package/dist/cssm/components/TooltipBase/TooltipBase.js.map +1 -0
- package/dist/cssm/components/TooltipBase/TooltipBase.module.css +57 -0
- package/dist/vkui.css +10 -9
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +1490 -1085
- package/package.json +1 -1
|
@@ -12,8 +12,12 @@ export interface SearchProps extends React.InputHTMLAttributes<HTMLInputElement>
|
|
|
12
12
|
defaultValue?: string;
|
|
13
13
|
iconAriaLabel?: string;
|
|
14
14
|
clearAriaLabel?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Удаляет отступы у компонента
|
|
17
|
+
*/
|
|
18
|
+
noPadding?: boolean;
|
|
15
19
|
}
|
|
16
20
|
/**
|
|
17
21
|
* @see https://vkcom.github.io/VKUI/#/Search
|
|
18
22
|
*/
|
|
19
|
-
export declare const Search: ({ before, className, defaultValue, placeholder, after, getRef, icon, onIconClick, style, autoComplete, onChange: onChangeProp, value: valueProp, iconAriaLabel, clearAriaLabel, ...inputProps }: SearchProps) => React.JSX.Element;
|
|
23
|
+
export declare const Search: ({ before, className, defaultValue, placeholder, after, getRef, icon, onIconClick, style, autoComplete, onChange: onChangeProp, value: valueProp, iconAriaLabel, clearAriaLabel, noPadding, ...inputProps }: SearchProps) => React.JSX.Element;
|
|
@@ -8,13 +8,14 @@ import { useExternRef } from '../../hooks/useExternRef';
|
|
|
8
8
|
import { usePlatform } from '../../hooks/usePlatform';
|
|
9
9
|
import { SizeType } from '../../lib/adaptivity';
|
|
10
10
|
import { Platform } from '../../lib/platform';
|
|
11
|
+
import { touchEnabled } from '../../lib/touch';
|
|
11
12
|
import { Button } from '../Button/Button';
|
|
12
13
|
import { IconButton } from '../IconButton/IconButton';
|
|
13
14
|
import { Headline } from '../Typography/Headline/Headline';
|
|
14
15
|
import styles from './Search.module.css';
|
|
15
16
|
/**
|
|
16
17
|
* @see https://vkcom.github.io/VKUI/#/Search
|
|
17
|
-
*/ export const Search = ({ before = /*#__PURE__*/ React.createElement(Icon16SearchOutline, null), className, defaultValue = '', placeholder = 'Поиск', after = 'Отмена', getRef, icon, onIconClick = noop, style, autoComplete = 'off', onChange: onChangeProp, value: valueProp, iconAriaLabel, clearAriaLabel = 'Очистить', ...inputProps })=>{
|
|
18
|
+
*/ export const Search = ({ before = /*#__PURE__*/ React.createElement(Icon16SearchOutline, null), className, defaultValue = '', placeholder = 'Поиск', after = 'Отмена', getRef, icon, onIconClick = noop, style, autoComplete = 'off', onChange: onChangeProp, value: valueProp, iconAriaLabel, clearAriaLabel = 'Очистить', noPadding, ...inputProps })=>{
|
|
18
19
|
const inputRef = useExternRef(getRef);
|
|
19
20
|
const { value: isFocused, setTrue: setFocusedTrue, setFalse: setFocusedFalse } = useBooleanState(false);
|
|
20
21
|
const [value, onChange] = useEnsuredControl({
|
|
@@ -49,11 +50,15 @@ import styles from './Search.module.css';
|
|
|
49
50
|
const onIconCancelClickStart = React.useCallback((e)=>{
|
|
50
51
|
e.originalEvent.preventDefault();
|
|
51
52
|
inputRef.current?.focus();
|
|
53
|
+
if (touchEnabled()) {
|
|
54
|
+
onCancel();
|
|
55
|
+
}
|
|
52
56
|
}, [
|
|
53
|
-
inputRef
|
|
57
|
+
inputRef,
|
|
58
|
+
onCancel
|
|
54
59
|
]);
|
|
55
60
|
return /*#__PURE__*/ React.createElement("div", {
|
|
56
|
-
className: classNames('vkuiInternalSearch', styles['Search'], sizeY === 'none' && styles['Search--sizeY-none'], sizeY === SizeType.COMPACT && styles['Search--sizeY-compact'], isFocused && styles['Search--focused'], value && styles['Search--has-value'], after && styles['Search--has-after'], icon && styles['Search--has-icon'], inputProps.disabled && styles['Search--disabled'], className),
|
|
61
|
+
className: classNames('vkuiInternalSearch', styles['Search'], sizeY === 'none' && styles['Search--sizeY-none'], sizeY === SizeType.COMPACT && styles['Search--sizeY-compact'], isFocused && styles['Search--focused'], value && styles['Search--has-value'], after && styles['Search--has-after'], icon && styles['Search--has-icon'], inputProps.disabled && styles['Search--disabled'], !noPadding && styles['Search--withPadding'], className),
|
|
57
62
|
style: style
|
|
58
63
|
}, /*#__PURE__*/ React.createElement("div", {
|
|
59
64
|
className: styles['Search__field']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Search/Search.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { VKUITouchEvent } from '../../lib/touch';\nimport { HasRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton } from '../IconButton/IconButton';\nimport { TouchEvent } from '../Touch/Touch';\nimport { Headline } from '../Typography/Headline/Headline';\nimport styles from './Search.module.css';\n\nexport interface SearchProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRef<HTMLInputElement> {\n /**\n * iOS only. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode;\n before?: React.ReactNode;\n icon?: React.ReactNode;\n onIconClick?: (e: VKUITouchEvent) => void;\n defaultValue?: string;\n iconAriaLabel?: string;\n clearAriaLabel?: string;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Search\n */\nexport const Search = ({\n before = <Icon16SearchOutline />,\n className,\n defaultValue = '',\n placeholder = 'Поиск',\n after = 'Отмена',\n getRef,\n icon,\n onIconClick = noop,\n style,\n autoComplete = 'off',\n onChange: onChangeProp,\n value: valueProp,\n iconAriaLabel,\n clearAriaLabel = 'Очистить',\n ...inputProps\n}: SearchProps) => {\n const inputRef = useExternRef(getRef);\n const {\n value: isFocused,\n setTrue: setFocusedTrue,\n setFalse: setFocusedFalse,\n } = useBooleanState(false);\n\n const [value, onChange] = useEnsuredControl({\n defaultValue,\n onChange: onChangeProp,\n value: valueProp,\n });\n const { sizeY = 'none' } = useAdaptivity();\n const platform = usePlatform();\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n inputProps.onFocus && inputProps.onFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n inputProps.onBlur && inputProps.onBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart = React.useCallback(\n (e: TouchEvent) => onIconClick(e.originalEvent),\n [onIconClick],\n );\n\n const onIconCancelClickStart = React.useCallback(\n (e: TouchEvent) => {\n e.originalEvent.preventDefault();\n inputRef.current?.focus();\n },\n [inputRef],\n );\n\n return (\n <div\n className={classNames(\n 'vkuiInternalSearch',\n styles['Search'],\n sizeY === 'none' && styles['Search--sizeY-none'],\n sizeY === SizeType.COMPACT && styles['Search--sizeY-compact'],\n isFocused && styles['Search--focused'],\n value && styles['Search--has-value'],\n after && styles['Search--has-after'],\n icon && styles['Search--has-icon'],\n inputProps.disabled && styles['Search--disabled'],\n className,\n )}\n style={style}\n >\n <div className={styles['Search__field']}>\n <label className={styles['Search__control']}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n {...inputProps}\n placeholder={placeholder}\n autoComplete={autoComplete}\n getRootRef={inputRef}\n className={styles['Search__input']}\n onFocus={onFocus}\n onBlur={onBlur}\n onChange={onChange}\n value={value}\n />\n </label>\n <div className={styles['Search__icons']}>\n {icon && (\n <IconButton\n hoverMode=\"opacity\"\n onStart={onIconClickStart}\n className={styles['Search__icon']}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n aria-label={iconAriaLabel}\n >\n {icon}\n </IconButton>\n )}\n {!!value && (\n <IconButton\n hoverMode=\"opacity\"\n onStart={onIconCancelClickStart}\n onClick={onCancel}\n className={styles['Search__icon']}\n aria-label={clearAriaLabel}\n >\n {platform === Platform.IOS ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n )}\n </div>\n </div>\n {platform === Platform.IOS && after && (\n <Button\n mode=\"tertiary\"\n size=\"m\"\n className={styles['Search__after']}\n focusVisibleMode=\"inside\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n <span className={styles['Search__afterText']}>{after}</span>\n </Button>\n )}\n </div>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","noop","useAdaptivity","useBooleanState","useEnsuredControl","useExternRef","usePlatform","SizeType","Platform","Button","IconButton","Headline","styles","Search","before","className","defaultValue","placeholder","after","getRef","icon","onIconClick","style","autoComplete","onChange","onChangeProp","value","valueProp","iconAriaLabel","clearAriaLabel","inputProps","inputRef","isFocused","setTrue","setFocusedTrue","setFalse","setFocusedFalse","sizeY","platform","onFocus","e","onBlur","onCancel","useCallback","nativeInputValueSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","originalEvent","onIconCancelClickStart","preventDefault","focus","div","COMPACT","disabled","label","Component","type","level","weight","getRootRef","hoverMode","onStart","aria-label","onClick","IOS","mode","size","focusVisibleMode","span"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,WAAW,EAAEC,mBAAmB,EAAEC,YAAY,QAAQ,mBAAmB;AAClF,SAASC,UAAU,EAAEC,IAAI,QAAQ,kBAAkB;AACnD,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,QAAQ,QAAQ,qBAAqB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Search/Search.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { touchEnabled, VKUITouchEvent } from '../../lib/touch';\nimport { HasRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton } from '../IconButton/IconButton';\nimport { TouchEvent } from '../Touch/Touch';\nimport { Headline } from '../Typography/Headline/Headline';\nimport styles from './Search.module.css';\n\nexport interface SearchProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRef<HTMLInputElement> {\n /**\n * iOS only. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode;\n before?: React.ReactNode;\n icon?: React.ReactNode;\n onIconClick?: (e: VKUITouchEvent) => void;\n defaultValue?: string;\n iconAriaLabel?: string;\n clearAriaLabel?: string;\n /**\n * Удаляет отступы у компонента\n */\n noPadding?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Search\n */\nexport const Search = ({\n before = <Icon16SearchOutline />,\n className,\n defaultValue = '',\n placeholder = 'Поиск',\n after = 'Отмена',\n getRef,\n icon,\n onIconClick = noop,\n style,\n autoComplete = 'off',\n onChange: onChangeProp,\n value: valueProp,\n iconAriaLabel,\n clearAriaLabel = 'Очистить',\n noPadding,\n ...inputProps\n}: SearchProps) => {\n const inputRef = useExternRef(getRef);\n const {\n value: isFocused,\n setTrue: setFocusedTrue,\n setFalse: setFocusedFalse,\n } = useBooleanState(false);\n\n const [value, onChange] = useEnsuredControl({\n defaultValue,\n onChange: onChangeProp,\n value: valueProp,\n });\n const { sizeY = 'none' } = useAdaptivity();\n const platform = usePlatform();\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n inputProps.onFocus && inputProps.onFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n inputProps.onBlur && inputProps.onBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart = React.useCallback(\n (e: TouchEvent) => onIconClick(e.originalEvent),\n [onIconClick],\n );\n\n const onIconCancelClickStart = React.useCallback(\n (e: TouchEvent) => {\n e.originalEvent.preventDefault();\n inputRef.current?.focus();\n if (touchEnabled()) {\n onCancel();\n }\n },\n [inputRef, onCancel],\n );\n\n return (\n <div\n className={classNames(\n 'vkuiInternalSearch',\n styles['Search'],\n sizeY === 'none' && styles['Search--sizeY-none'],\n sizeY === SizeType.COMPACT && styles['Search--sizeY-compact'],\n isFocused && styles['Search--focused'],\n value && styles['Search--has-value'],\n after && styles['Search--has-after'],\n icon && styles['Search--has-icon'],\n inputProps.disabled && styles['Search--disabled'],\n !noPadding && styles['Search--withPadding'],\n className,\n )}\n style={style}\n >\n <div className={styles['Search__field']}>\n <label className={styles['Search__control']}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n {...inputProps}\n placeholder={placeholder}\n autoComplete={autoComplete}\n getRootRef={inputRef}\n className={styles['Search__input']}\n onFocus={onFocus}\n onBlur={onBlur}\n onChange={onChange}\n value={value}\n />\n </label>\n <div className={styles['Search__icons']}>\n {icon && (\n <IconButton\n hoverMode=\"opacity\"\n onStart={onIconClickStart}\n className={styles['Search__icon']}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n aria-label={iconAriaLabel}\n >\n {icon}\n </IconButton>\n )}\n {!!value && (\n <IconButton\n hoverMode=\"opacity\"\n onStart={onIconCancelClickStart}\n onClick={onCancel}\n className={styles['Search__icon']}\n aria-label={clearAriaLabel}\n >\n {platform === Platform.IOS ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n )}\n </div>\n </div>\n {platform === Platform.IOS && after && (\n <Button\n mode=\"tertiary\"\n size=\"m\"\n className={styles['Search__after']}\n focusVisibleMode=\"inside\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n <span className={styles['Search__afterText']}>{after}</span>\n </Button>\n )}\n </div>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","noop","useAdaptivity","useBooleanState","useEnsuredControl","useExternRef","usePlatform","SizeType","Platform","touchEnabled","Button","IconButton","Headline","styles","Search","before","className","defaultValue","placeholder","after","getRef","icon","onIconClick","style","autoComplete","onChange","onChangeProp","value","valueProp","iconAriaLabel","clearAriaLabel","noPadding","inputProps","inputRef","isFocused","setTrue","setFocusedTrue","setFalse","setFocusedFalse","sizeY","platform","onFocus","e","onBlur","onCancel","useCallback","nativeInputValueSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","originalEvent","onIconCancelClickStart","preventDefault","focus","div","COMPACT","disabled","label","Component","type","level","weight","getRootRef","hoverMode","onStart","aria-label","onClick","IOS","mode","size","focusVisibleMode","span"],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
.Search {
|
|
2
2
|
display: flex;
|
|
3
3
|
overflow: hidden;
|
|
4
|
-
padding: 8px var(--vkui--size_base_padding_horizontal--regular);
|
|
5
4
|
-webkit-tap-highlight-color: transparent;
|
|
6
5
|
|
|
7
6
|
--vkui_internal--search_height: var(--vkui--size_search_height--regular);
|
|
8
7
|
}
|
|
9
8
|
|
|
9
|
+
.Search--withPadding {
|
|
10
|
+
padding: 8px var(--vkui--size_base_padding_horizontal--regular);
|
|
11
|
+
}
|
|
12
|
+
|
|
10
13
|
/*
|
|
11
14
|
sizeY-compact
|
|
12
15
|
*/
|
|
@@ -42,8 +42,12 @@ export interface SnackbarProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
42
42
|
* Не может использоваться одновременно с `action`
|
|
43
43
|
*/
|
|
44
44
|
subtitle?: React.ReactNode;
|
|
45
|
+
/**
|
|
46
|
+
* Величина отступа снизу. Используется для позиционирования элемента в случае, когда нежелательно, чтобы Snackbar при появлении перекрывал важные элементы интерфейса.
|
|
47
|
+
*/
|
|
48
|
+
offsetY?: React.CSSProperties['bottom'];
|
|
45
49
|
}
|
|
46
50
|
/**
|
|
47
51
|
* @see https://vkcom.github.io/VKUI/#/Snackbar
|
|
48
52
|
*/
|
|
49
|
-
export declare const Snackbar: ({ children, layout: layoutProps, action, before, after, duration, onActionClick, onClose, mode, className, subtitle, ...restProps }: SnackbarProps) => React.JSX.Element;
|
|
53
|
+
export declare const Snackbar: ({ children, layout: layoutProps, action, before, after, duration, onActionClick, onClose, mode, className, subtitle, offsetY, style, ...restProps }: SnackbarProps) => React.JSX.Element;
|
|
@@ -15,7 +15,7 @@ import { Subhead } from '../Typography/Subhead/Subhead';
|
|
|
15
15
|
import styles from './Snackbar.module.css';
|
|
16
16
|
/**
|
|
17
17
|
* @see https://vkcom.github.io/VKUI/#/Snackbar
|
|
18
|
-
*/ export const Snackbar = ({ children, layout: layoutProps = 'horizontal', action, before, after, duration = 4000, onActionClick, onClose, mode = 'default', className, subtitle, ...restProps })=>{
|
|
18
|
+
*/ export const Snackbar = ({ children, layout: layoutProps = 'horizontal', action, before, after, duration = 4000, onActionClick, onClose, mode = 'default', className, subtitle, offsetY, style, ...restProps })=>{
|
|
19
19
|
const platform = usePlatform();
|
|
20
20
|
const { viewWidth } = useAdaptivityWithJSMediaQueries();
|
|
21
21
|
const isDesktop = viewWidth >= ViewWidth.SMALL_TABLET;
|
|
@@ -101,7 +101,11 @@ import styles from './Snackbar.module.css';
|
|
|
101
101
|
className: classNames(styles['Snackbar'], platform === Platform.IOS && styles['Snackbar--ios'], {
|
|
102
102
|
vertical: styles['Snackbar--layout-vertical'],
|
|
103
103
|
horizontal: styles['Snackbar--layout-horizontal']
|
|
104
|
-
}[layout], mode === 'dark' && styles['Snackbar--mode-dark'], closing && styles['Snackbar--closing'], touched && styles['Snackbar--touched'], isDesktop && styles['Snackbar--desktop'], className)
|
|
104
|
+
}[layout], mode === 'dark' && styles['Snackbar--mode-dark'], closing && styles['Snackbar--closing'], touched && styles['Snackbar--touched'], isDesktop && styles['Snackbar--desktop'], className),
|
|
105
|
+
style: offsetY ? {
|
|
106
|
+
...style,
|
|
107
|
+
bottom: offsetY
|
|
108
|
+
} : style
|
|
105
109
|
}, /*#__PURE__*/ React.createElement(Touch, {
|
|
106
110
|
className: styles['Snackbar__in'],
|
|
107
111
|
getRootRef: innerElRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Snackbar/Snackbar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { useWaitTransitionFinish } from '../../hooks/useWaitTransitionFinish';\nimport { ViewWidth } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { rubber } from '../../lib/touch';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { Button } from '../Button/Button';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './Snackbar.module.css';\n\nexport interface SnackbarProps extends React.HTMLAttributes<HTMLElement> {\n /**\n * Название кнопки действия в уведомлении\n * Не может использоваться одновременно с `subtitle`\n */\n action?: React.ReactNode;\n\n /**\n * Будет вызвано при клике на кнопку действия\n */\n onActionClick?: (e: React.MouseEvent) => void;\n\n /**\n * Может быть следующими компонентами:\n * - цветная иконка 24x24 или 28x28 пикселя\n * - `<Avatar size={32} />`\n * - `<Image size={40} />`\n */\n before?: React.ReactNode;\n /**\n * Контент в правой части, может быть иконкой 24x24\n */\n after?: React.ReactNode;\n /**\n * Варианты расположения кнопки действия\n * Игнорируется на десктопах и при наличии элементов `after` или `subtitle`\n */\n layout?: 'vertical' | 'horizontal';\n /**\n * Время в миллисекундах, через которое плашка скроется\n */\n duration?: number;\n /**\n * Обработчик закрытия уведомления\n */\n onClose: () => void;\n /**\n * Задает стиль снекбара\n */\n mode?: 'default' | 'dark';\n /**\n * Дополнительная строка текста под `children`.\n * Не может использоваться одновременно с `action`\n */\n subtitle?: React.ReactNode;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Snackbar\n */\nexport const Snackbar = ({\n children,\n layout: layoutProps = 'horizontal',\n action,\n before,\n after,\n duration = 4000,\n onActionClick,\n onClose,\n mode = 'default',\n className,\n subtitle,\n ...restProps\n}: SnackbarProps) => {\n const platform = usePlatform();\n const { viewWidth } = useAdaptivityWithJSMediaQueries();\n const isDesktop = viewWidth >= ViewWidth.SMALL_TABLET;\n const { waitTransitionFinish } = useWaitTransitionFinish();\n\n const [closing, setClosing] = React.useState(false);\n const [touched, setTouched] = React.useState(false);\n\n const shiftXPercentRef = React.useRef<number>(0);\n const shiftXCurrentRef = React.useRef<number>(0);\n\n const bodyElRef = React.useRef<HTMLDivElement | null>(null);\n const innerElRef = React.useRef<HTMLDivElement | null>(null);\n\n const animationFrameRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n\n const transitionFinishDurationFallback = platform === Platform.IOS ? 320 : 400;\n\n const close = () => {\n setClosing(true);\n waitTransitionFinish(\n innerElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n };\n\n const handleActionClick: React.MouseEventHandler<HTMLElement> = (e) => {\n close();\n\n if (action && typeof onActionClick === 'function') {\n onActionClick(e);\n }\n };\n\n const closeTimeout = useTimeout(close, duration);\n\n const setBodyTransform = (percent: number) => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n animationFrameRef.current = requestAnimationFrame(() => {\n if (bodyElRef.current) {\n bodyElRef.current.style.transform = `translate3d(${percent}%, 0, 0)`;\n }\n });\n };\n\n const onTouchStart = closeTimeout.clear;\n\n const onTouchMoveX = (event: TouchEvent) => {\n const { shiftX, originalEvent } = event;\n originalEvent.preventDefault();\n\n if (!touched) {\n setTouched(true);\n }\n\n shiftXPercentRef.current = (shiftX / (bodyElRef.current?.offsetWidth ?? 0)) * 100;\n shiftXCurrentRef.current = rubber(shiftXPercentRef.current, 72, 1.2, platform !== Platform.IOS);\n\n setBodyTransform(shiftXCurrentRef.current);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n let callback: VoidFunction | undefined;\n\n if (touched) {\n let shiftXCurrent = shiftXCurrentRef.current;\n const expectTranslateY = (shiftXCurrent / e.duration) * 240 * 0.6;\n shiftXCurrent = shiftXCurrent + expectTranslateY;\n\n if (isDesktop && shiftXCurrent <= -50) {\n closeTimeout.clear();\n waitTransitionFinish(\n bodyElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n setBodyTransform(-120);\n } else if (!isDesktop && shiftXCurrent >= 50) {\n closeTimeout.clear();\n waitTransitionFinish(\n bodyElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n setBodyTransform(120);\n } else {\n callback = () => {\n closeTimeout.set();\n setBodyTransform(0);\n };\n }\n } else {\n closeTimeout.set();\n }\n\n setTouched(false);\n callback && requestAnimationFrame(callback);\n };\n\n React.useEffect(() => closeTimeout.set(), [closeTimeout]);\n\n const layout = after || isDesktop || subtitle ? 'vertical' : layoutProps;\n\n return (\n <AppRootPortal>\n <div\n {...restProps}\n className={classNames(\n styles['Snackbar'],\n platform === Platform.IOS && styles['Snackbar--ios'],\n {\n vertical: styles['Snackbar--layout-vertical'],\n horizontal: styles['Snackbar--layout-horizontal'],\n }[layout],\n mode === 'dark' && styles['Snackbar--mode-dark'],\n closing && styles['Snackbar--closing'],\n touched && styles['Snackbar--touched'],\n isDesktop && styles['Snackbar--desktop'],\n className,\n )}\n >\n <Touch\n className={styles['Snackbar__in']}\n getRootRef={innerElRef}\n onStart={onTouchStart}\n onMoveX={onTouchMoveX}\n onEnd={onTouchEnd}\n >\n <div className={styles['Snackbar__body']} ref={bodyElRef}>\n {before && <div className={styles['Snackbar__before']}>{before}</div>}\n\n <div className={styles['Snackbar__content']}>\n <Paragraph className={styles['Snackbar__content-text']}>{children}</Paragraph>\n {subtitle && !action && (\n <Subhead className={styles['Snackbar__content-subtitle']}>{subtitle}</Subhead>\n )}\n\n {action && !subtitle && (\n <Button\n align=\"left\"\n mode=\"link\"\n appearance={mode === 'dark' ? 'overlay' : 'accent'}\n size=\"s\"\n className={styles['Snackbar__action']}\n onClick={handleActionClick}\n >\n {action}\n </Button>\n )}\n </div>\n\n {after && <div className={styles['Snackbar__after']}>{after}</div>}\n </div>\n </Touch>\n </div>\n </AppRootPortal>\n );\n};\n"],"names":["React","classNames","useAdaptivityWithJSMediaQueries","usePlatform","useTimeout","useWaitTransitionFinish","ViewWidth","Platform","rubber","AppRootPortal","Button","Touch","Paragraph","Subhead","styles","Snackbar","children","layout","layoutProps","action","before","after","duration","onActionClick","onClose","mode","className","subtitle","restProps","platform","viewWidth","isDesktop","SMALL_TABLET","waitTransitionFinish","closing","setClosing","useState","touched","setTouched","shiftXPercentRef","useRef","shiftXCurrentRef","bodyElRef","innerElRef","animationFrameRef","transitionFinishDurationFallback","IOS","close","current","handleActionClick","e","closeTimeout","setBodyTransform","percent","cancelAnimationFrame","requestAnimationFrame","style","transform","onTouchStart","clear","onTouchMoveX","event","shiftX","originalEvent","preventDefault","offsetWidth","onTouchEnd","callback","shiftXCurrent","expectTranslateY","set","useEffect","div","vertical","horizontal","getRootRef","onStart","onMoveX","onEnd","ref","align","appearance","size","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Snackbar/Snackbar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { useWaitTransitionFinish } from '../../hooks/useWaitTransitionFinish';\nimport { ViewWidth } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { rubber } from '../../lib/touch';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { Button } from '../Button/Button';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './Snackbar.module.css';\n\nexport interface SnackbarProps extends React.HTMLAttributes<HTMLElement> {\n /**\n * Название кнопки действия в уведомлении\n * Не может использоваться одновременно с `subtitle`\n */\n action?: React.ReactNode;\n\n /**\n * Будет вызвано при клике на кнопку действия\n */\n onActionClick?: (e: React.MouseEvent) => void;\n\n /**\n * Может быть следующими компонентами:\n * - цветная иконка 24x24 или 28x28 пикселя\n * - `<Avatar size={32} />`\n * - `<Image size={40} />`\n */\n before?: React.ReactNode;\n /**\n * Контент в правой части, может быть иконкой 24x24\n */\n after?: React.ReactNode;\n /**\n * Варианты расположения кнопки действия\n * Игнорируется на десктопах и при наличии элементов `after` или `subtitle`\n */\n layout?: 'vertical' | 'horizontal';\n /**\n * Время в миллисекундах, через которое плашка скроется\n */\n duration?: number;\n /**\n * Обработчик закрытия уведомления\n */\n onClose: () => void;\n /**\n * Задает стиль снекбара\n */\n mode?: 'default' | 'dark';\n /**\n * Дополнительная строка текста под `children`.\n * Не может использоваться одновременно с `action`\n */\n subtitle?: React.ReactNode;\n /**\n * Величина отступа снизу. Используется для позиционирования элемента в случае, когда нежелательно, чтобы Snackbar при появлении перекрывал важные элементы интерфейса.\n */\n offsetY?: React.CSSProperties['bottom'];\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Snackbar\n */\nexport const Snackbar = ({\n children,\n layout: layoutProps = 'horizontal',\n action,\n before,\n after,\n duration = 4000,\n onActionClick,\n onClose,\n mode = 'default',\n className,\n subtitle,\n offsetY,\n style,\n ...restProps\n}: SnackbarProps) => {\n const platform = usePlatform();\n const { viewWidth } = useAdaptivityWithJSMediaQueries();\n const isDesktop = viewWidth >= ViewWidth.SMALL_TABLET;\n const { waitTransitionFinish } = useWaitTransitionFinish();\n\n const [closing, setClosing] = React.useState(false);\n const [touched, setTouched] = React.useState(false);\n\n const shiftXPercentRef = React.useRef<number>(0);\n const shiftXCurrentRef = React.useRef<number>(0);\n\n const bodyElRef = React.useRef<HTMLDivElement | null>(null);\n const innerElRef = React.useRef<HTMLDivElement | null>(null);\n\n const animationFrameRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n\n const transitionFinishDurationFallback = platform === Platform.IOS ? 320 : 400;\n\n const close = () => {\n setClosing(true);\n waitTransitionFinish(\n innerElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n };\n\n const handleActionClick: React.MouseEventHandler<HTMLElement> = (e) => {\n close();\n\n if (action && typeof onActionClick === 'function') {\n onActionClick(e);\n }\n };\n\n const closeTimeout = useTimeout(close, duration);\n\n const setBodyTransform = (percent: number) => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n animationFrameRef.current = requestAnimationFrame(() => {\n if (bodyElRef.current) {\n bodyElRef.current.style.transform = `translate3d(${percent}%, 0, 0)`;\n }\n });\n };\n\n const onTouchStart = closeTimeout.clear;\n\n const onTouchMoveX = (event: TouchEvent) => {\n const { shiftX, originalEvent } = event;\n originalEvent.preventDefault();\n\n if (!touched) {\n setTouched(true);\n }\n\n shiftXPercentRef.current = (shiftX / (bodyElRef.current?.offsetWidth ?? 0)) * 100;\n shiftXCurrentRef.current = rubber(shiftXPercentRef.current, 72, 1.2, platform !== Platform.IOS);\n\n setBodyTransform(shiftXCurrentRef.current);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n let callback: VoidFunction | undefined;\n\n if (touched) {\n let shiftXCurrent = shiftXCurrentRef.current;\n const expectTranslateY = (shiftXCurrent / e.duration) * 240 * 0.6;\n shiftXCurrent = shiftXCurrent + expectTranslateY;\n\n if (isDesktop && shiftXCurrent <= -50) {\n closeTimeout.clear();\n waitTransitionFinish(\n bodyElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n setBodyTransform(-120);\n } else if (!isDesktop && shiftXCurrent >= 50) {\n closeTimeout.clear();\n waitTransitionFinish(\n bodyElRef.current,\n () => {\n onClose();\n },\n transitionFinishDurationFallback,\n );\n setBodyTransform(120);\n } else {\n callback = () => {\n closeTimeout.set();\n setBodyTransform(0);\n };\n }\n } else {\n closeTimeout.set();\n }\n\n setTouched(false);\n callback && requestAnimationFrame(callback);\n };\n\n React.useEffect(() => closeTimeout.set(), [closeTimeout]);\n\n const layout = after || isDesktop || subtitle ? 'vertical' : layoutProps;\n\n return (\n <AppRootPortal>\n <div\n {...restProps}\n className={classNames(\n styles['Snackbar'],\n platform === Platform.IOS && styles['Snackbar--ios'],\n {\n vertical: styles['Snackbar--layout-vertical'],\n horizontal: styles['Snackbar--layout-horizontal'],\n }[layout],\n mode === 'dark' && styles['Snackbar--mode-dark'],\n closing && styles['Snackbar--closing'],\n touched && styles['Snackbar--touched'],\n isDesktop && styles['Snackbar--desktop'],\n className,\n )}\n style={offsetY ? { ...style, bottom: offsetY } : style}\n >\n <Touch\n className={styles['Snackbar__in']}\n getRootRef={innerElRef}\n onStart={onTouchStart}\n onMoveX={onTouchMoveX}\n onEnd={onTouchEnd}\n >\n <div className={styles['Snackbar__body']} ref={bodyElRef}>\n {before && <div className={styles['Snackbar__before']}>{before}</div>}\n\n <div className={styles['Snackbar__content']}>\n <Paragraph className={styles['Snackbar__content-text']}>{children}</Paragraph>\n {subtitle && !action && (\n <Subhead className={styles['Snackbar__content-subtitle']}>{subtitle}</Subhead>\n )}\n\n {action && !subtitle && (\n <Button\n align=\"left\"\n mode=\"link\"\n appearance={mode === 'dark' ? 'overlay' : 'accent'}\n size=\"s\"\n className={styles['Snackbar__action']}\n onClick={handleActionClick}\n >\n {action}\n </Button>\n )}\n </div>\n\n {after && <div className={styles['Snackbar__after']}>{after}</div>}\n </div>\n </Touch>\n </div>\n </AppRootPortal>\n );\n};\n"],"names":["React","classNames","useAdaptivityWithJSMediaQueries","usePlatform","useTimeout","useWaitTransitionFinish","ViewWidth","Platform","rubber","AppRootPortal","Button","Touch","Paragraph","Subhead","styles","Snackbar","children","layout","layoutProps","action","before","after","duration","onActionClick","onClose","mode","className","subtitle","offsetY","style","restProps","platform","viewWidth","isDesktop","SMALL_TABLET","waitTransitionFinish","closing","setClosing","useState","touched","setTouched","shiftXPercentRef","useRef","shiftXCurrentRef","bodyElRef","innerElRef","animationFrameRef","transitionFinishDurationFallback","IOS","close","current","handleActionClick","e","closeTimeout","setBodyTransform","percent","cancelAnimationFrame","requestAnimationFrame","transform","onTouchStart","clear","onTouchMoveX","event","shiftX","originalEvent","preventDefault","offsetWidth","onTouchEnd","callback","shiftXCurrent","expectTranslateY","set","useEffect","div","vertical","horizontal","bottom","getRootRef","onStart","onMoveX","onEnd","ref","align","appearance","size","onClick"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { TappableProps } from '../Tappable/Tappable';
|
|
3
3
|
export interface SubnavigationButtonProps extends Omit<TappableProps, 'size'> {
|
|
4
4
|
mode?: 'primary' | 'outline' | 'tertiary';
|
|
5
|
+
appearance?: 'accent' | 'neutral';
|
|
5
6
|
size?: 's' | 'm' | 'l';
|
|
6
7
|
selected?: boolean;
|
|
7
8
|
/**
|
|
@@ -21,4 +22,4 @@ export interface SubnavigationButtonProps extends Omit<TappableProps, 'size'> {
|
|
|
21
22
|
/**
|
|
22
23
|
* @see https://vkcom.github.io/VKUI/#/SubnavigationButton
|
|
23
24
|
*/
|
|
24
|
-
export declare const SubnavigationButton: ({ mode, size, selected, textLevel, before, after, expandable, children, className, ...restProps }: SubnavigationButtonProps) => React.JSX.Element;
|
|
25
|
+
export declare const SubnavigationButton: ({ mode, appearance, size, selected, textLevel, before, after, expandable, children, className, ...restProps }: SubnavigationButtonProps) => React.JSX.Element;
|
|
@@ -7,6 +7,20 @@ import { Tappable } from '../Tappable/Tappable';
|
|
|
7
7
|
import { Caption } from '../Typography/Caption/Caption';
|
|
8
8
|
import { Subhead } from '../Typography/Subhead/Subhead';
|
|
9
9
|
import styles from './SubnavigationButton.module.css';
|
|
10
|
+
const appearanceStyles = {
|
|
11
|
+
accent: styles['SubnavigationButton--appearance-accent'],
|
|
12
|
+
neutral: styles['SubnavigationButton--appearance-neutral']
|
|
13
|
+
};
|
|
14
|
+
const modeStyles = {
|
|
15
|
+
primary: styles['SubnavigationButton--mode-primary'],
|
|
16
|
+
outline: styles['SubnavigationButton--mode-outline'],
|
|
17
|
+
tertiary: styles['SubnavigationButton--mode-tertiary']
|
|
18
|
+
};
|
|
19
|
+
const sizeStyles = {
|
|
20
|
+
s: styles['SubnavigationButton--size-s'],
|
|
21
|
+
m: styles['SubnavigationButton--size-m'],
|
|
22
|
+
l: styles['SubnavigationButton--size-l']
|
|
23
|
+
};
|
|
10
24
|
const sizeYClassNames = {
|
|
11
25
|
none: styles['SubnavigationButton--sizeY-none'],
|
|
12
26
|
[SizeType.COMPACT]: styles['SubnavigationButton--sizeY-compact']
|
|
@@ -22,21 +36,13 @@ const SubnavigationButtonTypography = ({ textLevel, ...restProps })=>{
|
|
|
22
36
|
};
|
|
23
37
|
/**
|
|
24
38
|
* @see https://vkcom.github.io/VKUI/#/SubnavigationButton
|
|
25
|
-
*/ export const SubnavigationButton = ({ mode = 'primary', size = 'm', selected, textLevel = '1', before, after, expandable, children, className, ...restProps })=>{
|
|
39
|
+
*/ export const SubnavigationButton = ({ mode = 'primary', appearance = 'accent', size = 'm', selected, textLevel = '1', before, after, expandable, children, className, ...restProps })=>{
|
|
26
40
|
const { sizeY = 'none' } = useAdaptivity();
|
|
27
41
|
return /*#__PURE__*/ React.createElement(Tappable, {
|
|
28
42
|
...restProps,
|
|
29
43
|
hasActive: false,
|
|
30
44
|
focusVisibleMode: "outside",
|
|
31
|
-
className: classNames(styles['SubnavigationButton'],
|
|
32
|
-
s: styles['SubnavigationButton--size-s'],
|
|
33
|
-
m: styles['SubnavigationButton--size-m'],
|
|
34
|
-
l: styles['SubnavigationButton--size-l']
|
|
35
|
-
}[size], {
|
|
36
|
-
primary: styles['SubnavigationButton--mode-primary'],
|
|
37
|
-
outline: styles['SubnavigationButton--mode-outline'],
|
|
38
|
-
tertiary: styles['SubnavigationButton--mode-tertiary']
|
|
39
|
-
}[mode], selected && styles['SubnavigationButton--selected'], sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY], className)
|
|
45
|
+
className: classNames(styles['SubnavigationButton'], sizeStyles[size], modeStyles[mode], appearanceStyles[appearance], selected && styles['SubnavigationButton--selected'], sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY], className)
|
|
40
46
|
}, /*#__PURE__*/ React.createElement("span", {
|
|
41
47
|
className: styles['SubnavigationButton__in']
|
|
42
48
|
}, before && /*#__PURE__*/ React.createElement("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/SubnavigationButton/SubnavigationButton.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Dropdown } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { HasChildren, HasComponent } from '../../types';\nimport { Tappable, TappableProps } from '../Tappable/Tappable';\nimport { Caption } from '../Typography/Caption/Caption';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './SubnavigationButton.module.css';\n\nconst sizeYClassNames = {\n none: styles['SubnavigationButton--sizeY-none'],\n [SizeType.COMPACT]: styles['SubnavigationButton--sizeY-compact'],\n};\n\nexport interface SubnavigationButtonProps extends Omit<TappableProps, 'size'> {\n mode?: 'primary' | 'outline' | 'tertiary';\n size?: 's' | 'm' | 'l';\n selected?: boolean;\n /**\n * Размер шрифта. Этим свойством рекомендуется пользоваться, чтобы отрегулировать размер шрифта у кнопок в `<SubnavigationBar mode=\"fixed\" />`\n */\n textLevel?: '1' | '2' | '3';\n /**\n * Рекомендуется использовать только иконки с размером 24\n */\n before?: React.ReactNode;\n /**\n * Рекомендуется использовать только `<Counter size=\"s\" />` или `<Badge />`\n */\n after?: React.ReactNode;\n expandable?: boolean;\n}\n\ntype SubnavigationButtonTypographyProps = Pick<\n SubnavigationButtonProps,\n 'textLevel' | 'className'\n> &\n HasComponent &\n HasChildren;\n\nconst SubnavigationButtonTypography = ({\n textLevel,\n ...restProps\n}: SubnavigationButtonTypographyProps) => {\n if (textLevel === '1') {\n return <Subhead {...restProps} />;\n }\n\n return <Caption level={textLevel === '2' ? '1' : '2'} {...restProps} />;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/SubnavigationButton\n */\nexport const SubnavigationButton = ({\n mode = 'primary',\n size = 'm',\n selected,\n textLevel = '1',\n before,\n after,\n expandable,\n children,\n className,\n ...restProps\n}: SubnavigationButtonProps) => {\n const { sizeY = 'none' } = useAdaptivity();\n\n return (\n <Tappable\n {...restProps}\n hasActive={false}\n focusVisibleMode=\"outside\"\n className={classNames(\n styles['SubnavigationButton'],\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/SubnavigationButton/SubnavigationButton.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Dropdown } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { HasChildren, HasComponent } from '../../types';\nimport { Tappable, TappableProps } from '../Tappable/Tappable';\nimport { Caption } from '../Typography/Caption/Caption';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './SubnavigationButton.module.css';\n\nconst appearanceStyles = {\n accent: styles['SubnavigationButton--appearance-accent'],\n neutral: styles['SubnavigationButton--appearance-neutral'],\n};\n\nconst modeStyles = {\n primary: styles['SubnavigationButton--mode-primary'],\n outline: styles['SubnavigationButton--mode-outline'],\n tertiary: styles['SubnavigationButton--mode-tertiary'],\n};\n\nconst sizeStyles = {\n s: styles['SubnavigationButton--size-s'],\n m: styles['SubnavigationButton--size-m'],\n l: styles['SubnavigationButton--size-l'],\n};\n\nconst sizeYClassNames = {\n none: styles['SubnavigationButton--sizeY-none'],\n [SizeType.COMPACT]: styles['SubnavigationButton--sizeY-compact'],\n};\n\nexport interface SubnavigationButtonProps extends Omit<TappableProps, 'size'> {\n mode?: 'primary' | 'outline' | 'tertiary';\n appearance?: 'accent' | 'neutral';\n size?: 's' | 'm' | 'l';\n selected?: boolean;\n /**\n * Размер шрифта. Этим свойством рекомендуется пользоваться, чтобы отрегулировать размер шрифта у кнопок в `<SubnavigationBar mode=\"fixed\" />`\n */\n textLevel?: '1' | '2' | '3';\n /**\n * Рекомендуется использовать только иконки с размером 24\n */\n before?: React.ReactNode;\n /**\n * Рекомендуется использовать только `<Counter size=\"s\" />` или `<Badge />`\n */\n after?: React.ReactNode;\n expandable?: boolean;\n}\n\ntype SubnavigationButtonTypographyProps = Pick<\n SubnavigationButtonProps,\n 'textLevel' | 'className'\n> &\n HasComponent &\n HasChildren;\n\nconst SubnavigationButtonTypography = ({\n textLevel,\n ...restProps\n}: SubnavigationButtonTypographyProps) => {\n if (textLevel === '1') {\n return <Subhead {...restProps} />;\n }\n\n return <Caption level={textLevel === '2' ? '1' : '2'} {...restProps} />;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/SubnavigationButton\n */\nexport const SubnavigationButton = ({\n mode = 'primary',\n appearance = 'accent',\n size = 'm',\n selected,\n textLevel = '1',\n before,\n after,\n expandable,\n children,\n className,\n ...restProps\n}: SubnavigationButtonProps) => {\n const { sizeY = 'none' } = useAdaptivity();\n\n return (\n <Tappable\n {...restProps}\n hasActive={false}\n focusVisibleMode=\"outside\"\n className={classNames(\n styles['SubnavigationButton'],\n sizeStyles[size],\n modeStyles[mode],\n appearanceStyles[appearance],\n selected && styles['SubnavigationButton--selected'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n >\n <span className={styles['SubnavigationButton__in']}>\n {before && <span className={styles['SubnavigationButton__before']}>{before}</span>}\n <SubnavigationButtonTypography\n textLevel={textLevel}\n className={styles['SubnavigationButton__label']}\n Component=\"span\"\n >\n {children}\n </SubnavigationButtonTypography>\n {after && <span className={styles['SubnavigationButton__after']}>{after}</span>}\n {expandable && <Icon16Dropdown className={styles['SubnavigationButton__expandableIcon']} />}\n </span>\n </Tappable>\n );\n};\n"],"names":["React","Icon16Dropdown","classNames","useAdaptivity","SizeType","Tappable","Caption","Subhead","styles","appearanceStyles","accent","neutral","modeStyles","primary","outline","tertiary","sizeStyles","s","m","l","sizeYClassNames","none","COMPACT","SubnavigationButtonTypography","textLevel","restProps","level","SubnavigationButton","mode","appearance","size","selected","before","after","expandable","children","className","sizeY","hasActive","focusVisibleMode","REGULAR","span","Component"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,cAAc,QAAQ,mBAAmB;AAClD,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,QAAQ,QAAQ,uBAAuB;AAEhD,SAASC,QAAQ,QAAuB,uBAAuB;AAC/D,SAASC,OAAO,QAAQ,gCAAgC;AACxD,SAASC,OAAO,QAAQ,gCAAgC;AACxD,OAAOC,YAAY,mCAAmC;AAEtD,MAAMC,mBAAmB;IACvBC,QAAQF,MAAM,CAAC,yCAAyC;IACxDG,SAASH,MAAM,CAAC,0CAA0C;AAC5D;AAEA,MAAMI,aAAa;IACjBC,SAASL,MAAM,CAAC,oCAAoC;IACpDM,SAASN,MAAM,CAAC,oCAAoC;IACpDO,UAAUP,MAAM,CAAC,qCAAqC;AACxD;AAEA,MAAMQ,aAAa;IACjBC,GAAGT,MAAM,CAAC,8BAA8B;IACxCU,GAAGV,MAAM,CAAC,8BAA8B;IACxCW,GAAGX,MAAM,CAAC,8BAA8B;AAC1C;AAEA,MAAMY,kBAAkB;IACtBC,MAAMb,MAAM,CAAC,kCAAkC;IAC/C,CAACJ,SAASkB,OAAO,CAAC,EAAEd,MAAM,CAAC,qCAAqC;AAClE;AA6BA,MAAMe,gCAAgC,CAAC,EACrCC,SAAS,EACT,GAAGC,WACgC;IACnC,IAAID,cAAc,KAAK;QACrB,qBAAO,oBAACjB,SAAYkB;IACtB;IAEA,qBAAO,oBAACnB;QAAQoB,OAAOF,cAAc,MAAM,MAAM;QAAM,GAAGC,SAAS;;AACrE;AAEA;;CAEC,GACD,OAAO,MAAME,sBAAsB,CAAC,EAClCC,OAAO,SAAS,EAChBC,aAAa,QAAQ,EACrBC,OAAO,GAAG,EACVC,QAAQ,EACRP,YAAY,GAAG,EACfQ,MAAM,EACNC,KAAK,EACLC,UAAU,EACVC,QAAQ,EACRC,SAAS,EACT,GAAGX,WACsB;IACzB,MAAM,EAAEY,QAAQ,MAAM,EAAE,GAAGlC;IAE3B,qBACE,oBAACE;QACE,GAAGoB,SAAS;QACba,WAAW;QACXC,kBAAiB;QACjBH,WAAWlC,WACTM,MAAM,CAAC,sBAAsB,EAC7BQ,UAAU,CAACc,KAAK,EAChBlB,UAAU,CAACgB,KAAK,EAChBnB,gBAAgB,CAACoB,WAAW,EAC5BE,YAAYvB,MAAM,CAAC,gCAAgC,EACnD6B,UAAUjC,SAASoC,OAAO,IAAIpB,eAAe,CAACiB,MAAM,EACpDD;qBAGF,oBAACK;QAAKL,WAAW5B,MAAM,CAAC,0BAA0B;OAC/CwB,wBAAU,oBAACS;QAAKL,WAAW5B,MAAM,CAAC,8BAA8B;OAAGwB,uBACpE,oBAACT;QACCC,WAAWA;QACXY,WAAW5B,MAAM,CAAC,6BAA6B;QAC/CkC,WAAU;OAETP,WAEFF,uBAAS,oBAACQ;QAAKL,WAAW5B,MAAM,CAAC,6BAA6B;OAAGyB,QACjEC,4BAAc,oBAACjC;QAAemC,WAAW5B,MAAM,CAAC,sCAAsC;;AAI/F,EAAE"}
|
|
@@ -113,6 +113,15 @@
|
|
|
113
113
|
box-shadow: inset 0 0 0 var(--vkui_internal--thin_border) var(--vkui--color_field_border_alpha);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
/**
|
|
117
|
+
* appearance
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
.SubnavigationButton--appearance-neutral .SubnavigationButton__expandableIcon,
|
|
121
|
+
.SubnavigationButton--appearance-neutral .SubnavigationButton__before {
|
|
122
|
+
color: var(--vkui--color_icon_primary);
|
|
123
|
+
}
|
|
124
|
+
|
|
116
125
|
/**
|
|
117
126
|
* selected
|
|
118
127
|
*/
|
|
@@ -124,14 +133,19 @@
|
|
|
124
133
|
border: 0;
|
|
125
134
|
}
|
|
126
135
|
|
|
127
|
-
.SubnavigationButton--selected.SubnavigationButton--mode-tertiary
|
|
136
|
+
.SubnavigationButton--selected.SubnavigationButton--mode-tertiary,
|
|
137
|
+
.SubnavigationButton--selected.SubnavigationButton--appearance-neutral {
|
|
128
138
|
background-color: var(--vkui--color_transparent--active);
|
|
129
139
|
color: var(--vkui--color_text_primary);
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
.SubnavigationButton--selected
|
|
142
|
+
.SubnavigationButton--selected.SubnavigationButton--appearance-accent:not(
|
|
143
|
+
.SubnavigationButton--mode-tertiary
|
|
144
|
+
)
|
|
133
145
|
.SubnavigationButton__before,
|
|
134
|
-
.SubnavigationButton--selected
|
|
146
|
+
.SubnavigationButton--selected.SubnavigationButton--appearance-accent:not(
|
|
147
|
+
.SubnavigationButton--mode-tertiary
|
|
148
|
+
)
|
|
135
149
|
.SubnavigationButton__expandableIcon {
|
|
136
150
|
color: var(--vkui--color_icon_contrast_themed);
|
|
137
151
|
}
|
|
@@ -146,11 +160,18 @@
|
|
|
146
160
|
--vkui_internal--counter_inherit_color: var(--vkui--color_text_contrast_themed);
|
|
147
161
|
}
|
|
148
162
|
|
|
149
|
-
.SubnavigationButton--selected
|
|
163
|
+
.SubnavigationButton--selected.SubnavigationButton--appearance-accent:not(
|
|
164
|
+
.SubnavigationButton--mode-tertiary
|
|
165
|
+
) {
|
|
150
166
|
--vkui_internal--counter_inherit_background: var(--vkui--color_background_content);
|
|
151
167
|
--vkui_internal--counter_inherit_color: var(--vkui--color_text_accent_themed);
|
|
152
168
|
}
|
|
153
169
|
|
|
170
|
+
.SubnavigationButton--selected.SubnavigationButton--appearance-neutral {
|
|
171
|
+
--vkui_internal--counter_inherit_background: var(--vkui--color_background_content);
|
|
172
|
+
--vkui_internal--counter_inherit_color: var(--vkui--color_text_primary);
|
|
173
|
+
}
|
|
174
|
+
|
|
154
175
|
:global(.vkuiInternalSubnavigationBar--mode-fixed) .SubnavigationButton {
|
|
155
176
|
flex: 1;
|
|
156
177
|
min-width: 0;
|
|
@@ -1,34 +1,18 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { type PlacementWithAuto } from '../../lib/floating';
|
|
3
3
|
import { HasRootRef } from '../../types';
|
|
4
|
-
import { type
|
|
5
|
-
export interface TooltipProps {
|
|
4
|
+
import { type TooltipBaseProps } from '../TooltipBase/TooltipBase';
|
|
5
|
+
export interface TooltipProps extends Omit<TooltipBaseProps, 'arrowCoords' | 'arrowPlacement' | 'getArrowRef' | 'floatingStyle' | 'withArrow'> {
|
|
6
6
|
/**
|
|
7
7
|
* **Важно**: если в `children` передан React-компонент, то необходимо убедиться в том, что он поддерживает
|
|
8
8
|
* свойство `getRootRef`, которое должно возвращаться ссылку на корневой DOM-элемент компонента,
|
|
9
9
|
* иначе тултип показан не будет. Если передан React-element, то такой проблемы нет.
|
|
10
10
|
*/
|
|
11
11
|
children: React.ReactElement<HasRootRef<any>> | React.ReactElement;
|
|
12
|
-
/**
|
|
13
|
-
* Стиль отображения подсказки
|
|
14
|
-
*/
|
|
15
|
-
appearance?: 'accent' | 'neutral' | 'white' | 'black' | 'inversion';
|
|
16
12
|
/**
|
|
17
13
|
* Если передан `false`, то рисуется просто `children`.
|
|
18
14
|
*/
|
|
19
15
|
isShown?: boolean;
|
|
20
|
-
/**
|
|
21
|
-
* Текст тултипа.
|
|
22
|
-
*/
|
|
23
|
-
text?: React.ReactNode;
|
|
24
|
-
/**
|
|
25
|
-
* Заголовок тултипа.
|
|
26
|
-
*/
|
|
27
|
-
header?: React.ReactNode;
|
|
28
|
-
/**
|
|
29
|
-
* Положение по горизонтали (прижатие к левому или правому краю `children`).
|
|
30
|
-
* Если не задано, позиция по горизонтали определятся автоматически
|
|
31
|
-
*/
|
|
32
16
|
alignX?: 'center' | 'left' | 'right';
|
|
33
17
|
/**
|
|
34
18
|
* Положение по вертикали (расположение над или под `children`).
|
|
@@ -51,20 +35,6 @@ export interface TooltipProps {
|
|
|
51
35
|
* Безопасная зона вокруг стрелки, чтобы та не выходила за края контента.
|
|
52
36
|
*/
|
|
53
37
|
arrowPadding?: number;
|
|
54
|
-
/**
|
|
55
|
-
* Пользовательская SVG иконка.
|
|
56
|
-
*
|
|
57
|
-
* Требования:
|
|
58
|
-
*
|
|
59
|
-
* 1. Иконка по умолчанию должна быть направлена вверх (a.k.a `IconUp`).
|
|
60
|
-
* 2. Чтобы избежать проблемы с пространством между стрелкой и контентом на некоторых экранах,
|
|
61
|
-
* растяните кривую по высоте на `1px` и увеличьте на этот размер `height` и `viewBox` SVG.
|
|
62
|
-
* (см. https://github.com/VKCOM/VKUI/pull/4496).
|
|
63
|
-
* 3. Убедитесь, что компонент принимает все валидные для SVG параметры.
|
|
64
|
-
* 4. Убедитесь, что SVG и её элементы наследует цвет через `fill="currentColor"`.
|
|
65
|
-
* 5. Если стрелка наезжает на якорный элемент, то увеличьте значение параметра `offsetY`.
|
|
66
|
-
*/
|
|
67
|
-
ArrowIcon?: PopperArrowProps['Icon'];
|
|
68
38
|
/**
|
|
69
39
|
* Сдвиг стрелочки относительно центра дочернего элемента.
|
|
70
40
|
*/
|
|
@@ -81,12 +51,8 @@ export interface TooltipProps {
|
|
|
81
51
|
* По умолчанию компонент выберет наилучшее расположение сам. Но его можно задать извне с помощью этого свойства
|
|
82
52
|
*/
|
|
83
53
|
placement?: PlacementWithAuto;
|
|
84
|
-
/**
|
|
85
|
-
* Пользовательские css-классы, будут добавлены на root-элемент
|
|
86
|
-
*/
|
|
87
|
-
className?: string;
|
|
88
54
|
}
|
|
89
55
|
/**
|
|
90
56
|
* @see https://vkcom.github.io/VKUI/#/Tooltip
|
|
91
57
|
*/
|
|
92
|
-
export declare const Tooltip: ({ children, isShown: isShownProp, offsetX, offsetY, alignX, alignY, onClose, cornerOffset, cornerAbsoluteOffset,
|
|
58
|
+
export declare const Tooltip: ({ children, isShown: isShownProp, offsetX, offsetY, alignX, alignY, onClose, cornerOffset, cornerAbsoluteOffset, arrow, arrowPadding, placement: placementProp, ...restProps }: TooltipProps) => React.JSX.Element;
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import ReactDOM from 'react-dom';
|
|
3
|
-
import {
|
|
3
|
+
import { hasReactNode } from '@vkontakte/vkjs';
|
|
4
4
|
import { useExternRef } from '../../hooks/useExternRef';
|
|
5
|
-
import { useGlobalEventListener } from '../../hooks/useGlobalEventListener';
|
|
6
|
-
import { useDOM } from '../../lib/dom';
|
|
7
5
|
import { arrowMiddleware, autoPlacementMiddleware, autoUpdateFloatingElement, checkIsNotAutoPlacement, convertFloatingDataToReactCSSProperties, flipMiddleware, getAutoPlacementAlign, offsetMiddleware, shiftMiddleware, useFloating } from '../../lib/floating';
|
|
8
6
|
import { warnOnce } from '../../lib/warnOnce';
|
|
9
7
|
import { useNavTransition } from '../NavTransitionContext/NavTransitionContext';
|
|
10
|
-
import {
|
|
11
|
-
import { PopperArrow } from '../PopperArrow/PopperArrow';
|
|
12
|
-
import { Subhead } from '../Typography/Subhead/Subhead';
|
|
8
|
+
import { TooltipBase } from '../TooltipBase/TooltipBase';
|
|
13
9
|
import { tooltipContainerAttr } from './TooltipContainer';
|
|
14
10
|
import styles from './Tooltip.module.css';
|
|
15
11
|
const isDOMTypeElement = (element)=>{
|
|
16
12
|
return /*#__PURE__*/ React.isValidElement(element) && typeof element.type === 'string';
|
|
17
13
|
};
|
|
18
14
|
const warn = warnOnce('Tooltip');
|
|
19
|
-
const stylesAppearance = {
|
|
20
|
-
accent: styles['Tooltip--appearance-accent'],
|
|
21
|
-
white: styles['Tooltip--appearance-white'],
|
|
22
|
-
black: styles['Tooltip--appearance-black'],
|
|
23
|
-
inversion: styles['Tooltip--appearance-inversion']
|
|
24
|
-
};
|
|
25
15
|
function mapAlignX(x) {
|
|
26
16
|
switch(x){
|
|
27
17
|
case 'left':
|
|
@@ -43,7 +33,7 @@ function isVerticalPlacement(placement) {
|
|
|
43
33
|
}
|
|
44
34
|
/**
|
|
45
35
|
* @see https://vkcom.github.io/VKUI/#/Tooltip
|
|
46
|
-
*/ export const Tooltip = ({ children, isShown: isShownProp = true, offsetX = 0, offsetY = 15, alignX, alignY, onClose, cornerOffset = 0, cornerAbsoluteOffset,
|
|
36
|
+
*/ export const Tooltip = ({ children, isShown: isShownProp = true, offsetX = 0, offsetY = 15, alignX, alignY, onClose, cornerOffset = 0, cornerAbsoluteOffset, arrow = true, arrowPadding = 14, placement: placementProp, ...restProps })=>{
|
|
47
37
|
const [arrowRef, setArrowRef] = React.useState(null);
|
|
48
38
|
const [target, setTarget] = React.useState(null);
|
|
49
39
|
/* eslint-disable no-restricted-properties */ const tooltipContainer = React.useMemo(()=>target?.closest(`[${tooltipContainerAttr}]`), [
|
|
@@ -132,33 +122,23 @@ function isVerticalPlacement(placement) {
|
|
|
132
122
|
middleware: memoizedMiddlewares,
|
|
133
123
|
whileElementsMounted: autoUpdateFloatingElement
|
|
134
124
|
});
|
|
135
|
-
const { document } = useDOM();
|
|
136
|
-
useGlobalEventListener(document, 'click', isShown && onClose, {
|
|
137
|
-
capture: true,
|
|
138
|
-
passive: true
|
|
139
|
-
});
|
|
140
125
|
const childRef = isDOMTypeElement(children) ? children.ref : /*#__PURE__*/ React.isValidElement(children) ? children.props.getRootRef : null;
|
|
141
126
|
const patchedRef = useExternRef(setTarget, refs.setReference, childRef);
|
|
142
127
|
const child = /*#__PURE__*/ React.isValidElement(children) ? /*#__PURE__*/ React.cloneElement(children, {
|
|
143
128
|
[isDOMTypeElement(children) ? 'ref' : 'getRootRef']: patchedRef
|
|
144
129
|
}) : children;
|
|
145
|
-
return /*#__PURE__*/ React.createElement(React.Fragment, null, child, isShown && target != null && /*#__PURE__*/ ReactDOM.createPortal(/*#__PURE__*/ React.createElement(
|
|
130
|
+
return /*#__PURE__*/ React.createElement(React.Fragment, null, child, isShown && target != null && /*#__PURE__*/ ReactDOM.createPortal(/*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(TooltipBase, {
|
|
146
131
|
...restProps,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
placement: resolvedPlacement,
|
|
154
|
-
arrowClassName: styles['Tooltip__arrow'],
|
|
155
|
-
getRootRef: setArrowRef,
|
|
156
|
-
Icon: ArrowIcon
|
|
132
|
+
getRootRef: refs.setFloating,
|
|
133
|
+
floatingStyle: convertFloatingDataToReactCSSProperties(floatingPositionStrategy, floatingDataX, floatingDataY),
|
|
134
|
+
withArrow: arrow,
|
|
135
|
+
arrowCoords: arrowCoords,
|
|
136
|
+
arrowPlacement: resolvedPlacement,
|
|
137
|
+
getArrowRef: setArrowRef
|
|
157
138
|
}), /*#__PURE__*/ React.createElement("div", {
|
|
158
|
-
className: styles['
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}, header), text && /*#__PURE__*/ React.createElement(Subhead, null, text)))), tooltipContainer));
|
|
139
|
+
className: styles['Tooltip__overlay'],
|
|
140
|
+
onClickCapture: onClose
|
|
141
|
+
})), tooltipContainer));
|
|
162
142
|
};
|
|
163
143
|
|
|
164
144
|
//# sourceMappingURL=Tooltip.js.map
|