@vkontakte/vkui 5.5.2 → 5.5.4

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.
Files changed (111) hide show
  1. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +13 -9
  2. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  3. package/dist/cjs/components/CustomSelect/CustomSelect.js +23 -17
  4. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  5. package/dist/cjs/components/FixedLayout/FixedLayout.d.ts +6 -1
  6. package/dist/cjs/components/FixedLayout/FixedLayout.js +11 -4
  7. package/dist/cjs/components/FixedLayout/FixedLayout.js.map +1 -1
  8. package/dist/cjs/components/Group/Group.js +7 -5
  9. package/dist/cjs/components/Group/Group.js.map +1 -1
  10. package/dist/cjs/components/Header/Header.js +2 -2
  11. package/dist/cjs/components/Header/Header.js.map +1 -1
  12. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +7 -7
  13. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  14. package/dist/cjs/components/ImageBase/ImageBase.d.ts +2 -2
  15. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  16. package/dist/cjs/components/PullToRefresh/PullToRefresh.js +2 -1
  17. package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
  18. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +3 -3
  19. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  20. package/dist/cjs/components/Select/Select.d.ts +1 -1
  21. package/dist/cjs/components/Select/Select.js +22 -11
  22. package/dist/cjs/components/Select/Select.js.map +1 -1
  23. package/dist/cjs/components/Spinner/Spinner.d.ts +1 -1
  24. package/dist/cjs/components/Spinner/Spinner.js +14 -4
  25. package/dist/cjs/components/Spinner/Spinner.js.map +1 -1
  26. package/dist/cjs/components/Tappable/Tappable.d.ts +4 -4
  27. package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
  28. package/dist/cjs/hooks/useAutoDetectAppearance.js +9 -13
  29. package/dist/cjs/hooks/useAutoDetectAppearance.js.map +1 -1
  30. package/dist/cjs/lib/platform.d.ts +2 -1
  31. package/dist/cjs/lib/platform.js.map +1 -1
  32. package/dist/cjs/types.d.ts +12 -0
  33. package/dist/cjs/types.js.map +1 -1
  34. package/dist/components/ChipsSelect/ChipsSelect.js +13 -9
  35. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  36. package/dist/components/CustomSelect/CustomSelect.js +23 -17
  37. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  38. package/dist/components/FixedLayout/FixedLayout.d.ts +6 -1
  39. package/dist/components/FixedLayout/FixedLayout.js +11 -4
  40. package/dist/components/FixedLayout/FixedLayout.js.map +1 -1
  41. package/dist/components/Group/Group.js +7 -5
  42. package/dist/components/Group/Group.js.map +1 -1
  43. package/dist/components/Header/Header.js +2 -2
  44. package/dist/components/Header/Header.js.map +1 -1
  45. package/dist/components/HorizontalScroll/HorizontalScroll.js +7 -7
  46. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  47. package/dist/components/ImageBase/ImageBase.d.ts +2 -2
  48. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  49. package/dist/components/PullToRefresh/PullToRefresh.js +2 -1
  50. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  51. package/dist/components/ScreenSpinner/ScreenSpinner.js +3 -3
  52. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  53. package/dist/components/Select/Select.d.ts +1 -1
  54. package/dist/components/Select/Select.js +22 -11
  55. package/dist/components/Select/Select.js.map +1 -1
  56. package/dist/components/Spinner/Spinner.d.ts +1 -1
  57. package/dist/components/Spinner/Spinner.js +14 -4
  58. package/dist/components/Spinner/Spinner.js.map +1 -1
  59. package/dist/components/Tappable/Tappable.d.ts +4 -4
  60. package/dist/components/Tappable/Tappable.js.map +1 -1
  61. package/dist/components.css +6 -6
  62. package/dist/components.css.map +1 -1
  63. package/dist/components.js.tmp +751 -739
  64. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +13 -9
  65. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  66. package/dist/cssm/components/CustomSelect/CustomSelect.js +22 -16
  67. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  68. package/dist/cssm/components/FixedLayout/FixedLayout.d.ts +6 -1
  69. package/dist/cssm/components/FixedLayout/FixedLayout.js +8 -3
  70. package/dist/cssm/components/FixedLayout/FixedLayout.js.map +1 -1
  71. package/dist/cssm/components/Group/Group.js +6 -4
  72. package/dist/cssm/components/Group/Group.js.map +1 -1
  73. package/dist/cssm/components/Group/Group.module.css +34 -30
  74. package/dist/cssm/components/Header/Header.js +2 -2
  75. package/dist/cssm/components/Header/Header.js.map +1 -1
  76. package/dist/cssm/components/Header/Header.module.css +7 -9
  77. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +7 -7
  78. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  79. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +2 -0
  80. package/dist/cssm/components/ImageBase/ImageBase.d.ts +2 -2
  81. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  82. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +2 -1
  83. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  84. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +3 -3
  85. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  86. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +4 -4
  87. package/dist/cssm/components/Select/Select.d.ts +1 -1
  88. package/dist/cssm/components/Select/Select.js +4 -9
  89. package/dist/cssm/components/Select/Select.js.map +1 -1
  90. package/dist/cssm/components/Spinner/Spinner.d.ts +1 -1
  91. package/dist/cssm/components/Spinner/Spinner.js +12 -3
  92. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  93. package/dist/cssm/components/Tappable/Tappable.d.ts +4 -4
  94. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  95. package/dist/cssm/hooks/useAutoDetectAppearance.js +9 -13
  96. package/dist/cssm/hooks/useAutoDetectAppearance.js.map +1 -1
  97. package/dist/cssm/lib/platform.d.ts +2 -1
  98. package/dist/cssm/lib/platform.js.map +1 -1
  99. package/dist/cssm/styles/constants.css +3 -0
  100. package/dist/cssm/types.d.ts +12 -0
  101. package/dist/cssm/types.js.map +1 -1
  102. package/dist/hooks/useAutoDetectAppearance.js +9 -13
  103. package/dist/hooks/useAutoDetectAppearance.js.map +1 -1
  104. package/dist/lib/platform.d.ts +2 -1
  105. package/dist/lib/platform.js.map +1 -1
  106. package/dist/types.d.ts +12 -0
  107. package/dist/types.js.map +1 -1
  108. package/dist/vkui.css +6 -6
  109. package/dist/vkui.css.map +1 -1
  110. package/dist/vkui.js.tmp +751 -739
  111. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Group/Group.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasChildren, HasRootRef } from '../../types';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './Group.module.css';\n\nconst sizeXClassNames = {\n none: styles['Group--sizeX-none'],\n [SizeType.COMPACT]: styles['Group--sizeX-compact'],\n [SizeType.REGULAR]: styles['Group--sizeX-regular'],\n};\n\nexport interface GroupProps\n extends HasRootRef<HTMLElement>,\n React.HTMLAttributes<HTMLElement>,\n HasChildren {\n header?: React.ReactNode;\n description?: React.ReactNode;\n /**\n show - разделитель всегда показывается,\n hide - разделитель всегда спрятан,\n auto - разделитель рисуется автоматически между соседними группами.\n */\n separator?: 'show' | 'hide' | 'auto';\n /**\n * Режим отображения. Если установлен 'card', выглядит как карточка c\n * обводкой и внешними отступами. Если 'plain' — без отступов и обводки.\n * По умолчанию режим отображения зависит от `sizeX`. В модальных окнах\n * по умолчанию 'plain'.\n */\n mode?: 'plain' | 'card';\n /**\n * Отвечает за отступы вокруг контента в режиме 'card'.\n */\n padding?: 's' | 'm';\n}\n\nconst warn = warnOnce('Group');\n/**\n * @see https://vkcom.github.io/VKUI/#/Group\n */\nexport const Group = ({\n header,\n description,\n children,\n separator = 'auto',\n getRootRef,\n mode: modeProps,\n padding = 'm',\n className,\n tabIndex: tabIndexProp,\n ...restProps\n}: GroupProps) => {\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n const { sizeX = 'none' } = useAdaptivity();\n\n let mode: GroupProps['mode'] | 'none' = modeProps;\n\n if (!modeProps) {\n // Подробнее в \"none\" можно прочитать в ADAPTIVITY_GUIDE.md\n mode = isInsideModal ? 'plain' : 'none';\n }\n\n const isTabPanel = restProps.role === 'tabpanel';\n\n if (\n process.env.NODE_ENV === 'development' &&\n isTabPanel &&\n (!restProps['aria-controls'] || !restProps['id'])\n ) {\n warn(\n 'При использовании роли \"tabpanel\" необходимо задать значение свойств \"aria-controls\" и \"id\"',\n );\n }\n\n const tabIndex = isTabPanel && tabIndexProp === undefined ? 0 : tabIndexProp;\n\n const separatorClassName = classNames(\n styles['Group__separator'],\n separator === 'show' && styles['Group__separator--force'],\n );\n\n return (\n <>\n <section\n {...restProps}\n tabIndex={tabIndex}\n ref={getRootRef}\n className={classNames(\n 'vkuiInternalGroup',\n styles['Group'],\n platform === Platform.IOS && styles['Group--ios'],\n sizeXClassNames[sizeX],\n mode &&\n {\n none: classNames(styles['Group--mode-none'], 'vkuiInternalGroup--mode-none'),\n plain: classNames(styles['Group--mode-plain'], 'vkuiInternalGroup--mode-plain'),\n card: classNames(styles['Group--mode-card'], 'vkuiInternalGroup--mode-card'),\n }[mode],\n {\n s: styles['Group--padding-s'],\n m: styles['Group--padding-m'],\n }[padding],\n className,\n )}\n >\n {header}\n {children}\n {hasReactNode(description) && (\n <Footnote className={styles['Group__description']}>{description}</Footnote>\n )}\n </section>\n\n {separator !== 'hide' && (\n <React.Fragment>\n <Spacing\n className={classNames(separatorClassName, styles['Group__separator--spacing'])}\n size={16}\n />\n <Separator\n className={classNames(separatorClassName, styles['Group__separator--separator'])}\n />\n </React.Fragment>\n )}\n </>\n );\n};\n"],"names":["Group","sizeXClassNames","none","SizeType","COMPACT","REGULAR","warn","warnOnce","header","description","children","separator","getRootRef","mode","modeProps","padding","className","tabIndex","tabIndexProp","restProps","isInsideModal","React","useContext","ModalRootContext","platform","usePlatform","useAdaptivity","sizeX","isTabPanel","role","process","env","NODE_ENV","undefined","separatorClassName","classNames","section","ref","Platform","IOS","plain","card","s","m","hasReactNode","Footnote","Fragment","Spacing","size","Separator"],"mappings":";;;;+BAiDaA;;;eAAAA;;;;;;;;+DAjDU;oBACkB;6BACX;2BACF;0BACH;wBACA;wBACA;gCAEQ;yBACP;uBACF;wBACC;IAGD;AAAxB,IAAMC,mBAAkB;IACtBC,IAAI;sBADkB,MAErBC,qBAASC,yDAFY,MAGrBD,qBAASE,sCAHY;AA+BxB,IAAMC,OAAOC,IAAAA,oBAAS;AAIf,IAAMP,QAAQ;QACnBQ,gBAAAA,QACAC,qBAAAA,aACAC,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,oBAAAA,YACAC,AAAMC,mBAAND,8BACAE,SAAAA,sCAAU,sBACVC,mBAAAA,WACAC,AAAUC,sBAAVD,UACGE;QATHX;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;QACAC;;IAGA,IAAM,AAAEG,gBAAkBC,OAAMC,WAAWC,oCAAnCH;IACR,IAAMI,WAAWC,IAAAA;IACjB,IAA2BC,kBAAAA,IAAAA,wDAAAA,gBAAnBC,OAAAA,0CAAQ;IAEhB,IAAId,OAAoCC;IAExC,IAAI,CAACA,WAAW;QACd,2DAA2D;QAC3DD,OAAOO,gBAAgB,UAAU;IACnC;IAEA,IAAMQ,aAAaT,UAAUU,SAAS;IAEtC,IACEC,QAAQC,IAAIC,aAAa,iBACzBJ,cACC,CAAA,CAACT,SAAS,CAAC,gBAAgB,IAAI,CAACA,SAAS,CAAC,KAAK,AAAD,GAC/C;QACAb,KACE;IAEJ;IAEA,IAAMW,WAAWW,cAAcV,iBAAiBe,YAAY,IAAIf;IAEhE,IAAMgB,qBAAqBC,IAAAA,0CAEzBxB,cAAc;IAGhB,qBACE,0DACE,qBAACyB,uDACKjB;QACJF,UAAUA;QACVoB,KAAKzB;QACLI,WAAWmB,IAAAA,kBACT,kCAEAX,aAAac,mBAASC,yBACtBtC,eAAe,CAAC0B,MAAM,EACtBd,QACE,CAAA;YACEX,MAAMiC,IAAAA,0CAAuC;YAC7CK,OAAOL,IAAAA,2CAAwC;YAC/CM,MAAMN,IAAAA,0CAAuC;QAC/C,CAAA,CAAC,CAACtB,KAAK,EACT;YACE6B,CAAC;YACDC,CAAC;QACH,CAAC,CAAC5B,QAAQ,EACVC;QAGDR,QACAE,UACAkC,IAAAA,oBAAanC,8BACZ,qBAACoC;QAAS7B,SAAS;OAAiCP,eAIvDE,cAAc,wBACb,qBAACU,OAAMyB,8BACL,qBAACC;QACC/B,WAAWmB,IAAAA,kBAAWD;QACtBc,MAAM;sBAER,qBAACC;QACCjC,WAAWmB,IAAAA,kBAAWD;;AAMlC"}
1
+ {"version":3,"sources":["../../../../src/components/Group/Group.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasChildren, HasRootRef } from '../../types';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './Group.module.css';\n\nconst sizeXClassNames = {\n none: classNames(styles['Group--sizeX-none'], 'vkuiInternalGroup--sizeX-none'),\n [SizeType.COMPACT]: styles['Group--sizeX-compact'],\n};\n\nexport interface GroupProps\n extends HasRootRef<HTMLElement>,\n React.HTMLAttributes<HTMLElement>,\n HasChildren {\n header?: React.ReactNode;\n description?: React.ReactNode;\n /**\n show - разделитель всегда показывается,\n hide - разделитель всегда спрятан,\n auto - разделитель рисуется автоматически между соседними группами.\n */\n separator?: 'show' | 'hide' | 'auto';\n /**\n * Режим отображения. Если установлен 'card', выглядит как карточка c\n * обводкой и внешними отступами. Если 'plain' — без отступов и обводки.\n * По умолчанию режим отображения зависит от `sizeX`. В модальных окнах\n * по умолчанию 'plain'.\n */\n mode?: 'plain' | 'card';\n /**\n * Отвечает за отступы вокруг контента в режиме 'card'.\n */\n padding?: 's' | 'm';\n}\n\nconst warn = warnOnce('Group');\n/**\n * @see https://vkcom.github.io/VKUI/#/Group\n */\nexport const Group = ({\n header,\n description,\n children,\n separator = 'auto',\n getRootRef,\n mode: modeProps,\n padding = 'm',\n className,\n tabIndex: tabIndexProp,\n ...restProps\n}: GroupProps) => {\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n const { sizeX = 'none' } = useAdaptivity();\n\n let mode: GroupProps['mode'] | 'none' = modeProps;\n\n if (!modeProps) {\n // Подробнее в \"none\" можно прочитать в ADAPTIVITY_GUIDE.md\n mode = isInsideModal ? 'plain' : 'none';\n }\n\n if (mode === 'none' && sizeX !== 'none') {\n mode = sizeX === SizeType.REGULAR ? 'card' : 'plain';\n }\n\n const isTabPanel = restProps.role === 'tabpanel';\n\n if (\n process.env.NODE_ENV === 'development' &&\n isTabPanel &&\n (!restProps['aria-controls'] || !restProps['id'])\n ) {\n warn(\n 'При использовании роли \"tabpanel\" необходимо задать значение свойств \"aria-controls\" и \"id\"',\n );\n }\n\n const tabIndex = isTabPanel && tabIndexProp === undefined ? 0 : tabIndexProp;\n\n const separatorClassName = classNames(\n styles['Group__separator'],\n separator === 'show' && styles['Group__separator--force'],\n );\n\n return (\n <>\n <section\n {...restProps}\n tabIndex={tabIndex}\n ref={getRootRef}\n className={classNames(\n 'vkuiInternalGroup',\n styles['Group'],\n platform === Platform.IOS && styles['Group--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n mode &&\n {\n none: classNames(styles['Group--mode-none'], 'vkuiInternalGroup--mode-none'),\n plain: classNames(styles['Group--mode-plain'], 'vkuiInternalGroup--mode-plain'),\n card: classNames(styles['Group--mode-card'], 'vkuiInternalGroup--mode-card'),\n }[mode],\n {\n s: styles['Group--padding-s'],\n m: styles['Group--padding-m'],\n }[padding],\n className,\n )}\n >\n {header}\n {children}\n {hasReactNode(description) && (\n <Footnote className={styles['Group__description']}>{description}</Footnote>\n )}\n </section>\n\n {separator !== 'hide' && (\n <React.Fragment>\n <Spacing\n className={classNames(separatorClassName, styles['Group__separator--spacing'])}\n size={16}\n />\n <Separator\n className={classNames(separatorClassName, styles['Group__separator--separator'])}\n />\n </React.Fragment>\n )}\n </>\n );\n};\n"],"names":["Group","sizeXClassNames","none","classNames","SizeType","COMPACT","warn","warnOnce","header","description","children","separator","getRootRef","mode","modeProps","padding","className","tabIndex","tabIndexProp","restProps","isInsideModal","React","useContext","ModalRootContext","platform","usePlatform","useAdaptivity","sizeX","REGULAR","isTabPanel","role","process","env","NODE_ENV","undefined","separatorClassName","section","ref","Platform","IOS","plain","card","s","m","hasReactNode","Footnote","Fragment","Spacing","size","Separator"],"mappings":";;;;+BAgDaA;;;eAAAA;;;;;;;;+DAhDU;oBACkB;6BACX;2BACF;0BACH;wBACA;wBACA;gCAEQ;yBACP;uBACF;wBACC;AAGzB,IAAMC;IACJC,MAAMC,IAAAA,2CAAwC;GAC7CC,qBAASC;AA4BZ,IAAMC,OAAOC,IAAAA,oBAAS;AAIf,IAAMP,QAAQ;QACnBQ,gBAAAA,QACAC,qBAAAA,aACAC,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,oBAAAA,YACAC,AAAMC,mBAAND,8BACAE,SAAAA,sCAAU,sBACVC,mBAAAA,WACAC,AAAUC,sBAAVD,UACGE;QATHX;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;QACAC;;IAGA,IAAM,AAAEG,gBAAkBC,OAAMC,WAAWC,oCAAnCH;IACR,IAAMI,WAAWC,IAAAA;IACjB,IAA2BC,kBAAAA,IAAAA,wDAAAA,gBAAnBC,OAAAA,0CAAQ;IAEhB,IAAId,OAAoCC;IAExC,IAAI,CAACA,WAAW;QACd,2DAA2D;QAC3DD,OAAOO,gBAAgB,UAAU;IACnC;IAEA,IAAIP,SAAS,UAAUc,UAAU,QAAQ;QACvCd,OAAOc,UAAUvB,qBAASwB,UAAU,SAAS;IAC/C;IAEA,IAAMC,aAAaV,UAAUW,SAAS;IAEtC,IACEC,QAAQC,IAAIC,aAAa,iBACzBJ,cACC,CAAA,CAACV,SAAS,CAAC,gBAAgB,IAAI,CAACA,SAAS,CAAC,KAAK,AAAD,GAC/C;QACAb,KACE;IAEJ;IAEA,IAAMW,WAAWY,cAAcX,iBAAiBgB,YAAY,IAAIhB;IAEhE,IAAMiB,qBAAqBhC,IAAAA,0CAEzBQ,cAAc;IAGhB,qBACE,0DACE,qBAACyB,uDACKjB;QACJF,UAAUA;QACVoB,KAAKzB;QACLI,WAAWb,IAAAA,kBACT,kCAEAqB,aAAac,mBAASC,yBACtBZ,UAAUvB,qBAASwB,WAAW3B,eAAe,CAAC0B,MAAM,EACpDd,QACE,CAAA;YACEX,MAAMC,IAAAA,0CAAuC;YAC7CqC,OAAOrC,IAAAA,2CAAwC;YAC/CsC,MAAMtC,IAAAA,0CAAuC;QAC/C,CAAA,CAAC,CAACU,KAAK,EACT;YACE6B,CAAC;YACDC,CAAC;QACH,CAAC,CAAC5B,QAAQ,EACVC;QAGDR,QACAE,UACAkC,IAAAA,oBAAanC,8BACZ,qBAACoC;QAAS7B,SAAS;OAAiCP,eAIvDE,cAAc,wBACb,qBAACU,OAAMyB,8BACL,qBAACC;QACC/B,WAAWb,IAAAA,kBAAWgC;QACtBa,MAAM;sBAER,qBAACC;QACCjC,WAAWb,IAAAA,kBAAWgC;;AAMlC"}
@@ -98,12 +98,12 @@ var Header = function(_param) {
98
98
  mode: mode,
99
99
  size: size
100
100
  }, /*#__PURE__*/ _react.createElement("span", {
101
- className: (0, _vkjs.classNames)("vkuiHeader__content-in", multiline && "vkuiHeader__content-in--multiline")
101
+ className: (0, _vkjs.classNames)("vkuiHeader__content-in", multiline && "vkuiHeader__content--multiline")
102
102
  }, children), (0, _vkjs.hasReactNode)(indicator) && /*#__PURE__*/ _react.createElement(_Footnote.Footnote, {
103
103
  className: "vkuiHeader__indicator",
104
104
  weight: "2"
105
105
  }, indicator)), (0, _vkjs.hasReactNode)(subtitle) && /*#__PURE__*/ _react.createElement(_Subhead.Subhead, {
106
- className: "vkuiHeader__subtitle",
106
+ className: (0, _vkjs.classNames)("vkuiHeader__subtitle", multiline && "vkuiHeader__content--multiline"),
107
107
  Component: "span"
108
108
  }, subtitle)), (0, _vkjs.hasReactNode)(aside) && /*#__PURE__*/ _react.createElement(_Paragraph.Paragraph, {
109
109
  className: "vkuiHeader__aside",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Header/Header.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode, isPrimitiveReactNode } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Title } from '../Typography/Title/Title';\nimport styles from './Header.module.css';\n\nexport interface HeaderProps extends React.HTMLAttributes<HTMLElement>, HasRootRef<HTMLElement> {\n mode?: 'primary' | 'secondary' | 'tertiary';\n size?: 'regular' | 'large';\n subtitle?: React.ReactNode;\n /**\n * Допускаются иконки, текст, Link\n */\n aside?: React.ReactNode;\n /**\n * Допускаются текст, Indicator\n */\n indicator?: React.ReactNode;\n multiline?: boolean;\n}\n\ntype HeaderContentProps = Pick<HeaderProps, 'children' | 'mode' | 'size' | 'className'> &\n HasComponent;\n\nconst HeaderContent = ({ mode, size, ...restProps }: HeaderContentProps) => {\n const isLarge = size === 'large';\n\n const platform = usePlatform();\n if (platform === Platform.IOS) {\n switch (mode) {\n case 'primary':\n return isLarge ? (\n <Title level=\"2\" weight=\"2\" {...restProps} />\n ) : (\n <Title weight=\"1\" level=\"3\" {...restProps} />\n );\n case 'secondary':\n return <Footnote weight=\"1\" caps {...restProps} />;\n case 'tertiary':\n return <Title weight=\"1\" level=\"3\" {...restProps} />;\n }\n }\n\n switch (mode) {\n case 'primary':\n return isLarge ? (\n <Title level=\"2\" weight=\"2\" {...restProps} />\n ) : (\n <Headline weight=\"2\" {...restProps} />\n );\n case 'secondary':\n return <Footnote weight=\"1\" caps {...restProps} />;\n case 'tertiary':\n return <Headline weight=\"2\" {...restProps} />;\n }\n\n return null;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Header\n */\nexport const Header = ({\n mode = 'primary',\n size = 'regular',\n children,\n subtitle,\n indicator,\n aside,\n getRootRef,\n multiline,\n className,\n ...restProps\n}: HeaderProps) => {\n const platform = usePlatform();\n\n return (\n <header\n {...restProps}\n ref={getRootRef}\n className={classNames(\n styles['Header'],\n platform === Platform.IOS && styles['Header--ios'],\n {\n primary: styles['Header--mode-primary'],\n secondary: styles['Header--mode-secondary'],\n tertiary: styles['Header--mode-tertiary'],\n }[mode],\n isPrimitiveReactNode(indicator) && styles['Header--pi'],\n hasReactNode(subtitle) && styles['Header--with-subtitle'],\n className,\n )}\n >\n <div className={styles['Header__main']}>\n <HeaderContent\n className={styles['Header__content']}\n Component=\"span\"\n mode={mode}\n size={size}\n >\n <span\n className={classNames(\n styles['Header__content-in'],\n multiline && styles['Header__content-in--multiline'],\n )}\n >\n {children}\n </span>\n {hasReactNode(indicator) && (\n <Footnote className={styles['Header__indicator']} weight=\"2\">\n {indicator}\n </Footnote>\n )}\n </HeaderContent>\n\n {hasReactNode(subtitle) && (\n <Subhead className={styles['Header__subtitle']} Component=\"span\">\n {subtitle}\n </Subhead>\n )}\n </div>\n\n {hasReactNode(aside) && (\n <Paragraph className={styles['Header__aside']} Component=\"span\">\n {aside}\n </Paragraph>\n )}\n </header>\n );\n};\n"],"names":["Header","HeaderContent","mode","size","restProps","isLarge","platform","usePlatform","Platform","IOS","Title","level","weight","Footnote","caps","Headline","children","subtitle","indicator","aside","getRootRef","multiline","className","header","ref","classNames","primary","secondary","tertiary","isPrimitiveReactNode","hasReactNode","div","Component","span","Subhead","Paragraph"],"mappings":";;;;+BAoEaA;;;eAAAA;;;;;;;+DApEU;oBACwC;2BACnC;wBACH;wBAEA;wBACA;yBACC;uBACF;qBACF;AAqBtB,IAAMC,gBAAgB;QAAGC,cAAAA,MAAMC,cAAAA,MAASC;QAAfF;QAAMC;;IAC7B,IAAME,UAAUF,SAAS;IAEzB,IAAMG,WAAWC,IAAAA;IACjB,IAAID,aAAaE,mBAASC,KAAK;QAC7B,OAAQP;YACN,KAAK;gBACH,OAAOG,wBACL,qBAACK;oBAAMC,OAAM;oBAAIC,QAAO;mBAAQR,4BAEhC,qBAACM;oBAAME,QAAO;oBAAID,OAAM;mBAAQP;YAEpC,KAAK;gBACH,qBAAO,qBAACS;oBAASD,QAAO;oBAAIE,MAAAA;mBAASV;YACvC,KAAK;gBACH,qBAAO,qBAACM;oBAAME,QAAO;oBAAID,OAAM;mBAAQP;QAC3C;IACF;IAEA,OAAQF;QACN,KAAK;YACH,OAAOG,wBACL,qBAACK;gBAAMC,OAAM;gBAAIC,QAAO;eAAQR,4BAEhC,qBAACW;gBAASH,QAAO;eAAQR;QAE7B,KAAK;YACH,qBAAO,qBAACS;gBAASD,QAAO;gBAAIE,MAAAA;eAASV;QACvC,KAAK;YACH,qBAAO,qBAACW;gBAASH,QAAO;eAAQR;IACpC;IAEA,OAAO;AACT;AAKO,IAAMJ,SAAS;6BACpBE,MAAAA,gCAAO,8CACPC,MAAAA,gCAAO,yBACPa,kBAAAA,UACAC,kBAAAA,UACAC,mBAAAA,WACAC,eAAAA,OACAC,oBAAAA,YACAC,mBAAAA,WACAC,mBAAAA,WACGlB;QATHF;QACAC;QACAa;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAMhB,WAAWC,IAAAA;IAEjB,qBACE,qBAACgB,sDACKnB;QACJoB,KAAKJ;QACLE,WAAWG,IAAAA,gCAETnB,aAAaE,mBAASC,0BACtB;YACEiB,OAAO;YACPC,SAAS;YACTC,QAAQ;QACV,CAAC,CAAC1B,KAAK,EACP2B,IAAAA,4BAAqBX,gCACrBY,IAAAA,oBAAab,0CACbK;sBAGF,qBAACS;QAAIT,SAAS;qBACZ,qBAACrB;QACCqB,SAAS;QACTU,WAAU;QACV9B,MAAMA;QACNC,MAAMA;qBAEN,qBAAC8B;QACCX,WAAWG,IAAAA,4CAETJ;OAGDL,WAEFc,IAAAA,oBAAaZ,4BACZ,qBAACL;QAASS,SAAS;QAA+BV,QAAO;OACtDM,aAKNY,IAAAA,oBAAab,2BACZ,qBAACiB;QAAQZ,SAAS;QAA8BU,WAAU;OACvDf,YAKNa,IAAAA,oBAAaX,wBACZ,qBAACgB;QAAUb,SAAS;QAA2BU,WAAU;OACtDb;AAKX"}
1
+ {"version":3,"sources":["../../../../src/components/Header/Header.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode, isPrimitiveReactNode } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Title } from '../Typography/Title/Title';\nimport styles from './Header.module.css';\n\nexport interface HeaderProps extends React.HTMLAttributes<HTMLElement>, HasRootRef<HTMLElement> {\n mode?: 'primary' | 'secondary' | 'tertiary';\n size?: 'regular' | 'large';\n subtitle?: React.ReactNode;\n /**\n * Допускаются иконки, текст, Link\n */\n aside?: React.ReactNode;\n /**\n * Допускаются текст, Indicator\n */\n indicator?: React.ReactNode;\n multiline?: boolean;\n}\n\ntype HeaderContentProps = Pick<HeaderProps, 'children' | 'mode' | 'size' | 'className'> &\n HasComponent;\n\nconst HeaderContent = ({ mode, size, ...restProps }: HeaderContentProps) => {\n const isLarge = size === 'large';\n\n const platform = usePlatform();\n if (platform === Platform.IOS) {\n switch (mode) {\n case 'primary':\n return isLarge ? (\n <Title level=\"2\" weight=\"2\" {...restProps} />\n ) : (\n <Title weight=\"1\" level=\"3\" {...restProps} />\n );\n case 'secondary':\n return <Footnote weight=\"1\" caps {...restProps} />;\n case 'tertiary':\n return <Title weight=\"1\" level=\"3\" {...restProps} />;\n }\n }\n\n switch (mode) {\n case 'primary':\n return isLarge ? (\n <Title level=\"2\" weight=\"2\" {...restProps} />\n ) : (\n <Headline weight=\"2\" {...restProps} />\n );\n case 'secondary':\n return <Footnote weight=\"1\" caps {...restProps} />;\n case 'tertiary':\n return <Headline weight=\"2\" {...restProps} />;\n }\n\n return null;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Header\n */\nexport const Header = ({\n mode = 'primary',\n size = 'regular',\n children,\n subtitle,\n indicator,\n aside,\n getRootRef,\n multiline,\n className,\n ...restProps\n}: HeaderProps) => {\n const platform = usePlatform();\n\n return (\n <header\n {...restProps}\n ref={getRootRef}\n className={classNames(\n styles['Header'],\n platform === Platform.IOS && styles['Header--ios'],\n {\n primary: styles['Header--mode-primary'],\n secondary: styles['Header--mode-secondary'],\n tertiary: styles['Header--mode-tertiary'],\n }[mode],\n isPrimitiveReactNode(indicator) && styles['Header--pi'],\n hasReactNode(subtitle) && styles['Header--with-subtitle'],\n className,\n )}\n >\n <div className={styles['Header__main']}>\n <HeaderContent\n className={styles['Header__content']}\n Component=\"span\"\n mode={mode}\n size={size}\n >\n <span\n className={classNames(\n styles['Header__content-in'],\n multiline && styles['Header__content--multiline'],\n )}\n >\n {children}\n </span>\n {hasReactNode(indicator) && (\n <Footnote className={styles['Header__indicator']} weight=\"2\">\n {indicator}\n </Footnote>\n )}\n </HeaderContent>\n\n {hasReactNode(subtitle) && (\n <Subhead\n className={classNames(\n styles['Header__subtitle'],\n multiline && styles['Header__content--multiline'],\n )}\n Component=\"span\"\n >\n {subtitle}\n </Subhead>\n )}\n </div>\n\n {hasReactNode(aside) && (\n <Paragraph className={styles['Header__aside']} Component=\"span\">\n {aside}\n </Paragraph>\n )}\n </header>\n );\n};\n"],"names":["Header","HeaderContent","mode","size","restProps","isLarge","platform","usePlatform","Platform","IOS","Title","level","weight","Footnote","caps","Headline","children","subtitle","indicator","aside","getRootRef","multiline","className","header","ref","classNames","primary","secondary","tertiary","isPrimitiveReactNode","hasReactNode","div","Component","span","Subhead","Paragraph"],"mappings":";;;;+BAoEaA;;;eAAAA;;;;;;;+DApEU;oBACwC;2BACnC;wBACH;wBAEA;wBACA;yBACC;uBACF;qBACF;AAqBtB,IAAMC,gBAAgB;QAAGC,cAAAA,MAAMC,cAAAA,MAASC;QAAfF;QAAMC;;IAC7B,IAAME,UAAUF,SAAS;IAEzB,IAAMG,WAAWC,IAAAA;IACjB,IAAID,aAAaE,mBAASC,KAAK;QAC7B,OAAQP;YACN,KAAK;gBACH,OAAOG,wBACL,qBAACK;oBAAMC,OAAM;oBAAIC,QAAO;mBAAQR,4BAEhC,qBAACM;oBAAME,QAAO;oBAAID,OAAM;mBAAQP;YAEpC,KAAK;gBACH,qBAAO,qBAACS;oBAASD,QAAO;oBAAIE,MAAAA;mBAASV;YACvC,KAAK;gBACH,qBAAO,qBAACM;oBAAME,QAAO;oBAAID,OAAM;mBAAQP;QAC3C;IACF;IAEA,OAAQF;QACN,KAAK;YACH,OAAOG,wBACL,qBAACK;gBAAMC,OAAM;gBAAIC,QAAO;eAAQR,4BAEhC,qBAACW;gBAASH,QAAO;eAAQR;QAE7B,KAAK;YACH,qBAAO,qBAACS;gBAASD,QAAO;gBAAIE,MAAAA;eAASV;QACvC,KAAK;YACH,qBAAO,qBAACW;gBAASH,QAAO;eAAQR;IACpC;IAEA,OAAO;AACT;AAKO,IAAMJ,SAAS;6BACpBE,MAAAA,gCAAO,8CACPC,MAAAA,gCAAO,yBACPa,kBAAAA,UACAC,kBAAAA,UACAC,mBAAAA,WACAC,eAAAA,OACAC,oBAAAA,YACAC,mBAAAA,WACAC,mBAAAA,WACGlB;QATHF;QACAC;QACAa;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAMhB,WAAWC,IAAAA;IAEjB,qBACE,qBAACgB,sDACKnB;QACJoB,KAAKJ;QACLE,WAAWG,IAAAA,gCAETnB,aAAaE,mBAASC,0BACtB;YACEiB,OAAO;YACPC,SAAS;YACTC,QAAQ;QACV,CAAC,CAAC1B,KAAK,EACP2B,IAAAA,4BAAqBX,gCACrBY,IAAAA,oBAAab,0CACbK;sBAGF,qBAACS;QAAIT,SAAS;qBACZ,qBAACrB;QACCqB,SAAS;QACTU,WAAU;QACV9B,MAAMA;QACNC,MAAMA;qBAEN,qBAAC8B;QACCX,WAAWG,IAAAA,4CAETJ;OAGDL,WAEFc,IAAAA,oBAAaZ,4BACZ,qBAACL;QAASS,SAAS;QAA+BV,QAAO;OACtDM,aAKNY,IAAAA,oBAAab,2BACZ,qBAACiB;QACCZ,WAAWG,IAAAA,0CAETJ;QAEFW,WAAU;OAETf,YAKNa,IAAAA,oBAAaX,wBACZ,qBAACgB;QAAUb,SAAS;QAA2BU,WAAU;OACtDb;AAKX"}
@@ -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("div", {
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 | number;
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 | 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"}
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"}
@@ -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":"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"}
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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"}
@@ -40,17 +40,17 @@ var ScreenSpinner = function(_param) {
40
40
  (0, _ScrollContext.useScrollLock)();
41
41
  return /*#__PURE__*/ _react.createElement(_PopoutWrapper.PopoutWrapper, {
42
42
  hasMask: false,
43
- className: (0, _vkjs.classNames)("vkuiScreenSpinner", hideSpinner && "vkuiScreenSpinner--hideSpinner", state === "cancelable" && "vkuiScreenSpinner--state-cancelable", state === "done" && "vkuiScreenSpinner--state-done", className),
43
+ className: (0, _vkjs.classNames)("vkuiScreenSpinner", state === "cancelable" && "vkuiScreenSpinner--clickable", className),
44
44
  style: style
45
45
  }, /*#__PURE__*/ _react.createElement("div", {
46
46
  className: "vkuiScreenSpinner__container",
47
47
  onClick: onClick
48
48
  }, /*#__PURE__*/ _react.createElement(_Spinner.Spinner, _object_spread._({
49
- className: "vkuiScreenSpinner__spinner",
49
+ className: (0, _vkjs.classNames)("vkuiScreenSpinner__spinner", hideSpinner && "vkuiScreenSpinner__spinner--hidden"),
50
50
  size: size,
51
51
  "aria-label": ariaLabel
52
52
  }, restProps)), /*#__PURE__*/ _react.createElement("div", {
53
- className: "vkuiScreenSpinner__icon"
53
+ className: (0, _vkjs.classNames)("vkuiScreenSpinner__icon", state === "done" && "vkuiScreenSpinner__icon--state-done")
54
54
  }, /*#__PURE__*/ _react.createElement(Icon, null))));
55
55
  };
56
56
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ScreenSpinner/ScreenSpinner.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon24Cancel } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport { Spinner, SpinnerProps } from '../Spinner/Spinner';\nimport { Icon48CancelCircle } from './Icon48CancelCircle';\nimport { Icon48DoneOutline } from './Icon48DoneOutline';\nimport styles from './ScreenSpinner.module.css';\n\nexport interface ScreenSpinnerProps extends SpinnerProps {\n state?: 'loading' | 'cancelable' | 'done' | 'error';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ScreenSpinner\n */\nexport const ScreenSpinner = ({\n style,\n className,\n state = 'loading',\n size = 'large',\n 'aria-label': ariaLabel = 'Пожалуйста, подождите...',\n onClick,\n ...restProps\n}: ScreenSpinnerProps) => {\n const hideSpinner = state === 'done' || state === 'error';\n\n const Icon = {\n loading: () => null,\n cancelable: Icon24Cancel,\n done: Icon48DoneOutline,\n error: Icon48CancelCircle,\n }[state];\n\n useScrollLock();\n\n return (\n <PopoutWrapper\n hasMask={false}\n className={classNames(\n styles['ScreenSpinner'],\n hideSpinner && styles['ScreenSpinner--hideSpinner'],\n state === 'cancelable' && styles['ScreenSpinner--state-cancelable'],\n state === 'done' && styles['ScreenSpinner--state-done'],\n className,\n )}\n style={style}\n >\n <div className={styles['ScreenSpinner__container']} onClick={onClick}>\n <Spinner\n className={styles['ScreenSpinner__spinner']}\n size={size}\n aria-label={ariaLabel}\n {...restProps}\n />\n <div className={styles['ScreenSpinner__icon']}>\n <Icon />\n </div>\n </div>\n </PopoutWrapper>\n );\n};\n"],"names":["ScreenSpinner","style","className","state","size","ariaLabel","onClick","restProps","hideSpinner","Icon","loading","cancelable","Icon24Cancel","done","Icon48DoneOutline","error","Icon48CancelCircle","useScrollLock","PopoutWrapper","hasMask","classNames","div","Spinner","aria-label"],"mappings":";;;;+BAiBaA;;;eAAAA;;;;;;+DAjBU;qBACM;oBACF;6BACG;6BACA;uBACQ;kCACH;iCACD;AAU3B,IAAMA,gBAAgB;QAC3BC,eAAAA,OACAC,mBAAAA,iCACAC,OAAAA,kCAAQ,+CACRC,MAAAA,gCAAO,uBACOC,aAAd,eAAcA,YAAAA,iBAAY,6BAAZA,KACdC,iBAAAA,SACGC;QANHN;QACAC;QACAC;QACAC;QACA;QACAE;;IAGA,IAAME,cAAcL,UAAU,UAAUA,UAAU;IAElD,IAAMM,OAAO;QACXC,SAAS;mBAAM;;QACfC,YAAYC;QACZC,MAAMC;QACNC,OAAOC;IACT,CAAC,CAACb,MAAM;IAERc,IAAAA;IAEA,qBACE,qBAACC;QACCC,SAAS;QACTjB,WAAWkB,IAAAA,uCAETZ,iDACAL,UAAU,uDACVA,UAAU,2CACVD;QAEFD,OAAOA;qBAEP,qBAACoB;QAAInB,SAAS;QAAsCI,SAASA;qBAC3D,qBAACgB;QACCpB,SAAS;QACTE,MAAMA;QACNmB,cAAYlB;OACRE,2BAEN,qBAACc;QAAInB,SAAS;qBACZ,qBAACO;AAKX"}
1
+ {"version":3,"sources":["../../../../src/components/ScreenSpinner/ScreenSpinner.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon24Cancel } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport { Spinner, SpinnerProps } from '../Spinner/Spinner';\nimport { Icon48CancelCircle } from './Icon48CancelCircle';\nimport { Icon48DoneOutline } from './Icon48DoneOutline';\nimport styles from './ScreenSpinner.module.css';\n\nexport interface ScreenSpinnerProps extends SpinnerProps {\n state?: 'loading' | 'cancelable' | 'done' | 'error';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ScreenSpinner\n */\nexport const ScreenSpinner = ({\n style,\n className,\n state = 'loading',\n size = 'large',\n 'aria-label': ariaLabel = 'Пожалуйста, подождите...',\n onClick,\n ...restProps\n}: ScreenSpinnerProps) => {\n const hideSpinner = state === 'done' || state === 'error';\n\n const Icon = {\n loading: () => null,\n cancelable: Icon24Cancel,\n done: Icon48DoneOutline,\n error: Icon48CancelCircle,\n }[state];\n\n useScrollLock();\n\n return (\n <PopoutWrapper\n hasMask={false}\n className={classNames(\n styles['ScreenSpinner'],\n state === 'cancelable' && styles['ScreenSpinner--clickable'],\n className,\n )}\n style={style}\n >\n <div className={styles['ScreenSpinner__container']} onClick={onClick}>\n <Spinner\n className={classNames(\n styles['ScreenSpinner__spinner'],\n hideSpinner && styles['ScreenSpinner__spinner--hidden'],\n )}\n size={size}\n aria-label={ariaLabel}\n {...restProps}\n />\n <div\n className={classNames(\n styles['ScreenSpinner__icon'],\n state === 'done' && styles['ScreenSpinner__icon--state-done'],\n )}\n >\n <Icon />\n </div>\n </div>\n </PopoutWrapper>\n );\n};\n"],"names":["ScreenSpinner","style","className","state","size","ariaLabel","onClick","restProps","hideSpinner","Icon","loading","cancelable","Icon24Cancel","done","Icon48DoneOutline","error","Icon48CancelCircle","useScrollLock","PopoutWrapper","hasMask","classNames","div","Spinner","aria-label"],"mappings":";;;;+BAiBaA;;;eAAAA;;;;;;+DAjBU;qBACM;oBACF;6BACG;6BACA;uBACQ;kCACH;iCACD;AAU3B,IAAMA,gBAAgB;QAC3BC,eAAAA,OACAC,mBAAAA,iCACAC,OAAAA,kCAAQ,+CACRC,MAAAA,gCAAO,uBACOC,aAAd,eAAcA,YAAAA,iBAAY,6BAAZA,KACdC,iBAAAA,SACGC;QANHN;QACAC;QACAC;QACAC;QACA;QACAE;;IAGA,IAAME,cAAcL,UAAU,UAAUA,UAAU;IAElD,IAAMM,OAAO;QACXC,SAAS;mBAAM;;QACfC,YAAYC;QACZC,MAAMC;QACNC,OAAOC;IACT,CAAC,CAACb,MAAM;IAERc,IAAAA;IAEA,qBACE,qBAACC;QACCC,SAAS;QACTjB,WAAWkB,IAAAA,uCAETjB,UAAU,gDACVD;QAEFD,OAAOA;qBAEP,qBAACoB;QAAInB,SAAS;QAAsCI,SAASA;qBAC3D,qBAACgB;QACCpB,WAAWkB,IAAAA,gDAETZ;QAEFJ,MAAMA;QACNmB,cAAYlB;OACRE,2BAEN,qBAACc;QACCnB,WAAWkB,IAAAA,6CAETjB,UAAU;qBAGZ,qBAACM;AAKX"}
@@ -4,4 +4,4 @@ export type SelectType = 'default' | 'plain' | 'accent';
4
4
  /**
5
5
  * @see https://vkcom.github.io/VKUI/#/Select
6
6
  */
7
- export declare const Select: ({ children, options, popupDirection, renderOption, allowClearButton, ClearButton, ...props }: SelectProps) => React.JSX.Element;
7
+ export declare const Select: ({ children, ...props }: SelectProps) => React.JSX.Element;
@@ -9,29 +9,40 @@ Object.defineProperty(exports, "Select", {
9
9
  }
10
10
  });
11
11
  var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
- var _object_spread = require("@swc/helpers/_/_object_spread");
13
12
  var _object_without_properties = require("@swc/helpers/_/_object_without_properties");
14
13
  var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
15
14
  var _useAdaptivityHasPointer = require("../../hooks/useAdaptivityHasPointer");
16
15
  var _CustomSelect = require("../CustomSelect/CustomSelect");
17
16
  var _NativeSelect = require("../NativeSelect/NativeSelect");
18
17
  var Select = function(_param) {
19
- var children = _param.children, _param_options = _param.options, options = _param_options === void 0 ? [] : _param_options, popupDirection = _param.popupDirection, renderOption = _param.renderOption, allowClearButton = _param.allowClearButton, ClearButton = _param.ClearButton, props = _object_without_properties._(_param, [
20
- "children",
18
+ var children = _param.children, props = _object_without_properties._(_param, [
19
+ "children"
20
+ ]);
21
+ var _props_options = props.options, options = _props_options === void 0 ? [] : _props_options, searchable = props.searchable, emptyText = props.emptyText, onInputChange = props.onInputChange, filterFn = props.filterFn, popupDirection = props.popupDirection, renderOption = props.renderOption, renderDropdown = props.renderDropdown, fetching = props.fetching, onClose = props.onClose, onOpen = props.onOpen, icon = props.icon, ClearButton = props.ClearButton, allowClearButton = props.allowClearButton, dropdownOffsetDistance = props.dropdownOffsetDistance, fixDropdownWidth = props.fixDropdownWidth, forceDropdownPortal = props.forceDropdownPortal, selectType = props.selectType, autoHideScrollbar = props.autoHideScrollbar, autoHideScrollbarDelay = props.autoHideScrollbarDelay, nativeProps // TODO: https://github.com/Microsoft/TypeScript/issues/12936
22
+ = _object_without_properties._(props, [
21
23
  "options",
24
+ "searchable",
25
+ "emptyText",
26
+ "onInputChange",
27
+ "filterFn",
22
28
  "popupDirection",
23
29
  "renderOption",
30
+ "renderDropdown",
31
+ "fetching",
32
+ "onClose",
33
+ "onOpen",
34
+ "icon",
35
+ "ClearButton",
24
36
  "allowClearButton",
25
- "ClearButton"
37
+ "dropdownOffsetDistance",
38
+ "fixDropdownWidth",
39
+ "forceDropdownPortal",
40
+ "selectType",
41
+ "autoHideScrollbar",
42
+ "autoHideScrollbarDelay"
26
43
  ]);
27
44
  var hasPointer = (0, _useAdaptivityHasPointer.useAdaptivityHasPointer)();
28
- return /*#__PURE__*/ _react.createElement(_react.Fragment, null, (hasPointer === undefined || hasPointer) && /*#__PURE__*/ _react.createElement(_CustomSelect.CustomSelect, _object_spread._({
29
- options: options,
30
- popupDirection: popupDirection,
31
- renderOption: renderOption,
32
- allowClearButton: allowClearButton,
33
- ClearButton: ClearButton
34
- }, props)), (hasPointer === undefined || !hasPointer) && /*#__PURE__*/ _react.createElement(_NativeSelect.NativeSelect, props, options.map(function(param) {
45
+ return /*#__PURE__*/ _react.createElement(_react.Fragment, null, (hasPointer === undefined || hasPointer) && /*#__PURE__*/ _react.createElement(_CustomSelect.CustomSelect, props), (hasPointer === undefined || !hasPointer) && /*#__PURE__*/ _react.createElement(_NativeSelect.NativeSelect, nativeProps, options.map(function(param) {
35
46
  var label = param.label, value = param.value;
36
47
  return /*#__PURE__*/ _react.createElement("option", {
37
48
  value: value,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { CustomSelect, SelectProps } from '../CustomSelect/CustomSelect';\nimport { NativeSelect } from '../NativeSelect/NativeSelect';\n\nexport type SelectType = 'default' | 'plain' | 'accent';\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Select\n */\nexport const Select = ({\n children,\n options = [],\n popupDirection,\n renderOption,\n allowClearButton,\n ClearButton,\n ...props\n}: SelectProps) => {\n const hasPointer = useAdaptivityHasPointer();\n\n return (\n <React.Fragment>\n {(hasPointer === undefined || hasPointer) && (\n <CustomSelect\n options={options}\n popupDirection={popupDirection}\n renderOption={renderOption}\n allowClearButton={allowClearButton}\n ClearButton={ClearButton}\n {...props}\n />\n )}\n {(hasPointer === undefined || !hasPointer) && (\n <NativeSelect {...props}>\n {options.map(({ label, value }) => (\n <option value={value} key={`${value}`}>\n {label}\n </option>\n ))}\n </NativeSelect>\n )}\n </React.Fragment>\n );\n};\n"],"names":["Select","children","options","popupDirection","renderOption","allowClearButton","ClearButton","props","hasPointer","useAdaptivityHasPointer","React","Fragment","undefined","CustomSelect","NativeSelect","map","label","value","option","key"],"mappings":";;;;+BAUaA;;;eAAAA;;;;;;+DAVU;uCACiB;4BACE;4BACb;AAOtB,IAAMA,SAAS;QACpBC,kBAAAA,kCACAC,SAAAA,sCAAU,EAAE,mBACZC,wBAAAA,gBACAC,sBAAAA,cACAC,0BAAAA,kBACAC,qBAAAA,aACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,aAAaC,IAAAA;IAEnB,qBACE,qBAACC,OAAMC,gBACJ,AAACH,CAAAA,eAAeI,aAAaJ,UAAS,mBACrC,qBAACK;QACCX,SAASA;QACTC,gBAAgBA;QAChBC,cAAcA;QACdC,kBAAkBA;QAClBC,aAAaA;OACTC,SAGP,AAACC,CAAAA,eAAeI,aAAa,CAACJ,UAAS,mBACtC,qBAACM,4BAAiBP,OACfL,QAAQa,IAAI;YAAGC,cAAAA,OAAOC,cAAAA;6BACrB,qBAACC;YAAOD,OAAOA;YAAOE,KAAK,AAAC,GAAQ,OAANF;WAC3BD;;AAOf"}
1
+ {"version":3,"sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { CustomSelect, SelectProps } from '../CustomSelect/CustomSelect';\nimport { NativeSelect } from '../NativeSelect/NativeSelect';\n\nexport type SelectType = 'default' | 'plain' | 'accent';\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Select\n */\nexport const Select = ({ children, ...props }: SelectProps) => {\n const {\n options = [],\n searchable,\n emptyText,\n onInputChange,\n filterFn,\n popupDirection,\n renderOption,\n renderDropdown,\n fetching,\n onClose,\n onOpen,\n icon,\n ClearButton,\n allowClearButton,\n dropdownOffsetDistance,\n fixDropdownWidth,\n forceDropdownPortal,\n selectType,\n autoHideScrollbar,\n autoHideScrollbarDelay,\n ...nativeProps // TODO: https://github.com/Microsoft/TypeScript/issues/12936\n } = props;\n\n const hasPointer = useAdaptivityHasPointer();\n\n return (\n <React.Fragment>\n {(hasPointer === undefined || hasPointer) && <CustomSelect {...props} />}\n {(hasPointer === undefined || !hasPointer) && (\n <NativeSelect {...nativeProps}>\n {options.map(({ label, value }) => (\n <option value={value} key={`${value}`}>\n {label}\n </option>\n ))}\n </NativeSelect>\n )}\n </React.Fragment>\n );\n};\n"],"names":["Select","children","props","options","searchable","emptyText","onInputChange","filterFn","popupDirection","renderOption","renderDropdown","fetching","onClose","onOpen","icon","ClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","nativeProps","hasPointer","useAdaptivityHasPointer","React","Fragment","undefined","CustomSelect","NativeSelect","map","label","value","option","key"],"mappings":";;;;+BAUaA;;;eAAAA;;;;;+DAVU;uCACiB;4BACE;4BACb;AAOtB,IAAMA,SAAS;QAAGC,kBAAAA,UAAaC;QAAbD;;IACvB,qBAsBIC,MArBFC,SAAAA,sCAAU,EAAE,mBACZC,aAoBEF,MApBFE,YACAC,YAmBEH,MAnBFG,WACAC,gBAkBEJ,MAlBFI,eACAC,WAiBEL,MAjBFK,UACAC,iBAgBEN,MAhBFM,gBACAC,eAeEP,MAfFO,cACAC,iBAcER,MAdFQ,gBACAC,WAaET,MAbFS,UACAC,UAYEV,MAZFU,SACAC,SAWEX,MAXFW,QACAC,OAUEZ,MAVFY,MACAC,cASEb,MATFa,aACAC,mBAQEd,MARFc,kBACAC,yBAOEf,MAPFe,wBACAC,mBAMEhB,MANFgB,kBACAC,sBAKEjB,MALFiB,qBACAC,aAIElB,MAJFkB,YACAC,oBAGEnB,MAHFmB,mBACAC,yBAEEpB,MAFFoB,wBACGC,YAAY,6DAA6D;oCAC1ErB;QArBFC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAIF,IAAME,aAAaC,IAAAA;IAEnB,qBACE,qBAACC,OAAMC,gBACJ,AAACH,CAAAA,eAAeI,aAAaJ,UAAS,mBAAM,qBAACK,4BAAiB3B,QAC9D,AAACsB,CAAAA,eAAeI,aAAa,CAACJ,UAAS,mBACtC,qBAACM,4BAAiBP,aACfpB,QAAQ4B,IAAI;YAAGC,cAAAA,OAAOC,cAAAA;6BACrB,qBAACC;YAAOD,OAAOA;YAAOE,KAAK,AAAC,GAAQ,OAANF;WAC3BD;;AAOf"}
@@ -5,4 +5,4 @@ export interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {
5
5
  /**
6
6
  * @see https://vkcom.github.io/VKUI/#/Spinner
7
7
  */
8
- export declare const Spinner: React.MemoExoticComponent<({ size, "aria-label": ariaLabel, className, ...restProps }: SpinnerProps) => React.JSX.Element>;
8
+ export declare const Spinner: React.MemoExoticComponent<({ size, children, "aria-label": ariaLabel, className, ...restProps }: SpinnerProps) => React.JSX.Element>;
@@ -15,9 +15,14 @@ var _object_without_properties = require("@swc/helpers/_/_object_without_propert
15
15
  var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
16
16
  var _icons = require("@vkontakte/icons");
17
17
  var _vkjs = require("@vkontakte/vkjs");
18
+ var _warnOnce = require("../../lib/warnOnce");
19
+ var _VisuallyHidden = require("../VisuallyHidden/VisuallyHidden");
20
+ var warn = (0, _warnOnce.warnOnce)("Spinner");
18
21
  var Spinner = /*#__PURE__*/ _react.memo(function(_param) {
19
- var _param_size = _param.size, size = _param_size === void 0 ? "regular" : _param_size, tmp = _param["aria-label"], ariaLabel = tmp === void 0 ? "Загружается..." : tmp, className = _param.className, restProps = _object_without_properties._(_param, [
22
+ var _param_size = _param.size, size = _param_size === void 0 ? "regular" : _param_size, _param_children = _param.children, children = _param_children === void 0 ? "Загружается..." : _param_children, tmp = _param[// TODO [>=6]: Удалить автоматическое приведение aria-label
23
+ "aria-label"], ariaLabel = tmp === void 0 ? "Загружается..." : tmp, className = _param.className, restProps = _object_without_properties._(_param, [
20
24
  "size",
25
+ "children",
21
26
  "aria-label",
22
27
  "className"
23
28
  ]);
@@ -27,14 +32,19 @@ var Spinner = /*#__PURE__*/ _react.memo(function(_param) {
27
32
  medium: _icons.Icon32Spinner,
28
33
  large: _icons.Icon44Spinner
29
34
  }[size];
35
+ // TODO [>=6]: Удалить варнинг
36
+ if (process.env.NODE_ENV === "development") {
37
+ if (ariaLabel && !children) {
38
+ warn("a11y: Пожалуйста, передавайте ваш текст для ассистивных технологий в children вместо aria-label.");
39
+ }
40
+ }
30
41
  return /*#__PURE__*/ _react.createElement("span", _object_spread_props._(_object_spread._({
31
- role: "status",
32
- "aria-label": ariaLabel
42
+ role: "status"
33
43
  }, restProps), {
34
44
  className: (0, _vkjs.classNames)("vkuiSpinner", className)
35
45
  }), /*#__PURE__*/ _react.createElement(SpinnerIcon, {
36
46
  className: "vkuiSpinner__self"
37
- }));
47
+ }), /*#__PURE__*/ _react.createElement(_VisuallyHidden.VisuallyHidden, null, children !== null && children !== void 0 ? children : ariaLabel));
38
48
  });
39
49
  Spinner.displayName = "Spinner";
40
50
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Spinner, Icon24Spinner, Icon32Spinner, Icon44Spinner } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport styles from './Spinner.module.css';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'small' | 'regular' | 'medium' | 'large';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Spinner\n */\nexport const Spinner = React.memo(\n ({\n size = 'regular',\n 'aria-label': ariaLabel = 'Загружается...',\n className,\n ...restProps\n }: SpinnerProps) => {\n const SpinnerIcon = {\n small: Icon16Spinner,\n regular: Icon24Spinner,\n medium: Icon32Spinner,\n large: Icon44Spinner,\n }[size];\n\n return (\n <span\n role=\"status\"\n aria-label={ariaLabel}\n {...restProps}\n className={classNames(styles['Spinner'], className)}\n >\n <SpinnerIcon className={styles['Spinner__self']} />\n </span>\n );\n },\n);\n\nSpinner.displayName = 'Spinner';\n"],"names":["Spinner","React","memo","size","ariaLabel","className","restProps","SpinnerIcon","small","Icon16Spinner","regular","Icon24Spinner","medium","Icon32Spinner","large","Icon44Spinner","span","role","aria-label","classNames","displayName"],"mappings":";;;;+BAYaA;;;eAAAA;;;;;;;+DAZU;qBACoD;oBAChD;AAUpB,IAAMA,wBAAUC,OAAMC,KAC3B;6BACEC,MAAAA,gCAAO,yBACOC,aAAd,eAAcA,YAAAA,iBAAY,mBAAZA,KACdC,mBAAAA,WACGC;QAHHH;QACA;QACAE;;IAGA,IAAME,cAAc;QAClBC,OAAOC;QACPC,SAASC;QACTC,QAAQC;QACRC,OAAOC;IACT,CAAC,CAACZ,KAAK;IAEP,qBACE,qBAACa;QACCC,MAAK;QACLC,cAAYd;OACRE;QACJD,WAAWc,IAAAA,iCAA8Bd;sBAEzC,qBAACE;QAAYF,SAAS;;AAG5B;AAGFL,QAAQoB,cAAc"}
1
+ {"version":3,"sources":["../../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Spinner, Icon24Spinner, Icon32Spinner, Icon44Spinner } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Spinner.module.css';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'small' | 'regular' | 'medium' | 'large';\n}\n\nconst warn = warnOnce('Spinner');\n/**\n * @see https://vkcom.github.io/VKUI/#/Spinner\n */\nexport const Spinner = React.memo(\n ({\n size = 'regular',\n children = 'Загружается...',\n // TODO [>=6]: Удалить автоматическое приведение aria-label\n 'aria-label': ariaLabel = 'Загружается...',\n className,\n ...restProps\n }: SpinnerProps) => {\n const SpinnerIcon = {\n small: Icon16Spinner,\n regular: Icon24Spinner,\n medium: Icon32Spinner,\n large: Icon44Spinner,\n }[size];\n\n // TODO [>=6]: Удалить варнинг\n if (process.env.NODE_ENV === 'development') {\n if (ariaLabel && !children) {\n warn(\n 'a11y: Пожалуйста, передавайте ваш текст для ассистивных технологий в children вместо aria-label.',\n );\n }\n }\n\n return (\n <span role=\"status\" {...restProps} className={classNames(styles['Spinner'], className)}>\n <SpinnerIcon className={styles['Spinner__self']} />\n <VisuallyHidden>{children ?? ariaLabel}</VisuallyHidden>\n </span>\n );\n },\n);\n\nSpinner.displayName = 'Spinner';\n"],"names":["Spinner","warn","warnOnce","React","memo","size","children","ariaLabel","className","restProps","SpinnerIcon","small","Icon16Spinner","regular","Icon24Spinner","medium","Icon32Spinner","large","Icon44Spinner","process","env","NODE_ENV","span","role","classNames","VisuallyHidden","displayName"],"mappings":";;;;+BAeaA;;;eAAAA;;;;;;;+DAfU;qBACoD;oBAChD;wBACF;8BACM;AAO/B,IAAMC,OAAOC,IAAAA,oBAAS;AAIf,IAAMF,wBAAUG,OAAMC,KAC3B;6BACEC,MAAAA,gCAAO,kDACPC,UAAAA,wCAAW,oCAEGC,aADd,2DAA2D;IAC3D,eAAcA,YAAAA,iBAAY,mBAAZA,KACdC,mBAAAA,WACGC;QALHJ;QACAC;QAEA;QACAE;;IAGA,IAAME,cAAc;QAClBC,OAAOC;QACPC,SAASC;QACTC,QAAQC;QACRC,OAAOC;IACT,CAAC,CAACb,KAAK;IAEP,8BAA8B;IAC9B,IAAIc,QAAQC,IAAIC,aAAa,eAAe;QAC1C,IAAId,aAAa,CAACD,UAAU;YAC1BL,KACE;QAEJ;IACF;IAEA,qBACE,qBAACqB;QAAKC,MAAK;OAAad;QAAWD,WAAWgB,IAAAA,iCAA8BhB;sBAC1E,qBAACE;QAAYF,SAAS;sBACtB,qBAACiB,sCAAgBnB,qBAAAA,sBAAAA,WAAYC;AAGnC;AAGFP,QAAQ0B,cAAc"}
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { AnchorHTMLAttributesOnly, HasChildren, HasComponent, HasRootRef } from '../../types';
2
+ import { AnchorHTMLAttributesOnly, HasChildren, HasComponent, HasRootRef, LiteralUnion } from '../../types';
3
3
  import { FocusVisibleMode } from '../FocusVisible/FocusVisible';
4
4
  import { TouchProps } from '../Touch/Touch';
5
5
  type StateMode = 'opacity' | 'background';
@@ -25,15 +25,15 @@ export interface TappableProps extends TappableElementProps, HasRootRef<HTMLElem
25
25
  /**
26
26
  * Стиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active
27
27
  */
28
- activeMode?: StateMode | string;
28
+ activeMode?: LiteralUnion<StateMode, string>;
29
29
  /**
30
30
  * Стиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover
31
31
  */
32
- hoverMode?: StateMode | string;
32
+ hoverMode?: LiteralUnion<StateMode, string>;
33
33
  /**
34
34
  * Стиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс во время focus-visible
35
35
  */
36
- focusVisibleMode?: FocusVisibleMode | string;
36
+ focusVisibleMode?: LiteralUnion<FocusVisibleMode, string>;
37
37
  onEnter?(outputEvent: MouseEvent): void;
38
38
  onLeave?(outputEvent: MouseEvent): void;
39
39
  }