@vkontakte/vkui 7.0.0-dev-efd91c.4 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
  2. package/dist/components/ActionSheet/ActionSheet.js +1 -3
  3. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  4. package/dist/components/AppRoot/AppRoot.d.ts +1 -1
  5. package/dist/components/AppRoot/AppRoot.d.ts.map +1 -1
  6. package/dist/components/AppRoot/AppRoot.js +16 -10
  7. package/dist/components/AppRoot/AppRoot.js.map +1 -1
  8. package/dist/components/AppRoot/AppRootPortal.js +1 -1
  9. package/dist/components/AppRoot/AppRootPortal.js.map +1 -1
  10. package/dist/components/AppRoot/{AppRootStyleContainer.d.ts → AppRootStyleContainer/AppRootStyleContainer.d.ts} +3 -3
  11. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.d.ts.map +1 -0
  12. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js +45 -0
  13. package/dist/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
  14. package/dist/components/AppRoot/helpers.d.ts +7 -0
  15. package/dist/components/AppRoot/helpers.d.ts.map +1 -1
  16. package/dist/components/AppRoot/helpers.js +20 -4
  17. package/dist/components/AppRoot/helpers.js.map +1 -1
  18. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  19. package/dist/components/Clickable/Clickable.js +2 -83
  20. package/dist/components/Clickable/Clickable.js.map +1 -1
  21. package/dist/components/Clickable/RealClickable.d.ts +6 -0
  22. package/dist/components/Clickable/RealClickable.d.ts.map +1 -0
  23. package/dist/components/Clickable/RealClickable.js +90 -0
  24. package/dist/components/Clickable/RealClickable.js.map +1 -0
  25. package/dist/components/HorizontalCell/HorizontalCell.d.ts +4 -0
  26. package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
  27. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  28. package/dist/components/ModalCard/ModalCardInternal.js +1 -1
  29. package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
  30. package/dist/components/ModalPage/ModalPage.d.ts +1 -1
  31. package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
  32. package/dist/components/ModalPage/ModalPage.js +53 -5
  33. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  34. package/dist/components/ModalPage/ModalPageInternal.d.ts +5 -2
  35. package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
  36. package/dist/components/ModalPage/ModalPageInternal.js +5 -4
  37. package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
  38. package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  39. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  40. package/dist/components/ModalRoot/types.d.ts.map +1 -1
  41. package/dist/components/ModalRoot/types.js.map +1 -1
  42. package/dist/components/ModalRoot/useModalManager.d.ts +2 -0
  43. package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
  44. package/dist/components/ModalRoot/useModalManager.js +4 -1
  45. package/dist/components/ModalRoot/useModalManager.js.map +1 -1
  46. package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  47. package/dist/components/PopoutWrapper/PopoutWrapper.d.ts.map +1 -1
  48. package/dist/components/PopoutWrapper/PopoutWrapper.js +2 -2
  49. package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  50. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  51. package/dist/components/Spinner/Spinner.js +11 -43
  52. package/dist/components/Spinner/Spinner.js.map +1 -1
  53. package/dist/components/Spinner/SpinnerAnimation.d.ts +7 -0
  54. package/dist/components/Spinner/SpinnerAnimation.d.ts.map +1 -0
  55. package/dist/components/Spinner/SpinnerAnimation.js +36 -0
  56. package/dist/components/Spinner/SpinnerAnimation.js.map +1 -0
  57. package/dist/components/SplitLayout/SplitLayout.d.ts +4 -4
  58. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  59. package/dist/components.css +1 -1
  60. package/dist/components.css.map +1 -1
  61. package/dist/cssm/components/ActionSheet/ActionSheet.js +1 -3
  62. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  63. package/dist/cssm/components/AppRoot/AppRoot.js +14 -9
  64. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  65. package/dist/cssm/components/AppRoot/AppRoot.module.css +17 -0
  66. package/dist/cssm/components/AppRoot/AppRootPortal.js +1 -1
  67. package/dist/cssm/components/AppRoot/AppRootPortal.js.map +1 -1
  68. package/dist/cssm/components/AppRoot/{AppRootStyleContainer.js → AppRootStyleContainer/AppRootStyleContainer.js} +12 -23
  69. package/dist/cssm/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.js.map +1 -0
  70. package/dist/cssm/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -31
  71. package/dist/cssm/components/AppRoot/helpers.js +17 -1
  72. package/dist/cssm/components/AppRoot/helpers.js.map +1 -1
  73. package/dist/cssm/components/Button/Button.module.css +6 -6
  74. package/dist/cssm/components/Card/Card.module.css +12 -6
  75. package/dist/cssm/components/Clickable/Clickable.js +2 -55
  76. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  77. package/dist/cssm/components/Clickable/RealClickable.js +61 -0
  78. package/dist/cssm/components/Clickable/RealClickable.js.map +1 -0
  79. package/dist/cssm/components/FormField/FormField.module.css +2 -0
  80. package/dist/cssm/components/FormItem/FormItem.module.css +6 -6
  81. package/dist/cssm/components/Group/Group.module.css +1 -0
  82. package/dist/cssm/components/Header/Header.module.css +10 -4
  83. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  84. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
  85. package/dist/cssm/components/IconButton/IconButton.module.css +12 -3
  86. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
  87. package/dist/cssm/components/ModalCard/ModalCardInternal.js +1 -1
  88. package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
  89. package/dist/cssm/components/ModalPage/ModalPage.js +50 -4
  90. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  91. package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
  92. package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
  93. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
  94. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  95. package/dist/cssm/components/ModalRoot/types.js.map +1 -1
  96. package/dist/cssm/components/ModalRoot/useModalManager.js +4 -1
  97. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
  98. package/dist/cssm/components/PanelHeader/PanelHeader.module.css +10 -4
  99. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  100. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
  101. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +2 -3
  102. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  103. package/dist/cssm/components/Removable/Removable.module.css +7 -2
  104. package/dist/cssm/components/Spinner/Spinner.js +11 -43
  105. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  106. package/dist/cssm/components/Spinner/SpinnerAnimation.js +36 -0
  107. package/dist/cssm/components/Spinner/SpinnerAnimation.js.map +1 -0
  108. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  109. package/dist/cssm/components/View/View.module.css +2 -2
  110. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
  111. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  112. package/dist/cssm/index.js.map +1 -1
  113. package/dist/cssm/lib/adaptivity/functions.js +1 -7
  114. package/dist/cssm/lib/adaptivity/functions.js.map +1 -1
  115. package/dist/cssm/lib/animation/useReducedMotion.js +4 -7
  116. package/dist/cssm/lib/animation/useReducedMotion.js.map +1 -1
  117. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js +22 -37
  118. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  119. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js +1 -9
  120. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  121. package/dist/cssm/lib/sheet/index.js +1 -1
  122. package/dist/cssm/lib/sheet/index.js.map +1 -1
  123. package/dist/cssm/lib/sheet/useBottomSheet.js +12 -15
  124. package/dist/cssm/lib/sheet/useBottomSheet.js.map +1 -1
  125. package/dist/cssm/styles/common.css +10 -4
  126. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts +3 -2
  127. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.d.ts.map +1 -1
  128. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +15 -4
  129. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  130. package/dist/index.d.ts +2 -2
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js.map +1 -1
  133. package/dist/lib/adaptivity/functions.d.ts +0 -1
  134. package/dist/lib/adaptivity/functions.d.ts.map +1 -1
  135. package/dist/lib/adaptivity/functions.js +1 -7
  136. package/dist/lib/adaptivity/functions.js.map +1 -1
  137. package/dist/lib/animation/useReducedMotion.d.ts +1 -1
  138. package/dist/lib/animation/useReducedMotion.d.ts.map +1 -1
  139. package/dist/lib/animation/useReducedMotion.js +4 -7
  140. package/dist/lib/animation/useReducedMotion.js.map +1 -1
  141. package/dist/lib/sheet/controllers/BottomSheetController.d.ts +8 -8
  142. package/dist/lib/sheet/controllers/BottomSheetController.d.ts.map +1 -1
  143. package/dist/lib/sheet/controllers/BottomSheetController.js +22 -37
  144. package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  145. package/dist/lib/sheet/controllers/CSSTransitionController.d.ts +1 -1
  146. package/dist/lib/sheet/controllers/CSSTransitionController.d.ts.map +1 -1
  147. package/dist/lib/sheet/controllers/CSSTransitionController.js +1 -9
  148. package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  149. package/dist/lib/sheet/index.d.ts +2 -1
  150. package/dist/lib/sheet/index.d.ts.map +1 -1
  151. package/dist/lib/sheet/index.js +1 -1
  152. package/dist/lib/sheet/index.js.map +1 -1
  153. package/dist/lib/sheet/useBottomSheet.d.ts +6 -5
  154. package/dist/lib/sheet/useBottomSheet.d.ts.map +1 -1
  155. package/dist/lib/sheet/useBottomSheet.js +12 -15
  156. package/dist/lib/sheet/useBottomSheet.js.map +1 -1
  157. package/dist/vkui.css +1 -1
  158. package/dist/vkui.css.map +1 -1
  159. package/package.json +2 -2
  160. package/src/components/ActionSheet/ActionSheet.tsx +1 -4
  161. package/src/components/AppRoot/AppRoot.module.css +17 -0
  162. package/src/components/AppRoot/AppRoot.tsx +24 -11
  163. package/src/components/AppRoot/AppRootPortal.tsx +1 -1
  164. package/src/components/AppRoot/{AppRootStyleContainer.module.css → AppRootStyleContainer/AppRootStyleContainer.module.css} +7 -24
  165. package/src/components/AppRoot/{AppRootStyleContainer.tsx → AppRootStyleContainer/AppRootStyleContainer.tsx} +11 -29
  166. package/src/components/AppRoot/helpers.ts +17 -1
  167. package/src/components/Button/Button.module.css +6 -6
  168. package/src/components/Card/Card.module.css +8 -6
  169. package/src/components/Clickable/Clickable.tsx +4 -103
  170. package/src/components/Clickable/RealClickable.tsx +99 -0
  171. package/src/components/FormField/FormField.module.css +2 -0
  172. package/src/components/FormItem/FormItem.module.css +6 -6
  173. package/src/components/Group/Group.module.css +1 -0
  174. package/src/components/Header/Header.module.css +8 -4
  175. package/src/components/HorizontalCell/HorizontalCell.tsx +4 -1
  176. package/src/components/HorizontalScroll/HorizontalScroll.module.css +1 -0
  177. package/src/components/IconButton/IconButton.module.css +10 -3
  178. package/src/components/MiniInfoCell/MiniInfoCell.module.css +1 -0
  179. package/src/components/ModalCard/ModalCardInternal.tsx +1 -1
  180. package/src/components/ModalPage/ModalPage.tsx +57 -3
  181. package/src/components/ModalPage/ModalPageInternal.tsx +14 -5
  182. package/src/components/ModalPageHeader/ModalPageHeader.module.css +1 -0
  183. package/src/components/ModalRoot/ModalRoot.tsx +0 -1
  184. package/src/components/ModalRoot/types.ts +0 -1
  185. package/src/components/ModalRoot/useModalManager.tsx +5 -3
  186. package/src/components/PanelHeader/PanelHeader.module.css +8 -4
  187. package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +4 -0
  188. package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +1 -1
  189. package/src/components/PopoutWrapper/PopoutWrapper.tsx +1 -4
  190. package/src/components/Removable/Removable.module.css +6 -2
  191. package/src/components/Spinner/Spinner.tsx +10 -48
  192. package/src/components/Spinner/SpinnerAnimation.tsx +42 -0
  193. package/src/components/SplitLayout/SplitLayout.tsx +4 -4
  194. package/src/components/View/View.module.css +2 -2
  195. package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +13 -4
  196. package/src/index.ts +2 -2
  197. package/src/lib/adaptivity/functions.ts +1 -8
  198. package/src/lib/animation/useReducedMotion.ts +6 -13
  199. package/src/lib/sheet/controllers/BottomSheetController.ts +32 -50
  200. package/src/lib/sheet/controllers/CSSTransitionController.ts +1 -8
  201. package/src/lib/sheet/index.ts +3 -0
  202. package/src/lib/sheet/useBottomSheet.ts +21 -17
  203. package/src/styles/common.css +12 -4
  204. package/dist/components/AppRoot/AppRootStyleContainer.d.ts.map +0 -1
  205. package/dist/components/AppRoot/AppRootStyleContainer.js +0 -57
  206. package/dist/components/AppRoot/AppRootStyleContainer.js.map +0 -1
  207. package/dist/cssm/components/AppRoot/AppRootStyleContainer.js.map +0 -1
@@ -99,11 +99,9 @@ import styles from "./ActionSheet.module.css";
99
99
  ]
100
100
  })
101
101
  });
102
- if (mode === 'menu') {
103
- return actionSheet;
104
- }
105
102
  return /*#__PURE__*/ _jsx(AppRootPortal, {
106
103
  children: /*#__PURE__*/ _jsx(PopoutWrapper, {
104
+ noBackground: mode === 'menu',
107
105
  closing: Boolean(closingBy),
108
106
  alignY: "bottom",
109
107
  className: className,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ActionSheet/ActionSheet.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { ActionSheetContext, type ItemClickHandler } from './ActionSheetContext';\nimport { ActionSheetDefaultIosCloseItem } from './ActionSheetDefaultIosCloseItem';\nimport { ActionSheetDropdownMenu } from './ActionSheetDropdownMenu';\nimport { ActionSheetDropdownSheet } from './ActionSheetDropdownSheet';\nimport type { SharedDropdownProps } from './types';\nimport styles from './ActionSheet.module.css';\n\ntype CloseInitiators = 'action-item' | 'cancel-item' | 'other';\nexport interface ActionSheetOnCloseOptions {\n closedBy: CloseInitiators;\n}\n\nexport interface ActionSheetProps\n extends Pick<\n SharedDropdownProps,\n 'toggleRef' | 'popupOffsetDistance' | 'placement' | 'autoFocus'\n >,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'autoFocus' | 'title'> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n /**\n * Закрыть попап по клику снаружи.\n */\n onClose: (options: ActionSheetOnCloseOptions) => void;\n /**\n * Только мобильный iOS.\n */\n iosCloseItem?: React.ReactNode;\n mode?: 'sheet' | 'menu';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ActionSheet\n */\nexport const ActionSheet = ({\n children,\n className,\n title,\n description,\n style,\n iosCloseItem,\n popupOffsetDistance,\n placement,\n mode: modeProp,\n onClose,\n ...restProps\n}: ActionSheetProps): React.ReactNode => {\n const platform = usePlatform();\n const [closingBy, setClosingBy] = React.useState<undefined | CloseInitiators>(undefined);\n const onCloseWithOther = React.useCallback(() => setClosingBy('other'), []);\n const actionCallbackRef = React.useRef(noop);\n\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n closingBy !== undefined ? 'exit' : 'enter',\n {\n onExited() {\n onClose({ closedBy: closingBy || 'other' });\n actionCallbackRef.current();\n actionCallbackRef.current = noop;\n },\n },\n );\n\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const mode = modeProp ?? (isDesktop ? 'menu' : 'sheet');\n\n useScrollLock(mode === 'sheet');\n\n const onItemClick = React.useCallback<ItemClickHandler>(\n ({ action, immediateAction, autoClose, isCancelItem }) =>\n (event) => {\n event.persist();\n immediateAction && immediateAction(event);\n if (autoClose) {\n if (action) {\n actionCallbackRef.current = () => action(event);\n }\n setClosingBy(isCancelItem ? 'cancel-item' : 'action-item');\n } else {\n action && action(event);\n }\n },\n [],\n );\n const contextValue = React.useMemo(\n () => ({ onItemClick, mode, onClose: onCloseWithOther }),\n [mode, onCloseWithOther, onItemClick],\n );\n\n const DropdownComponent = mode === 'menu' ? ActionSheetDropdownMenu : ActionSheetDropdownSheet;\n\n const dropdownProps =\n mode === 'menu' ? Object.assign(restProps, { popupOffsetDistance, placement }) : restProps;\n\n const actionSheet = (\n <ActionSheetContext.Provider value={contextValue}>\n <DropdownComponent\n closing={Boolean(closingBy)}\n role=\"dialog\"\n aria-modal=\"true\"\n autoFocus={animationState === 'entered'}\n {...dropdownProps}\n {...animationHandlers}\n onClose={onCloseWithOther}\n className={mode === 'menu' ? className : undefined}\n style={mode === 'menu' ? style : undefined}\n >\n <div className={styles.contentWrapper}>\n {(title || description) && (\n <div className={styles.header}>\n {title && (\n <Footnote weight=\"2\" className={styles.title}>\n {title}\n </Footnote>\n )}\n {description && <Footnote className={styles.description}>{description}</Footnote>}\n </div>\n )}\n {children}\n </div>\n {platform === 'ios' && mode === 'sheet' && (\n <div className={styles.closeItemWrapperIos}>\n {iosCloseItem ?? <ActionSheetDefaultIosCloseItem />}\n </div>\n )}\n </DropdownComponent>\n </ActionSheetContext.Provider>\n );\n\n if (mode === 'menu') {\n return actionSheet;\n }\n\n return (\n <AppRootPortal>\n <PopoutWrapper\n closing={Boolean(closingBy)}\n alignY=\"bottom\"\n className={className}\n style={style}\n onClick={onCloseWithOther}\n fixed\n >\n {actionSheet}\n </PopoutWrapper>\n </AppRootPortal>\n );\n};\n"],"names":["React","noop","useAdaptivityWithJSMediaQueries","usePlatform","useCSSKeyframesAnimationController","AppRootPortal","useScrollLock","PopoutWrapper","Footnote","ActionSheetContext","ActionSheetDefaultIosCloseItem","ActionSheetDropdownMenu","ActionSheetDropdownSheet","styles","ActionSheet","children","className","title","description","style","iosCloseItem","popupOffsetDistance","placement","mode","modeProp","onClose","restProps","platform","closingBy","setClosingBy","useState","undefined","onCloseWithOther","useCallback","actionCallbackRef","useRef","animationState","animationHandlers","onExited","closedBy","current","isDesktop","onItemClick","action","immediateAction","autoClose","isCancelItem","event","persist","contextValue","useMemo","DropdownComponent","dropdownProps","Object","assign","actionSheet","Provider","value","closing","Boolean","role","aria-modal","autoFocus","div","contentWrapper","header","weight","closeItemWrapperIos","alignY","onClick","fixed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ActionSheet/ActionSheet.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { ActionSheetContext, type ItemClickHandler } from './ActionSheetContext';\nimport { ActionSheetDefaultIosCloseItem } from './ActionSheetDefaultIosCloseItem';\nimport { ActionSheetDropdownMenu } from './ActionSheetDropdownMenu';\nimport { ActionSheetDropdownSheet } from './ActionSheetDropdownSheet';\nimport type { SharedDropdownProps } from './types';\nimport styles from './ActionSheet.module.css';\n\ntype CloseInitiators = 'action-item' | 'cancel-item' | 'other';\nexport interface ActionSheetOnCloseOptions {\n closedBy: CloseInitiators;\n}\n\nexport interface ActionSheetProps\n extends Pick<\n SharedDropdownProps,\n 'toggleRef' | 'popupOffsetDistance' | 'placement' | 'autoFocus'\n >,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'autoFocus' | 'title'> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n /**\n * Закрыть попап по клику снаружи.\n */\n onClose: (options: ActionSheetOnCloseOptions) => void;\n /**\n * Только мобильный iOS.\n */\n iosCloseItem?: React.ReactNode;\n mode?: 'sheet' | 'menu';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ActionSheet\n */\nexport const ActionSheet = ({\n children,\n className,\n title,\n description,\n style,\n iosCloseItem,\n popupOffsetDistance,\n placement,\n mode: modeProp,\n onClose,\n ...restProps\n}: ActionSheetProps): React.ReactNode => {\n const platform = usePlatform();\n const [closingBy, setClosingBy] = React.useState<undefined | CloseInitiators>(undefined);\n const onCloseWithOther = React.useCallback(() => setClosingBy('other'), []);\n const actionCallbackRef = React.useRef(noop);\n\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n closingBy !== undefined ? 'exit' : 'enter',\n {\n onExited() {\n onClose({ closedBy: closingBy || 'other' });\n actionCallbackRef.current();\n actionCallbackRef.current = noop;\n },\n },\n );\n\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const mode = modeProp ?? (isDesktop ? 'menu' : 'sheet');\n\n useScrollLock(mode === 'sheet');\n\n const onItemClick = React.useCallback<ItemClickHandler>(\n ({ action, immediateAction, autoClose, isCancelItem }) =>\n (event) => {\n event.persist();\n immediateAction && immediateAction(event);\n if (autoClose) {\n if (action) {\n actionCallbackRef.current = () => action(event);\n }\n setClosingBy(isCancelItem ? 'cancel-item' : 'action-item');\n } else {\n action && action(event);\n }\n },\n [],\n );\n const contextValue = React.useMemo(\n () => ({ onItemClick, mode, onClose: onCloseWithOther }),\n [mode, onCloseWithOther, onItemClick],\n );\n\n const DropdownComponent = mode === 'menu' ? ActionSheetDropdownMenu : ActionSheetDropdownSheet;\n\n const dropdownProps =\n mode === 'menu' ? Object.assign(restProps, { popupOffsetDistance, placement }) : restProps;\n\n const actionSheet = (\n <ActionSheetContext.Provider value={contextValue}>\n <DropdownComponent\n closing={Boolean(closingBy)}\n role=\"dialog\"\n aria-modal=\"true\"\n autoFocus={animationState === 'entered'}\n {...dropdownProps}\n {...animationHandlers}\n onClose={onCloseWithOther}\n className={mode === 'menu' ? className : undefined}\n style={mode === 'menu' ? style : undefined}\n >\n <div className={styles.contentWrapper}>\n {(title || description) && (\n <div className={styles.header}>\n {title && (\n <Footnote weight=\"2\" className={styles.title}>\n {title}\n </Footnote>\n )}\n {description && <Footnote className={styles.description}>{description}</Footnote>}\n </div>\n )}\n {children}\n </div>\n {platform === 'ios' && mode === 'sheet' && (\n <div className={styles.closeItemWrapperIos}>\n {iosCloseItem ?? <ActionSheetDefaultIosCloseItem />}\n </div>\n )}\n </DropdownComponent>\n </ActionSheetContext.Provider>\n );\n\n return (\n <AppRootPortal>\n <PopoutWrapper\n noBackground={mode === 'menu'}\n closing={Boolean(closingBy)}\n alignY=\"bottom\"\n className={className}\n style={style}\n onClick={onCloseWithOther}\n fixed\n >\n {actionSheet}\n </PopoutWrapper>\n </AppRootPortal>\n );\n};\n"],"names":["React","noop","useAdaptivityWithJSMediaQueries","usePlatform","useCSSKeyframesAnimationController","AppRootPortal","useScrollLock","PopoutWrapper","Footnote","ActionSheetContext","ActionSheetDefaultIosCloseItem","ActionSheetDropdownMenu","ActionSheetDropdownSheet","styles","ActionSheet","children","className","title","description","style","iosCloseItem","popupOffsetDistance","placement","mode","modeProp","onClose","restProps","platform","closingBy","setClosingBy","useState","undefined","onCloseWithOther","useCallback","actionCallbackRef","useRef","animationState","animationHandlers","onExited","closedBy","current","isDesktop","onItemClick","action","immediateAction","autoClose","isCancelItem","event","persist","contextValue","useMemo","DropdownComponent","dropdownProps","Object","assign","actionSheet","Provider","value","closing","Boolean","role","aria-modal","autoFocus","div","contentWrapper","header","weight","closeItemWrapperIos","noBackground","alignY","onClick","fixed"],"mappings":"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"}
@@ -1,24 +1,25 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
+ import { classNames } from "@vkontakte/vkjs";
4
5
  import { useKeyboardInputTracker } from "../../hooks/useKeyboardInputTracker.js";
5
6
  import { useSyncHTMLWithBaseVKUIClasses } from "../../hooks/useSyncHTMLWithBaseVKUIClasses.js";
6
7
  import { useSyncHTMLWithTokens } from "../../hooks/useSyncHTMLWithTokens.js";
7
8
  import { AppRootContext } from "./AppRootContext.js";
8
- import { AppRootStyleContainer } from "./AppRootStyleContainer.js";
9
+ import { AppRootStyleContainer } from "./AppRootStyleContainer/AppRootStyleContainer.js";
9
10
  import { ElementScrollController, GlobalScrollController } from "./ScrollContext.js";
11
+ import { useSafeAreaInsetsMemo } from "./helpers.js";
10
12
  import styles from "./AppRoot.module.css";
13
+ const layoutClassNames = {
14
+ card: styles.layoutCard,
15
+ plain: styles.layoutPlain
16
+ };
11
17
  /**
12
18
  * @see https://vkcom.github.io/VKUI/#/AppRoot
13
- */ export const AppRoot = ({ children, mode = 'full', scroll = 'global', portalRoot, disablePortal = false, disableParentTransformForPositionFixedElements, safeAreaInsets: safeAreaInsetsProp, layout, userSelectMode, disableSettingVKUIClassesInRuntime, ...props })=>{
19
+ */ export const AppRoot = ({ children, mode = 'full', scroll = 'global', portalRoot, disablePortal = false, disableParentTransformForPositionFixedElements, safeAreaInsets: safeAreaInsetsProp, layout, userSelectMode, disableSettingVKUIClassesInRuntime, className, ...props })=>{
14
20
  const appRootRef = React.useRef(null);
15
- const ScrollController = React.useMemo(()=>scroll === 'contain' ? ElementScrollController : GlobalScrollController, [
16
- scroll
17
- ]);
18
21
  const isKeyboardInputActiveRef = useKeyboardInputTracker();
19
- const safeAreaInsets = React.useMemo(()=>safeAreaInsetsProp, [
20
- safeAreaInsetsProp
21
- ]);
22
+ const safeAreaInsets = useSafeAreaInsetsMemo(safeAreaInsetsProp);
22
23
  const contextValue = React.useMemo(()=>({
23
24
  appRoot: appRootRef,
24
25
  portalRoot,
@@ -57,8 +58,12 @@ import styles from "./AppRoot.module.css";
57
58
  */ useSyncHTMLWithBaseVKUIClasses({
58
59
  appRootRef,
59
60
  mode,
61
+ layout,
60
62
  enable: mode !== 'partial' && !disableSettingVKUIClassesInRuntime
61
63
  });
64
+ const ScrollController = React.useMemo(()=>scroll === 'contain' ? ElementScrollController : GlobalScrollController, [
65
+ scroll
66
+ ]);
62
67
  return mode === 'partial' ? /*#__PURE__*/ _jsx(AppRootContext.Provider, {
63
68
  value: contextValue,
64
69
  children: /*#__PURE__*/ _jsx(ScrollController, {
@@ -69,7 +74,7 @@ import styles from "./AppRoot.module.css";
69
74
  value: contextValue,
70
75
  children: /*#__PURE__*/ _jsx(AppRootStyleContainer, {
71
76
  getRootRef: appRootRef,
72
- className: mode === 'embedded' && !disableParentTransformForPositionFixedElements ? styles.transformForPositionFixedElements : undefined,
77
+ className: classNames(className, styles.host, layout && layoutClassNames[layout], mode === 'embedded' && !disableParentTransformForPositionFixedElements ? styles.transformForPositionFixedElements : undefined),
73
78
  ...props,
74
79
  children: /*#__PURE__*/ _jsx(ScrollController, {
75
80
  elRef: appRootRef,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/AppRoot/AppRoot.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useKeyboardInputTracker } from '../../hooks/useKeyboardInputTracker';\nimport { useSyncHTMLWithBaseVKUIClasses } from '../../hooks/useSyncHTMLWithBaseVKUIClasses';\nimport { useSyncHTMLWithTokens } from '../../hooks/useSyncHTMLWithTokens';\nimport { AppRootContext } from './AppRootContext';\nimport { AppRootStyleContainer } from './AppRootStyleContainer';\nimport { ElementScrollController, GlobalScrollController } from './ScrollContext';\nimport type {\n AppRootLayout,\n AppRootMode,\n AppRootScroll,\n AppRootUserSelectMode,\n SafeAreaInsets,\n} from './types';\nimport styles from './AppRoot.module.css';\n\nexport interface AppRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Режим встраивания */\n mode?: AppRootMode;\n /**\n * - `global` (по умолчанию) — VKUI-приложение скроллится вместе со страницей.\n * - `contain` — VKUI-приложение живет в отдельной зоне и скроллится независимо внутри `AppRoot` (например, в модалке).\n *\n * Полезно при использовании `mode=\"embedded\"`.\n */\n scroll?: AppRootScroll;\n /**\n * см. документацию [mdn web docs | env#values](https://developer.mozilla.org/en-US/docs/Web/CSS/env#values).\n */\n safeAreaInsets?: SafeAreaInsets;\n /**\n * Кастомный root-элемент портала\n */\n portalRoot?: HTMLElement | React.RefObject<HTMLElement> | null;\n /**\n * Отключает рендер всплывающих компонентов в отдельном контейнере\n */\n disablePortal?: boolean;\n /**\n * По умолчанию, mode=\"embedded\" переносит систему координат элементов с `position: fixed` на\n * свой контейнер через `transform: translate3d(0, 0, 0)`.\n *\n * Это поведение можно отключить с помощью этого параметра.\n */\n disableParentTransformForPositionFixedElements?: boolean;\n /**\n * Глобально задаёт тип оформления макета для компонентов\n * [Panel](https://vkcom.github.io/VKUI/#/Panel) и [Group](https://vkcom.github.io/VKUI/#/Group).\n */\n layout?: AppRootLayout;\n /**\n * Задаёт режим выбора текста (выделения текста) для всего приложения.\n * По умолчанию, если режим не задан, запрещает выбор текста в приложениях,\n * запущенных в webview (по значению свойства `isWebView` из [ConfigProvider](https://vkcom.github.io/VKUI/#/ConfigProvider)).\n *\n * - `enabled-with-pointer` – разрешает выбор текста, если устройство ввода типа `pointer` (например, `мышь`), в остальных случаях запрещает;\n * - `disabled` – запрещает выбор текста;\n * - `enabled` – разрешает выбор текста.\n *\n * @since 6.2.0\n */\n userSelectMode?: AppRootUserSelectMode;\n /*\n * По умолчанию в режиме `mode=\"full\"` VKUI в рантайме выставляет:\n * - класс .vkui на html элемент\n * - класс .vkui__root на элемент-контейнер, в который монтируется VKUI\n * С помощью этой опции такое поведение можно отключить.\n *\n * Для корректной работы SSR рекоммендуется выставлять эти классы самостоятельно\n * и отключить это поводение.\n */\n disableSettingVKUIClassesInRuntime?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/AppRoot\n */\nexport const AppRoot = ({\n children,\n mode = 'full',\n scroll = 'global',\n portalRoot,\n disablePortal = false,\n disableParentTransformForPositionFixedElements,\n safeAreaInsets: safeAreaInsetsProp,\n layout,\n userSelectMode,\n disableSettingVKUIClassesInRuntime,\n ...props\n}: AppRootProps): React.ReactNode => {\n const appRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const ScrollController = React.useMemo(\n () => (scroll === 'contain' ? ElementScrollController : GlobalScrollController),\n [scroll],\n );\n\n const isKeyboardInputActiveRef = useKeyboardInputTracker();\n const safeAreaInsets = React.useMemo(() => safeAreaInsetsProp, [safeAreaInsetsProp]);\n const contextValue = React.useMemo(\n () => ({\n appRoot: appRootRef,\n portalRoot,\n safeAreaInsets,\n embedded: mode === 'embedded',\n mode,\n disablePortal,\n layout,\n get keyboardInput() {\n return isKeyboardInputActiveRef.current;\n },\n userSelectMode,\n }),\n [\n portalRoot,\n disablePortal,\n isKeyboardInputActiveRef,\n layout,\n mode,\n safeAreaInsets,\n userSelectMode,\n ],\n );\n\n /*\n * Вешаем класс токенов на html в режиме full.\n * Это необходимо, чтобы цвета html элемента и скроллбара соответствовали текущей цветовой схеме:\n * - фон html элемента виден, если пользователь оверскролит. Тогда возникает анимация bounce-эффекта и виден фон html элемента. Без токенов в черной теме будет выглядывать белый фон.\n * - цвет системного сколлбара зависит от color-sheme свойства, значение которого задётся токенами и должно быть выставлено именно на html элементе.\n * В режме SSR пользователи сами могу задать этот класс на html-элементе. главное, чтобы он соответствовал переданным platform и appearence свойствам.\n */\n useSyncHTMLWithTokens({ appRootRef, enable: mode === 'full' });\n /*\n * По умолчанию VKUI будет выставлять .vkui на html и .vkui__root на контейнере в режиме full.\n * В режиме embedded будет выставлять только .vkui__root и .vkui__root--embedded на контейнере.\n * В режиме partial мы классы не выставляем.\n */\n useSyncHTMLWithBaseVKUIClasses({\n appRootRef,\n mode,\n enable: mode !== 'partial' && !disableSettingVKUIClassesInRuntime,\n });\n\n return mode === 'partial' ? (\n <AppRootContext.Provider value={contextValue}>\n <ScrollController elRef={appRootRef}>{children}</ScrollController>\n </AppRootContext.Provider>\n ) : (\n <AppRootContext.Provider value={contextValue}>\n <AppRootStyleContainer\n getRootRef={appRootRef}\n className={\n mode === 'embedded' && !disableParentTransformForPositionFixedElements\n ? styles.transformForPositionFixedElements\n : undefined\n }\n {...props}\n >\n <ScrollController elRef={appRootRef}>{children}</ScrollController>\n </AppRootStyleContainer>\n </AppRootContext.Provider>\n );\n};\n"],"names":["React","useKeyboardInputTracker","useSyncHTMLWithBaseVKUIClasses","useSyncHTMLWithTokens","AppRootContext","AppRootStyleContainer","ElementScrollController","GlobalScrollController","styles","AppRoot","children","mode","scroll","portalRoot","disablePortal","disableParentTransformForPositionFixedElements","safeAreaInsets","safeAreaInsetsProp","layout","userSelectMode","disableSettingVKUIClassesInRuntime","props","appRootRef","useRef","ScrollController","useMemo","isKeyboardInputActiveRef","contextValue","appRoot","embedded","keyboardInput","current","enable","Provider","value","elRef","getRootRef","className","transformForPositionFixedElements","undefined"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,uBAAuB,QAAQ,yCAAsC;AAC9E,SAASC,8BAA8B,QAAQ,gDAA6C;AAC5F,SAASC,qBAAqB,QAAQ,uCAAoC;AAC1E,SAASC,cAAc,QAAQ,sBAAmB;AAClD,SAASC,qBAAqB,QAAQ,6BAA0B;AAChE,SAASC,uBAAuB,EAAEC,sBAAsB,QAAQ,qBAAkB;AAQlF,OAAOC,YAAY,uBAAuB;AA4D1C;;CAEC,GACD,OAAO,MAAMC,UAAU,CAAC,EACtBC,QAAQ,EACRC,OAAO,MAAM,EACbC,SAAS,QAAQ,EACjBC,UAAU,EACVC,gBAAgB,KAAK,EACrBC,8CAA8C,EAC9CC,gBAAgBC,kBAAkB,EAClCC,MAAM,EACNC,cAAc,EACdC,kCAAkC,EAClC,GAAGC,OACU;IACb,MAAMC,aAAatB,MAAMuB,MAAM,CAAwB;IAEvD,MAAMC,mBAAmBxB,MAAMyB,OAAO,CACpC,IAAOb,WAAW,YAAYN,0BAA0BC,wBACxD;QAACK;KAAO;IAGV,MAAMc,2BAA2BzB;IACjC,MAAMe,iBAAiBhB,MAAMyB,OAAO,CAAC,IAAMR,oBAAoB;QAACA;KAAmB;IACnF,MAAMU,eAAe3B,MAAMyB,OAAO,CAChC,IAAO,CAAA;YACLG,SAASN;YACTT;YACAG;YACAa,UAAUlB,SAAS;YACnBA;YACAG;YACAI;YACA,IAAIY,iBAAgB;gBAClB,OAAOJ,yBAAyBK,OAAO;YACzC;YACAZ;QACF,CAAA,GACA;QACEN;QACAC;QACAY;QACAR;QACAP;QACAK;QACAG;KACD;IAGH;;;;;;GAMC,GACDhB,sBAAsB;QAAEmB;QAAYU,QAAQrB,SAAS;IAAO;IAC5D;;;;GAIC,GACDT,+BAA+B;QAC7BoB;QACAX;QACAqB,QAAQrB,SAAS,aAAa,CAACS;IACjC;IAEA,OAAOT,SAAS,0BACd,KAACP,eAAe6B,QAAQ;QAACC,OAAOP;kBAC9B,cAAA,KAACH;YAAiBW,OAAOb;sBAAaZ;;uBAGxC,KAACN,eAAe6B,QAAQ;QAACC,OAAOP;kBAC9B,cAAA,KAACtB;YACC+B,YAAYd;YACZe,WACE1B,SAAS,cAAc,CAACI,iDACpBP,OAAO8B,iCAAiC,GACxCC;YAEL,GAAGlB,KAAK;sBAET,cAAA,KAACG;gBAAiBW,OAAOb;0BAAaZ;;;;AAI9C,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/AppRoot/AppRoot.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useKeyboardInputTracker } from '../../hooks/useKeyboardInputTracker';\nimport { useSyncHTMLWithBaseVKUIClasses } from '../../hooks/useSyncHTMLWithBaseVKUIClasses';\nimport { useSyncHTMLWithTokens } from '../../hooks/useSyncHTMLWithTokens';\nimport { AppRootContext } from './AppRootContext';\nimport { AppRootStyleContainer } from './AppRootStyleContainer/AppRootStyleContainer';\nimport { ElementScrollController, GlobalScrollController } from './ScrollContext';\nimport { useSafeAreaInsetsMemo } from './helpers';\nimport type {\n AppRootLayout,\n AppRootMode,\n AppRootScroll,\n AppRootUserSelectMode,\n SafeAreaInsets,\n} from './types';\nimport styles from './AppRoot.module.css';\n\nconst layoutClassNames = {\n card: styles.layoutCard,\n plain: styles.layoutPlain,\n};\n\nexport interface AppRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Режим встраивания */\n mode?: AppRootMode;\n /**\n * - `global` (по умолчанию) — VKUI-приложение скроллится вместе со страницей.\n * - `contain` — VKUI-приложение живет в отдельной зоне и скроллится независимо внутри `AppRoot` (например, в модалке).\n *\n * Полезно при использовании `mode=\"embedded\"`.\n */\n scroll?: AppRootScroll;\n /**\n * см. документацию [mdn web docs | env#values](https://developer.mozilla.org/en-US/docs/Web/CSS/env#values).\n */\n safeAreaInsets?: SafeAreaInsets;\n /**\n * Кастомный root-элемент портала\n */\n portalRoot?: HTMLElement | React.RefObject<HTMLElement> | null;\n /**\n * Отключает рендер всплывающих компонентов в отдельном контейнере\n */\n disablePortal?: boolean;\n /**\n * По умолчанию, mode=\"embedded\" переносит систему координат элементов с `position: fixed` на\n * свой контейнер через `transform: translate3d(0, 0, 0)`.\n *\n * Это поведение можно отключить с помощью этого параметра.\n */\n disableParentTransformForPositionFixedElements?: boolean;\n /**\n * Глобально задаёт тип оформления макета для компонентов\n * [Panel](https://vkcom.github.io/VKUI/#/Panel) и [Group](https://vkcom.github.io/VKUI/#/Group).\n */\n layout?: AppRootLayout;\n /**\n * Задаёт режим выбора текста (выделения текста) для всего приложения.\n * По умолчанию, если режим не задан, запрещает выбор текста в приложениях,\n * запущенных в webview (по значению свойства `isWebView` из [ConfigProvider](https://vkcom.github.io/VKUI/#/ConfigProvider)).\n *\n * - `enabled-with-pointer` – разрешает выбор текста, если устройство ввода типа `pointer` (например, `мышь`), в остальных случаях запрещает;\n * - `disabled` – запрещает выбор текста;\n * - `enabled` – разрешает выбор текста.\n *\n * @since 6.2.0\n */\n userSelectMode?: AppRootUserSelectMode;\n /*\n * По умолчанию в режиме `mode=\"full\"` VKUI в рантайме выставляет:\n * - класс .vkui на html элемент\n * - класс .vkui__root на элемент-контейнер, в который монтируется VKUI\n * С помощью этой опции такое поведение можно отключить.\n *\n * Для корректной работы SSR рекоммендуется выставлять эти классы самостоятельно\n * и отключить это поведение.\n */\n disableSettingVKUIClassesInRuntime?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/AppRoot\n */\nexport const AppRoot = ({\n children,\n mode = 'full',\n scroll = 'global',\n portalRoot,\n disablePortal = false,\n disableParentTransformForPositionFixedElements,\n safeAreaInsets: safeAreaInsetsProp,\n layout,\n userSelectMode,\n disableSettingVKUIClassesInRuntime,\n className,\n ...props\n}: AppRootProps): React.ReactNode => {\n const appRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const isKeyboardInputActiveRef = useKeyboardInputTracker();\n const safeAreaInsets = useSafeAreaInsetsMemo(safeAreaInsetsProp);\n\n const contextValue = React.useMemo(\n () => ({\n appRoot: appRootRef,\n portalRoot,\n safeAreaInsets,\n embedded: mode === 'embedded',\n mode,\n disablePortal,\n layout,\n get keyboardInput() {\n return isKeyboardInputActiveRef.current;\n },\n userSelectMode,\n }),\n [\n portalRoot,\n disablePortal,\n isKeyboardInputActiveRef,\n layout,\n mode,\n safeAreaInsets,\n userSelectMode,\n ],\n );\n\n /*\n * Вешаем класс токенов на html в режиме full.\n * Это необходимо, чтобы цвета html элемента и скроллбара соответствовали текущей цветовой схеме:\n * - фон html элемента виден, если пользователь оверскролит. Тогда возникает анимация bounce-эффекта и виден фон html элемента. Без токенов в черной теме будет выглядывать белый фон.\n * - цвет системного сколлбара зависит от color-sheme свойства, значение которого задётся токенами и должно быть выставлено именно на html элементе.\n * В режме SSR пользователи сами могу задать этот класс на html-элементе. главное, чтобы он соответствовал переданным platform и appearence свойствам.\n */\n useSyncHTMLWithTokens({ appRootRef, enable: mode === 'full' });\n /*\n * По умолчанию VKUI будет выставлять .vkui на html и .vkui__root на контейнере в режиме full.\n * В режиме embedded будет выставлять только .vkui__root и .vkui__root--embedded на контейнере.\n * В режиме partial мы классы не выставляем.\n */\n useSyncHTMLWithBaseVKUIClasses({\n appRootRef,\n mode,\n layout,\n enable: mode !== 'partial' && !disableSettingVKUIClassesInRuntime,\n });\n\n const ScrollController = React.useMemo(\n () => (scroll === 'contain' ? ElementScrollController : GlobalScrollController),\n [scroll],\n );\n\n return mode === 'partial' ? (\n <AppRootContext.Provider value={contextValue}>\n <ScrollController elRef={appRootRef}>{children}</ScrollController>\n </AppRootContext.Provider>\n ) : (\n <AppRootContext.Provider value={contextValue}>\n <AppRootStyleContainer\n getRootRef={appRootRef}\n className={classNames(\n className,\n styles.host,\n layout && layoutClassNames[layout],\n mode === 'embedded' && !disableParentTransformForPositionFixedElements\n ? styles.transformForPositionFixedElements\n : undefined,\n )}\n {...props}\n >\n <ScrollController elRef={appRootRef}>{children}</ScrollController>\n </AppRootStyleContainer>\n </AppRootContext.Provider>\n );\n};\n"],"names":["React","classNames","useKeyboardInputTracker","useSyncHTMLWithBaseVKUIClasses","useSyncHTMLWithTokens","AppRootContext","AppRootStyleContainer","ElementScrollController","GlobalScrollController","useSafeAreaInsetsMemo","styles","layoutClassNames","card","layoutCard","plain","layoutPlain","AppRoot","children","mode","scroll","portalRoot","disablePortal","disableParentTransformForPositionFixedElements","safeAreaInsets","safeAreaInsetsProp","layout","userSelectMode","disableSettingVKUIClassesInRuntime","className","props","appRootRef","useRef","isKeyboardInputActiveRef","contextValue","useMemo","appRoot","embedded","keyboardInput","current","enable","ScrollController","Provider","value","elRef","getRootRef","host","transformForPositionFixedElements","undefined"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,uBAAuB,QAAQ,yCAAsC;AAC9E,SAASC,8BAA8B,QAAQ,gDAA6C;AAC5F,SAASC,qBAAqB,QAAQ,uCAAoC;AAC1E,SAASC,cAAc,QAAQ,sBAAmB;AAClD,SAASC,qBAAqB,QAAQ,mDAAgD;AACtF,SAASC,uBAAuB,EAAEC,sBAAsB,QAAQ,qBAAkB;AAClF,SAASC,qBAAqB,QAAQ,eAAY;AAQlD,OAAOC,YAAY,uBAAuB;AAE1C,MAAMC,mBAAmB;IACvBC,MAAMF,OAAOG,UAAU;IACvBC,OAAOJ,OAAOK,WAAW;AAC3B;AA4DA;;CAEC,GACD,OAAO,MAAMC,UAAU,CAAC,EACtBC,QAAQ,EACRC,OAAO,MAAM,EACbC,SAAS,QAAQ,EACjBC,UAAU,EACVC,gBAAgB,KAAK,EACrBC,8CAA8C,EAC9CC,gBAAgBC,kBAAkB,EAClCC,MAAM,EACNC,cAAc,EACdC,kCAAkC,EAClCC,SAAS,EACT,GAAGC,OACU;IACb,MAAMC,aAAa9B,MAAM+B,MAAM,CAAwB;IAEvD,MAAMC,2BAA2B9B;IACjC,MAAMqB,iBAAiBd,sBAAsBe;IAE7C,MAAMS,eAAejC,MAAMkC,OAAO,CAChC,IAAO,CAAA;YACLC,SAASL;YACTV;YACAG;YACAa,UAAUlB,SAAS;YACnBA;YACAG;YACAI;YACA,IAAIY,iBAAgB;gBAClB,OAAOL,yBAAyBM,OAAO;YACzC;YACAZ;QACF,CAAA,GACA;QACEN;QACAC;QACAW;QACAP;QACAP;QACAK;QACAG;KACD;IAGH;;;;;;GAMC,GACDtB,sBAAsB;QAAE0B;QAAYS,QAAQrB,SAAS;IAAO;IAC5D;;;;GAIC,GACDf,+BAA+B;QAC7B2B;QACAZ;QACAO;QACAc,QAAQrB,SAAS,aAAa,CAACS;IACjC;IAEA,MAAMa,mBAAmBxC,MAAMkC,OAAO,CACpC,IAAOf,WAAW,YAAYZ,0BAA0BC,wBACxD;QAACW;KAAO;IAGV,OAAOD,SAAS,0BACd,KAACb,eAAeoC,QAAQ;QAACC,OAAOT;kBAC9B,cAAA,KAACO;YAAiBG,OAAOb;sBAAab;;uBAGxC,KAACZ,eAAeoC,QAAQ;QAACC,OAAOT;kBAC9B,cAAA,KAAC3B;YACCsC,YAAYd;YACZF,WAAW3B,WACT2B,WACAlB,OAAOmC,IAAI,EACXpB,UAAUd,gBAAgB,CAACc,OAAO,EAClCP,SAAS,cAAc,CAACI,iDACpBZ,OAAOoC,iCAAiC,GACxCC;YAEL,GAAGlB,KAAK;sBAET,cAAA,KAACW;gBAAiBG,OAAOb;0BAAab;;;;AAI9C,EAAE"}
@@ -1,3 +1,20 @@
1
+ .host {
2
+ /* чтобы можно было ограничить размеры приложения
3
+ * извне с помощью max-height, max-width */
4
+ max-inline-size: inherit;
5
+ max-block-size: inherit;
6
+ inline-size: 100%;
7
+ block-size: 100%;
8
+ }
9
+
10
+ .layoutCard {
11
+ background: var(--vkui--color_background);
12
+ }
13
+
14
+ .layoutPlain {
15
+ background: var(--vkui--color_background_content);
16
+ }
17
+
1
18
  .transformForPositionFixedElements {
2
19
  transform: translate3d(0, 0, 0);
3
20
  }
@@ -7,7 +7,7 @@ import { useDOM } from "../../lib/dom.js";
7
7
  import { isRefObject } from "../../lib/isRefObject.js";
8
8
  import { ColorSchemeProvider } from "../ColorSchemeProvider/ColorSchemeProvider.js";
9
9
  import { AppRootContext } from "./AppRootContext.js";
10
- import { AppRootStyleContainer } from "./AppRootStyleContainer.js";
10
+ import { AppRootStyleContainer } from "./AppRootStyleContainer/AppRootStyleContainer.js";
11
11
  export const AppRootPortal = ({ children, usePortal, className })=>{
12
12
  const { mode, disablePortal: disableCreatePortalInGlobalPortalRoot } = React.useContext(AppRootContext);
13
13
  const colorScheme = useColorScheme();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/AppRoot/AppRootPortal.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useColorScheme } from '../../hooks/useColorScheme';\nimport { createPortal } from '../../lib/createPortal';\nimport { useDOM } from '../../lib/dom';\nimport { isRefObject } from '../../lib/isRefObject';\nimport type { HasChildren } from '../../types';\nimport { ColorSchemeProvider } from '../ColorSchemeProvider/ColorSchemeProvider';\nimport { AppRootContext, type AppRootContextInterface } from './AppRootContext';\nimport { AppRootStyleContainer } from './AppRootStyleContainer';\n\nexport interface AppRootPortalProps extends HasChildren {\n /**\n * - При передаче `true` в качестве портала будет использован `portalRoot`\n * из контекста `AppRoot` если он передан в `AppRoot`, иначе `document.body`.\n * - При передаче элемента будут игнорироваться `portalRoot` и `disablePortal` из контекста `AppRoot`.\n *\n * По умолчанию в качестве портала будет использован `document.body`\n */\n usePortal?: boolean | HTMLElement | React.RefObject<HTMLElement> | null;\n className?: string;\n}\n\nexport const AppRootPortal = ({\n children,\n usePortal,\n className,\n}: AppRootPortalProps): React.ReactNode => {\n const { mode, disablePortal: disableCreatePortalInGlobalPortalRoot } =\n React.useContext(AppRootContext);\n const colorScheme = useColorScheme();\n\n const canUsePortal = shouldUsePortal(\n usePortal,\n mode,\n Boolean(disableCreatePortalInGlobalPortalRoot),\n );\n\n const portalContainer = usePortalContainer(usePortal);\n\n if (canUsePortal && portalContainer) {\n return createPortal(\n <ColorSchemeProvider value={colorScheme}>\n <AppRootStyleContainer className={className}>{children}</AppRootStyleContainer>\n </ColorSchemeProvider>,\n portalContainer,\n );\n }\n\n return children;\n};\n\nfunction shouldUsePortal(\n usePortal: AppRootPortalProps['usePortal'],\n mode: AppRootContextInterface['mode'],\n disableCreatePortalInGlobalPortalRoot: boolean,\n) {\n if (usePortal === undefined) {\n return disableCreatePortalInGlobalPortalRoot === false && mode !== 'full';\n }\n\n if (typeof usePortal !== 'boolean') {\n return true;\n }\n\n return disableCreatePortalInGlobalPortalRoot === false && usePortal === true;\n}\n\nfunction usePortalContainer(usePortal: AppRootPortalProps['usePortal']): HTMLElement | null {\n const { portalRoot: portalRootFromContext } = React.useContext(AppRootContext);\n\n const { document } = useDOM();\n\n if (usePortal && typeof usePortal !== 'boolean') {\n return isRefObject(usePortal) ? usePortal.current : usePortal;\n }\n\n const resolvedPortalFromContext = isRefObject(portalRootFromContext)\n ? portalRootFromContext.current\n : portalRootFromContext;\n // если portalRoot не передали через AppRoot, то мы используем body\n // мы можем использовать body как портал,\n // так как все стили передаются вместе с AppRootStyleContainer\n const portalRoot = resolvedPortalFromContext || document?.body || null;\n return portalRoot;\n}\n"],"names":["React","useColorScheme","createPortal","useDOM","isRefObject","ColorSchemeProvider","AppRootContext","AppRootStyleContainer","AppRootPortal","children","usePortal","className","mode","disablePortal","disableCreatePortalInGlobalPortalRoot","useContext","colorScheme","canUsePortal","shouldUsePortal","Boolean","portalContainer","usePortalContainer","value","undefined","portalRoot","portalRootFromContext","document","current","resolvedPortalFromContext","body"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,MAAM,QAAQ,mBAAgB;AACvC,SAASC,WAAW,QAAQ,2BAAwB;AAEpD,SAASC,mBAAmB,QAAQ,gDAA6C;AACjF,SAASC,cAAc,QAAsC,sBAAmB;AAChF,SAASC,qBAAqB,QAAQ,6BAA0B;AAchE,OAAO,MAAMC,gBAAgB,CAAC,EAC5BC,QAAQ,EACRC,SAAS,EACTC,SAAS,EACU;IACnB,MAAM,EAAEC,IAAI,EAAEC,eAAeC,qCAAqC,EAAE,GAClEd,MAAMe,UAAU,CAACT;IACnB,MAAMU,cAAcf;IAEpB,MAAMgB,eAAeC,gBACnBR,WACAE,MACAO,QAAQL;IAGV,MAAMM,kBAAkBC,mBAAmBX;IAE3C,IAAIO,gBAAgBG,iBAAiB;QACnC,OAAOlB,2BACL,KAACG;YAAoBiB,OAAON;sBAC1B,cAAA,KAACT;gBAAsBI,WAAWA;0BAAYF;;YAEhDW;IAEJ;IAEA,OAAOX;AACT,EAAE;AAEF,SAASS,gBACPR,SAA0C,EAC1CE,IAAqC,EACrCE,qCAA8C;IAE9C,IAAIJ,cAAca,WAAW;QAC3B,OAAOT,0CAA0C,SAASF,SAAS;IACrE;IAEA,IAAI,OAAOF,cAAc,WAAW;QAClC,OAAO;IACT;IAEA,OAAOI,0CAA0C,SAASJ,cAAc;AAC1E;AAEA,SAASW,mBAAmBX,SAA0C;IACpE,MAAM,EAAEc,YAAYC,qBAAqB,EAAE,GAAGzB,MAAMe,UAAU,CAACT;IAE/D,MAAM,EAAEoB,QAAQ,EAAE,GAAGvB;IAErB,IAAIO,aAAa,OAAOA,cAAc,WAAW;QAC/C,OAAON,YAAYM,aAAaA,UAAUiB,OAAO,GAAGjB;IACtD;IAEA,MAAMkB,4BAA4BxB,YAAYqB,yBAC1CA,sBAAsBE,OAAO,GAC7BF;IACJ,mEAAmE;IACnE,yCAAyC;IACzC,8DAA8D;IAC9D,MAAMD,aAAaI,6BAA6BF,UAAUG,QAAQ;IAClE,OAAOL;AACT"}
1
+ {"version":3,"sources":["../../../../src/components/AppRoot/AppRootPortal.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useColorScheme } from '../../hooks/useColorScheme';\nimport { createPortal } from '../../lib/createPortal';\nimport { useDOM } from '../../lib/dom';\nimport { isRefObject } from '../../lib/isRefObject';\nimport type { HasChildren } from '../../types';\nimport { ColorSchemeProvider } from '../ColorSchemeProvider/ColorSchemeProvider';\nimport { AppRootContext, type AppRootContextInterface } from './AppRootContext';\nimport { AppRootStyleContainer } from './AppRootStyleContainer/AppRootStyleContainer';\n\nexport interface AppRootPortalProps extends HasChildren {\n /**\n * - При передаче `true` в качестве портала будет использован `portalRoot`\n * из контекста `AppRoot` если он передан в `AppRoot`, иначе `document.body`.\n * - При передаче элемента будут игнорироваться `portalRoot` и `disablePortal` из контекста `AppRoot`.\n *\n * По умолчанию в качестве портала будет использован `document.body`\n */\n usePortal?: boolean | HTMLElement | React.RefObject<HTMLElement> | null;\n className?: string;\n}\n\nexport const AppRootPortal = ({\n children,\n usePortal,\n className,\n}: AppRootPortalProps): React.ReactNode => {\n const { mode, disablePortal: disableCreatePortalInGlobalPortalRoot } =\n React.useContext(AppRootContext);\n const colorScheme = useColorScheme();\n\n const canUsePortal = shouldUsePortal(\n usePortal,\n mode,\n Boolean(disableCreatePortalInGlobalPortalRoot),\n );\n\n const portalContainer = usePortalContainer(usePortal);\n\n if (canUsePortal && portalContainer) {\n return createPortal(\n <ColorSchemeProvider value={colorScheme}>\n <AppRootStyleContainer className={className}>{children}</AppRootStyleContainer>\n </ColorSchemeProvider>,\n portalContainer,\n );\n }\n\n return children;\n};\n\nfunction shouldUsePortal(\n usePortal: AppRootPortalProps['usePortal'],\n mode: AppRootContextInterface['mode'],\n disableCreatePortalInGlobalPortalRoot: boolean,\n) {\n if (usePortal === undefined) {\n return disableCreatePortalInGlobalPortalRoot === false && mode !== 'full';\n }\n\n if (typeof usePortal !== 'boolean') {\n return true;\n }\n\n return disableCreatePortalInGlobalPortalRoot === false && usePortal === true;\n}\n\nfunction usePortalContainer(usePortal: AppRootPortalProps['usePortal']): HTMLElement | null {\n const { portalRoot: portalRootFromContext } = React.useContext(AppRootContext);\n\n const { document } = useDOM();\n\n if (usePortal && typeof usePortal !== 'boolean') {\n return isRefObject(usePortal) ? usePortal.current : usePortal;\n }\n\n const resolvedPortalFromContext = isRefObject(portalRootFromContext)\n ? portalRootFromContext.current\n : portalRootFromContext;\n // если portalRoot не передали через AppRoot, то мы используем body\n // мы можем использовать body как портал,\n // так как все стили передаются вместе с AppRootStyleContainer\n const portalRoot = resolvedPortalFromContext || document?.body || null;\n return portalRoot;\n}\n"],"names":["React","useColorScheme","createPortal","useDOM","isRefObject","ColorSchemeProvider","AppRootContext","AppRootStyleContainer","AppRootPortal","children","usePortal","className","mode","disablePortal","disableCreatePortalInGlobalPortalRoot","useContext","colorScheme","canUsePortal","shouldUsePortal","Boolean","portalContainer","usePortalContainer","value","undefined","portalRoot","portalRootFromContext","document","current","resolvedPortalFromContext","body"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,MAAM,QAAQ,mBAAgB;AACvC,SAASC,WAAW,QAAQ,2BAAwB;AAEpD,SAASC,mBAAmB,QAAQ,gDAA6C;AACjF,SAASC,cAAc,QAAsC,sBAAmB;AAChF,SAASC,qBAAqB,QAAQ,mDAAgD;AActF,OAAO,MAAMC,gBAAgB,CAAC,EAC5BC,QAAQ,EACRC,SAAS,EACTC,SAAS,EACU;IACnB,MAAM,EAAEC,IAAI,EAAEC,eAAeC,qCAAqC,EAAE,GAClEd,MAAMe,UAAU,CAACT;IACnB,MAAMU,cAAcf;IAEpB,MAAMgB,eAAeC,gBACnBR,WACAE,MACAO,QAAQL;IAGV,MAAMM,kBAAkBC,mBAAmBX;IAE3C,IAAIO,gBAAgBG,iBAAiB;QACnC,OAAOlB,2BACL,KAACG;YAAoBiB,OAAON;sBAC1B,cAAA,KAACT;gBAAsBI,WAAWA;0BAAYF;;YAEhDW;IAEJ;IAEA,OAAOX;AACT,EAAE;AAEF,SAASS,gBACPR,SAA0C,EAC1CE,IAAqC,EACrCE,qCAA8C;IAE9C,IAAIJ,cAAca,WAAW;QAC3B,OAAOT,0CAA0C,SAASF,SAAS;IACrE;IAEA,IAAI,OAAOF,cAAc,WAAW;QAClC,OAAO;IACT;IAEA,OAAOI,0CAA0C,SAASJ,cAAc;AAC1E;AAEA,SAASW,mBAAmBX,SAA0C;IACpE,MAAM,EAAEc,YAAYC,qBAAqB,EAAE,GAAGzB,MAAMe,UAAU,CAACT;IAE/D,MAAM,EAAEoB,QAAQ,EAAE,GAAGvB;IAErB,IAAIO,aAAa,OAAOA,cAAc,WAAW;QAC/C,OAAON,YAAYM,aAAaA,UAAUiB,OAAO,GAAGjB;IACtD;IAEA,MAAMkB,4BAA4BxB,YAAYqB,yBAC1CA,sBAAsBE,OAAO,GAC7BF;IACJ,mEAAmE;IACnE,yCAAyC;IACzC,8DAA8D;IAC9D,MAAMD,aAAaI,6BAA6BF,UAAUG,QAAQ;IAClE,OAAOL;AACT"}
@@ -2,28 +2,20 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { classNames } from "@vkontakte/vkjs";
5
- import { useAdaptivity } from "../../hooks/useAdaptivity.js";
6
- import { useTokensClassName } from "../../lib/tokens/index.js";
7
- import { useConfigProvider } from "../ConfigProvider/ConfigProviderContext.js";
8
- import { RootComponent } from "../RootComponent/RootComponent.js";
9
- import { AppRootContext } from "./AppRootContext.js";
10
- import { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from "./helpers.js";
5
+ import { useAdaptivity } from "../../../hooks/useAdaptivity.js";
6
+ import { useTokensClassName } from "../../../lib/tokens/index.js";
7
+ import { useConfigProvider } from "../../ConfigProvider/ConfigProviderContext.js";
8
+ import { RootComponent } from "../../RootComponent/RootComponent.js";
9
+ import { AppRootContext } from "../AppRootContext.js";
10
+ import { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from "../helpers.js";
11
11
  import styles from "./AppRootStyleContainer.module.css";
12
- const sizeXClassNames = {
13
- none: styles.sizeXNone,
14
- regular: styles.sizeXRegular
15
- };
16
12
  const sizeYClassNames = {
17
13
  none: styles.sizeYNone,
18
14
  compact: styles.sizeYCompact
19
15
  };
20
- const layoutClassNames = {
21
- card: styles.layoutCard,
22
- plain: styles.layoutPlain
23
- };
24
16
  export function useAppRootStyles() {
25
- const { layout, safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);
26
- const { hasPointer, sizeX = 'none', sizeY = 'none' } = useAdaptivity();
17
+ const { safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);
18
+ const { hasPointer, sizeY = 'none' } = useAdaptivity();
27
19
  const { isWebView } = useConfigProvider();
28
20
  const userSelectModeClassName = getUserSelectModeClassName({
29
21
  userSelectMode,
@@ -33,23 +25,20 @@ export function useAppRootStyles() {
33
25
  const tokensClassName = useTokensClassName();
34
26
  return {
35
27
  style: safeAreaInsets ? getSafeAreaInsetsAsCssVariables(safeAreaInsets) : undefined,
36
- className: classNames(styles.host, mode === 'embedded' && styles.embedded, sizeX !== 'compact' && sizeXClassNames[sizeX], sizeY !== 'regular' && sizeYClassNames[sizeY], layout && layoutClassNames[layout], userSelectModeClassName, tokensClassName)
28
+ className: classNames(styles.host, mode === 'embedded' && styles.embedded, sizeY !== 'regular' && sizeYClassNames[sizeY], userSelectModeClassName, tokensClassName)
37
29
  };
38
30
  }
39
31
  /**
40
32
  * Специальный контейнер для переиспользования стилей, токенов и safe-area-inset в:
41
33
  * - точке монтирования приложения – `AppRoot`;
42
- * - точке монтирования порталов для модальных окон – `PortalRoot`.
34
+ * - точке монтирования порталов для модальных окон – `AppRootPortal`.
43
35
  *
44
36
  * @private
45
- */ export function AppRootStyleContainer({ style, ...props }) {
37
+ */ export function AppRootStyleContainer(props) {
46
38
  const { style: appRootStyle, className: appRootClassName } = useAppRootStyles();
47
39
  return /*#__PURE__*/ _jsx(RootComponent, {
48
40
  baseClassName: appRootClassName,
49
- style: appRootStyle ? {
50
- ...appRootStyle,
51
- ...style
52
- } : style,
41
+ baseStyle: appRootStyle,
53
42
  ...props
54
43
  });
55
44
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/components/AppRoot/AppRootStyleContainer/AppRootStyleContainer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../../hooks/useAdaptivity';\nimport { useTokensClassName } from '../../../lib/tokens';\nimport { useConfigProvider } from '../../ConfigProvider/ConfigProviderContext';\nimport { RootComponent, type RootComponentProps } from '../../RootComponent/RootComponent';\nimport { AppRootContext } from '../AppRootContext';\nimport { getSafeAreaInsetsAsCssVariables, getUserSelectModeClassName } from '../helpers';\nimport styles from './AppRootStyleContainer.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nexport function useAppRootStyles() {\n const { safeAreaInsets, mode, userSelectMode } = React.useContext(AppRootContext);\n const { hasPointer, sizeY = 'none' } = useAdaptivity();\n const { isWebView } = useConfigProvider();\n const userSelectModeClassName = getUserSelectModeClassName({\n userSelectMode,\n isWebView,\n hasPointer,\n });\n const tokensClassName = useTokensClassName();\n\n return {\n style: safeAreaInsets ? getSafeAreaInsetsAsCssVariables(safeAreaInsets) : undefined,\n className: classNames(\n styles.host,\n mode === 'embedded' && styles.embedded,\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n userSelectModeClassName,\n tokensClassName,\n ),\n };\n}\n\ntype AppRootStyleContainerProps = RootComponentProps<HTMLDivElement>;\n\n/**\n * Специальный контейнер для переиспользования стилей, токенов и safe-area-inset в:\n * - точке монтирования приложения – `AppRoot`;\n * - точке монтирования порталов для модальных окон – `AppRootPortal`.\n *\n * @private\n */\nexport function AppRootStyleContainer(props: AppRootStyleContainerProps) {\n const { style: appRootStyle, className: appRootClassName } = useAppRootStyles();\n\n return <RootComponent baseClassName={appRootClassName} baseStyle={appRootStyle} {...props} />;\n}\n"],"names":["React","classNames","useAdaptivity","useTokensClassName","useConfigProvider","RootComponent","AppRootContext","getSafeAreaInsetsAsCssVariables","getUserSelectModeClassName","styles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","useAppRootStyles","safeAreaInsets","mode","userSelectMode","useContext","hasPointer","sizeY","isWebView","userSelectModeClassName","tokensClassName","style","undefined","className","host","embedded","AppRootStyleContainer","props","appRootStyle","appRootClassName","baseClassName","baseStyle"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,kCAA+B;AAC7D,SAASC,kBAAkB,QAAQ,+BAAsB;AACzD,SAASC,iBAAiB,QAAQ,gDAA6C;AAC/E,SAASC,aAAa,QAAiC,uCAAoC;AAC3F,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SAASC,+BAA+B,EAAEC,0BAA0B,QAAQ,gBAAa;AACzF,OAAOC,YAAY,qCAAqC;AAExD,MAAMC,kBAAkB;IACtBC,MAAMF,OAAOG,SAAS;IACtBC,SAASJ,OAAOK,YAAY;AAC9B;AAEA,OAAO,SAASC;IACd,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,cAAc,EAAE,GAAGlB,MAAMmB,UAAU,CAACb;IAClE,MAAM,EAAEc,UAAU,EAAEC,QAAQ,MAAM,EAAE,GAAGnB;IACvC,MAAM,EAAEoB,SAAS,EAAE,GAAGlB;IACtB,MAAMmB,0BAA0Bf,2BAA2B;QACzDU;QACAI;QACAF;IACF;IACA,MAAMI,kBAAkBrB;IAExB,OAAO;QACLsB,OAAOT,iBAAiBT,gCAAgCS,kBAAkBU;QAC1EC,WAAW1B,WACTQ,OAAOmB,IAAI,EACXX,SAAS,cAAcR,OAAOoB,QAAQ,EACtCR,UAAU,aAAaX,eAAe,CAACW,MAAM,EAC7CE,yBACAC;IAEJ;AACF;AAIA;;;;;;CAMC,GACD,OAAO,SAASM,sBAAsBC,KAAiC;IACrE,MAAM,EAAEN,OAAOO,YAAY,EAAEL,WAAWM,gBAAgB,EAAE,GAAGlB;IAE7D,qBAAO,KAACV;QAAc6B,eAAeD;QAAkBE,WAAWH;QAAe,GAAGD,KAAK;;AAC3F"}
@@ -1,10 +1,11 @@
1
+ /*
2
+ * Стили, которые переиспользуются в AppRoot и при использовании порталов.
3
+ *
4
+ * Желательно не помещать сюда стили отвечающие за геометрию и фон,
5
+ * чтобы не влиять на поведение модалок и других плавающих элементов.
6
+ * Такие стили лучше помещать сразу в AppRoot.
7
+ */
1
8
  .host {
2
- /* чтобы можно было ограничить размеры приложения
3
- * извне с помощью max-height, max-width */
4
- max-inline-size: inherit;
5
- max-block-size: inherit;
6
- inline-size: 100%;
7
- block-size: 100%;
8
9
  -webkit-tap-highlight-color: transparent;
9
10
  -webkit-text-size-adjust: 100%;
10
11
  text-size-adjust: 100%;
@@ -12,52 +13,28 @@
12
13
  color: var(--vkui--color_text_primary);
13
14
  color-scheme: var(--vkui--colors_scheme);
14
15
  }
15
-
16
- .sizeXRegular {
17
- background: var(--vkui--color_background);
18
- }
19
-
20
- @media (min-width: 768px) {
21
- .sizeXNone {
22
- background: var(--vkui--color_background);
23
- }
24
- }
25
-
26
- .layoutCard {
27
- background: var(--vkui--color_background);
28
- }
29
-
30
- .layoutPlain {
31
- background: var(--vkui--color_background_content);
32
- }
33
-
34
16
  .sizeYCompact {
35
17
  --vkui_internal--panel_header_height: var(--vkui--size_panel_header_height--compact);
36
18
  }
37
-
38
19
  @media (pointer: fine) and (min-width: 768px),(max-height: 414.9px) {
39
20
  .sizeYNone {
40
21
  --vkui_internal--panel_header_height: var(--vkui--size_panel_header_height--compact);
41
22
  }
42
23
  }
43
-
44
24
  .userSelectNone {
45
25
  -webkit-user-select: none;
46
26
  -moz-user-select: none;
47
27
  user-select: none;
48
28
  }
49
-
50
29
  /**
51
30
  * Хак для webkit-based браузеров, потому что на версиях iOS <= 14.* исчезает возможность
52
31
  * редактировать contenteditable элементы, если выше по дереву задан user-select: none;
53
32
  */
54
-
55
33
  .userSelectNone [contenteditable] {
56
34
  -webkit-user-select: text;
57
35
  -moz-user-select: text;
58
36
  user-select: text;
59
37
  }
60
-
61
38
  @media (pointer: coarse),(pointer: none) {
62
39
  .pointerNone {
63
40
  -webkit-user-select: none;
@@ -71,7 +48,6 @@
71
48
  user-select: text;
72
49
  }
73
50
  }
74
-
75
51
  .embedded {
76
52
  /* Раньше в этом режиме на родителе (app__root--embeded)
77
53
  * лежал стиль overflow-x: hidden
@@ -1,7 +1,23 @@
1
+ import * as React from "react";
1
2
  import { isRefObject } from "../../lib/isRefObject.js";
2
- import styles from "./AppRoot.module.css";
3
+ import styles from "./AppRootStyleContainer/AppRootStyleContainer.module.css";
3
4
  export const extractPortalRootByProp = (portalRootProp)=>isRefObject(portalRootProp) ? portalRootProp.current : portalRootProp;
4
5
  export const CUSTOM_PROPERTY_INSET_PREFIX = `--vkui_internal--safe_area_inset_`;
6
+ export function useSafeAreaInsetsMemo(safeAreaInsetsProp) {
7
+ const { top, right, bottom, left } = safeAreaInsetsProp ?? {};
8
+ const safeAreaInsets = React.useMemo(()=>({
9
+ top,
10
+ right,
11
+ bottom,
12
+ left
13
+ }), [
14
+ top,
15
+ right,
16
+ bottom,
17
+ left
18
+ ]);
19
+ return safeAreaInsets;
20
+ }
5
21
  export function getSafeAreaInsetsAsCssVariables(safeAreaInsets) {
6
22
  if (!safeAreaInsets) {
7
23
  return {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/AppRoot/helpers.ts"],"sourcesContent":["import { isRefObject } from '../../lib/isRefObject';\nimport type { AppRootUserSelectMode, SafeAreaInsets } from './types';\nimport styles from './AppRoot.module.css';\n\nexport const extractPortalRootByProp = (\n portalRootProp: HTMLElement | React.RefObject<HTMLElement>,\n): HTMLElement | null => (isRefObject(portalRootProp) ? portalRootProp.current : portalRootProp);\n\nexport const CUSTOM_PROPERTY_INSET_PREFIX = `--vkui_internal--safe_area_inset_`;\n\nexport function getSafeAreaInsetsAsCssVariables(\n safeAreaInsets: SafeAreaInsets | undefined,\n): Record<string, string> {\n if (!safeAreaInsets) {\n return {};\n }\n\n const cssVariables: Record<string, string> = {};\n\n for (const key in safeAreaInsets) {\n if (safeAreaInsets.hasOwnProperty(key) && typeof safeAreaInsets[key] === 'number') {\n const propertyKey = `${CUSTOM_PROPERTY_INSET_PREFIX}${key}`;\n const propertyValue = safeAreaInsets[key];\n\n cssVariables[propertyKey] = `${propertyValue}px`;\n }\n }\n\n return cssVariables;\n}\n\nexport function getUserSelectModeClassName({\n userSelectMode,\n isWebView,\n hasPointer,\n}: {\n userSelectMode: AppRootUserSelectMode | undefined;\n isWebView: boolean;\n hasPointer: boolean | undefined;\n}): string | null {\n switch (userSelectMode) {\n case 'enabled-with-pointer': {\n if (hasPointer) {\n return null;\n }\n\n const enableByHasPointerMediaQuery = hasPointer === undefined;\n if (enableByHasPointerMediaQuery) {\n return styles.pointerNone;\n }\n\n return styles.userSelectNone;\n }\n case 'disabled':\n return styles.userSelectNone;\n case 'enabled':\n return null;\n default:\n return isWebView ? styles.userSelectNone : null;\n }\n}\n"],"names":["isRefObject","styles","extractPortalRootByProp","portalRootProp","current","CUSTOM_PROPERTY_INSET_PREFIX","getSafeAreaInsetsAsCssVariables","safeAreaInsets","cssVariables","key","hasOwnProperty","propertyKey","propertyValue","getUserSelectModeClassName","userSelectMode","isWebView","hasPointer","enableByHasPointerMediaQuery","undefined","pointerNone","userSelectNone"],"mappings":"AAAA,SAASA,WAAW,QAAQ,2BAAwB;AAEpD,OAAOC,YAAY,uBAAuB;AAE1C,OAAO,MAAMC,0BAA0B,CACrCC,iBACwBH,YAAYG,kBAAkBA,eAAeC,OAAO,GAAGD,eAAgB;AAEjG,OAAO,MAAME,+BAA+B,CAAC,iCAAiC,CAAC,CAAC;AAEhF,OAAO,SAASC,gCACdC,cAA0C;IAE1C,IAAI,CAACA,gBAAgB;QACnB,OAAO,CAAC;IACV;IAEA,MAAMC,eAAuC,CAAC;IAE9C,IAAK,MAAMC,OAAOF,eAAgB;QAChC,IAAIA,eAAeG,cAAc,CAACD,QAAQ,OAAOF,cAAc,CAACE,IAAI,KAAK,UAAU;YACjF,MAAME,cAAc,GAAGN,+BAA+BI,KAAK;YAC3D,MAAMG,gBAAgBL,cAAc,CAACE,IAAI;YAEzCD,YAAY,CAACG,YAAY,GAAG,GAAGC,cAAc,EAAE,CAAC;QAClD;IACF;IAEA,OAAOJ;AACT;AAEA,OAAO,SAASK,2BAA2B,EACzCC,cAAc,EACdC,SAAS,EACTC,UAAU,EAKX;IACC,OAAQF;QACN,KAAK;YAAwB;gBAC3B,IAAIE,YAAY;oBACd,OAAO;gBACT;gBAEA,MAAMC,+BAA+BD,eAAeE;gBACpD,IAAID,8BAA8B;oBAChC,OAAOhB,OAAOkB,WAAW;gBAC3B;gBAEA,OAAOlB,OAAOmB,cAAc;YAC9B;QACA,KAAK;YACH,OAAOnB,OAAOmB,cAAc;QAC9B,KAAK;YACH,OAAO;QACT;YACE,OAAOL,YAAYd,OAAOmB,cAAc,GAAG;IAC/C;AACF"}
1
+ {"version":3,"sources":["../../../../src/components/AppRoot/helpers.ts"],"sourcesContent":["import * as React from 'react';\nimport { isRefObject } from '../../lib/isRefObject';\nimport type { AppRootUserSelectMode, SafeAreaInsets } from './types';\nimport styles from './AppRootStyleContainer/AppRootStyleContainer.module.css';\n\nexport const extractPortalRootByProp = (\n portalRootProp: HTMLElement | React.RefObject<HTMLElement>,\n): HTMLElement | null => (isRefObject(portalRootProp) ? portalRootProp.current : portalRootProp);\n\nexport const CUSTOM_PROPERTY_INSET_PREFIX = `--vkui_internal--safe_area_inset_`;\n\nexport function useSafeAreaInsetsMemo(safeAreaInsetsProp: SafeAreaInsets | undefined) {\n const { top, right, bottom, left } = safeAreaInsetsProp ?? {};\n const safeAreaInsets = React.useMemo(\n () => ({\n top,\n right,\n bottom,\n left,\n }),\n [top, right, bottom, left],\n );\n\n return safeAreaInsets;\n}\n\nexport function getSafeAreaInsetsAsCssVariables(\n safeAreaInsets: SafeAreaInsets | undefined,\n): Record<string, string> {\n if (!safeAreaInsets) {\n return {};\n }\n\n const cssVariables: Record<string, string> = {};\n\n for (const key in safeAreaInsets) {\n if (safeAreaInsets.hasOwnProperty(key) && typeof safeAreaInsets[key] === 'number') {\n const propertyKey = `${CUSTOM_PROPERTY_INSET_PREFIX}${key}`;\n const propertyValue = safeAreaInsets[key];\n\n cssVariables[propertyKey] = `${propertyValue}px`;\n }\n }\n\n return cssVariables;\n}\n\nexport function getUserSelectModeClassName({\n userSelectMode,\n isWebView,\n hasPointer,\n}: {\n userSelectMode: AppRootUserSelectMode | undefined;\n isWebView: boolean;\n hasPointer: boolean | undefined;\n}): string | null {\n switch (userSelectMode) {\n case 'enabled-with-pointer': {\n if (hasPointer) {\n return null;\n }\n\n const enableByHasPointerMediaQuery = hasPointer === undefined;\n if (enableByHasPointerMediaQuery) {\n return styles.pointerNone;\n }\n\n return styles.userSelectNone;\n }\n case 'disabled':\n return styles.userSelectNone;\n case 'enabled':\n return null;\n default:\n return isWebView ? styles.userSelectNone : null;\n }\n}\n"],"names":["React","isRefObject","styles","extractPortalRootByProp","portalRootProp","current","CUSTOM_PROPERTY_INSET_PREFIX","useSafeAreaInsetsMemo","safeAreaInsetsProp","top","right","bottom","left","safeAreaInsets","useMemo","getSafeAreaInsetsAsCssVariables","cssVariables","key","hasOwnProperty","propertyKey","propertyValue","getUserSelectModeClassName","userSelectMode","isWebView","hasPointer","enableByHasPointerMediaQuery","undefined","pointerNone","userSelectNone"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,WAAW,QAAQ,2BAAwB;AAEpD,OAAOC,YAAY,2DAA2D;AAE9E,OAAO,MAAMC,0BAA0B,CACrCC,iBACwBH,YAAYG,kBAAkBA,eAAeC,OAAO,GAAGD,eAAgB;AAEjG,OAAO,MAAME,+BAA+B,CAAC,iCAAiC,CAAC,CAAC;AAEhF,OAAO,SAASC,sBAAsBC,kBAA8C;IAClF,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGJ,sBAAsB,CAAC;IAC5D,MAAMK,iBAAiBb,MAAMc,OAAO,CAClC,IAAO,CAAA;YACLL;YACAC;YACAC;YACAC;QACF,CAAA,GACA;QAACH;QAAKC;QAAOC;QAAQC;KAAK;IAG5B,OAAOC;AACT;AAEA,OAAO,SAASE,gCACdF,cAA0C;IAE1C,IAAI,CAACA,gBAAgB;QACnB,OAAO,CAAC;IACV;IAEA,MAAMG,eAAuC,CAAC;IAE9C,IAAK,MAAMC,OAAOJ,eAAgB;QAChC,IAAIA,eAAeK,cAAc,CAACD,QAAQ,OAAOJ,cAAc,CAACI,IAAI,KAAK,UAAU;YACjF,MAAME,cAAc,GAAGb,+BAA+BW,KAAK;YAC3D,MAAMG,gBAAgBP,cAAc,CAACI,IAAI;YAEzCD,YAAY,CAACG,YAAY,GAAG,GAAGC,cAAc,EAAE,CAAC;QAClD;IACF;IAEA,OAAOJ;AACT;AAEA,OAAO,SAASK,2BAA2B,EACzCC,cAAc,EACdC,SAAS,EACTC,UAAU,EAKX;IACC,OAAQF;QACN,KAAK;YAAwB;gBAC3B,IAAIE,YAAY;oBACd,OAAO;gBACT;gBAEA,MAAMC,+BAA+BD,eAAeE;gBACpD,IAAID,8BAA8B;oBAChC,OAAOvB,OAAOyB,WAAW;gBAC3B;gBAEA,OAAOzB,OAAO0B,cAAc;YAC9B;QACA,KAAK;YACH,OAAO1B,OAAO0B,cAAc;QAC9B,KAAK;YACH,OAAO;QACT;YACE,OAAOL,YAAYrB,OAAO0B,cAAc,GAAG;IAC/C;AACF"}
@@ -309,27 +309,27 @@
309
309
  Buttons text colors
310
310
  */
311
311
 
312
- .host.appearanceAccent {
312
+ .appearanceAccent {
313
313
  color: var(--vkui--color_text_accent_themed);
314
314
  }
315
315
 
316
- .host.appearancePositive {
316
+ .appearancePositive {
317
317
  color: var(--vkui--color_text_positive);
318
318
  }
319
319
 
320
- .host.appearanceNegative {
320
+ .appearanceNegative {
321
321
  color: var(--vkui--color_text_negative);
322
322
  }
323
323
 
324
- .host.appearanceNeutral {
324
+ .appearanceNeutral {
325
325
  color: var(--vkui--color_text_primary);
326
326
  }
327
327
 
328
- .host.modePrimary.appearanceNeutral {
328
+ .modePrimary.appearanceNeutral {
329
329
  color: var(--vkui--color_text_contrast_themed);
330
330
  }
331
331
 
332
- .host.appearanceAccentInvariable {
332
+ .appearanceAccentInvariable {
333
333
  color: var(--vkui--color_text_accent);
334
334
  }
335
335
 
@@ -80,7 +80,7 @@
80
80
  * SplitCol
81
81
  */
82
82
 
83
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
83
+ /* stylelint-disable selector-pseudo-class-disallowed-list */
84
84
 
85
85
  :global(.vkuiInternalGroup--mode-card) :global(.vkuiInternalCardScroll--size-l) .host,
86
86
  :global(.vkuiInternalSplitCol--viewWidth-tabletPlus):global(.vkuiInternalSplitCol--spaced-auto)
@@ -91,8 +91,10 @@
91
91
  margin-inline-end: 16px;
92
92
  }
93
93
 
94
+ /* stylelint-enable selector-pseudo-class-disallowed-list */
95
+
94
96
  @media (min-width: 768px) {
95
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
97
+ /* stylelint-disable selector-pseudo-class-disallowed-list */
96
98
  :global(.vkuiInternalSplitCol--viewWidth-none):global(.vkuiInternalSplitCol--spaced-auto)
97
99
  :global(.vkuiInternalCardScroll--size-l)
98
100
  .host {
@@ -100,9 +102,10 @@
100
102
  -webkit-margin-end: 16px;
101
103
  margin-inline-end: 16px;
102
104
  }
105
+ /* stylelint-enable selector-pseudo-class-disallowed-list */
103
106
  }
104
107
 
105
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
108
+ /* stylelint-disable selector-pseudo-class-disallowed-list */
106
109
 
107
110
  :global(.vkuiInternalGroup--mode-card) :global(.vkuiInternalCardScroll--size-l) .host:last-of-type,
108
111
  :global(.vkuiInternalSplitCol--viewWidth-tabletPlus):global(.vkuiInternalSplitCol--spaced-auto)
@@ -112,8 +115,11 @@
112
115
  margin-inline-end: 0;
113
116
  }
114
117
 
118
+ /* stylelint-enable selector-pseudo-class-disallowed-list */
119
+
120
+ /* stylelint-disable selector-pseudo-class-disallowed-list */
121
+
115
122
  @media (min-width: 768px) {
116
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
117
123
  :global(.vkuiInternalSplitCol--viewWidth-none):global(.vkuiInternalSplitCol--spaced-auto)
118
124
  :global(.vkuiInternalCardScroll--size-l)
119
125
  .host:last-of-type {
@@ -123,7 +129,6 @@
123
129
  }
124
130
 
125
131
  @media (min-width: 768px) {
126
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
127
132
  :global(.vkuiInternalGroup--mode-none)
128
133
  :global(.vkuiInternalCardScroll--size-l)
129
134
  .host:last-of-type {
@@ -131,7 +136,6 @@
131
136
  margin-inline-end: 0;
132
137
  }
133
138
 
134
- /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
135
139
  :global(.vkuiInternalGroup--mode-none) :global(.vkuiInternalCardScroll--size-l) .host {
136
140
  inline-size: calc(100% - 32px);
137
141
  -webkit-margin-end: 16px;
@@ -139,6 +143,8 @@
139
143
  }
140
144
  }
141
145
 
146
+ /* stylelint-enable selector-pseudo-class-disallowed-list */
147
+
142
148
  /**
143
149
  * CMP:
144
150
  * CardGrid
@@ -1,67 +1,14 @@
1
- 'use client';
2
1
  import { jsx as _jsx } from "react/jsx-runtime";
3
2
  import * as React from "react";
4
- import { classNames, noop } from "@vkontakte/vkjs";
5
- import { useFocusVisible } from "../../hooks/useFocusVisible.js";
6
- import { useFocusVisibleClassName } from "../../hooks/useFocusVisibleClassName.js";
7
- import { mergeCalls } from "../../lib/mergeCalls.js";
8
- import { clickByKeyboardHandler } from "../../lib/utils.js";
3
+ import { classNames } from "@vkontakte/vkjs";
9
4
  import { RootComponent } from "../RootComponent/RootComponent.js";
10
- import { ClickableLockStateContext, DEFAULT_ACTIVE_EFFECT_DELAY, useState } from "./useState.js";
5
+ import { RealClickable } from "./RealClickable.js";
11
6
  import styles from "./Clickable.module.css";
12
7
  /**
13
8
  * Некликабельный компонент. Отключаем возможность нажимать на компонент.
14
9
  */ const NonClickable = ({ href, onClick, onClickCapture, activeClassName, hoverClassName, hasActive, hasHover, hovered, unlockParentHover, activated, activeEffectDelay, ...restProps })=>/*#__PURE__*/ _jsx(RootComponent, {
15
10
  ...restProps
16
11
  });
17
- /**
18
- * Кликабельный компонент. Добавляем кучу обвесов
19
- */ const RealClickable = ({ baseClassName, children, focusVisibleMode = 'inside', activeClassName, hoverClassName, activeEffectDelay = DEFAULT_ACTIVE_EFFECT_DELAY, hasHover = true, hasActive = true, hovered, activated, hasHoverWithChildren, unlockParentHover, onPointerEnter, onPointerLeave, onPointerDown, onPointerCancel, onPointerUp, onBlur, onFocus, onKeyDown, ...restProps })=>{
20
- const { focusVisible, ...focusEvents } = useFocusVisible();
21
- const focusVisibleClassNames = useFocusVisibleClassName({
22
- focusVisible,
23
- mode: focusVisibleMode
24
- });
25
- const { stateClassName, setLockHoverBubblingImmediate, setLockActiveBubblingImmediate, ...stateEvents } = useState({
26
- activeClassName,
27
- hoverClassName,
28
- activeEffectDelay,
29
- hasHover,
30
- hasActive,
31
- hovered,
32
- activated,
33
- unlockParentHover
34
- });
35
- const handlers = mergeCalls(focusEvents, stateEvents, {
36
- onKeyDown: clickByKeyboardHandler
37
- }, {
38
- onPointerEnter,
39
- onPointerLeave,
40
- onPointerDown,
41
- onPointerCancel,
42
- onPointerUp,
43
- onBlur,
44
- onFocus,
45
- onKeyDown
46
- });
47
- const lockStateContextValue = React.useMemo(()=>({
48
- lockHoverStateBubbling: hasHoverWithChildren ? noop : setLockHoverBubblingImmediate,
49
- lockActiveStateBubbling: setLockActiveBubblingImmediate
50
- }), [
51
- setLockHoverBubblingImmediate,
52
- setLockActiveBubblingImmediate,
53
- hasHoverWithChildren
54
- ]);
55
- return /*#__PURE__*/ _jsx(RootComponent, {
56
- baseClassName: classNames(baseClassName, styles.realClickable, focusVisibleClassNames, stateClassName),
57
- ...handlers,
58
- ...restProps,
59
- children: /*#__PURE__*/ _jsx(ClickableLockStateContext.Provider, {
60
- value: lockStateContextValue,
61
- children: children
62
- })
63
- });
64
- };
65
12
  /**
66
13
  * Проверяем, является ли компонент кликабельным
67
14
  */ export function checkClickable(props) {