@vkontakte/vkui 5.5.1 → 5.5.3
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/Banner/Banner.d.ts +3 -6
- package/dist/cjs/components/Banner/Banner.js.map +1 -1
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +23 -17
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/cjs/components/FixedLayout/FixedLayout.js +11 -4
- package/dist/cjs/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/cjs/components/FormItem/FormItem.d.ts +1 -1
- package/dist/cjs/components/FormItem/FormItem.js +6 -3
- package/dist/cjs/components/FormItem/FormItem.js.map +1 -1
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cjs/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cjs/components/ModalCard/ModalCard.d.ts +1 -1
- package/dist/cjs/components/ModalCard/ModalCard.js +4 -2
- package/dist/cjs/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/cjs/components/PanelHeader/LegacyPanelHeaderContent.d.ts +12 -0
- package/dist/cjs/components/PanelHeader/LegacyPanelHeaderContent.js +35 -0
- package/dist/cjs/components/PanelHeader/LegacyPanelHeaderContent.js.map +1 -0
- package/dist/cjs/components/PanelHeader/PanelHeader.d.ts +6 -4
- package/dist/cjs/components/PanelHeader/PanelHeader.js +3 -23
- package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/cjs/components/Select/Select.d.ts +1 -1
- package/dist/cjs/components/Select/Select.js +22 -11
- package/dist/cjs/components/Select/Select.js.map +1 -1
- package/dist/cjs/components/Spinner/Spinner.d.ts +1 -1
- package/dist/cjs/components/Spinner/Spinner.js +14 -4
- package/dist/cjs/components/Spinner/Spinner.js.map +1 -1
- package/dist/cjs/components/TabbarItem/TabbarItem.d.ts +1 -1
- package/dist/cjs/components/TabbarItem/TabbarItem.js +4 -2
- package/dist/cjs/components/TabbarItem/TabbarItem.js.map +1 -1
- package/dist/cjs/components/Tappable/Tappable.d.ts +4 -4
- package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
- package/dist/cjs/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/cjs/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/cjs/lib/platform.d.ts +2 -1
- package/dist/cjs/lib/platform.js.map +1 -1
- package/dist/cjs/types.d.ts +12 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/components/Banner/Banner.d.ts +3 -6
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +23 -17
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/components/FixedLayout/FixedLayout.js +11 -4
- package/dist/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/components/FormItem/FormItem.d.ts +1 -1
- package/dist/components/FormItem/FormItem.js +6 -3
- package/dist/components/FormItem/FormItem.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components/ModalCard/ModalCard.d.ts +1 -1
- package/dist/components/ModalCard/ModalCard.js +4 -2
- package/dist/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/components/PanelHeader/LegacyPanelHeaderContent.d.ts +12 -0
- package/dist/components/PanelHeader/LegacyPanelHeaderContent.js +27 -0
- package/dist/components/PanelHeader/LegacyPanelHeaderContent.js.map +1 -0
- package/dist/components/PanelHeader/PanelHeader.d.ts +6 -4
- package/dist/components/PanelHeader/PanelHeader.js +1 -21
- package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/components/Select/Select.d.ts +1 -1
- package/dist/components/Select/Select.js +22 -11
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +1 -1
- package/dist/components/Spinner/Spinner.js +14 -4
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/TabbarItem/TabbarItem.d.ts +1 -1
- package/dist/components/TabbarItem/TabbarItem.js +4 -2
- package/dist/components/TabbarItem/TabbarItem.js.map +1 -1
- package/dist/components/Tappable/Tappable.d.ts +4 -4
- package/dist/components/Tappable/Tappable.js.map +1 -1
- package/dist/components.css +5 -5
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +1392 -1352
- package/dist/cssm/components/Banner/Banner.d.ts +3 -6
- package/dist/cssm/components/Banner/Banner.js.map +1 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +22 -16
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.js +8 -3
- package/dist/cssm/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/cssm/components/FormItem/FormItem.d.ts +1 -1
- package/dist/cssm/components/FormItem/FormItem.js +4 -2
- package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +2 -0
- package/dist/cssm/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cssm/components/ModalCard/ModalCard.d.ts +1 -1
- package/dist/cssm/components/ModalCard/ModalCard.js +2 -1
- package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/cssm/components/PanelHeader/LegacyPanelHeaderContent.d.ts +12 -0
- package/dist/cssm/components/PanelHeader/LegacyPanelHeaderContent.js +27 -0
- package/dist/cssm/components/PanelHeader/LegacyPanelHeaderContent.js.map +1 -0
- package/dist/cssm/components/PanelHeader/PanelHeader.d.ts +6 -4
- package/dist/cssm/components/PanelHeader/PanelHeader.js +1 -20
- package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +7 -0
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +4 -4
- package/dist/cssm/components/Select/Select.d.ts +1 -1
- package/dist/cssm/components/Select/Select.js +4 -9
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/Spinner/Spinner.d.ts +1 -1
- package/dist/cssm/components/Spinner/Spinner.js +12 -3
- package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
- package/dist/cssm/components/TabbarItem/TabbarItem.d.ts +1 -1
- package/dist/cssm/components/TabbarItem/TabbarItem.js +2 -1
- package/dist/cssm/components/TabbarItem/TabbarItem.js.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.d.ts +4 -4
- package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
- package/dist/cssm/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/cssm/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/cssm/lib/platform.d.ts +2 -1
- package/dist/cssm/lib/platform.js.map +1 -1
- package/dist/cssm/styles/constants.css +3 -0
- package/dist/cssm/types.d.ts +12 -0
- package/dist/cssm/types.js.map +1 -1
- package/dist/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/lib/platform.d.ts +2 -1
- package/dist/lib/platform.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.js.map +1 -1
- package/dist/vkui.css +5 -5
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +1392 -1352
- package/package.json +2 -2
|
@@ -15,4 +15,4 @@ export interface FormItemProps extends React.AllHTMLAttributes<HTMLElement>, Has
|
|
|
15
15
|
/**
|
|
16
16
|
* @see https://vkcom.github.io/VKUI/#/FormItem
|
|
17
17
|
*/
|
|
18
|
-
export declare const FormItem: ({ children, top, bottom, status, Component, removable, onRemove, removePlaceholder, getRootRef, className, ...restProps }: FormItemProps) => React.JSX.Element;
|
|
18
|
+
export declare const FormItem: ({ children, top, bottom, status, Component, removable, onRemove, removePlaceholder, getRootRef, className, htmlFor, ...restProps }: FormItemProps) => React.JSX.Element;
|
|
@@ -25,7 +25,7 @@ var sizeYClassNames = _define_property._({
|
|
|
25
25
|
none: (0, _vkjs.classNames)("vkuiFormItem--sizeY-none", "vkuiInternalFormItem--sizeY-none")
|
|
26
26
|
}, _adaptivity.SizeType.COMPACT, (0, _vkjs.classNames)("vkuiFormItem--sizeY-compact", "vkuiInternalFormItem--sizeY-compact"));
|
|
27
27
|
var FormItem = function(_param) {
|
|
28
|
-
var children = _param.children, top = _param.top, bottom = _param.bottom, _param_status = _param.status, status = _param_status === void 0 ? "default" : _param_status, _param_Component = _param.Component, Component = _param_Component === void 0 ? "div" : _param_Component, removable = _param.removable, _param_onRemove = _param.onRemove, onRemove = _param_onRemove === void 0 ? _vkjs.noop : _param_onRemove, _param_removePlaceholder = _param.removePlaceholder, removePlaceholder = _param_removePlaceholder === void 0 ? "Удалить" : _param_removePlaceholder, getRootRef = _param.getRootRef, className = _param.className, restProps = _object_without_properties._(_param, [
|
|
28
|
+
var children = _param.children, top = _param.top, bottom = _param.bottom, _param_status = _param.status, status = _param_status === void 0 ? "default" : _param_status, _param_Component = _param.Component, Component = _param_Component === void 0 ? "div" : _param_Component, removable = _param.removable, _param_onRemove = _param.onRemove, onRemove = _param_onRemove === void 0 ? _vkjs.noop : _param_onRemove, _param_removePlaceholder = _param.removePlaceholder, removePlaceholder = _param_removePlaceholder === void 0 ? "Удалить" : _param_removePlaceholder, getRootRef = _param.getRootRef, className = _param.className, htmlFor = _param.htmlFor, restProps = _object_without_properties._(_param, [
|
|
29
29
|
"children",
|
|
30
30
|
"top",
|
|
31
31
|
"bottom",
|
|
@@ -35,12 +35,15 @@ var FormItem = function(_param) {
|
|
|
35
35
|
"onRemove",
|
|
36
36
|
"removePlaceholder",
|
|
37
37
|
"getRootRef",
|
|
38
|
-
"className"
|
|
38
|
+
"className",
|
|
39
|
+
"htmlFor"
|
|
39
40
|
]);
|
|
40
41
|
var rootEl = (0, _useExternRef.useExternRef)(getRootRef);
|
|
41
42
|
var _useAdaptivity1 = (0, _useAdaptivity.useAdaptivity)(), _useAdaptivity_sizeY = _useAdaptivity1.sizeY, sizeY = _useAdaptivity_sizeY === void 0 ? "none" : _useAdaptivity_sizeY;
|
|
42
43
|
var wrappedChildren = /*#__PURE__*/ _react.createElement(_react.Fragment, null, (0, _vkjs.hasReactNode)(top) && /*#__PURE__*/ _react.createElement(_Subhead.Subhead, {
|
|
43
|
-
className: "vkuiFormItem__top"
|
|
44
|
+
className: "vkuiFormItem__top",
|
|
45
|
+
Component: htmlFor ? "label" : "h5",
|
|
46
|
+
htmlFor: htmlFor
|
|
44
47
|
}, top), children, (0, _vkjs.hasReactNode)(bottom) && /*#__PURE__*/ _react.createElement(_Footnote.Footnote, {
|
|
45
48
|
className: "vkuiFormItem__bottom"
|
|
46
49
|
}, bottom));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/FormItem/FormItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { Removable, RemovableProps } from '../Removable/Removable';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './FormItem.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles['FormItem--sizeY-none'], 'vkuiInternalFormItem--sizeY-none'),\n [SizeType.COMPACT]: classNames(\n styles['FormItem--sizeY-compact'],\n 'vkuiInternalFormItem--sizeY-compact',\n ),\n};\n\nexport interface FormItemProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent,\n RemovableProps {\n top?: React.ReactNode;\n bottom?: React.ReactNode;\n status?: 'default' | 'error' | 'valid';\n /**\n * Дает возможность удалить `FormItem`. Рекомендуется использовать только для `Input` или `Select`.\n *\n * Режим `indent` предназначен для визуального отступа\n */\n removable?: boolean | 'indent';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormItem\n */\nexport const FormItem = ({\n children,\n top,\n bottom,\n status = 'default',\n Component = 'div',\n removable,\n onRemove = noop,\n removePlaceholder = 'Удалить',\n getRootRef,\n className,\n ...restProps\n}: FormItemProps) => {\n const rootEl = useExternRef(getRootRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n const wrappedChildren = (\n <React.Fragment>\n {hasReactNode(top) && <Subhead
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/FormItem/FormItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { Removable, RemovableProps } from '../Removable/Removable';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport styles from './FormItem.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles['FormItem--sizeY-none'], 'vkuiInternalFormItem--sizeY-none'),\n [SizeType.COMPACT]: classNames(\n styles['FormItem--sizeY-compact'],\n 'vkuiInternalFormItem--sizeY-compact',\n ),\n};\n\nexport interface FormItemProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent,\n RemovableProps {\n top?: React.ReactNode;\n bottom?: React.ReactNode;\n status?: 'default' | 'error' | 'valid';\n /**\n * Дает возможность удалить `FormItem`. Рекомендуется использовать только для `Input` или `Select`.\n *\n * Режим `indent` предназначен для визуального отступа\n */\n removable?: boolean | 'indent';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormItem\n */\nexport const FormItem = ({\n children,\n top,\n bottom,\n status = 'default',\n Component = 'div',\n removable,\n onRemove = noop,\n removePlaceholder = 'Удалить',\n getRootRef,\n className,\n htmlFor,\n ...restProps\n}: FormItemProps) => {\n const rootEl = useExternRef(getRootRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n const wrappedChildren = (\n <React.Fragment>\n {hasReactNode(top) && (\n <Subhead\n className={styles['FormItem__top']}\n Component={htmlFor ? 'label' : 'h5'}\n htmlFor={htmlFor}\n >\n {top}\n </Subhead>\n )}\n {children}\n {hasReactNode(bottom) && <Footnote className={styles['FormItem__bottom']}>{bottom}</Footnote>}\n </React.Fragment>\n );\n\n return (\n <Component\n {...restProps}\n ref={rootEl}\n className={classNames(\n styles['FormItem'],\n 'vkuiInternalFormItem',\n status !== 'default' &&\n {\n error: classNames(\n styles['FormItem--status-error'],\n 'vkuiInternalFormItem--status-error',\n ),\n valid: classNames(\n styles['FormItem--status-valid'],\n 'vkuiInternalFormItem--status-valid',\n ),\n }[status],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n hasReactNode(top) &&\n classNames(styles['FormItem--withTop'], 'vkuiInternalFormItem--withTop'),\n removable && classNames(styles['FormItem--removable'], 'vkuiInternalFormItem--removable'),\n className,\n )}\n >\n {removable ? (\n <Removable\n align=\"start\"\n onRemove={(e) => {\n if (rootEl?.current) {\n onRemove(e, rootEl.current);\n }\n }}\n removePlaceholder={removePlaceholder}\n indent={removable === 'indent'}\n >\n <div\n className={classNames(styles['FormItem__removable'], 'vkuiInternalFormItem__removable')}\n >\n {wrappedChildren}\n </div>\n </Removable>\n ) : (\n wrappedChildren\n )}\n </Component>\n );\n};\n"],"names":["FormItem","sizeYClassNames","none","classNames","SizeType","COMPACT","children","top","bottom","status","Component","removable","onRemove","noop","removePlaceholder","getRootRef","className","htmlFor","restProps","rootEl","useExternRef","useAdaptivity","sizeY","wrappedChildren","React","Fragment","hasReactNode","Subhead","Footnote","ref","error","valid","REGULAR","Removable","align","e","current","indent","div"],"mappings":";;;;+BAsCaA;;;eAAAA;;;;;;;;+DAtCU;oBACwB;6BACjB;4BACD;0BACJ;yBAEiB;wBACjB;uBACD;AAGxB,IAAMC,kBAEJ;IADAC,MAAMC,IAAAA,8CAA2C;GAChDC,qBAASC,SAAUF,IAAAA,iDAElB;AAuBG,IAAMH,WAAW;QACtBM,kBAAAA,UACAC,aAAAA,KACAC,gBAAAA,+BACAC,QAAAA,oCAAS,qDACTC,WAAAA,0CAAY,0BACZC,mBAAAA,oCACAC,UAAAA,wCAAWC,gEACXC,mBAAAA,0DAAoB,sCACpBC,oBAAAA,YACAC,mBAAAA,WACAC,iBAAAA,SACGC;QAXHZ;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;QACAC;QACAC;;IAGA,IAAME,SAASC,IAAAA,4BAAaL;IAC5B,IAA2BM,kBAAAA,IAAAA,wDAAAA,gBAAnBC,OAAAA,0CAAQ;IAEhB,IAAMC,gCACJ,qBAACC,OAAMC,gBACJC,IAAAA,oBAAanB,sBACZ,qBAACoB;QACCX,SAAS;QACTN,WAAWO,UAAU,UAAU;QAC/BA,SAASA;OAERV,MAGJD,UACAoB,IAAAA,oBAAalB,yBAAW,qBAACoB;QAASZ,SAAS;OAA+BR;IAI/E,qBACE,qBAACE,uDACKQ;QACJW,KAAKV;QACLH,WAAWb,IAAAA,kCAET,wBACAM,WAAW,aACT,CAAA;YACEqB,OAAO3B,IAAAA,gDAEL;YAEF4B,OAAO5B,IAAAA,gDAEL;QAEJ,CAAA,CAAC,CAACM,OAAO,EACXa,UAAUlB,qBAAS4B,WAAW/B,eAAe,CAACqB,MAAM,EACpDI,IAAAA,oBAAanB,QACXJ,IAAAA,2CAAwC,kCAC1CQ,aAAaR,IAAAA,6CAA0C,oCACvDa;QAGDL,0BACC,qBAACsB;QACCC,OAAM;QACNtB,UAAU,SAACuB;YACT,IAAIhB,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQiB,SAAS;gBACnBxB,SAASuB,GAAGhB,OAAOiB;YACrB;QACF;QACAtB,mBAAmBA;QACnBuB,QAAQ1B,cAAc;qBAEtB,qBAAC2B;QACCtB,WAAWb,IAAAA,6CAA0C;OAEpDoB,oBAILA;AAIR"}
|
|
@@ -190,12 +190,7 @@ var HorizontalScroll = function(_param) {
|
|
|
190
190
|
]);
|
|
191
191
|
return /*#__PURE__*/ _react.createElement("div", _object_spread_props._(_object_spread._({}, restProps), {
|
|
192
192
|
className: (0, _vkjs.classNames)("vkuiHorizontalScroll", "vkuiInternalHorizontalScroll", showArrows === "always" && "vkuiHorizontalScroll--withConstArrows", className)
|
|
193
|
-
}), /*#__PURE__*/ _react.createElement(
|
|
194
|
-
className: "vkuiHorizontalScroll__in",
|
|
195
|
-
ref: scrollerRef
|
|
196
|
-
}, /*#__PURE__*/ _react.createElement("div", {
|
|
197
|
-
className: "vkuiHorizontalScroll__in-wrapper"
|
|
198
|
-
}, children)), showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && /*#__PURE__*/ _react.createElement(_ScrollArrow.ScrollArrow, {
|
|
193
|
+
}), showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && /*#__PURE__*/ _react.createElement(_ScrollArrow.ScrollArrow, {
|
|
199
194
|
size: arrowSize,
|
|
200
195
|
offsetY: arrowOffsetY,
|
|
201
196
|
direction: "left",
|
|
@@ -207,7 +202,12 @@ var HorizontalScroll = function(_param) {
|
|
|
207
202
|
direction: "right",
|
|
208
203
|
className: (0, _vkjs.classNames)("vkuiHorizontalScroll__arrow", "vkuiHorizontalScroll__arrowRight"),
|
|
209
204
|
onClick: scrollToRight
|
|
210
|
-
})
|
|
205
|
+
}), /*#__PURE__*/ _react.createElement("div", {
|
|
206
|
+
className: "vkuiHorizontalScroll__in",
|
|
207
|
+
ref: scrollerRef
|
|
208
|
+
}, /*#__PURE__*/ _react.createElement("div", {
|
|
209
|
+
className: "vkuiHorizontalScroll__in-wrapper"
|
|
210
|
+
}, children)));
|
|
211
211
|
};
|
|
212
212
|
|
|
213
213
|
//# sourceMappingURL=HorizontalScroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { easeInOutSine } from '../../lib/fx';\nimport { HasRef } from '../../types';\nimport { ScrollArrow } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToRightBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate\n */\n initialScrollWidth: number;\n}\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при клике на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при клике на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n arrowSize?: 'm' | 'l';\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n showArrows?: boolean | 'always';\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n}\n\n/**\n * timing method\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => Math.ceil(el.scrollLeft);\n\n/**\n * Код анимации скрола, на основе полифила: https://github.com/iamdustan/smoothscroll\n * Константа взята из полифила (468), на дизайн-ревью уточнили до 250\n * @var {number} SCROLL_ONE_FRAME_TIME время анимации скролла\n */\nconst SCROLL_ONE_FRAME_TIME = 250;\n\nfunction doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue,\n onScrollToRightBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * максимальное значение сдвига влево\n */\n const maxLeft = initialScrollWidth - scrollElement.offsetWidth;\n\n let startLeft = roundUpElementScrollLeft(scrollElement);\n let endLeft = getScrollPosition(startLeft);\n\n onScrollStart();\n\n if (endLeft >= maxLeft) {\n onScrollToRightBorder();\n endLeft = maxLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n if (!scrollElement) {\n onScrollEnd();\n return;\n }\n\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentLeft = startLeft + (endLeft - startLeft) * value;\n scrollElement.scrollLeft = Math.ceil(currentLeft);\n\n if (roundUpElementScrollLeft(scrollElement) !== Math.max(0, endLeft) && elapsed !== 1) {\n requestAnimationFrame(scroll);\n return;\n }\n\n onScrollEnd();\n animationQueue.shift();\n if (animationQueue.length > 0) {\n animationQueue[0]();\n }\n })();\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/HorizontalScroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'l',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n className,\n scrollOnAnyWheel = false,\n ...restProps\n}: HorizontalScrollProps) => {\n const [canScrollLeft, setCanScrollLeft] = React.useState(false);\n const [canScrollRight, setCanScrollRight] = React.useState(false);\n\n const isCustomScrollingRef = React.useRef(false);\n\n const scrollerRef = useExternRef(getRef);\n\n const animationQueue = React.useRef<VoidFunction[]>([]);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const scrollTo = React.useCallback(\n (getScrollPosition: ScrollPositionHandler) => {\n const scrollElement = scrollerRef.current;\n\n animationQueue.current.push(() =>\n doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue: animationQueue.current,\n onScrollToRightBorder: () => setCanScrollRight(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollAnimationDuration, scrollerRef],\n );\n\n const scrollToLeft = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToRight = React.useCallback(() => {\n const getScrollPosition =\n getScrollToRight ?? ((i: number) => i + scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToRight, scrollTo, scrollerRef]);\n\n const onscroll = React.useCallback(() => {\n if (showArrows && hasPointer && scrollerRef.current && !isCustomScrollingRef.current) {\n const scrollElement = scrollerRef.current;\n\n setCanScrollLeft(scrollElement.scrollLeft > 0);\n setCanScrollRight(\n roundUpElementScrollLeft(scrollElement) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [hasPointer, scrollerRef, showArrows]);\n\n const scrollEvent = useEventListener('scroll', onscroll);\n React.useEffect(() => {\n if (scrollerRef.current) {\n scrollEvent.add(scrollerRef.current);\n }\n }, [scrollEvent, scrollerRef]);\n React.useEffect(onscroll, [scrollerRef, children, onscroll]);\n\n /**\n * Прокрутка с помощью любого колеса мыши\n */\n const onwheel = React.useCallback(\n (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n },\n [scrollerRef],\n );\n\n const wheelEvent = useEventListener('wheel', onwheel);\n React.useEffect(() => {\n if (!scrollerRef.current || !scrollOnAnyWheel) {\n return noop;\n }\n\n wheelEvent.add(scrollerRef.current);\n\n return wheelEvent.remove;\n }, [wheelEvent, scrollerRef, scrollOnAnyWheel]);\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['HorizontalScroll'],\n 'vkuiInternalHorizontalScroll',\n showArrows === 'always' && styles['HorizontalScroll--withConstArrows'],\n className,\n )}\n >\n <div className={styles['HorizontalScroll__in']} ref={scrollerRef}>\n <div className={styles['HorizontalScroll__in-wrapper']}>{children}</div>\n </div>\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowLeft'],\n )}\n onClick={scrollToLeft}\n />\n )}\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollRight && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowRight'],\n )}\n onClick={scrollToRight}\n />\n )}\n </div>\n );\n};\n"],"names":["HorizontalScroll","now","performance","Date","roundUpElementScrollLeft","el","Math","ceil","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToRightBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","maxLeft","offsetWidth","startLeft","endLeft","startTime","scroll","time","elapsed","min","value","easeInOutSine","currentLeft","max","requestAnimationFrame","shift","length","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","className","scrollOnAnyWheel","restProps","React","useState","canScrollLeft","setCanScrollLeft","canScrollRight","setCanScrollRight","isCustomScrollingRef","useRef","scrollerRef","useExternRef","hasPointer","useAdaptivityHasPointer","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToLeft","i","scrollToRight","onscroll","scrollEvent","useEventListener","useEffect","add","onwheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","wheelEvent","noop","remove","div","classNames","ref","undefined","ScrollArrow","size","offsetY","direction","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { easeInOutSine } from '../../lib/fx';\nimport { HasRef } from '../../types';\nimport { ScrollArrow } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToRightBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate\n */\n initialScrollWidth: number;\n}\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при клике на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при клике на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n arrowSize?: 'm' | 'l';\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n showArrows?: boolean | 'always';\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n}\n\n/**\n * timing method\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => Math.ceil(el.scrollLeft);\n\n/**\n * Код анимации скрола, на основе полифила: https://github.com/iamdustan/smoothscroll\n * Константа взята из полифила (468), на дизайн-ревью уточнили до 250\n * @var {number} SCROLL_ONE_FRAME_TIME время анимации скролла\n */\nconst SCROLL_ONE_FRAME_TIME = 250;\n\nfunction doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue,\n onScrollToRightBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * максимальное значение сдвига влево\n */\n const maxLeft = initialScrollWidth - scrollElement.offsetWidth;\n\n let startLeft = roundUpElementScrollLeft(scrollElement);\n let endLeft = getScrollPosition(startLeft);\n\n onScrollStart();\n\n if (endLeft >= maxLeft) {\n onScrollToRightBorder();\n endLeft = maxLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n if (!scrollElement) {\n onScrollEnd();\n return;\n }\n\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentLeft = startLeft + (endLeft - startLeft) * value;\n scrollElement.scrollLeft = Math.ceil(currentLeft);\n\n if (roundUpElementScrollLeft(scrollElement) !== Math.max(0, endLeft) && elapsed !== 1) {\n requestAnimationFrame(scroll);\n return;\n }\n\n onScrollEnd();\n animationQueue.shift();\n if (animationQueue.length > 0) {\n animationQueue[0]();\n }\n })();\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/HorizontalScroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'l',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n className,\n scrollOnAnyWheel = false,\n ...restProps\n}: HorizontalScrollProps) => {\n const [canScrollLeft, setCanScrollLeft] = React.useState(false);\n const [canScrollRight, setCanScrollRight] = React.useState(false);\n\n const isCustomScrollingRef = React.useRef(false);\n\n const scrollerRef = useExternRef(getRef);\n\n const animationQueue = React.useRef<VoidFunction[]>([]);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const scrollTo = React.useCallback(\n (getScrollPosition: ScrollPositionHandler) => {\n const scrollElement = scrollerRef.current;\n\n animationQueue.current.push(() =>\n doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue: animationQueue.current,\n onScrollToRightBorder: () => setCanScrollRight(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollAnimationDuration, scrollerRef],\n );\n\n const scrollToLeft = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToRight = React.useCallback(() => {\n const getScrollPosition =\n getScrollToRight ?? ((i: number) => i + scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToRight, scrollTo, scrollerRef]);\n\n const onscroll = React.useCallback(() => {\n if (showArrows && hasPointer && scrollerRef.current && !isCustomScrollingRef.current) {\n const scrollElement = scrollerRef.current;\n\n setCanScrollLeft(scrollElement.scrollLeft > 0);\n setCanScrollRight(\n roundUpElementScrollLeft(scrollElement) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [hasPointer, scrollerRef, showArrows]);\n\n const scrollEvent = useEventListener('scroll', onscroll);\n React.useEffect(() => {\n if (scrollerRef.current) {\n scrollEvent.add(scrollerRef.current);\n }\n }, [scrollEvent, scrollerRef]);\n React.useEffect(onscroll, [scrollerRef, children, onscroll]);\n\n /**\n * Прокрутка с помощью любого колеса мыши\n */\n const onwheel = React.useCallback(\n (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n },\n [scrollerRef],\n );\n\n const wheelEvent = useEventListener('wheel', onwheel);\n React.useEffect(() => {\n if (!scrollerRef.current || !scrollOnAnyWheel) {\n return noop;\n }\n\n wheelEvent.add(scrollerRef.current);\n\n return wheelEvent.remove;\n }, [wheelEvent, scrollerRef, scrollOnAnyWheel]);\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['HorizontalScroll'],\n 'vkuiInternalHorizontalScroll',\n showArrows === 'always' && styles['HorizontalScroll--withConstArrows'],\n className,\n )}\n >\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowLeft'],\n )}\n onClick={scrollToLeft}\n />\n )}\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollRight && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowRight'],\n )}\n onClick={scrollToRight}\n />\n )}\n <div className={styles['HorizontalScroll__in']} ref={scrollerRef}>\n <div className={styles['HorizontalScroll__in-wrapper']}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["HorizontalScroll","now","performance","Date","roundUpElementScrollLeft","el","Math","ceil","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToRightBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","maxLeft","offsetWidth","startLeft","endLeft","startTime","scroll","time","elapsed","min","value","easeInOutSine","currentLeft","max","requestAnimationFrame","shift","length","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","className","scrollOnAnyWheel","restProps","React","useState","canScrollLeft","setCanScrollLeft","canScrollRight","setCanScrollRight","isCustomScrollingRef","useRef","scrollerRef","useExternRef","hasPointer","useAdaptivityHasPointer","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToLeft","i","scrollToRight","onscroll","scrollEvent","useEventListener","useEffect","add","onwheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","wheelEvent","noop","remove","div","classNames","undefined","ScrollArrow","size","offsetY","direction","onClick","ref"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { HasRef, HasRootRef } from '../../types';
|
|
2
|
+
import type { HasRef, HasRootRef, LiteralUnion } from '../../types';
|
|
3
3
|
import { type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';
|
|
4
4
|
import { type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';
|
|
5
5
|
import { ImageBaseContext } from './context';
|
|
@@ -15,7 +15,7 @@ export interface ImageBaseProps extends React.ImgHTMLAttributes<HTMLElement>, Ha
|
|
|
15
15
|
*
|
|
16
16
|
* > ⚠️ Использование кастомного размера – это пограничный кейс.
|
|
17
17
|
*/
|
|
18
|
-
size?: ImageBaseSize
|
|
18
|
+
size?: LiteralUnion<ImageBaseSize, number>;
|
|
19
19
|
/**
|
|
20
20
|
* Включает или отключает обводку.
|
|
21
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport type { HasRef, HasRootRef } from '../../types';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: ImageBaseSize
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport type { HasRef, HasRootRef, LiteralUnion } from '../../types';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: LiteralUnion<ImageBaseSize, number>;\n /**\n * Включает или отключает обводку.\n */\n withBorder?: boolean;\n /**\n * Фолбек на случай, если картинка не прогрузилась.\n *\n * > 📝 Нужный для `<ImageBase size={...} />` размер можно узнать из функции `getFallbackIconSizeByImageBaseSize()`.\n *\n * > Предпочтительней использовать иконки из `@vkontakte/icons`.\n *\n * > 📊️ Если вы хотите передать кастомную иконку, то следует именовать её по шаблону `Icon<size><name>`. Или же\n * > чтобы в неё был передан параметр `width`. Тогда мы сможем выводить в консоль подсказку правильного ли размера вы\n * > использовали иконку.\n *\n * > ⚠️ Может перекрывать `children`.\n */\n fallbackIcon?: React.ReactElement<ImageBaseExpectedIconProps>;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ImageBase\n */\nexport const ImageBase = ({\n alt,\n crossOrigin,\n decoding,\n loading,\n referrerPolicy,\n sizes,\n src,\n srcSet,\n useMap,\n getRef,\n size = 24,\n width,\n height,\n style,\n className,\n getRootRef,\n withBorder = true,\n 'fallbackIcon': fallbackIconProp,\n children,\n 'aria-label': ariaLabel,\n onClick,\n onLoad,\n onError,\n ...restProps\n}: ImageBaseProps) => {\n const [loaded, setLoaded] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n\n const hasSrc = src || srcSet;\n const needShowFallbackIcon = (failed || !hasSrc) && React.isValidElement(fallbackIconProp);\n\n const fallbackIcon = needShowFallbackIcon ? fallbackIconProp : null;\n\n if (process.env.NODE_ENV === 'development') {\n validateSize(size);\n if (fallbackIcon) {\n validateFallbackIcon(size, { name: 'fallbackIcon', value: fallbackIcon });\n }\n }\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(true);\n setFailed(false);\n onLoad?.(event);\n };\n\n const handleImageError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(false);\n setFailed(true);\n onError?.(event);\n };\n\n const sizeClassName = (() => {\n switch (size) {\n case 28:\n return styles['ImageBase--size-28'];\n case 32:\n return styles['ImageBase--size-32'];\n case 40:\n return styles['ImageBase--size-40'];\n case 48:\n return styles['ImageBase--size-48'];\n case 72:\n return styles['ImageBase--size-72'];\n }\n\n return null;\n })();\n\n return (\n <ImageBaseContext.Provider value={{ size }}>\n <div\n {...restProps}\n ref={getRootRef}\n style={{ ...style, width: size, height: size }}\n className={classNames(\n className,\n styles['ImageBase'],\n sizeClassName,\n loaded && styles['ImageBase--loaded'],\n )}\n role={hasSrc ? 'img' : 'presentation'}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {hasSrc && (\n <img\n ref={getRef}\n alt={alt}\n className={styles['ImageBase__img']}\n crossOrigin={crossOrigin}\n decoding={decoding}\n loading={loading}\n referrerPolicy={referrerPolicy}\n sizes={sizes}\n src={src}\n srcSet={srcSet}\n useMap={useMap}\n width={width}\n height={height}\n onLoad={handleImageLoad}\n onError={handleImageError}\n />\n )}\n {fallbackIcon && (\n <div className={classNames(styles['ImageBase__fallback'])}>{fallbackIcon}</div>\n )}\n {children}\n {withBorder && <div aria-hidden className={styles['ImageBase__border']} />}\n </div>\n </ImageBaseContext.Provider>\n );\n};\n\nImageBase.Badge = ImageBaseBadge;\n\nImageBase.Overlay = ImageBaseOverlay;\n"],"names":["getBadgeIconSizeByImageBaseSize","getFallbackIconSizeByImageBaseSize","getOverlayIconSizeByImageBaseSize","ImageBaseContext","ImageBase","alt","crossOrigin","decoding","loading","referrerPolicy","sizes","src","srcSet","useMap","getRef","size","width","height","style","className","getRootRef","withBorder","fallbackIconProp","children","ariaLabel","onClick","onLoad","onError","restProps","React","useState","loaded","setLoaded","failed","setFailed","hasSrc","needShowFallbackIcon","isValidElement","fallbackIcon","process","env","NODE_ENV","validateSize","validateFallbackIcon","name","value","handleImageLoad","event","handleImageError","sizeClassName","Provider","div","ref","classNames","role","aria-label","img","aria-hidden","Badge","ImageBaseBadge","Overlay","ImageBaseOverlay"],"mappings":";;;;;;;;;;;IAmBEA,+BAA+B;eAA/BA;;IACAC,kCAAkC;eAAlCA;;IACAC,iCAAiC;eAAjCA;;IAGOC,gBAAgB;eAAhBA;;IAqCIC,SAAS;eAATA;;;;;;;;+DA7DU;oBACI;8BAE8B;gCACI;uBAC5B;0BAEkB;uBAe5C;AAuCA,IAAMA,YAAY;QACvBC,aAAAA,KACAC,qBAAAA,aACAC,kBAAAA,UACAC,iBAAAA,SACAC,wBAAAA,gBACAC,eAAAA,OACAC,aAAAA,KACAC,gBAAAA,QACAC,gBAAAA,QACAC,gBAAAA,6BACAC,MAAAA,gCAAO,kBACPC,eAAAA,OACAC,gBAAAA,QACAC,eAAAA,OACAC,mBAAAA,WACAC,oBAAAA,uCACAC,YAAAA,4CAAa,0BACb,AAAgBC,0BAAhB,iBACAC,kBAAAA,UACA,AAAcC,mBAAd,eACAC,iBAAAA,SACAC,gBAAAA,QACAC,iBAAAA,SACGC;QAvBHvB;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACA;QACAE;QACA;QACAE;QACAC;QACAC;;IAGA,IAA4BE,qCAAAA,OAAMC,SAAS,YAApCC,SAAqBF,oBAAbG,YAAaH;IAC5B,IAA4BA,sCAAAA,OAAMC,SAAS,YAApCG,SAAqBJ,qBAAbK,YAAaL;IAE5B,IAAMM,SAASxB,OAAOC;IACtB,IAAMwB,uBAAuB,AAACH,CAAAA,UAAU,CAACE,MAAK,mBAAMN,OAAMQ,eAAef;IAEzE,IAAMgB,eAAeF,uBAAuBd,mBAAmB;IAE/D,IAAIiB,QAAQC,IAAIC,aAAa,eAAe;QAC1CC,IAAAA,0BAAa3B;QACb,IAAIuB,cAAc;YAChBK,IAAAA,kCAAqB5B,MAAM;gBAAE6B,MAAM;gBAAgBC,OAAOP;YAAa;QACzE;IACF;IAEA,IAAMQ,kBAAkB,SAACC;QACvBf,UAAU;QACVE,UAAU;QACVR,mBAAAA,oBAAAA,KAAAA,IAAAA,OAASqB;IACX;IAEA,IAAMC,mBAAmB,SAACD;QACxBf,UAAU;QACVE,UAAU;QACVP,oBAAAA,qBAAAA,KAAAA,IAAAA,QAAUoB;IACZ;IAEA,IAAME,gBAAgB,AAAC;QACrB,OAAQlC;YACN,KAAK;gBACH;YACF,KAAK;gBACH;YACF,KAAK;gBACH;YACF,KAAK;gBACH;YACF,KAAK;gBACH;QACJ;QAEA,OAAO;IACT;IAEA,qBACE,qBAACZ,0BAAiB+C;QAASL,OAAO;YAAE9B,MAAAA;QAAK;qBACvC,qBAACoC,mDACKvB;QACJwB,KAAKhC;QACLF,OAAO,4CAAKA;YAAOF,OAAOD;YAAME,QAAQF;;QACxCI,WAAWkC,IAAAA,kBACTlC,4BAEA8B,eACAlB;QAEFuB,MAAMnB,SAAS,QAAQ;QACvBoB,cAAY/B;QACZC,SAASA;QAERU,wBACC,qBAACqB;QACCJ,KAAKtC;QACLT,KAAKA;QACLc,SAAS;QACTb,aAAaA;QACbC,UAAUA;QACVC,SAASA;QACTC,gBAAgBA;QAChBC,OAAOA;QACPC,KAAKA;QACLC,QAAQA;QACRC,QAAQA;QACRG,OAAOA;QACPC,QAAQA;QACRS,QAAQoB;QACRnB,SAASqB;QAGZV,8BACC,qBAACa;QAAIhC,WAAWkC,IAAAA;OAA4Cf,eAE7Df,UACAF,4BAAc,qBAAC8B;QAAIM,eAAAA;QAAYtC,SAAS;;AAIjD;AAEAf,UAAUsD,QAAQC;AAElBvD,UAAUwD,UAAUC"}
|
|
@@ -6,4 +6,4 @@ export interface ModalCardProps extends NavIdProps, ModalCardBaseProps {
|
|
|
6
6
|
/**
|
|
7
7
|
* @see https://vkcom.github.io/VKUI/#/ModalCard
|
|
8
8
|
*/
|
|
9
|
-
export declare const ModalCard: ({ icon, header, subheader, children, actions, onClose, nav, id, className, size, ...restProps }: ModalCardProps) => React.JSX.Element;
|
|
9
|
+
export declare const ModalCard: ({ icon, header, subheader, children, actions, onClose, nav, id, className, size, getRootRef, ...restProps }: ModalCardProps) => React.JSX.Element;
|
|
@@ -28,7 +28,7 @@ var platformClassNames = {
|
|
|
28
28
|
};
|
|
29
29
|
var warn = (0, _warnOnce.warnOnce)("ModalCard");
|
|
30
30
|
var ModalCard = function(_param) {
|
|
31
|
-
var icon = _param.icon, header = _param.header, subheader = _param.subheader, children = _param.children, actions = _param.actions, onClose = _param.onClose, nav = _param.nav, id = _param.id, className = _param.className, size = _param.size, restProps = _object_without_properties._(_param, [
|
|
31
|
+
var icon = _param.icon, header = _param.header, subheader = _param.subheader, children = _param.children, actions = _param.actions, onClose = _param.onClose, nav = _param.nav, id = _param.id, className = _param.className, size = _param.size, getRootRef = _param.getRootRef, restProps = _object_without_properties._(_param, [
|
|
32
32
|
"icon",
|
|
33
33
|
"header",
|
|
34
34
|
"subheader",
|
|
@@ -38,7 +38,8 @@ var ModalCard = function(_param) {
|
|
|
38
38
|
"nav",
|
|
39
39
|
"id",
|
|
40
40
|
"className",
|
|
41
|
-
"size"
|
|
41
|
+
"size",
|
|
42
|
+
"getRootRef"
|
|
42
43
|
]);
|
|
43
44
|
var isDesktop = (0, _useAdaptivityWithJSMediaQueries.useAdaptivityWithJSMediaQueries)().isDesktop;
|
|
44
45
|
var platform = (0, _usePlatform.usePlatform)();
|
|
@@ -48,6 +49,7 @@ var ModalCard = function(_param) {
|
|
|
48
49
|
id: id
|
|
49
50
|
}, warn), _types.ModalType.CARD).refs;
|
|
50
51
|
return /*#__PURE__*/ _react.createElement("div", _object_spread_props._(_object_spread._({}, restProps), {
|
|
52
|
+
ref: getRootRef,
|
|
51
53
|
id: id,
|
|
52
54
|
className: (0, _vkjs.classNames)("vkuiModalCard", platformClassNames.hasOwnProperty(platform) ? platformClassNames[platform] : platformClassNames.android, isDesktop && "vkuiModalCard--desktop", className)
|
|
53
55
|
}), /*#__PURE__*/ _react.createElement(_ModalCardBase.ModalCardBase, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ModalCard/ModalCard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ModalCardBase, ModalCardBaseProps } from '../ModalCardBase/ModalCardBase';\nimport { ModalRootContext, useModalRegistry } from '../ModalRoot/ModalRootContext';\nimport { ModalType } from '../ModalRoot/types';\nimport styles from './ModalCard.module.css';\n\nconst platformClassNames = {\n ios: styles['ModalCard--ios'],\n android: styles['ModalCard--android'],\n vkcom: styles['ModalCard--vkcom'],\n};\n\nexport interface ModalCardProps extends NavIdProps, ModalCardBaseProps {}\n\nconst warn = warnOnce('ModalCard');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ModalCard\n */\nexport const ModalCard = ({\n icon,\n header,\n subheader,\n children,\n actions,\n onClose,\n nav,\n id,\n className,\n size,\n ...restProps\n}: ModalCardProps) => {\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const platform = usePlatform();\n\n const modalContext = React.useContext(ModalRootContext);\n const { refs } = useModalRegistry(getNavId({ nav, id }, warn), ModalType.CARD);\n\n return (\n <div\n {...restProps}\n id={id}\n className={classNames(\n styles['ModalCard'],\n platformClassNames.hasOwnProperty(platform)\n ? platformClassNames[platform]\n : platformClassNames.android,\n isDesktop && styles['ModalCard--desktop'],\n className,\n )}\n >\n <ModalCardBase\n className={styles['ModalCard__in']}\n getRootRef={refs.innerElement}\n icon={icon}\n header={header}\n subheader={subheader}\n actions={actions}\n onClose={onClose || modalContext.onClose}\n size={size}\n >\n {children}\n </ModalCardBase>\n </div>\n );\n};\n"],"names":["ModalCard","platformClassNames","ios","android","vkcom","warn","warnOnce","icon","header","subheader","children","actions","onClose","nav","id","className","size","restProps","isDesktop","useAdaptivityWithJSMediaQueries","platform","usePlatform","modalContext","React","useContext","ModalRootContext","refs","useModalRegistry","getNavId","ModalType","CARD","div","classNames","hasOwnProperty","ModalCardBase","
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ModalCard/ModalCard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ModalCardBase, ModalCardBaseProps } from '../ModalCardBase/ModalCardBase';\nimport { ModalRootContext, useModalRegistry } from '../ModalRoot/ModalRootContext';\nimport { ModalType } from '../ModalRoot/types';\nimport styles from './ModalCard.module.css';\n\nconst platformClassNames = {\n ios: styles['ModalCard--ios'],\n android: styles['ModalCard--android'],\n vkcom: styles['ModalCard--vkcom'],\n};\n\nexport interface ModalCardProps extends NavIdProps, ModalCardBaseProps {}\n\nconst warn = warnOnce('ModalCard');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ModalCard\n */\nexport const ModalCard = ({\n icon,\n header,\n subheader,\n children,\n actions,\n onClose,\n nav,\n id,\n className,\n size,\n getRootRef,\n ...restProps\n}: ModalCardProps) => {\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const platform = usePlatform();\n\n const modalContext = React.useContext(ModalRootContext);\n const { refs } = useModalRegistry(getNavId({ nav, id }, warn), ModalType.CARD);\n\n return (\n <div\n {...restProps}\n ref={getRootRef}\n id={id}\n className={classNames(\n styles['ModalCard'],\n platformClassNames.hasOwnProperty(platform)\n ? platformClassNames[platform]\n : platformClassNames.android,\n isDesktop && styles['ModalCard--desktop'],\n className,\n )}\n >\n <ModalCardBase\n className={styles['ModalCard__in']}\n getRootRef={refs.innerElement}\n icon={icon}\n header={header}\n subheader={subheader}\n actions={actions}\n onClose={onClose || modalContext.onClose}\n size={size}\n >\n {children}\n </ModalCardBase>\n </div>\n );\n};\n"],"names":["ModalCard","platformClassNames","ios","android","vkcom","warn","warnOnce","icon","header","subheader","children","actions","onClose","nav","id","className","size","getRootRef","restProps","isDesktop","useAdaptivityWithJSMediaQueries","platform","usePlatform","modalContext","React","useContext","ModalRootContext","refs","useModalRegistry","getNavId","ModalType","CARD","div","ref","classNames","hasOwnProperty","ModalCardBase","innerElement"],"mappings":";;;;+BAwBaA;;;eAAAA;;;;;;;+DAxBU;oBACI;+CACqB;2BACpB;wBACS;wBACZ;6BACyB;gCACC;qBACzB;AAG1B,IAAMC,qBAAqB;IACzBC,GAAG;IACHC,OAAO;IACPC,KAAK;AACP;AAIA,IAAMC,OAAOC,IAAAA,oBAAS;AAKf,IAAMN,YAAY;QACvBO,cAAAA,MACAC,gBAAAA,QACAC,mBAAAA,WACAC,kBAAAA,UACAC,iBAAAA,SACAC,iBAAAA,SACAC,aAAAA,KACAC,YAAAA,IACAC,mBAAAA,WACAC,cAAAA,MACAC,oBAAAA,YACGC;QAXHX;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAM,AAAEE,YAAcC,IAAAA,oEAAdD;IACR,IAAME,WAAWC,IAAAA;IAEjB,IAAMC,eAAeC,OAAMC,WAAWC;IACtC,IAAM,AAAEC,OAASC,IAAAA,oCAAiBC,IAAAA,oBAAS;QAAEhB,KAAAA;QAAKC,IAAAA;IAAG,GAAGT,OAAOyB,iBAAUC,MAAjEJ;IAER,qBACE,qBAACK,mDACKd;QACJe,KAAKhB;QACLH,IAAIA;QACJC,WAAWmB,IAAAA,mCAETjC,mBAAmBkC,eAAed,YAC9BpB,kBAAkB,CAACoB,SAAS,GAC5BpB,mBAAmBE,SACvBgB,uCACAJ;sBAGF,qBAACqB;QACCrB,SAAS;QACTE,YAAYU,KAAKU;QACjB9B,MAAMA;QACNC,QAAQA;QACRC,WAAWA;QACXE,SAASA;QACTC,SAASA,WAAWW,aAAaX;QACjCI,MAAMA;OAELN;AAIT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { HasComponent } from '../../types';
|
|
3
|
+
export interface LegacyPanelHeaderContentProps extends React.HTMLAttributes<HTMLElement>, HasComponent {
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* TODO [>=6]: Удалить подкомпонент
|
|
7
|
+
* @deprecated
|
|
8
|
+
*/
|
|
9
|
+
export declare const LegacyPanelHeaderContent: {
|
|
10
|
+
({ children, Component, id, }: LegacyPanelHeaderContentProps): React.JSX.Element;
|
|
11
|
+
displayName: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LegacyPanelHeaderContent", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LegacyPanelHeaderContent;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
|
|
12
|
+
var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
13
|
+
var _usePlatform = require("../../hooks/usePlatform");
|
|
14
|
+
var _platform = require("../../lib/platform");
|
|
15
|
+
var _warnOnce = require("../../lib/warnOnce");
|
|
16
|
+
var _Text = require("../Typography/Text/Text");
|
|
17
|
+
var warn = (0, _warnOnce.warnOnce)("PanelHeader");
|
|
18
|
+
var LegacyPanelHeaderContent = function(param) {
|
|
19
|
+
var children = param.children, _param_Component = param.Component, Component = _param_Component === void 0 ? "span" : _param_Component, id = param.id;
|
|
20
|
+
if (process.env.NODE_ENV === "development") {
|
|
21
|
+
warn("Подкомпонент PanelHeader.Content устарел и будет удалён в v6. Используйте параметр typographyProps.");
|
|
22
|
+
}
|
|
23
|
+
var platform = (0, _usePlatform.usePlatform)();
|
|
24
|
+
return platform === _platform.Platform.VKCOM ? /*#__PURE__*/ _react.createElement(_Text.Text, {
|
|
25
|
+
weight: "2",
|
|
26
|
+
Component: Component,
|
|
27
|
+
id: id
|
|
28
|
+
}, children) : /*#__PURE__*/ _react.createElement(Component, {
|
|
29
|
+
className: "vkuiPanelHeader__content-in",
|
|
30
|
+
id: id
|
|
31
|
+
}, children);
|
|
32
|
+
};
|
|
33
|
+
LegacyPanelHeaderContent.displayName = "LegacyPanelHeaderContent";
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=LegacyPanelHeaderContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/PanelHeader/LegacyPanelHeaderContent.tsx"],"sourcesContent":["import * as React from 'react';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasComponent } from '../../types';\nimport { Text } from '../Typography/Text/Text';\nimport styles from './PanelHeader.module.css';\n\nexport interface LegacyPanelHeaderContentProps\n extends React.HTMLAttributes<HTMLElement>,\n HasComponent {}\n\nconst warn = warnOnce('PanelHeader');\n\n/**\n * TODO [>=6]: Удалить подкомпонент\n * @deprecated\n */\nexport const LegacyPanelHeaderContent = ({\n children,\n Component = 'span',\n id,\n}: LegacyPanelHeaderContentProps) => {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Подкомпонент PanelHeader.Content устарел и будет удалён в v6. Используйте параметр typographyProps.',\n );\n }\n\n const platform = usePlatform();\n\n return platform === Platform.VKCOM ? (\n <Text weight=\"2\" Component={Component} id={id}>\n {children}\n </Text>\n ) : (\n <Component className={styles['PanelHeader__content-in']} id={id}>\n {children}\n </Component>\n );\n};\n\nLegacyPanelHeaderContent.displayName = 'LegacyPanelHeaderContent';\n"],"names":["LegacyPanelHeaderContent","warn","warnOnce","children","Component","id","process","env","NODE_ENV","platform","usePlatform","Platform","VKCOM","Text","weight","className","displayName"],"mappings":";;;;+BAkBaA;;;eAAAA;;;;+DAlBU;2BACK;wBACH;wBACA;oBAEJ;AAOrB,IAAMC,OAAOC,IAAAA,oBAAS;AAMf,IAAMF,2BAA2B;QACtCG,iBAAAA,mCACAC,WAAAA,0CAAY,2BACZC,WAAAA;IAEA,IAAIC,QAAQC,IAAIC,aAAa,eAAe;QAC1CP,KACE;IAEJ;IAEA,IAAMQ,WAAWC,IAAAA;IAEjB,OAAOD,aAAaE,mBAASC,sBAC3B,qBAACC;QAAKC,QAAO;QAAIV,WAAWA;QAAWC,IAAIA;OACxCF,0BAGH,qBAACC;QAAUW,SAAS;QAAqCV,IAAIA;OAC1DF;AAGP;AAEAH,yBAAyBgB,cAAc"}
|
|
@@ -2,6 +2,11 @@ import * as React from 'react';
|
|
|
2
2
|
import { HasComponent, HasRef, HasRootRef } from '../../types';
|
|
3
3
|
export interface PanelHeaderProps extends React.HTMLAttributes<HTMLDivElement>, HasRef<HTMLDivElement>, HasRootRef<HTMLDivElement> {
|
|
4
4
|
before?: React.ReactNode;
|
|
5
|
+
/**
|
|
6
|
+
* Добавляет элемент справа.
|
|
7
|
+
*
|
|
8
|
+
* При передаче нескольких элементов, расставляет отступы между ними.
|
|
9
|
+
*/
|
|
5
10
|
after?: React.ReactNode;
|
|
6
11
|
separator?: boolean;
|
|
7
12
|
transparent?: boolean;
|
|
@@ -25,10 +30,7 @@ export interface PanelHeaderProps extends React.HTMLAttributes<HTMLDivElement>,
|
|
|
25
30
|
export declare const PanelHeader: {
|
|
26
31
|
({ before, children, after, separator, visor, transparent, shadow, getRef, getRootRef, fixed, className, typographyProps, ...restProps }: PanelHeaderProps): React.JSX.Element;
|
|
27
32
|
Content: {
|
|
28
|
-
({ children, Component, id, }: LegacyPanelHeaderContentProps): React.JSX.Element;
|
|
33
|
+
({ children, Component, id, }: import("./LegacyPanelHeaderContent").LegacyPanelHeaderContentProps): React.JSX.Element;
|
|
29
34
|
displayName: string;
|
|
30
35
|
};
|
|
31
36
|
};
|
|
32
|
-
interface LegacyPanelHeaderContentProps extends React.HTMLAttributes<HTMLElement>, HasComponent {
|
|
33
|
-
}
|
|
34
|
-
export {};
|
|
@@ -19,7 +19,6 @@ var _useAdaptivityConditionalRender = require("../../hooks/useAdaptivityConditio
|
|
|
19
19
|
var _usePlatform = require("../../hooks/usePlatform");
|
|
20
20
|
var _adaptivity = require("../../lib/adaptivity");
|
|
21
21
|
var _platform = require("../../lib/platform");
|
|
22
|
-
var _warnOnce = require("../../lib/warnOnce");
|
|
23
22
|
var _ConfigProviderContext = require("../ConfigProvider/ConfigProviderContext");
|
|
24
23
|
var _FixedLayout = require("../FixedLayout/FixedLayout");
|
|
25
24
|
var _ModalRootContext = require("../ModalRoot/ModalRootContext");
|
|
@@ -27,6 +26,7 @@ var _Separator = require("../Separator/Separator");
|
|
|
27
26
|
var _Spacing = require("../Spacing/Spacing");
|
|
28
27
|
var _TooltipContainer = require("../Tooltip/TooltipContainer");
|
|
29
28
|
var _Text = require("../Typography/Text/Text");
|
|
29
|
+
var _LegacyPanelHeaderContent = require("./LegacyPanelHeaderContent");
|
|
30
30
|
var platformClassNames = {
|
|
31
31
|
ios: (0, _vkjs.classNames)("vkuiPanelHeader--ios", "vkuiInternalPanelHeader--ios"),
|
|
32
32
|
android: (0, _vkjs.classNames)("vkuiPanelHeader--android", "vkuiInternalPanelHeader--android"),
|
|
@@ -47,7 +47,7 @@ var PanelHeaderIn = function(param) {
|
|
|
47
47
|
var typographyNode;
|
|
48
48
|
// TODO [>=6]: Удалить условие
|
|
49
49
|
if (/*#__PURE__*/ _react.isValidElement(children) && // eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
50
|
-
children.type.displayName === LegacyPanelHeaderContent.displayName) {
|
|
50
|
+
children.type.displayName === _LegacyPanelHeaderContent.LegacyPanelHeaderContent.displayName) {
|
|
51
51
|
typographyNode = children;
|
|
52
52
|
} else {
|
|
53
53
|
typographyNode = platform === _platform.Platform.VKCOM ? /*#__PURE__*/ _react.createElement(_Text.Text, _object_spread._({
|
|
@@ -116,26 +116,6 @@ var PanelHeader = function(_param) {
|
|
|
116
116
|
size: 16
|
|
117
117
|
})));
|
|
118
118
|
};
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* TODO [>=6]: Удалить подкомпонент
|
|
122
|
-
* @deprecated
|
|
123
|
-
*/ var LegacyPanelHeaderContent = function(param) {
|
|
124
|
-
var children = param.children, _param_Component = param.Component, Component = _param_Component === void 0 ? "span" : _param_Component, id = param.id;
|
|
125
|
-
if (process.env.NODE_ENV === "development") {
|
|
126
|
-
warn("Подкомпонент PanelHeader.Content устарел и будет удалён в v6. Используйте параметр typographyProps.");
|
|
127
|
-
}
|
|
128
|
-
var platform = (0, _usePlatform.usePlatform)();
|
|
129
|
-
return platform === _platform.Platform.VKCOM ? /*#__PURE__*/ _react.createElement(_Text.Text, {
|
|
130
|
-
weight: "2",
|
|
131
|
-
Component: Component,
|
|
132
|
-
id: id
|
|
133
|
-
}, children) : /*#__PURE__*/ _react.createElement(Component, {
|
|
134
|
-
className: "vkuiPanelHeader__content-in",
|
|
135
|
-
id: id
|
|
136
|
-
}, children);
|
|
137
|
-
};
|
|
138
|
-
LegacyPanelHeaderContent.displayName = "LegacyPanelHeaderContent";
|
|
139
|
-
PanelHeader.Content = LegacyPanelHeaderContent;
|
|
119
|
+
PanelHeader.Content = _LegacyPanelHeaderContent.LegacyPanelHeaderContent;
|
|
140
120
|
|
|
141
121
|
//# sourceMappingURL=PanelHeader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/PanelHeader/PanelHeader.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasComponent, HasRef, HasRootRef } from '../../types';\nimport { useConfigProvider, WebviewType } from '../ConfigProvider/ConfigProviderContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { TooltipContainer } from '../Tooltip/TooltipContainer';\nimport { Text } from '../Typography/Text/Text';\nimport styles from './PanelHeader.module.css';\n\nconst platformClassNames = {\n ios: classNames(styles['PanelHeader--ios'], 'vkuiInternalPanelHeader--ios'),\n android: classNames(styles['PanelHeader--android'], 'vkuiInternalPanelHeader--android'),\n vkcom: classNames(styles['PanelHeader--vkcom'], 'vkuiInternalPanelHeader--vkcom'),\n};\n\nconst sizeXClassNames = {\n none: styles['PanelHeader--sizeX-none'],\n regular: styles['PanelHeader--sizeX-regular'],\n};\n\nexport interface PanelHeaderProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n before?: React.ReactNode;\n after?: React.ReactNode;\n separator?: boolean;\n transparent?: boolean;\n shadow?: boolean;\n /**\n * Если `false`, то шапка будет нулевой высоты и контент панели \"залезет\" под неё\n */\n visor?: boolean;\n /**\n * Если `false`, то шапка будет в потоке. По умолчанию `true`, но если платформа vkcom, то по умолчанию `false`.\n */\n fixed?: boolean;\n /**\n * По умолчанию как `Component` используется `span`.\n */\n typographyProps?: HasComponent & React.HTMLAttributes<HTMLElement>;\n}\n\nconst PanelHeaderIn = ({\n before,\n after,\n separator,\n children,\n typographyProps = {},\n}: PanelHeaderProps) => {\n const { Component = 'span', ...restProps } = typographyProps;\n const { webviewType } = useConfigProvider();\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n\n let typographyNode: React.ReactNode;\n\n // TODO [>=6]: Удалить условие\n if (\n React.isValidElement(children) &&\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n (children as JSX.Element).type.displayName === LegacyPanelHeaderContent.displayName\n ) {\n typographyNode = children;\n } else {\n typographyNode =\n platform === Platform.VKCOM ? (\n <Text weight=\"2\" Component={Component} {...restProps}>\n {children}\n </Text>\n ) : (\n <Component className={styles['PanelHeader__content-in']} {...restProps}>\n {children}\n </Component>\n );\n }\n\n return (\n <React.Fragment>\n <TooltipContainer fixed className={styles['PanelHeader__in']}>\n <div\n className={classNames(styles['PanelHeader__before'], 'vkuiInternalPanelHeader__before')}\n >\n {before}\n </div>\n <div className={styles['PanelHeader__content']}>{typographyNode}</div>\n <div className={classNames(styles['PanelHeader__after'], 'vkuiInternalPanelHeader__after')}>\n {(webviewType === WebviewType.INTERNAL || isInsideModal) && after}\n </div>\n </TooltipContainer>\n {separator && platform === Platform.VKCOM && (\n <Separator className={styles['PanelHeader__separator']} wide />\n )}\n </React.Fragment>\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PanelHeader\n */\nexport const PanelHeader = ({\n before,\n children,\n after,\n separator = true,\n visor = true,\n transparent = false,\n shadow,\n getRef,\n getRootRef,\n fixed,\n className,\n typographyProps,\n ...restProps\n}: PanelHeaderProps) => {\n const platform = usePlatform();\n const { webviewType } = useConfigProvider();\n const { isInsideModal } = React.useContext(ModalRootContext);\n const { sizeX = 'none' } = useAdaptivity();\n const { sizeX: adaptiveSizeX } = useAdaptivityConditionalRender();\n let isFixed = fixed !== undefined ? fixed : platform !== Platform.VKCOM;\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['PanelHeader'],\n 'vkuiInternalPanelHeader',\n platformClassNames.hasOwnProperty(platform)\n ? platformClassNames[platform]\n : platformClassNames.android,\n transparent && styles['PanelHeader--trnsp'],\n shadow && styles['PanelHeader--shadow'],\n visor && classNames(styles['PanelHeader--vis'], 'vkuiInternalPanelHeader--vis'),\n separator &&\n visor &&\n classNames(styles['PanelHeader--sep'], 'vkuiInternalPanelHeader--sep'),\n webviewType === WebviewType.VKAPPS && !isInsideModal && styles['PanelHeader--vkapps'],\n !before &&\n classNames(styles['PanelHeader--no-before'], 'vkuiInternalPanelHeader--no-before'),\n !after && styles['PanelHeader--no-after'],\n isFixed && styles['PanelHeader--fixed'],\n sizeX !== SizeType.COMPACT && sizeXClassNames[sizeX],\n className,\n )}\n ref={isFixed ? getRootRef : getRef}\n >\n {isFixed ? (\n <FixedLayout\n className={classNames(styles['PanelHeader__fixed'], 'vkuiInternalPanelHeader__fixed')}\n vertical=\"top\"\n getRootRef={getRef}\n >\n <PanelHeaderIn\n before={before}\n after={after}\n separator={separator}\n typographyProps={typographyProps}\n >\n {children}\n </PanelHeaderIn>\n </FixedLayout>\n ) : (\n <PanelHeaderIn\n before={before}\n after={after}\n separator={separator}\n typographyProps={typographyProps}\n >\n {children}\n </PanelHeaderIn>\n )}\n {separator && visor && platform !== Platform.VKCOM && (\n <React.Fragment>\n {adaptiveSizeX.compact && <Separator className={adaptiveSizeX.compact.className} />}\n {adaptiveSizeX.regular && (\n <Spacing className={adaptiveSizeX.regular.className} size={16} />\n )}\n </React.Fragment>\n )}\n </div>\n );\n};\n\ninterface LegacyPanelHeaderContentProps extends React.HTMLAttributes<HTMLElement>, HasComponent {}\n\nconst warn = warnOnce('PanelHeader');\n\n/**\n * TODO [>=6]: Удалить подкомпонент\n * @deprecated\n */\nconst LegacyPanelHeaderContent = ({\n children,\n Component = 'span',\n id,\n}: LegacyPanelHeaderContentProps) => {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Подкомпонент PanelHeader.Content устарел и будет удалён в v6. Используйте параметр typographyProps.',\n );\n }\n\n const platform = usePlatform();\n\n return platform === Platform.VKCOM ? (\n <Text weight=\"2\" Component={Component} id={id}>\n {children}\n </Text>\n ) : (\n <Component className={styles['PanelHeader__content-in']} id={id}>\n {children}\n </Component>\n );\n};\n\nLegacyPanelHeaderContent.displayName = 'LegacyPanelHeaderContent';\n\nPanelHeader.Content = LegacyPanelHeaderContent;\n"],"names":["PanelHeader","platformClassNames","ios","classNames","android","vkcom","sizeXClassNames","none","regular","PanelHeaderIn","before","after","separator","children","typographyProps","Component","restProps","webviewType","useConfigProvider","isInsideModal","React","useContext","ModalRootContext","platform","usePlatform","typographyNode","isValidElement","type","displayName","LegacyPanelHeaderContent","Platform","VKCOM","Text","weight","className","Fragment","TooltipContainer","fixed","div","WebviewType","INTERNAL","Separator","wide","visor","transparent","shadow","getRef","getRootRef","useAdaptivity","sizeX","useAdaptivityConditionalRender","adaptiveSizeX","isFixed","undefined","hasOwnProperty","VKAPPS","SizeType","COMPACT","ref","FixedLayout","vertical","compact","Spacing","size","warn","warnOnce","id","process","env","NODE_ENV","Content"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/PanelHeader/PanelHeader.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { HasComponent, HasRef, HasRootRef } from '../../types';\nimport { useConfigProvider, WebviewType } from '../ConfigProvider/ConfigProviderContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { TooltipContainer } from '../Tooltip/TooltipContainer';\nimport { Text } from '../Typography/Text/Text';\nimport { LegacyPanelHeaderContent } from './LegacyPanelHeaderContent';\nimport styles from './PanelHeader.module.css';\n\nconst platformClassNames = {\n ios: classNames(styles['PanelHeader--ios'], 'vkuiInternalPanelHeader--ios'),\n android: classNames(styles['PanelHeader--android'], 'vkuiInternalPanelHeader--android'),\n vkcom: classNames(styles['PanelHeader--vkcom'], 'vkuiInternalPanelHeader--vkcom'),\n};\n\nconst sizeXClassNames = {\n none: styles['PanelHeader--sizeX-none'],\n regular: styles['PanelHeader--sizeX-regular'],\n};\n\nexport interface PanelHeaderProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n before?: React.ReactNode;\n /**\n * Добавляет элемент справа.\n *\n * При передаче нескольких элементов, расставляет отступы между ними.\n */\n after?: React.ReactNode;\n separator?: boolean;\n transparent?: boolean;\n shadow?: boolean;\n /**\n * Если `false`, то шапка будет нулевой высоты и контент панели \"залезет\" под неё\n */\n visor?: boolean;\n /**\n * Если `false`, то шапка будет в потоке. По умолчанию `true`, но если платформа vkcom, то по умолчанию `false`.\n */\n fixed?: boolean;\n /**\n * По умолчанию как `Component` используется `span`.\n */\n typographyProps?: HasComponent & React.HTMLAttributes<HTMLElement>;\n}\n\nconst PanelHeaderIn = ({\n before,\n after,\n separator,\n children,\n typographyProps = {},\n}: PanelHeaderProps) => {\n const { Component = 'span', ...restProps } = typographyProps;\n const { webviewType } = useConfigProvider();\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n\n let typographyNode: React.ReactNode;\n\n // TODO [>=6]: Удалить условие\n if (\n React.isValidElement(children) &&\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n (children as JSX.Element).type.displayName === LegacyPanelHeaderContent.displayName\n ) {\n typographyNode = children;\n } else {\n typographyNode =\n platform === Platform.VKCOM ? (\n <Text weight=\"2\" Component={Component} {...restProps}>\n {children}\n </Text>\n ) : (\n <Component className={styles['PanelHeader__content-in']} {...restProps}>\n {children}\n </Component>\n );\n }\n\n return (\n <React.Fragment>\n <TooltipContainer fixed className={styles['PanelHeader__in']}>\n <div\n className={classNames(styles['PanelHeader__before'], 'vkuiInternalPanelHeader__before')}\n >\n {before}\n </div>\n <div className={styles['PanelHeader__content']}>{typographyNode}</div>\n <div className={classNames(styles['PanelHeader__after'], 'vkuiInternalPanelHeader__after')}>\n {(webviewType === WebviewType.INTERNAL || isInsideModal) && after}\n </div>\n </TooltipContainer>\n {separator && platform === Platform.VKCOM && (\n <Separator className={styles['PanelHeader__separator']} wide />\n )}\n </React.Fragment>\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PanelHeader\n */\nexport const PanelHeader = ({\n before,\n children,\n after,\n separator = true,\n visor = true,\n transparent = false,\n shadow,\n getRef,\n getRootRef,\n fixed,\n className,\n typographyProps,\n ...restProps\n}: PanelHeaderProps) => {\n const platform = usePlatform();\n const { webviewType } = useConfigProvider();\n const { isInsideModal } = React.useContext(ModalRootContext);\n const { sizeX = 'none' } = useAdaptivity();\n const { sizeX: adaptiveSizeX } = useAdaptivityConditionalRender();\n let isFixed = fixed !== undefined ? fixed : platform !== Platform.VKCOM;\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['PanelHeader'],\n 'vkuiInternalPanelHeader',\n platformClassNames.hasOwnProperty(platform)\n ? platformClassNames[platform]\n : platformClassNames.android,\n transparent && styles['PanelHeader--trnsp'],\n shadow && styles['PanelHeader--shadow'],\n visor && classNames(styles['PanelHeader--vis'], 'vkuiInternalPanelHeader--vis'),\n separator &&\n visor &&\n classNames(styles['PanelHeader--sep'], 'vkuiInternalPanelHeader--sep'),\n webviewType === WebviewType.VKAPPS && !isInsideModal && styles['PanelHeader--vkapps'],\n !before &&\n classNames(styles['PanelHeader--no-before'], 'vkuiInternalPanelHeader--no-before'),\n !after && styles['PanelHeader--no-after'],\n isFixed && styles['PanelHeader--fixed'],\n sizeX !== SizeType.COMPACT && sizeXClassNames[sizeX],\n className,\n )}\n ref={isFixed ? getRootRef : getRef}\n >\n {isFixed ? (\n <FixedLayout\n className={classNames(styles['PanelHeader__fixed'], 'vkuiInternalPanelHeader__fixed')}\n vertical=\"top\"\n getRootRef={getRef}\n >\n <PanelHeaderIn\n before={before}\n after={after}\n separator={separator}\n typographyProps={typographyProps}\n >\n {children}\n </PanelHeaderIn>\n </FixedLayout>\n ) : (\n <PanelHeaderIn\n before={before}\n after={after}\n separator={separator}\n typographyProps={typographyProps}\n >\n {children}\n </PanelHeaderIn>\n )}\n {separator && visor && platform !== Platform.VKCOM && (\n <React.Fragment>\n {adaptiveSizeX.compact && <Separator className={adaptiveSizeX.compact.className} />}\n {adaptiveSizeX.regular && (\n <Spacing className={adaptiveSizeX.regular.className} size={16} />\n )}\n </React.Fragment>\n )}\n </div>\n );\n};\n\nPanelHeader.Content = LegacyPanelHeaderContent;\n"],"names":["PanelHeader","platformClassNames","ios","classNames","android","vkcom","sizeXClassNames","none","regular","PanelHeaderIn","before","after","separator","children","typographyProps","Component","restProps","webviewType","useConfigProvider","isInsideModal","React","useContext","ModalRootContext","platform","usePlatform","typographyNode","isValidElement","type","displayName","LegacyPanelHeaderContent","Platform","VKCOM","Text","weight","className","Fragment","TooltipContainer","fixed","div","WebviewType","INTERNAL","Separator","wide","visor","transparent","shadow","getRef","getRootRef","useAdaptivity","sizeX","useAdaptivityConditionalRender","adaptiveSizeX","isFixed","undefined","hasOwnProperty","VKAPPS","SizeType","COMPACT","ref","FixedLayout","vertical","compact","Spacing","size","Content"],"mappings":"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"}
|
|
@@ -218,7 +218,8 @@ var PullToRefresh = function(_param) {
|
|
|
218
218
|
onEnd: onTouchEnd,
|
|
219
219
|
className: (0, _vkjs.classNames)("vkuiPullToRefresh", platform === _platform.Platform.IOS && "vkuiPullToRefresh--ios", watching && "vkuiPullToRefresh--watching", refreshing && "vkuiPullToRefresh--refreshing", className)
|
|
220
220
|
}), /*#__PURE__*/ _react.createElement(_FixedLayout.FixedLayout, {
|
|
221
|
-
className: "vkuiPullToRefresh__controls"
|
|
221
|
+
className: "vkuiPullToRefresh__controls",
|
|
222
|
+
useParentWidth: true
|
|
222
223
|
}, /*#__PURE__*/ _react.createElement(_PullToRefreshSpinner.PullToRefreshSpinner, {
|
|
223
224
|
style: {
|
|
224
225
|
transform: spinnerTransform,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const onWindowTouchMove = (event: Event) => {\n if (refreshing) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n onRefresh();\n runTapticImpactOccurred('light');\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n };\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']}>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["PullToRefresh","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","children","isFetching","onRefresh","className","restProps","platform","usePlatform","scroll","useScroll","document","useDOM","prevIsFetching","usePrevious","initParams","React","useMemo","start","Platform","IOS","max","maxY","refreshing","positionMultiplier","useState","spinnerY","setSpinnerY","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","onWindowTouchMove","useGlobalEventListener","resetRefreshingState","useCallback","onRefreshingFinish","useTimeout","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","useIsomorphicLayoutEffect","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurred","onTouchStart","e","onTouchMove","isY","shiftY","pageYOffset","getScroll","y","shift","Math","current","currentY","clamp","progress","abs","onTouchEnd","spinnerTransform","contentTransform","TouchRootContext","Provider","value","Touch","onStart","onMove","onEnd","classNames","FixedLayout","PullToRefreshSpinner","style","transform","WebkitTransform","opacity","on","div"],"mappings":";;;;+BAwDaA;;;eAAAA;;;;;;;;;+DAxDU;oBACI;oBACL;sCACiB;2BACX;2BACA;0BACD;mBACM;wBACR;sBACe;yCACE;6BAEQ;2BACtB;qBACkB;qEACjB;oCACQ;AAGrC,SAASC,YAAYC,KAAU;IAC7B,IAAI,CAACA,OAAO;QACV,OAAO;IACT;IACA,MAAOA,MAAMC,cAAe;QAC1BD,QAAQA,MAAMC;IAChB;IACA,IAAID,MAAME,kBAAkBF,MAAMG,YAAY;QAC5CH,MAAME;IACR;IACA,IAAIF,MAAMI,iBAAiB;QACzBJ,MAAMI;IACR;IACA,OAAO;AACT;AAeA,IAAMC,0BAA0B;IAC9BF,YAAY;IACZG,SAAS;AACX;AAKO,IAAMR,gBAAgB;QAC3BS,kBAAAA,UACAC,oBAAAA,YACAC,mBAAAA,WACAC,mBAAAA,WACGC;QAJHJ;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWC,IAAAA;IACjB,IAAMC,SAASC,IAAAA;IACf,IAAM,AAAEC,WAAaC,IAAAA,eAAbD;IACR,IAAME,iBAAiBC,IAAAA,0BAAYX;IAEnC,IAAMY,aAAaC,OAAMC,QACvB;eAAO;YACLC,OAAOX,aAAaY,mBAASC,MAAM,CAAC,KAAK,CAAC;YAC1CC,KAAKd,aAAaY,mBAASC,MAAM,KAAK;YACtCE,MAAMf,aAAaY,mBAASC,MAAM,MAAM;YACxCG,YAAYhB,aAAaY,mBAASC,MAAM,KAAK;YAC7CI,oBAAoBjB,aAAaY,mBAASC,MAAM,OAAO;QACzD;OACA;QAACb;KAAS;IAGZ,IAAgCS,qCAAAA,OAAMS,SAASV,WAAWG,YAAnDQ,WAAyBV,oBAAfW,cAAeX;IAChC,IAAgCA,sCAAAA,OAAMS,SAAS,YAAxCG,WAAyBZ,qBAAfa,cAAeb;IAChC,IAAoCA,sCAAAA,OAAMS,SAAS,YAA5CF,aAA6BP,qBAAjBc,gBAAiBd;IACpC,IAAoCA,sCAAAA,OAAMS,SAAS,YAA5CM,aAA6Bf,qBAAjBgB,gBAAiBhB;IACpC,IAAkCA,sCAAAA,OAAMS,SAAS,YAA1CQ,YAA2BjB,qBAAhBkB,eAAgBlB;IAClC,IAAMmB,gBAAgBrB,IAAAA,0BAAYmB;IAElC,IAAMG,SAASpB,OAAMqB,OAAO;IAC5B,IAAwCrB,sCAAAA,OAAMS,SAAS,QAAhDa,eAAiCtB,qBAAnBuB,kBAAmBvB;IACxC,IAA8CA,sCAAAA,OAAMS,SAAS,QAAtDe,kBAAuCxB,qBAAtByB,qBAAsBzB;IAE9C,IAAM0B,oBAAoB,SAAC/C;QACzB,IAAI4B,YAAY;YACd5B,MAAME;YACNF,MAAMI;QACR;IACF;IAEA4C,IAAAA,gDAAuBhC,UAAU,aAAa+B,mBAAmB1C;IAEjE,IAAM4C,uBAAuB5B,OAAM6B,YAAY;QAC7ChB,YAAY;QACZG,cAAc;QACdF,cAAc;QACdH,YAAYZ,WAAWG;QACvBuB,mBAAmB;QACnBF,gBAAgB;IAClB,GAAG;QAACxB;KAAW;IAEf,IAAM+B,qBAAqB9B,OAAM6B,YAAY;QAC3C,IAAI,CAACZ,WAAW;YACdW;QACF;IACF,GAAG;QAACX;QAAWW;KAAqB;IAEpC,IAAyEG,eAAAA,IAAAA,wBACvED,oBACA,OAFME,AAAKC,yBAA4DF,aAAjEC,KAA6BE,AAAOC,2BAA6BJ,aAApCG;IAKrCE,IAAAA,sDAA0B;QACxB,IAAIvC,mBAAmBwC,aAAaxC,kBAAkB,CAACV,YAAY;YACjE2C;QACF;IACF,GAAG;QAACjC;QAAgBV;QAAY2C;KAAmB;IAEnDM,IAAAA,sDAA0B;QACxB,IAAIvC,mBAAmBwC,aAAa,CAACxC,kBAAkBV,YAAY;YACjEgD;QACF;IACF,GAAG;QAAChD;QAAYU;QAAgBsC;KAAyB;IAEzD,IAAMG,gBAAgBtC,OAAM6B,YAAY;QACtC,IAAI,CAACtB,cAAcnB,WAAW;YAC5B,wDAAwD;YACxD6C;YAEAnB,cAAc;YACdH,YAAY,SAAC4B;uBACXhD,aAAaY,mBAASC,MAAMmC,eAAexC,WAAWQ;;YAGxDnB;YACAoD,IAAAA,iCAAwB;QAC1B;IACF,GAAG;QAACjC;QAAYnB;QAAW6C;QAAwB1C;QAAUQ,WAAWQ;KAAW;IAEnF6B,IAAAA,sDAA0B;QACxB,IAAIjB,kBAAkBkB,aAAalB,iBAAiB,CAACF,WAAW;YAC9D,IAAI,CAACV,cAAcQ,YAAY;gBAC7BuB;YACF,OAAO,IAAI/B,cAAc,CAACpB,YAAY;gBACpC,gDAAgD;gBAChDyC;YACF,OAAO;gBACL,gDAAgD;gBAChD,4DAA4D;gBAC5DjB,YAAYJ,aAAaR,WAAWQ,aAAaR,WAAWG;gBAC5DuB,mBAAmB;gBACnBF,gBAAgB;YAClB;QACF;IACF,GAAG;QACDxB;QACAF;QACAV;QACA2C;QACAX;QACAF;QACAV;QACAQ;QACAuB;KACD;IAED,IAAMG,eAAe,SAACC;QACpB,IAAInC,YAAY;YACd7B,YAAYgE;QACd;QACAxB,aAAa;IACf;IAEA,IAAMyB,cAAc,SAACD;QACnB,IAAQE,MAAgBF,EAAhBE,KAAKC,SAAWH,EAAXG;QACb,IAAQ3C,QAAeH,WAAfG,OAAOG,MAAQN,WAARM;QACf,IAAMyC,cAAcrD,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQsD,YAAYC;QAExC,IAAIpC,YAAYK,WAAW;YACzBvC,YAAYgE;YAEZ,IAAQlC,qBAA6BT,WAA7BS,oBAAoBF,OAASP,WAATO;YAE5B,IAAM2C,QAAQC,KAAK7C,IAAI,GAAGwC,SAASzB,OAAO+B;YAE1C,IAAMC,WAAWC,IAAAA,aAAMnD,QAAQ+C,QAAQzC,oBAAoBN,OAAOI;YAClE,IAAMgD,WAAWF,WAAW,CAAC,KAAKF,KAAKK,IAAI,AAACH,CAAAA,WAAW,EAAC,IAAK/C,OAAO,KAAK;YAEzEM,YAAYyC;YACZ3B,mBAAmB4B,IAAAA,aAAMC,UAAU,GAAG;YACtCtC,cAAcsC,WAAW;YACzB/B,gBAAgB,AAAC6B,CAAAA,WAAW,EAAC,IAAK;YAElC,IAAIE,WAAW,MAAM,CAAC/C,cAAchB,aAAaY,mBAASC,KAAK;gBAC7DkC;YACF;QACF,OAAO,IAAIM,OAAOE,gBAAgB,KAAKD,SAAS,KAAK,CAACtC,cAAcU,WAAW;YAC7EvC,YAAYgE;YAEZtB,OAAO+B,UAAUN;YACjBhC,YAAY;YACZF,YAAYT;YACZuB,mBAAmB;QACrB;IACF;IAEA,IAAM+B,aAAa;QACjB3C,YAAY;QACZK,aAAa;IACf;IAEA,IAAMuC,mBAAmB,AAAC,kBAA0B,OAAT/C,UAAS;IACpD,IAAIgD,mBAAmB;IAEvB,IAAInE,aAAaY,mBAASC,OAAOG,cAAc,CAACU,WAAW;QACzDyC,mBAAmB;IACrB,OAAO,IAAInE,aAAaY,mBAASC,OAAQkB,CAAAA,gBAAgBf,UAAS,GAAI;QACpEmD,mBAAmB,AAAC,kBAA8B,OAAbpC,cAAa;IACpD;IAEA,qBACE,qBAACqC,sBAAiBC;QAASC,OAAO;qBAChC,qBAACC,0DACKxE;QACJyE,SAAStB;QACTuB,QAAQrB;QACRsB,OAAOT;QACPnE,WAAW6E,IAAAA,uCAET3E,aAAaY,mBAASC,iCACtBQ,2CACAL,+CACAlB;sBAGF,qBAAC8E;QAAY9E,SAAS;qBACpB,qBAAC+E;QACCC,OAAO;YACLC,WAAWb;YACXc,iBAAiBd;YACjBe,SAAS5D,YAAYL,cAAcQ,aAAa,IAAI;QACtD;QACA0D,IAAIlE;QACJ+C,UAAU/C,aAAa8B,YAAYb;uBAIvC,qBAACkD;QACCrF,SAAS;QACTgF,OAAO;YACLC,WAAWZ;YACXa,iBAAiBb;QACnB;OAECxE;AAKX"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const onWindowTouchMove = (event: Event) => {\n if (refreshing) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n onRefresh();\n runTapticImpactOccurred('light');\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n };\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']} useParentWidth>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["PullToRefresh","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","children","isFetching","onRefresh","className","restProps","platform","usePlatform","scroll","useScroll","document","useDOM","prevIsFetching","usePrevious","initParams","React","useMemo","start","Platform","IOS","max","maxY","refreshing","positionMultiplier","useState","spinnerY","setSpinnerY","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","onWindowTouchMove","useGlobalEventListener","resetRefreshingState","useCallback","onRefreshingFinish","useTimeout","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","useIsomorphicLayoutEffect","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurred","onTouchStart","e","onTouchMove","isY","shiftY","pageYOffset","getScroll","y","shift","Math","current","currentY","clamp","progress","abs","onTouchEnd","spinnerTransform","contentTransform","TouchRootContext","Provider","value","Touch","onStart","onMove","onEnd","classNames","FixedLayout","useParentWidth","PullToRefreshSpinner","style","transform","WebkitTransform","opacity","on","div"],"mappings":"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"}
|