@gravity-ui/navigation 6.6.0 → 7.0.0-beta.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 (292) hide show
  1. package/build/cjs/components/AsideHeader/AsideHeader.css +9 -1
  2. package/build/cjs/components/AsideHeader/AsideHeader.js +2 -2
  3. package/build/cjs/components/AsideHeader/AsideHeader.js.map +1 -1
  4. package/build/cjs/components/AsideHeader/AsideHeader.module.scss.js +1 -1
  5. package/build/cjs/components/AsideHeader/AsideHeaderContext.d.ts +5 -0
  6. package/build/cjs/components/AsideHeader/AsideHeaderContext.js +2 -0
  7. package/build/cjs/components/AsideHeader/AsideHeaderContext.js.map +1 -1
  8. package/build/cjs/components/AsideHeader/__playwright__/AsideTransitionExample.d.ts +8 -0
  9. package/build/cjs/components/AsideHeader/__playwright__/CollapseButtonExample.d.ts +14 -0
  10. package/build/cjs/components/AsideHeader/__playwright__/CompactTransitionExample.d.ts +12 -0
  11. package/build/cjs/components/AsideHeader/__playwright__/CurrentIndicatorExample.d.ts +20 -0
  12. package/build/cjs/components/AsideHeader/__playwright__/QuickAccessOverflowExample.d.ts +8 -0
  13. package/build/cjs/components/AsideHeader/__playwright__/currentIndicatorPaint.d.ts +21 -0
  14. package/build/cjs/components/AsideHeader/__playwright__/transitionTestUtils.d.ts +4 -0
  15. package/build/cjs/components/AsideHeader/__stories__/fullNavigationMoc.d.ts +6 -0
  16. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +2 -4
  17. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -1
  18. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -3
  19. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
  20. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
  21. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +2 -4
  22. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
  23. package/build/cjs/components/AsideHeader/components/AsideDivider.d.ts +7 -0
  24. package/build/cjs/components/AsideHeader/components/AsideDivider.js +13 -0
  25. package/build/cjs/components/AsideHeader/components/AsideDivider.js.map +1 -0
  26. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
  27. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +3 -1
  28. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js +12 -8
  29. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
  30. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
  31. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.d.ts +20 -0
  32. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js +170 -0
  33. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js.map +1 -0
  34. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.css +3 -1
  35. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +13 -2
  36. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js +53 -39
  37. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
  38. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
  39. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
  40. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js +4 -2
  41. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js.map +1 -1
  42. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.css +33 -1
  43. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js +158 -43
  44. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
  45. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
  46. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +22 -4
  47. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +19 -0
  48. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +137 -20
  49. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -1
  50. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.d.ts +7 -0
  51. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js +25 -0
  52. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js.map +1 -0
  53. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +1 -1
  54. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +5 -1
  55. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -1
  56. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
  57. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -6
  58. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +14 -5
  59. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
  60. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
  61. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +8 -8
  62. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +68 -33
  63. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -1
  64. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.d.ts +1 -0
  65. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.js +2 -0
  66. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.js.map +1 -1
  67. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.d.ts +24 -0
  68. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.js +39 -0
  69. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.js.map +1 -0
  70. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.d.ts +12 -7
  71. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js +42 -35
  72. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
  73. package/build/cjs/components/AsideHeader/components/FirstPanel.js +129 -10
  74. package/build/cjs/components/AsideHeader/components/FirstPanel.js.map +1 -1
  75. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
  76. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js +18 -2
  77. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
  78. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
  79. package/build/cjs/components/AsideHeader/components/Header.js +7 -3
  80. package/build/cjs/components/AsideHeader/components/Header.js.map +1 -1
  81. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.css +9 -1
  82. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.d.ts +1 -0
  83. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js +13 -6
  84. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
  85. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.d.ts +80 -0
  86. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js +600 -0
  87. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js.map +1 -0
  88. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.d.ts +14 -0
  89. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js +164 -0
  90. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js.map +1 -0
  91. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.d.ts +14 -0
  92. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js +94 -0
  93. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js.map +1 -0
  94. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.css +9 -1
  95. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -1
  96. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js +14 -5
  97. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
  98. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.css +9 -1
  99. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
  100. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js +5 -2
  101. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
  102. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.d.ts +7 -0
  103. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.js +25 -0
  104. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.js.map +1 -0
  105. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.d.ts +25 -0
  106. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.js +89 -0
  107. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.js.map +1 -0
  108. package/build/cjs/components/AsideHeader/components/Panels.js +2 -2
  109. package/build/cjs/components/AsideHeader/components/Panels.js.map +1 -1
  110. package/build/cjs/components/AsideHeader/density.d.ts +21 -0
  111. package/build/cjs/components/AsideHeader/density.js +61 -0
  112. package/build/cjs/components/AsideHeader/density.js.map +1 -0
  113. package/build/cjs/components/AsideHeader/i18n/__mocks__/index.d.ts +1 -0
  114. package/build/cjs/components/AsideHeader/i18n/en.json.js +10 -1
  115. package/build/cjs/components/AsideHeader/i18n/en.json.js.map +1 -1
  116. package/build/cjs/components/AsideHeader/i18n/index.d.ts +4 -4
  117. package/build/cjs/components/AsideHeader/i18n/ru.json.js +10 -1
  118. package/build/cjs/components/AsideHeader/i18n/ru.json.js.map +1 -1
  119. package/build/cjs/components/AsideHeader/index.d.ts +1 -0
  120. package/build/cjs/components/AsideHeader/quickAccess.d.ts +9 -0
  121. package/build/cjs/components/AsideHeader/quickAccess.js +31 -0
  122. package/build/cjs/components/AsideHeader/quickAccess.js.map +1 -0
  123. package/build/cjs/components/AsideHeader/types.d.ts +50 -5
  124. package/build/cjs/components/AsideHeader/types.js.map +1 -1
  125. package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js +18 -3
  126. package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
  127. package/build/cjs/components/AsideHeader/utils.d.ts +1 -0
  128. package/build/cjs/components/AsideHeader/utils.js +2 -0
  129. package/build/cjs/components/AsideHeader/utils.js.map +1 -1
  130. package/build/cjs/components/Footer/desktop/Footer.css +1 -1
  131. package/build/cjs/components/Footer/mobile/Footer.css +1 -1
  132. package/build/cjs/components/HotkeysPanel/HotkeysPanel.css +1 -1
  133. package/build/cjs/components/HotkeysPanel/HotkeysPanel.js +1 -1
  134. package/build/cjs/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
  135. package/build/cjs/components/HotkeysPanel/HotkeysPanel.module.scss.js +1 -1
  136. package/build/cjs/components/Logo/Logo.css +1 -1
  137. package/build/cjs/components/Logo/Logo.d.ts +1 -0
  138. package/build/cjs/components/Logo/Logo.js +4 -4
  139. package/build/cjs/components/Logo/Logo.js.map +1 -1
  140. package/build/cjs/components/constants.d.ts +5 -0
  141. package/build/cjs/components/constants.js +6 -0
  142. package/build/cjs/components/constants.js.map +1 -1
  143. package/build/cjs/components/types.d.ts +4 -4
  144. package/build/docs/components/AsideHeader.md +234 -42
  145. package/build/esm/components/AsideHeader/AsideHeader.css +9 -1
  146. package/build/esm/components/AsideHeader/AsideHeader.js +2 -2
  147. package/build/esm/components/AsideHeader/AsideHeader.js.map +1 -1
  148. package/build/esm/components/AsideHeader/AsideHeader.module.scss.js +1 -1
  149. package/build/esm/components/AsideHeader/AsideHeaderContext.d.ts +5 -0
  150. package/build/esm/components/AsideHeader/AsideHeaderContext.js +2 -0
  151. package/build/esm/components/AsideHeader/AsideHeaderContext.js.map +1 -1
  152. package/build/esm/components/AsideHeader/__playwright__/AsideTransitionExample.d.ts +8 -0
  153. package/build/esm/components/AsideHeader/__playwright__/CollapseButtonExample.d.ts +14 -0
  154. package/build/esm/components/AsideHeader/__playwright__/CompactTransitionExample.d.ts +12 -0
  155. package/build/esm/components/AsideHeader/__playwright__/CurrentIndicatorExample.d.ts +20 -0
  156. package/build/esm/components/AsideHeader/__playwright__/QuickAccessOverflowExample.d.ts +8 -0
  157. package/build/esm/components/AsideHeader/__playwright__/currentIndicatorPaint.d.ts +21 -0
  158. package/build/esm/components/AsideHeader/__playwright__/transitionTestUtils.d.ts +4 -0
  159. package/build/esm/components/AsideHeader/__stories__/fullNavigationMoc.d.ts +6 -0
  160. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +3 -5
  161. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -1
  162. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -3
  163. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
  164. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
  165. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +2 -4
  166. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
  167. package/build/esm/components/AsideHeader/components/AsideDivider.d.ts +7 -0
  168. package/build/esm/components/AsideHeader/components/AsideDivider.js +11 -0
  169. package/build/esm/components/AsideHeader/components/AsideDivider.js.map +1 -0
  170. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
  171. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +3 -1
  172. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js +12 -8
  173. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
  174. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
  175. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.d.ts +20 -0
  176. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js +167 -0
  177. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js.map +1 -0
  178. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.css +3 -1
  179. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +13 -2
  180. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js +54 -40
  181. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
  182. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
  183. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
  184. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js +4 -2
  185. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js.map +1 -1
  186. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.css +33 -1
  187. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js +161 -46
  188. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
  189. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
  190. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +22 -4
  191. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +19 -0
  192. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +139 -23
  193. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -1
  194. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.d.ts +7 -0
  195. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js +23 -0
  196. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js.map +1 -0
  197. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +1 -1
  198. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +5 -1
  199. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -1
  200. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
  201. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -6
  202. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +15 -6
  203. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
  204. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
  205. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +8 -8
  206. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +68 -33
  207. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -1
  208. package/build/esm/components/AsideHeader/components/CompositeBar/constants.d.ts +1 -0
  209. package/build/esm/components/AsideHeader/components/CompositeBar/constants.js +2 -1
  210. package/build/esm/components/AsideHeader/components/CompositeBar/constants.js.map +1 -1
  211. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.d.ts +24 -0
  212. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.js +36 -0
  213. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.js.map +1 -0
  214. package/build/esm/components/AsideHeader/components/CompositeBar/utils.d.ts +12 -7
  215. package/build/esm/components/AsideHeader/components/CompositeBar/utils.js +44 -35
  216. package/build/esm/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
  217. package/build/esm/components/AsideHeader/components/FirstPanel.js +131 -12
  218. package/build/esm/components/AsideHeader/components/FirstPanel.js.map +1 -1
  219. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
  220. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js +18 -2
  221. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
  222. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
  223. package/build/esm/components/AsideHeader/components/Header.js +8 -4
  224. package/build/esm/components/AsideHeader/components/Header.js.map +1 -1
  225. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.css +9 -1
  226. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.d.ts +1 -0
  227. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js +14 -7
  228. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
  229. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.d.ts +80 -0
  230. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js +598 -0
  231. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js.map +1 -0
  232. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.d.ts +14 -0
  233. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js +162 -0
  234. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js.map +1 -0
  235. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.d.ts +14 -0
  236. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js +92 -0
  237. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js.map +1 -0
  238. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.css +9 -1
  239. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -1
  240. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js +15 -6
  241. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
  242. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.css +9 -1
  243. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
  244. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js +5 -2
  245. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
  246. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.d.ts +7 -0
  247. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.js +17 -0
  248. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.js.map +1 -0
  249. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.d.ts +25 -0
  250. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.js +84 -0
  251. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.js.map +1 -0
  252. package/build/esm/components/AsideHeader/components/Panels.js +3 -3
  253. package/build/esm/components/AsideHeader/components/Panels.js.map +1 -1
  254. package/build/esm/components/AsideHeader/density.d.ts +21 -0
  255. package/build/esm/components/AsideHeader/density.js +58 -0
  256. package/build/esm/components/AsideHeader/density.js.map +1 -0
  257. package/build/esm/components/AsideHeader/i18n/__mocks__/index.d.ts +1 -0
  258. package/build/esm/components/AsideHeader/i18n/en.json.js +8 -2
  259. package/build/esm/components/AsideHeader/i18n/en.json.js.map +1 -1
  260. package/build/esm/components/AsideHeader/i18n/index.d.ts +4 -4
  261. package/build/esm/components/AsideHeader/i18n/ru.json.js +8 -2
  262. package/build/esm/components/AsideHeader/i18n/ru.json.js.map +1 -1
  263. package/build/esm/components/AsideHeader/index.d.ts +1 -0
  264. package/build/esm/components/AsideHeader/quickAccess.d.ts +9 -0
  265. package/build/esm/components/AsideHeader/quickAccess.js +27 -0
  266. package/build/esm/components/AsideHeader/quickAccess.js.map +1 -0
  267. package/build/esm/components/AsideHeader/types.d.ts +50 -5
  268. package/build/esm/components/AsideHeader/types.js.map +1 -1
  269. package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js +18 -3
  270. package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
  271. package/build/esm/components/AsideHeader/utils.d.ts +1 -0
  272. package/build/esm/components/AsideHeader/utils.js +2 -1
  273. package/build/esm/components/AsideHeader/utils.js.map +1 -1
  274. package/build/esm/components/Footer/desktop/Footer.css +1 -1
  275. package/build/esm/components/Footer/mobile/Footer.css +1 -1
  276. package/build/esm/components/HotkeysPanel/HotkeysPanel.css +1 -1
  277. package/build/esm/components/HotkeysPanel/HotkeysPanel.js +1 -1
  278. package/build/esm/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
  279. package/build/esm/components/HotkeysPanel/HotkeysPanel.module.scss.js +1 -1
  280. package/build/esm/components/Logo/Logo.css +1 -1
  281. package/build/esm/components/Logo/Logo.d.ts +1 -0
  282. package/build/esm/components/Logo/Logo.js +4 -4
  283. package/build/esm/components/Logo/Logo.js.map +1 -1
  284. package/build/esm/components/constants.d.ts +5 -0
  285. package/build/esm/components/constants.js +6 -1
  286. package/build/esm/components/constants.js.map +1 -1
  287. package/build/esm/components/types.d.ts +4 -4
  288. package/package.json +1 -1
  289. package/build/cjs/assets/icons/control-menu-button.svg.js +0 -41
  290. package/build/cjs/assets/icons/control-menu-button.svg.js.map +0 -1
  291. package/build/esm/assets/icons/control-menu-button.svg.js +0 -18
  292. package/build/esm/assets/icons/control-menu-button.svg.js.map +0 -1
@@ -1,7 +1,19 @@
1
1
  import React from 'react';
2
+ import { PopupProps } from '@gravity-ui/uikit';
2
3
  import { AsideHeaderItem } from '../../../types';
4
+ import type { QuickAccessToggleHandler } from './Item.types';
5
+ export declare function getItemPopoverOffset({ isSingleLabel, itemHeight, popupRowHeight, titleHeight, nested, }: {
6
+ isSingleLabel: boolean;
7
+ itemHeight: number;
8
+ popupRowHeight: number;
9
+ titleHeight?: number;
10
+ /** The popup opens from a row inside another popup. */
11
+ nested?: boolean;
12
+ }): NonNullable<PopupProps['offset']>;
3
13
  interface Props {
4
14
  items: AsideHeaderItem[];
15
+ /** `label` is the minimal popup used by one compact leaf item. */
16
+ variant?: 'menu' | 'label';
5
17
  /** Optional title rendered at the top of the popup. */
6
18
  title?: string;
7
19
  open?: boolean;
@@ -9,11 +21,18 @@ interface Props {
9
21
  type?: string;
10
22
  collapsed?: boolean;
11
23
  hideIcon?: boolean;
24
+ /** Icon visibility for a child popup opened from a row in this popup. */
25
+ nestedPopupHideIcon?: boolean;
12
26
  itemClassName?: string;
13
27
  children: React.ReactElement;
14
28
  onOpenChange?: (open: boolean) => void;
15
29
  onPopupItemClick?: AsideHeaderItem['onItemClick'];
16
30
  onItemClick?: AsideHeaderItem['onItemClick'];
31
+ /** Controls selected styling without altering the source items passed to callbacks. */
32
+ highlightCurrentItem?: boolean;
33
+ enableQuickAccessPin?: boolean;
34
+ onToggleQuickAccess?: QuickAccessToggleHandler;
35
+ suppressCurrentItemIds?: ReadonlySet<string>;
17
36
  }
18
37
  export declare const ItemPopup: React.FC<Props>;
19
38
  export {};
@@ -2,62 +2,179 @@
2
2
 
3
3
  var React = require('react');
4
4
  var uikit = require('@gravity-ui/uikit');
5
+ var constants = require('../../../../constants.js');
5
6
  var cn = require('../../../../utils/cn.js');
7
+ var AsideHeaderContext = require('../../../AsideHeaderContext.js');
8
+ var density = require('../../../density.js');
9
+ var presentationCurrent = require('../presentationCurrent.js');
6
10
  var utils = require('../utils.js');
7
11
  var Item = require('./Item.js');
8
12
  var ItemPopupNestContext = require('./ItemPopupNestContext.js');
9
13
  var Item_module = require('./Item.module.scss.js');
10
14
 
11
15
  const b = cn.createBlock('composite-bar-item', Item_module.default);
16
+ const POPUP_PADDING = 4;
12
17
  const POPUP_MAIN_AXIS_OFFSET = 14;
13
- const POPUP_CROSS_AXIS_OFFSET_WITH_TITLE = -30;
14
- const POPUP_CROSS_AXIS_OFFSET_WITHOUT_TITLE = 0;
15
- const DEFAULT_POPUP_DELAY = 100;
16
- const ItemPopup = ({ items, itemClassName, title, open, disabled, type, collapsed = false, hideIcon = false, children, onPopupItemClick, onItemClick, onOpenChange, }) => {
18
+ /** Whitespace between the painted borders of two chained popups. */
19
+ const NESTED_POPUP_GAP = 4;
20
+ /** `.g-popup` paints its border as a 1px shadow spread outside the border box. */
21
+ const POPUP_SHADOW_RING = 1;
22
+ const SOLO_LABEL_POPUP_ITEM_HEIGHT = 28;
23
+ const SOLO_LABEL_POPUP_BORDER_RADIUS = 4;
24
+ const POPUP_TITLE_BLOCK_HEIGHT = 30;
25
+ const DEFAULT_POPUP_DELAY = 0;
26
+ function getItemPopoverOffset({ isSingleLabel, itemHeight, popupRowHeight, titleHeight = 0, nested = false, }) {
27
+ if (isSingleLabel) {
28
+ return { mainAxis: POPUP_MAIN_AXIS_OFFSET, crossAxis: 0 };
29
+ }
30
+ // A nested popup anchors to a row that sits `POPUP_PADDING` inside the parent popup
31
+ // border box, and both popups paint a shadow ring outside that box. Compensate for
32
+ // both so chained popups keep `NESTED_POPUP_GAP` of whitespace at any density.
33
+ const mainAxis = nested
34
+ ? NESTED_POPUP_GAP + 2 * POPUP_SHADOW_RING + POPUP_PADDING
35
+ : POPUP_MAIN_AXIS_OFFSET;
36
+ const firstRowOffsetInAnchor = (itemHeight - popupRowHeight) / 2;
37
+ return {
38
+ mainAxis,
39
+ crossAxis: firstRowOffsetInAnchor - POPUP_PADDING - titleHeight,
40
+ };
41
+ }
42
+ const ItemPopup = ({ items, variant = 'menu', itemClassName, title, open, disabled, type, collapsed = false, hideIcon = false, nestedPopupHideIcon, children, onPopupItemClick, onItemClick, onOpenChange, highlightCurrentItem = true, enableQuickAccessPin, onToggleQuickAccess, suppressCurrentItemIds, }) => {
43
+ const asideHeaderContext = AsideHeaderContext.useSafeAsideHeaderContext();
44
+ const parentPopupNest = React.useContext(ItemPopupNestContext.ItemPopupNestContext);
45
+ const theme = uikit.useThemeValue();
46
+ const densityConfig = density.getAsideHeaderDensityConfig(asideHeaderContext === null || asideHeaderContext === undefined ? undefined : asideHeaderContext.menuDensity);
17
47
  const nestedOpenCountRef = React.useRef(0);
18
- const popoverOffset = React.useMemo(() => ({
19
- mainAxis: POPUP_MAIN_AXIS_OFFSET,
20
- crossAxis: title
21
- ? POPUP_CROSS_AXIS_OFFSET_WITH_TITLE
22
- : POPUP_CROSS_AXIS_OFFSET_WITHOUT_TITLE,
23
- }), [title]);
24
- const isSingleLabel = !title && items.length === 1;
48
+ // A nested portaled popup temporarily blocks the parent's hover-close. Remember that close
49
+ // request and replay it after the child closes, unless the pointer/focus returned to the parent.
50
+ const deferredCloseRef = React.useRef(false);
51
+ const interactionInsideRef = React.useRef(false);
52
+ const popupContentRef = React.useRef(null);
53
+ const triggerElementRef = React.useRef(null);
54
+ const onOpenChangeRef = React.useRef(onOpenChange);
55
+ const densityCssProperties = density.getAsideHeaderDensityCssProperties(asideHeaderContext === null || asideHeaderContext === undefined ? undefined : asideHeaderContext.menuDensity);
56
+ const isSingleLabel = variant === 'label';
57
+ const soloPopupTheme = theme.endsWith('-hc') ? 'dark-hc' : 'dark';
58
+ React.useEffect(() => {
59
+ onOpenChangeRef.current = onOpenChange;
60
+ }, [onOpenChange]);
61
+ const popoverStyle = React.useMemo(() => {
62
+ const popupPadding = isSingleLabel ? 0 : POPUP_PADDING;
63
+ const popupBorderRadius = isSingleLabel
64
+ ? SOLO_LABEL_POPUP_BORDER_RADIUS
65
+ : densityConfig.itemExpandedRadius + popupPadding;
66
+ return Object.assign(Object.assign({}, densityCssProperties), { '--_--popup-padding': `${popupPadding}px`, '--_--popup-border-radius': `${popupBorderRadius}px`, '--_--popup-title-height': `${POPUP_TITLE_BLOCK_HEIGHT}px`, '--g-popup-border-radius': `${popupBorderRadius}px`,
67
+ // Popovers must appear instantly. `PopoverProps` does not expose Popup's
68
+ // `disableTransition`, so the enter/exit animation is disabled here; the
69
+ // style lands on the same `.g-popup` element that owns the transition.
70
+ transition: 'none' });
71
+ }, [densityConfig.itemExpandedRadius, densityCssProperties, isSingleLabel]);
72
+ const popupItemHeight = React.useCallback((item) => isSingleLabel ? SOLO_LABEL_POPUP_ITEM_HEIGHT : utils.getPopupItemHeight(item), [isSingleLabel]);
73
+ const popupItemsHeight = React.useCallback((listItems) => listItems.reduce((sum, item) => sum + popupItemHeight(item), 0), [popupItemHeight]);
74
+ const popoverOffset = React.useMemo(() => getItemPopoverOffset({
75
+ isSingleLabel,
76
+ itemHeight: densityConfig.itemHeight,
77
+ popupRowHeight: constants.POPUP_REGULAR_ITEM_HEIGHT,
78
+ titleHeight: title ? POPUP_TITLE_BLOCK_HEIGHT : 0,
79
+ nested: Boolean(parentPopupNest),
80
+ }), [densityConfig.itemHeight, isSingleLabel, parentPopupNest, title]);
25
81
  const registerNestedOpen = React.useCallback((delta) => {
82
+ var _a;
26
83
  nestedOpenCountRef.current = Math.max(0, nestedOpenCountRef.current + delta);
84
+ if (nestedOpenCountRef.current === 0 &&
85
+ deferredCloseRef.current &&
86
+ !interactionInsideRef.current) {
87
+ deferredCloseRef.current = false;
88
+ (_a = onOpenChangeRef.current) === null || _a === undefined ? undefined : _a.call(onOpenChangeRef, false);
89
+ }
27
90
  }, []);
28
91
  const nestContextValue = React.useMemo(() => ({ registerNestedOpen }), [registerNestedOpen]);
29
92
  const wrappedOnOpenChange = React.useCallback((next) => {
30
93
  if (!next && nestedOpenCountRef.current > 0) {
94
+ deferredCloseRef.current = true;
31
95
  return;
32
96
  }
97
+ deferredCloseRef.current = false;
33
98
  onOpenChange === null || onOpenChange === undefined ? undefined : onOpenChange(next);
34
99
  }, [onOpenChange]);
100
+ const markInteractionRegionEntered = React.useCallback(() => {
101
+ interactionInsideRef.current = true;
102
+ deferredCloseRef.current = false;
103
+ }, []);
104
+ const markInteractionRegionLeft = React.useCallback((relatedTarget) => {
105
+ var _a, _b;
106
+ const nextTarget = relatedTarget instanceof Node ? relatedTarget : null;
107
+ const remainsInside = Boolean(nextTarget &&
108
+ (((_a = triggerElementRef.current) === null || _a === undefined ? undefined : _a.contains(nextTarget)) ||
109
+ ((_b = popupContentRef.current) === null || _b === undefined ? undefined : _b.contains(nextTarget))));
110
+ if (!remainsInside) {
111
+ interactionInsideRef.current = false;
112
+ }
113
+ }, []);
35
114
  const handlePopupContentClick = React.useCallback((event) => {
36
115
  event.stopPropagation();
37
116
  }, []);
38
117
  // Inside a popup list, action items must look like regular menu rows, not floating
39
118
  // action buttons (e.g. when an `action` item overflows into the "More" popup).
40
119
  const popupItems = React.useMemo(() => items.map((item) => item.type === 'action' ? Object.assign(Object.assign({}, item), { type: 'regular' }) : item), [items]);
120
+ const sourceItemsById = React.useMemo(() => new Map(items.map((item) => [item.id, item])), [items]);
121
+ const selectedPopupItemIndex = React.useMemo(() => {
122
+ if (!highlightCurrentItem) {
123
+ return undefined;
124
+ }
125
+ const index = popupItems.findIndex((item) => presentationCurrent.isItemPresentationCurrent(item, { suppressCurrentItemIds }));
126
+ return index === -1 ? undefined : index;
127
+ }, [highlightCurrentItem, popupItems, suppressCurrentItemIds]);
41
128
  if (!popupItems.length) {
42
129
  return children;
43
130
  }
44
131
  const content = (React.createElement(ItemPopupNestContext.ItemPopupNestContext.Provider, { value: nestContextValue },
45
- React.createElement("div", { className: b('popup-content', { collapsed }), onClick: handlePopupContentClick },
132
+ React.createElement("div", { ref: popupContentRef, className: b('popup-content', { collapsed, 'single-label': isSingleLabel }), onClick: handlePopupContentClick, onMouseEnter: markInteractionRegionEntered, onMouseLeave: (event) => markInteractionRegionLeft(event.relatedTarget), onFocusCapture: markInteractionRegionEntered, onBlurCapture: (event) => markInteractionRegionLeft(event.relatedTarget) },
46
133
  title && React.createElement("div", { className: b('popup-title') }, title),
47
- React.createElement(uikit.List, { items: popupItems, selectedItemIndex: utils.getSelectedItemIndex(popupItems), itemHeight: utils.getPopupItemHeight, itemsHeight: utils.getPopupItemsHeight, itemClassName: b('root-menu-item', itemClassName), virtualized: false, filterable: false, sortable: false, renderItem: (item) => (React.createElement(Item.Item, Object.assign({}, item, { qa: undefined, compact: false, className: b('popup-item'), hideIcon: hideIcon, stopClickPropagation: !item.itemWrapper, enableTooltip: false, bringForward: false, popupVisible: false, renderPopupContent: undefined, onOpenChangePopup: undefined, popupRef: undefined, onItemClick: (_innerItem, _innerCollapsed, event) => {
48
- var _a;
49
- if (!item.current) {
50
- onOpenChange === null || onOpenChange === undefined ? undefined : onOpenChange(false);
51
- }
52
- (_a = (onPopupItemClick !== null && onPopupItemClick !== undefined ? onPopupItemClick : onItemClick)) === null || _a === undefined ? undefined : _a(item, collapsed, event);
53
- } }))) }))));
134
+ React.createElement(uikit.List, { items: popupItems, selectedItemIndex: selectedPopupItemIndex, itemHeight: popupItemHeight, itemsHeight: popupItemsHeight, itemClassName: b('root-menu-item', itemClassName), virtualized: false, filterable: false, sortable: false, renderItem: (item) => {
135
+ var _a;
136
+ const sourceItem = (_a = sourceItemsById.get(item.id)) !== null && _a !== undefined ? _a : item;
137
+ return (React.createElement(Item.Item, Object.assign({}, item, { rowRef: undefined, qa: undefined, compact: false, menuPopupRow: true, suppressCurrentHighlight: !highlightCurrentItem, suppressCurrentItemIds: suppressCurrentItemIds, className: b('popup-item'), hideIcon: hideIcon, menuPopupHideIcon: nestedPopupHideIcon, stopClickPropagation: !sourceItem.itemWrapper, enableTooltip: false, bringForward: false, popupVisible: false, renderPopupContent: undefined, onOpenChangePopup: undefined, popupRef: undefined, enableQuickAccessPin: !isSingleLabel && enableQuickAccessPin, quickAccessPinItem: sourceItem, onToggleQuickAccess: isSingleLabel ? undefined : onToggleQuickAccess, onItemClick: (_innerItem, _innerCollapsed, event) => {
138
+ var _a;
139
+ if (!sourceItem.current) {
140
+ onOpenChange === null || onOpenChange === undefined ? undefined : onOpenChange(false);
141
+ }
142
+ (_a = (onPopupItemClick !== null && onPopupItemClick !== undefined ? onPopupItemClick : onItemClick)) === null || _a === undefined ? undefined : _a(sourceItem, collapsed, event);
143
+ } })));
144
+ } }))));
145
+ const triggerProps = children.props;
146
+ const trigger = React.cloneElement(children, {
147
+ onMouseEnter: (event) => {
148
+ var _a;
149
+ triggerElementRef.current = event.currentTarget;
150
+ markInteractionRegionEntered();
151
+ (_a = triggerProps.onMouseEnter) === null || _a === undefined ? undefined : _a.call(triggerProps, event);
152
+ },
153
+ onMouseLeave: (event) => {
154
+ var _a;
155
+ markInteractionRegionLeft(event.relatedTarget);
156
+ (_a = triggerProps.onMouseLeave) === null || _a === undefined ? undefined : _a.call(triggerProps, event);
157
+ },
158
+ onFocus: (event) => {
159
+ var _a;
160
+ triggerElementRef.current = event.currentTarget;
161
+ markInteractionRegionEntered();
162
+ (_a = triggerProps.onFocus) === null || _a === undefined ? undefined : _a.call(triggerProps, event);
163
+ },
164
+ onBlur: (event) => {
165
+ var _a;
166
+ markInteractionRegionLeft(event.relatedTarget);
167
+ (_a = triggerProps.onBlur) === null || _a === undefined ? undefined : _a.call(triggerProps, event);
168
+ },
169
+ });
54
170
  return (React.createElement(uikit.Popover, { disabled: disabled, open: open, onOpenChange: (nextOpen) => {
55
171
  if (nextOpen && disabled)
56
172
  return;
57
173
  wrappedOnOpenChange(nextOpen);
58
- }, placement: isSingleLabel ? 'right' : 'right-start', strategy: "fixed", openDelay: DEFAULT_POPUP_DELAY, closeDelay: DEFAULT_POPUP_DELAY, offset: popoverOffset, enableSafePolygon: true, className: b('icon-popover', { 'item-type': type }), content: content }, children));
174
+ }, placement: isSingleLabel ? 'right' : 'right-start', strategy: "fixed", openDelay: DEFAULT_POPUP_DELAY, closeDelay: DEFAULT_POPUP_DELAY, offset: popoverOffset, enableSafePolygon: true, className: b('icon-popover', { 'item-type': type, 'single-label': isSingleLabel }, isSingleLabel ? `g-root g-root_theme_${soloPopupTheme}` : undefined), style: popoverStyle, content: content }, trigger));
59
175
  };
60
176
  ItemPopup.displayName = 'ItemPopup';
61
177
 
62
178
  exports.ItemPopup = ItemPopup;
179
+ exports.getItemPopoverOffset = getItemPopoverOffset;
63
180
  //# sourceMappingURL=ItemPopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ItemPopup.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/Item/ItemPopup.tsx"],"sourcesContent":["import React from 'react';\n\nimport {List, Popover, PopupProps} from '@gravity-ui/uikit';\n\nimport {createBlock} from '../../../../utils/cn';\nimport {AsideHeaderItem} from '../../../types';\nimport {getPopupItemHeight, getPopupItemsHeight, getSelectedItemIndex} from '../utils';\n\nimport {Item} from './Item';\nimport {ItemPopupNestContext} from './ItemPopupNestContext';\n\nimport styles from './Item.module.scss';\n\nconst b = createBlock('composite-bar-item', styles);\n\nconst POPUP_MAIN_AXIS_OFFSET = 14;\nconst POPUP_CROSS_AXIS_OFFSET_WITH_TITLE = -30;\nconst POPUP_CROSS_AXIS_OFFSET_WITHOUT_TITLE = 0;\n\nconst DEFAULT_POPUP_DELAY = 100;\n\ninterface Props {\n items: AsideHeaderItem[];\n /** Optional title rendered at the top of the popup. */\n title?: string;\n open?: boolean;\n disabled?: boolean;\n type?: string;\n collapsed?: boolean;\n hideIcon?: boolean;\n itemClassName?: string;\n children: React.ReactElement;\n onOpenChange?: (open: boolean) => void;\n onPopupItemClick?: AsideHeaderItem['onItemClick'];\n onItemClick?: AsideHeaderItem['onItemClick'];\n}\n\nexport const ItemPopup: React.FC<Props> = ({\n items,\n itemClassName,\n title,\n open,\n disabled,\n type,\n collapsed = false,\n hideIcon = false,\n children,\n onPopupItemClick,\n onItemClick,\n onOpenChange,\n}) => {\n const nestedOpenCountRef = React.useRef(0);\n\n const popoverOffset = React.useMemo<NonNullable<PopupProps['offset']>>(\n () => ({\n mainAxis: POPUP_MAIN_AXIS_OFFSET,\n crossAxis: title\n ? POPUP_CROSS_AXIS_OFFSET_WITH_TITLE\n : POPUP_CROSS_AXIS_OFFSET_WITHOUT_TITLE,\n }),\n [title],\n );\n\n const isSingleLabel = !title && items.length === 1;\n\n const registerNestedOpen = React.useCallback((delta: number) => {\n nestedOpenCountRef.current = Math.max(0, nestedOpenCountRef.current + delta);\n }, []);\n\n const nestContextValue = React.useMemo(() => ({registerNestedOpen}), [registerNestedOpen]);\n\n const wrappedOnOpenChange = React.useCallback(\n (next: boolean) => {\n if (!next && nestedOpenCountRef.current > 0) {\n return;\n }\n\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const handlePopupContentClick = React.useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n }, []);\n\n // Inside a popup list, action items must look like regular menu rows, not floating\n // action buttons (e.g. when an `action` item overflows into the \"More\" popup).\n const popupItems = React.useMemo(\n () =>\n items.map((item) =>\n item.type === 'action' ? {...item, type: 'regular' as const} : item,\n ),\n [items],\n );\n\n if (!popupItems.length) {\n return children;\n }\n\n const content = (\n <ItemPopupNestContext.Provider value={nestContextValue}>\n <div className={b('popup-content', {collapsed})} onClick={handlePopupContentClick}>\n {title && <div className={b('popup-title')}>{title}</div>}\n <List\n items={popupItems}\n selectedItemIndex={getSelectedItemIndex(popupItems)}\n itemHeight={getPopupItemHeight}\n itemsHeight={getPopupItemsHeight}\n itemClassName={b('root-menu-item', itemClassName)}\n virtualized={false}\n filterable={false}\n sortable={false}\n renderItem={(item) => (\n <Item\n {...item}\n qa={undefined}\n compact={false}\n className={b('popup-item')}\n hideIcon={hideIcon}\n stopClickPropagation={!item.itemWrapper}\n enableTooltip={false}\n bringForward={false}\n popupVisible={false}\n renderPopupContent={undefined}\n onOpenChangePopup={undefined}\n popupRef={undefined}\n onItemClick={(_innerItem, _innerCollapsed, event) => {\n if (!item.current) {\n onOpenChange?.(false);\n }\n\n (onPopupItemClick ?? onItemClick)?.(item, collapsed, event);\n }}\n />\n )}\n />\n </div>\n </ItemPopupNestContext.Provider>\n );\n\n return (\n <Popover\n disabled={disabled}\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen && disabled) return;\n wrappedOnOpenChange(nextOpen);\n }}\n placement={isSingleLabel ? 'right' : 'right-start'}\n strategy=\"fixed\"\n openDelay={DEFAULT_POPUP_DELAY}\n closeDelay={DEFAULT_POPUP_DELAY}\n offset={popoverOffset}\n enableSafePolygon\n className={b('icon-popover', {'item-type': type})}\n content={content}\n >\n {children}\n </Popover>\n );\n};\n\nItemPopup.displayName = 'ItemPopup';\n"],"names":["createBlock","styles","ItemPopupNestContext","List","getSelectedItemIndex","getPopupItemHeight","getPopupItemsHeight","Item","Popover"],"mappings":"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"}
1
+ {"version":3,"file":"ItemPopup.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/Item/ItemPopup.tsx"],"sourcesContent":["import React from 'react';\n\nimport {List, Popover, PopupProps, useThemeValue} from '@gravity-ui/uikit';\n\nimport {POPUP_REGULAR_ITEM_HEIGHT} from '../../../../constants';\nimport {createBlock} from '../../../../utils/cn';\nimport {useSafeAsideHeaderContext} from '../../../AsideHeaderContext';\nimport {getAsideHeaderDensityConfig, getAsideHeaderDensityCssProperties} from '../../../density';\nimport {AsideHeaderItem} from '../../../types';\nimport {isItemPresentationCurrent} from '../presentationCurrent';\nimport {getPopupItemHeight} from '../utils';\n\nimport {Item} from './Item';\nimport type {QuickAccessToggleHandler} from './Item.types';\nimport {ItemPopupNestContext} from './ItemPopupNestContext';\n\nimport styles from './Item.module.scss';\n\nconst b = createBlock('composite-bar-item', styles);\n\nconst POPUP_PADDING = 4;\nconst POPUP_MAIN_AXIS_OFFSET = 14;\n/** Whitespace between the painted borders of two chained popups. */\nconst NESTED_POPUP_GAP = 4;\n/** `.g-popup` paints its border as a 1px shadow spread outside the border box. */\nconst POPUP_SHADOW_RING = 1;\nconst SOLO_LABEL_POPUP_ITEM_HEIGHT = 28;\nconst SOLO_LABEL_POPUP_BORDER_RADIUS = 4;\nconst POPUP_TITLE_BLOCK_HEIGHT = 30;\nconst DEFAULT_POPUP_DELAY = 0;\n\nexport function getItemPopoverOffset({\n isSingleLabel,\n itemHeight,\n popupRowHeight,\n titleHeight = 0,\n nested = false,\n}: {\n isSingleLabel: boolean;\n itemHeight: number;\n popupRowHeight: number;\n titleHeight?: number;\n /** The popup opens from a row inside another popup. */\n nested?: boolean;\n}): NonNullable<PopupProps['offset']> {\n if (isSingleLabel) {\n return {mainAxis: POPUP_MAIN_AXIS_OFFSET, crossAxis: 0};\n }\n\n // A nested popup anchors to a row that sits `POPUP_PADDING` inside the parent popup\n // border box, and both popups paint a shadow ring outside that box. Compensate for\n // both so chained popups keep `NESTED_POPUP_GAP` of whitespace at any density.\n const mainAxis = nested\n ? NESTED_POPUP_GAP + 2 * POPUP_SHADOW_RING + POPUP_PADDING\n : POPUP_MAIN_AXIS_OFFSET;\n const firstRowOffsetInAnchor = (itemHeight - popupRowHeight) / 2;\n\n return {\n mainAxis,\n crossAxis: firstRowOffsetInAnchor - POPUP_PADDING - titleHeight,\n };\n}\n\ninterface Props {\n items: AsideHeaderItem[];\n /** `label` is the minimal popup used by one compact leaf item. */\n variant?: 'menu' | 'label';\n /** Optional title rendered at the top of the popup. */\n title?: string;\n open?: boolean;\n disabled?: boolean;\n type?: string;\n collapsed?: boolean;\n hideIcon?: boolean;\n /** Icon visibility for a child popup opened from a row in this popup. */\n nestedPopupHideIcon?: boolean;\n itemClassName?: string;\n children: React.ReactElement;\n onOpenChange?: (open: boolean) => void;\n onPopupItemClick?: AsideHeaderItem['onItemClick'];\n onItemClick?: AsideHeaderItem['onItemClick'];\n /** Controls selected styling without altering the source items passed to callbacks. */\n highlightCurrentItem?: boolean;\n enableQuickAccessPin?: boolean;\n onToggleQuickAccess?: QuickAccessToggleHandler;\n suppressCurrentItemIds?: ReadonlySet<string>;\n}\n\ntype PopupTriggerInteractionProps = {\n onMouseEnter?: React.MouseEventHandler<HTMLElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n onBlur?: React.FocusEventHandler<HTMLElement>;\n};\n\nexport const ItemPopup: React.FC<Props> = ({\n items,\n variant = 'menu',\n itemClassName,\n title,\n open,\n disabled,\n type,\n collapsed = false,\n hideIcon = false,\n nestedPopupHideIcon,\n children,\n onPopupItemClick,\n onItemClick,\n onOpenChange,\n highlightCurrentItem = true,\n enableQuickAccessPin,\n onToggleQuickAccess,\n suppressCurrentItemIds,\n}) => {\n const asideHeaderContext = useSafeAsideHeaderContext();\n const parentPopupNest = React.useContext(ItemPopupNestContext);\n const theme = useThemeValue();\n const densityConfig = getAsideHeaderDensityConfig(asideHeaderContext?.menuDensity);\n const nestedOpenCountRef = React.useRef(0);\n // A nested portaled popup temporarily blocks the parent's hover-close. Remember that close\n // request and replay it after the child closes, unless the pointer/focus returned to the parent.\n const deferredCloseRef = React.useRef(false);\n const interactionInsideRef = React.useRef(false);\n const popupContentRef = React.useRef<HTMLDivElement>(null);\n const triggerElementRef = React.useRef<HTMLElement | null>(null);\n const onOpenChangeRef = React.useRef(onOpenChange);\n const densityCssProperties = getAsideHeaderDensityCssProperties(\n asideHeaderContext?.menuDensity,\n );\n\n const isSingleLabel = variant === 'label';\n const soloPopupTheme = theme.endsWith('-hc') ? 'dark-hc' : 'dark';\n\n React.useEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n }, [onOpenChange]);\n\n const popoverStyle = React.useMemo(() => {\n const popupPadding = isSingleLabel ? 0 : POPUP_PADDING;\n const popupBorderRadius = isSingleLabel\n ? SOLO_LABEL_POPUP_BORDER_RADIUS\n : densityConfig.itemExpandedRadius + popupPadding;\n\n return {\n ...densityCssProperties,\n '--_--popup-padding': `${popupPadding}px`,\n '--_--popup-border-radius': `${popupBorderRadius}px`,\n '--_--popup-title-height': `${POPUP_TITLE_BLOCK_HEIGHT}px`,\n '--g-popup-border-radius': `${popupBorderRadius}px`,\n // Popovers must appear instantly. `PopoverProps` does not expose Popup's\n // `disableTransition`, so the enter/exit animation is disabled here; the\n // style lands on the same `.g-popup` element that owns the transition.\n transition: 'none',\n } as React.CSSProperties;\n }, [densityConfig.itemExpandedRadius, densityCssProperties, isSingleLabel]);\n\n const popupItemHeight = React.useCallback(\n (item: AsideHeaderItem) =>\n isSingleLabel ? SOLO_LABEL_POPUP_ITEM_HEIGHT : getPopupItemHeight(item),\n [isSingleLabel],\n );\n\n const popupItemsHeight = React.useCallback(\n (listItems: AsideHeaderItem[]) =>\n listItems.reduce((sum, item) => sum + popupItemHeight(item), 0),\n [popupItemHeight],\n );\n\n const popoverOffset = React.useMemo<NonNullable<PopupProps['offset']>>(\n () =>\n getItemPopoverOffset({\n isSingleLabel,\n itemHeight: densityConfig.itemHeight,\n popupRowHeight: POPUP_REGULAR_ITEM_HEIGHT,\n titleHeight: title ? POPUP_TITLE_BLOCK_HEIGHT : 0,\n nested: Boolean(parentPopupNest),\n }),\n [densityConfig.itemHeight, isSingleLabel, parentPopupNest, title],\n );\n\n const registerNestedOpen = React.useCallback((delta: number) => {\n nestedOpenCountRef.current = Math.max(0, nestedOpenCountRef.current + delta);\n\n if (\n nestedOpenCountRef.current === 0 &&\n deferredCloseRef.current &&\n !interactionInsideRef.current\n ) {\n deferredCloseRef.current = false;\n onOpenChangeRef.current?.(false);\n }\n }, []);\n\n const nestContextValue = React.useMemo(() => ({registerNestedOpen}), [registerNestedOpen]);\n\n const wrappedOnOpenChange = React.useCallback(\n (next: boolean) => {\n if (!next && nestedOpenCountRef.current > 0) {\n deferredCloseRef.current = true;\n return;\n }\n\n deferredCloseRef.current = false;\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const markInteractionRegionEntered = React.useCallback(() => {\n interactionInsideRef.current = true;\n deferredCloseRef.current = false;\n }, []);\n\n const markInteractionRegionLeft = React.useCallback((relatedTarget: EventTarget | null) => {\n const nextTarget = relatedTarget instanceof Node ? relatedTarget : null;\n const remainsInside = Boolean(\n nextTarget &&\n (triggerElementRef.current?.contains(nextTarget) ||\n popupContentRef.current?.contains(nextTarget)),\n );\n\n if (!remainsInside) {\n interactionInsideRef.current = false;\n }\n }, []);\n\n const handlePopupContentClick = React.useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n }, []);\n\n // Inside a popup list, action items must look like regular menu rows, not floating\n // action buttons (e.g. when an `action` item overflows into the \"More\" popup).\n const popupItems = React.useMemo(\n () =>\n items.map((item) =>\n item.type === 'action' ? {...item, type: 'regular' as const} : item,\n ),\n [items],\n );\n const sourceItemsById = React.useMemo(\n () => new Map(items.map((item) => [item.id, item])),\n [items],\n );\n const selectedPopupItemIndex = React.useMemo(() => {\n if (!highlightCurrentItem) {\n return undefined;\n }\n\n const index = popupItems.findIndex((item) =>\n isItemPresentationCurrent(item, {suppressCurrentItemIds}),\n );\n\n return index === -1 ? undefined : index;\n }, [highlightCurrentItem, popupItems, suppressCurrentItemIds]);\n\n if (!popupItems.length) {\n return children;\n }\n\n const content = (\n <ItemPopupNestContext.Provider value={nestContextValue}>\n <div\n ref={popupContentRef}\n className={b('popup-content', {collapsed, 'single-label': isSingleLabel})}\n onClick={handlePopupContentClick}\n onMouseEnter={markInteractionRegionEntered}\n onMouseLeave={(event) => markInteractionRegionLeft(event.relatedTarget)}\n onFocusCapture={markInteractionRegionEntered}\n onBlurCapture={(event) => markInteractionRegionLeft(event.relatedTarget)}\n >\n {title && <div className={b('popup-title')}>{title}</div>}\n <List\n items={popupItems}\n selectedItemIndex={selectedPopupItemIndex}\n itemHeight={popupItemHeight}\n itemsHeight={popupItemsHeight}\n itemClassName={b('root-menu-item', itemClassName)}\n virtualized={false}\n filterable={false}\n sortable={false}\n renderItem={(item) => {\n const sourceItem = sourceItemsById.get(item.id) ?? item;\n\n return (\n <Item\n {...item}\n rowRef={undefined}\n qa={undefined}\n compact={false}\n menuPopupRow\n suppressCurrentHighlight={!highlightCurrentItem}\n suppressCurrentItemIds={suppressCurrentItemIds}\n className={b('popup-item')}\n hideIcon={hideIcon}\n menuPopupHideIcon={nestedPopupHideIcon}\n stopClickPropagation={!sourceItem.itemWrapper}\n enableTooltip={false}\n bringForward={false}\n popupVisible={false}\n renderPopupContent={undefined}\n onOpenChangePopup={undefined}\n popupRef={undefined}\n enableQuickAccessPin={!isSingleLabel && enableQuickAccessPin}\n quickAccessPinItem={sourceItem}\n onToggleQuickAccess={\n isSingleLabel ? undefined : onToggleQuickAccess\n }\n onItemClick={(_innerItem, _innerCollapsed, event) => {\n if (!sourceItem.current) {\n onOpenChange?.(false);\n }\n\n (onPopupItemClick ?? onItemClick)?.(\n sourceItem,\n collapsed,\n event,\n );\n }}\n />\n );\n }}\n />\n </div>\n </ItemPopupNestContext.Provider>\n );\n\n const triggerProps = children.props as PopupTriggerInteractionProps;\n const trigger = React.cloneElement(\n children as React.ReactElement<PopupTriggerInteractionProps>,\n {\n onMouseEnter: (event) => {\n triggerElementRef.current = event.currentTarget;\n markInteractionRegionEntered();\n triggerProps.onMouseEnter?.(event);\n },\n onMouseLeave: (event) => {\n markInteractionRegionLeft(event.relatedTarget);\n triggerProps.onMouseLeave?.(event);\n },\n onFocus: (event) => {\n triggerElementRef.current = event.currentTarget;\n markInteractionRegionEntered();\n triggerProps.onFocus?.(event);\n },\n onBlur: (event) => {\n markInteractionRegionLeft(event.relatedTarget);\n triggerProps.onBlur?.(event);\n },\n },\n );\n\n return (\n <Popover\n disabled={disabled}\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen && disabled) return;\n wrappedOnOpenChange(nextOpen);\n }}\n placement={isSingleLabel ? 'right' : 'right-start'}\n strategy=\"fixed\"\n openDelay={DEFAULT_POPUP_DELAY}\n closeDelay={DEFAULT_POPUP_DELAY}\n offset={popoverOffset}\n enableSafePolygon\n className={b(\n 'icon-popover',\n {'item-type': type, 'single-label': isSingleLabel},\n isSingleLabel ? `g-root g-root_theme_${soloPopupTheme}` : undefined,\n )}\n style={popoverStyle}\n content={content}\n >\n {trigger}\n </Popover>\n );\n};\n\nItemPopup.displayName = 'ItemPopup';\n"],"names":["createBlock","styles","useSafeAsideHeaderContext","ItemPopupNestContext","useThemeValue","getAsideHeaderDensityConfig","getAsideHeaderDensityCssProperties","getPopupItemHeight","POPUP_REGULAR_ITEM_HEIGHT","isItemPresentationCurrent","List","Item","Popover"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type ItemQuickAccessPinProps = {
3
+ quickAccess?: boolean;
4
+ onToggle: (event: React.MouseEvent<HTMLButtonElement>) => void;
5
+ };
6
+ export declare const ItemQuickAccessPin: React.FC<ItemQuickAccessPinProps>;
7
+ export {};
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var icons = require('@gravity-ui/icons');
5
+ var uikit = require('@gravity-ui/uikit');
6
+ var cn = require('../../../../utils/cn.js');
7
+ var index = require('../../../i18n/index.js');
8
+ var Item_module = require('./Item.module.scss.js');
9
+
10
+ const b = cn.createBlock('composite-bar-item', Item_module.default);
11
+ const ItemQuickAccessPin = ({ quickAccess, onToggle }) => {
12
+ const label = quickAccess ? index.default('quick_access_unpin') : index.default('quick_access_pin');
13
+ const handleClick = React.useCallback((event) => {
14
+ event.preventDefault();
15
+ event.stopPropagation();
16
+ onToggle(event);
17
+ }, [onToggle]);
18
+ return (React.createElement(uikit.Button, { className: b('quick-access-pin', { pinned: quickAccess }), view: "flat-secondary", size: "s", onClick: handleClick, "aria-label": label, title: label },
19
+ React.createElement(uikit.Button.Icon, null,
20
+ React.createElement(uikit.Icon, { data: quickAccess ? icons.PinFill : icons.Pin }))));
21
+ };
22
+ ItemQuickAccessPin.displayName = 'ItemQuickAccessPin';
23
+
24
+ exports.ItemQuickAccessPin = ItemQuickAccessPin;
25
+ //# sourceMappingURL=ItemQuickAccessPin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemQuickAccessPin.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.tsx"],"sourcesContent":["import React from 'react';\n\nimport {Pin, PinFill} from '@gravity-ui/icons';\nimport {Button, Icon} from '@gravity-ui/uikit';\n\nimport {createBlock} from '../../../../utils/cn';\nimport i18n from '../../../i18n';\n\nimport styles from './Item.module.scss';\n\nconst b = createBlock('composite-bar-item', styles);\n\ntype ItemQuickAccessPinProps = {\n quickAccess?: boolean;\n onToggle: (event: React.MouseEvent<HTMLButtonElement>) => void;\n};\n\nexport const ItemQuickAccessPin: React.FC<ItemQuickAccessPinProps> = ({quickAccess, onToggle}) => {\n const label = quickAccess ? i18n('quick_access_unpin') : i18n('quick_access_pin');\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onToggle(event);\n },\n [onToggle],\n );\n\n return (\n <Button\n className={b('quick-access-pin', {pinned: quickAccess})}\n view=\"flat-secondary\"\n size=\"s\"\n onClick={handleClick}\n aria-label={label}\n title={label}\n >\n <Button.Icon>\n <Icon data={quickAccess ? PinFill : Pin} />\n </Button.Icon>\n </Button>\n );\n};\n\nItemQuickAccessPin.displayName = 'ItemQuickAccessPin';\n"],"names":["createBlock","styles","i18n","Button","Icon","PinFill","Pin"],"mappings":";;;;;;;;;AAUA,MAAM,CAAC,GAAGA,cAAW,CAAC,oBAAoB,EAAEC,mBAAM,CAAC;AAOtC,MAAA,kBAAkB,GAAsC,CAAC,EAAC,WAAW,EAAE,QAAQ,EAAC,KAAI;AAC7F,IAAA,MAAM,KAAK,GAAG,WAAW,GAAGC,aAAI,CAAC,oBAAoB,CAAC,GAAGA,aAAI,CAAC,kBAAkB,CAAC;IACjF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CACjC,CAAC,KAA0C,KAAI;QAC3C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,QAAQ,CAAC,KAAK,CAAC;AACnB,KAAC,EACD,CAAC,QAAQ,CAAC,CACb;AAED,IAAA,QACI,KAAA,CAAA,aAAA,CAACC,YAAM,EAAA,EACH,SAAS,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAC,MAAM,EAAE,WAAW,EAAC,CAAC,EACvD,IAAI,EAAC,gBAAgB,EACrB,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,WAAW,EACR,YAAA,EAAA,KAAK,EACjB,KAAK,EAAE,KAAK,EAAA;QAEZ,KAAC,CAAA,aAAA,CAAAA,YAAM,CAAC,IAAI,EAAA,IAAA;AACR,YAAA,KAAA,CAAA,aAAA,CAACC,UAAI,EAAC,EAAA,IAAI,EAAE,WAAW,GAAGC,aAAO,GAAGC,SAAG,GAAI,CACjC,CACT;AAEjB;AAEA,kBAAkB,CAAC,WAAW,GAAG,oBAAoB;;;;"}
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { AsideHeaderItem } from 'src/components/AsideHeader/types';
3
- export declare function renderItemTitle(params: Pick<AsideHeaderItem, 'title' | 'rightAdornment'>): React.JSX.Element;
3
+ export declare function renderItemTitle(params: Pick<AsideHeaderItem, 'title' | 'rightAdornment' | 'titleLines'>): React.JSX.Element;
@@ -6,7 +6,11 @@ var Item_module = require('./Item.module.scss.js');
6
6
 
7
7
  const b = cn.createBlock('composite-bar-item', Item_module.default);
8
8
  function renderItemTitle(params) {
9
- let titleNode = React.createElement("div", { className: b('title-text') }, params.title);
9
+ var _a;
10
+ // Preserve the pre-v7 two-line fallback. Consumers opt into the new
11
+ // single-line presentation explicitly with `titleLines: 1`.
12
+ const titleLines = (_a = params.titleLines) !== null && _a !== undefined ? _a : 2;
13
+ let titleNode = (React.createElement("div", { className: b('title-text', { lines: titleLines === 2 ? '2' : undefined }) }, params.title));
10
14
  if (params.rightAdornment) {
11
15
  titleNode = (React.createElement(React.Fragment, null,
12
16
  titleNode,
@@ -1 +1 @@
1
- {"version":3,"file":"renderItemTitle.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.tsx"],"sourcesContent":["import React from 'react';\n\nimport {AsideHeaderItem} from 'src/components/AsideHeader/types';\n\nimport {createBlock} from '../../../../utils/cn';\n\nimport styles from './Item.module.scss';\n\nconst b = createBlock('composite-bar-item', styles);\n\nexport function renderItemTitle(params: Pick<AsideHeaderItem, 'title' | 'rightAdornment'>) {\n let titleNode = <div className={b('title-text')}>{params.title}</div>;\n\n if (params.rightAdornment) {\n titleNode = (\n <React.Fragment>\n {titleNode}\n <div className={b('title-adornment')}>{params.rightAdornment}</div>\n </React.Fragment>\n );\n }\n\n return titleNode;\n}\n"],"names":["createBlock","styles"],"mappings":";;;;;;AAQA,MAAM,CAAC,GAAGA,cAAW,CAAC,oBAAoB,EAAEC,mBAAM,CAAC;AAE7C,SAAU,eAAe,CAAC,MAAyD,EAAA;AACrF,IAAA,IAAI,SAAS,GAAG,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,EAAG,EAAA,MAAM,CAAC,KAAK,CAAO;AAErE,IAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACvB,QAAA,SAAS,IACL,KAAC,CAAA,aAAA,CAAA,KAAK,CAAC,QAAQ,EAAA,IAAA;YACV,SAAS;AACV,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAG,EAAA,MAAM,CAAC,cAAc,CAAO,CACtD,CACpB;;AAGL,IAAA,OAAO,SAAS;AACpB;;;;"}
1
+ {"version":3,"file":"renderItemTitle.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.tsx"],"sourcesContent":["import React from 'react';\n\nimport {AsideHeaderItem} from 'src/components/AsideHeader/types';\n\nimport {createBlock} from '../../../../utils/cn';\n\nimport styles from './Item.module.scss';\n\nconst b = createBlock('composite-bar-item', styles);\n\nexport function renderItemTitle(\n params: Pick<AsideHeaderItem, 'title' | 'rightAdornment' | 'titleLines'>,\n) {\n // Preserve the pre-v7 two-line fallback. Consumers opt into the new\n // single-line presentation explicitly with `titleLines: 1`.\n const titleLines = params.titleLines ?? 2;\n let titleNode = (\n <div className={b('title-text', {lines: titleLines === 2 ? '2' : undefined})}>\n {params.title}\n </div>\n );\n\n if (params.rightAdornment) {\n titleNode = (\n <React.Fragment>\n {titleNode}\n <div className={b('title-adornment')}>{params.rightAdornment}</div>\n </React.Fragment>\n );\n }\n\n return titleNode;\n}\n"],"names":["createBlock","styles"],"mappings":";;;;;;AAQA,MAAM,CAAC,GAAGA,cAAW,CAAC,oBAAoB,EAAEC,mBAAM,CAAC;AAE7C,SAAU,eAAe,CAC3B,MAAwE,EAAA;;;;IAIxE,MAAM,UAAU,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,SAAA,GAAA,EAAA,GAAI,CAAC;AACzC,IAAA,IAAI,SAAS,IACT,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,EAAC,KAAK,EAAE,UAAU,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,EAAC,CAAC,EAAA,EACvE,MAAM,CAAC,KAAK,CACX,CACT;AAED,IAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACvB,QAAA,SAAS,IACL,KAAC,CAAA,aAAA,CAAA,KAAK,CAAC,QAAQ,EAAA,IAAA;YACV,SAAS;AACV,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAG,EAAA,MAAM,CAAC,cAAc,CAAO,CACtD,CACpB;;AAGL,IAAA,OAAO,SAAS;AACpB;;;;"}
@@ -1 +1 @@
1
- .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS{--_--scrollbar-width:var(--gn-aside-scrollbar-width,8px);--_--scrollbar-thumb-width:var(--gn-aside-scrollbar-thumb-width,4px);flex:1 1 auto;min-height:0;position:relative;width:100%}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:before{background:var(--gn-aside-bottom-shadow-color,linear-gradient(to bottom,transparent 0,transparent 50%,rgba(0,0,0,.08) 100%));bottom:0;content:"";height:100%;left:0;opacity:0;pointer-events:none;position:absolute;right:0;transition:opacity .3s ease-in-out}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ:before{opacity:1}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza{-ms-overflow-style:none;height:100%;overflow-y:auto;scrollbar-width:none;width:100%}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza::-webkit-scrollbar{display:none;height:0;width:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN{background:var(--gn-aside-scrollbar-track-color,transparent);bottom:0;pointer-events:auto;position:absolute;right:0;top:0;width:var(--_--scrollbar-width);z-index:3}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h{background:var(--gn-aside-scrollbar-handle-color,var(--g-color-base-simple-hover));border-radius:calc(var(--_--scrollbar-thumb-width)/2);opacity:0;position:absolute;right:calc((var(--_--scrollbar-width) - var(--_--scrollbar-thumb-width))/2);top:0;touch-action:none;transition:opacity .15s ease-in-out;width:var(--_--scrollbar-thumb-width)}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:hover .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h{opacity:1}.g-root_theme_light .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS, .g-root_theme_light-hc .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS{--gn-aside-bottom-shadow-color:linear-gradient(180deg,transparent 0%,transparent 50%,rgba(0,0,0,.08))}.g-root_theme_dark .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS, .g-root_theme_dark-hc .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS{--gn-aside-bottom-shadow-color:linear-gradient(180deg,transparent 0%,transparent 80%,rgba(0,0,0,.4))}
1
+ .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS{--_--scrollbar-width:var(--gn-aside-scrollbar-width,8px);--_--scrollbar-thumb-width:var(--gn-aside-scrollbar-thumb-width,4px);flex:1 1 auto;min-height:0;position:relative;width:100%}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:after, .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:before{content:"";height:12px;inset-inline:0;opacity:0;pointer-events:none;position:absolute;transition:opacity .3s ease-in-out;z-index:2}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:before{background:linear-gradient(to bottom,var(--g-color-sfx-shadow),transparent);inset-block-start:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:after{background:linear-gradient(to top,var(--g-color-sfx-shadow),transparent);inset-block-end:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-end___WH4ZY:after, .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-start___dQ8Jw:before{opacity:.7}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza{-ms-overflow-style:none;height:100%;overflow-y:auto;scrollbar-width:none;width:100%}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza::-webkit-scrollbar{display:none;height:0;width:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider___QV96G{background-color:var(--gn-aside-header-divider-horizontal-color,var(--g-color-line-generic));height:1px;inset-inline:0;opacity:0;pointer-events:none;position:absolute;transition:opacity .3s ease-in-out;z-index:2}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_start___jneED{inset-block-start:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_end___YqNPa{inset-block-end:0}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_visible___B7td6{opacity:1}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN{background:var(--gn-aside-scrollbar-track-color,transparent);bottom:0;pointer-events:auto;position:absolute;right:0;top:0;width:var(--_--scrollbar-width);z-index:3}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h{background:var(--gn-aside-scrollbar-handle-color,var(--g-color-base-simple-hover));border-radius:calc(var(--_--scrollbar-thumb-width)/2);opacity:0;position:absolute;right:calc((var(--_--scrollbar-width) - var(--_--scrollbar-thumb-width))/2);top:0;touch-action:none;transition:opacity .15s ease-in-out;width:var(--_--scrollbar-thumb-width)}.ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS:hover .ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h{opacity:1}
@@ -1,12 +1,10 @@
1
- import React, { FC, ReactNode } from 'react';
1
+ import { FC, ReactNode } from 'react';
2
2
  type ScrollableWithScrollbarProps = {
3
3
  children: ReactNode;
4
4
  className?: string;
5
- /**
6
- * Extra dependencies that should trigger a recalculation of the bottom
7
- * shadow and custom scrollbar thumb (e.g. when the rendered items change).
8
- */
9
- recalcDeps?: React.DependencyList;
5
+ showScrollDividers?: boolean;
6
+ /** Called when scrollable content overflows the allocated height. */
7
+ onOverflowChange?: (overflows: boolean) => void;
10
8
  };
11
9
  export declare const ScrollableWithScrollbar: FC<ScrollableWithScrollbarProps>;
12
10
  export {};
@@ -3,19 +3,28 @@ import './ScrollableWithScrollbar.css';
3
3
 
4
4
  var React = require('react');
5
5
  var cn = require('../../../../utils/cn.js');
6
+ var AsideDivider = require('../../AsideDivider.js');
6
7
  var useScrollableScrollbarSync = require('./useScrollableScrollbarSync.js');
7
8
  var ScrollableWithScrollbar_module = require('./ScrollableWithScrollbar.module.scss.js');
8
9
 
9
10
  const b = cn.createBlock('scrollable-with-scrollbar', ScrollableWithScrollbar_module.default);
10
- const EMPTY_DEPS = [];
11
11
  // Hides the native scrollbar and renders a custom thumb synced with the
12
12
  // underlying scroll position. The scroll itself stays native (wheel / touch /
13
13
  // keyboard) — only the visual indicator and drag handling are custom, so the
14
14
  // reserved gutter width is identical across OS / browser scrollbar settings.
15
- const ScrollableWithScrollbar = ({ children, className, recalcDeps = EMPTY_DEPS, }) => {
16
- const { scrollRef, trackRef, thumbRef, hasContentBelow, overflows, thumb, scheduleUpdate, handleThumbPointerDown, handleTrackPointerDown, } = useScrollableScrollbarSync.useScrollableScrollbarSync(recalcDeps);
17
- return (React.createElement("div", { className: b({ 'bottom-shadow': hasContentBelow }, className) },
18
- React.createElement("div", { ref: scrollRef, className: b('scrollable-inner'), onScroll: scheduleUpdate }, children),
15
+ const ScrollableWithScrollbar = ({ children, className, showScrollDividers = false, onOverflowChange, }) => {
16
+ const { scrollRef, trackRef, thumbRef, overflows, canScrollUp, canScrollDown, thumb, scheduleUpdate, handleThumbPointerDown, handleTrackPointerDown, } = useScrollableScrollbarSync.useScrollableScrollbarSync();
17
+ React.useEffect(() => {
18
+ onOverflowChange === null || onOverflowChange === undefined ? undefined : onOverflowChange(overflows);
19
+ }, [onOverflowChange, overflows]);
20
+ React.useEffect(() => {
21
+ return () => onOverflowChange === null || onOverflowChange === undefined ? undefined : onOverflowChange(false);
22
+ }, [onOverflowChange]);
23
+ return (React.createElement("div", { className: b({ 'shadow-start': canScrollUp, 'shadow-end': canScrollDown }, className) },
24
+ React.createElement("div", { ref: scrollRef, className: b('scrollable-inner'), onScroll: scheduleUpdate, "data-gn-aside-scrollport": true }, children),
25
+ showScrollDividers && (React.createElement(React.Fragment, null,
26
+ React.createElement(AsideDivider.AsideDivider, { transitionId: "scroll-start", className: b('scroll-divider', { start: true, visible: canScrollUp }) }),
27
+ React.createElement(AsideDivider.AsideDivider, { transitionId: "scroll-end", className: b('scroll-divider', { end: true, visible: canScrollDown }) }))),
19
28
  overflows ? (React.createElement("div", { ref: trackRef, className: b('scrollbar-track'), onPointerDown: handleTrackPointerDown, "aria-hidden": "true" },
20
29
  React.createElement("div", { ref: thumbRef, className: b('scrollbar-thumb'), style: { transform: `translateY(${thumb.top}px)`, height: thumb.height }, onPointerDown: handleThumbPointerDown }))) : null));
21
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollableWithScrollbar.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.tsx"],"sourcesContent":["import React, {FC, ReactNode} from 'react';\n\nimport {createBlock} from '../../../../utils/cn';\n\nimport {useScrollableScrollbarSync} from './useScrollableScrollbarSync';\n\nimport styles from './ScrollableWithScrollbar.module.scss';\n\nconst b = createBlock('scrollable-with-scrollbar', styles);\n\nconst EMPTY_DEPS: React.DependencyList = [];\n\ntype ScrollableWithScrollbarProps = {\n children: ReactNode;\n className?: string;\n /**\n * Extra dependencies that should trigger a recalculation of the bottom\n * shadow and custom scrollbar thumb (e.g. when the rendered items change).\n */\n recalcDeps?: React.DependencyList;\n};\n\n// Hides the native scrollbar and renders a custom thumb synced with the\n// underlying scroll position. The scroll itself stays native (wheel / touch /\n// keyboard) — only the visual indicator and drag handling are custom, so the\n// reserved gutter width is identical across OS / browser scrollbar settings.\nexport const ScrollableWithScrollbar: FC<ScrollableWithScrollbarProps> = ({\n children,\n className,\n recalcDeps = EMPTY_DEPS,\n}) => {\n const {\n scrollRef,\n trackRef,\n thumbRef,\n hasContentBelow,\n overflows,\n thumb,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n } = useScrollableScrollbarSync(recalcDeps);\n\n return (\n <div className={b({'bottom-shadow': hasContentBelow}, className)}>\n <div ref={scrollRef} className={b('scrollable-inner')} onScroll={scheduleUpdate}>\n {children}\n </div>\n\n {overflows ? (\n <div\n ref={trackRef}\n className={b('scrollbar-track')}\n onPointerDown={handleTrackPointerDown}\n aria-hidden=\"true\"\n >\n <div\n ref={thumbRef}\n className={b('scrollbar-thumb')}\n style={{transform: `translateY(${thumb.top}px)`, height: thumb.height}}\n onPointerDown={handleThumbPointerDown}\n />\n </div>\n ) : null}\n </div>\n );\n};\n"],"names":["createBlock","styles","useScrollableScrollbarSync"],"mappings":";;;;;;;AAQA,MAAM,CAAC,GAAGA,cAAW,CAAC,2BAA2B,EAAEC,sCAAM,CAAC;AAE1D,MAAM,UAAU,GAAyB,EAAE;AAY3C;AACA;AACA;AACA;AACO,MAAM,uBAAuB,GAAqC,CAAC,EACtE,QAAQ,EACR,SAAS,EACT,UAAU,GAAG,UAAU,GAC1B,KAAI;IACD,MAAM,EACF,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,SAAS,EACT,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,GACzB,GAAGC,qDAA0B,CAAC,UAAU,CAAC;AAE1C,IAAA,QACI,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,EAAC,eAAe,EAAE,eAAe,EAAC,EAAE,SAAS,CAAC,EAAA;AAC5D,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAA,EAC1E,QAAQ,CACP;QAEL,SAAS,IACN,6BACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,aAAa,EAAE,sBAAsB,iBACzB,MAAM,EAAA;AAElB,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,KAAK,EAAE,EAAC,SAAS,EAAE,CAAA,WAAA,EAAc,KAAK,CAAC,GAAG,CAAK,GAAA,CAAA,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAC,EACtE,aAAa,EAAE,sBAAsB,EACvC,CAAA,CACA,IACN,IAAI,CACN;AAEd;;;;"}
1
+ {"version":3,"file":"ScrollableWithScrollbar.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.tsx"],"sourcesContent":["import React, {FC, ReactNode, useEffect} from 'react';\n\nimport {createBlock} from '../../../../utils/cn';\nimport {AsideDivider} from '../../AsideDivider';\n\nimport {useScrollableScrollbarSync} from './useScrollableScrollbarSync';\n\nimport styles from './ScrollableWithScrollbar.module.scss';\n\nconst b = createBlock('scrollable-with-scrollbar', styles);\n\ntype ScrollableWithScrollbarProps = {\n children: ReactNode;\n className?: string;\n showScrollDividers?: boolean;\n /** Called when scrollable content overflows the allocated height. */\n onOverflowChange?: (overflows: boolean) => void;\n};\n\n// Hides the native scrollbar and renders a custom thumb synced with the\n// underlying scroll position. The scroll itself stays native (wheel / touch /\n// keyboard) — only the visual indicator and drag handling are custom, so the\n// reserved gutter width is identical across OS / browser scrollbar settings.\nexport const ScrollableWithScrollbar: FC<ScrollableWithScrollbarProps> = ({\n children,\n className,\n showScrollDividers = false,\n onOverflowChange,\n}) => {\n const {\n scrollRef,\n trackRef,\n thumbRef,\n overflows,\n canScrollUp,\n canScrollDown,\n thumb,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n } = useScrollableScrollbarSync();\n\n useEffect(() => {\n onOverflowChange?.(overflows);\n }, [onOverflowChange, overflows]);\n\n useEffect(() => {\n return () => onOverflowChange?.(false);\n }, [onOverflowChange]);\n\n return (\n <div className={b({'shadow-start': canScrollUp, 'shadow-end': canScrollDown}, className)}>\n <div\n ref={scrollRef}\n className={b('scrollable-inner')}\n onScroll={scheduleUpdate}\n data-gn-aside-scrollport\n >\n {children}\n </div>\n\n {showScrollDividers && (\n <React.Fragment>\n <AsideDivider\n transitionId=\"scroll-start\"\n className={b('scroll-divider', {start: true, visible: canScrollUp})}\n />\n <AsideDivider\n transitionId=\"scroll-end\"\n className={b('scroll-divider', {end: true, visible: canScrollDown})}\n />\n </React.Fragment>\n )}\n {overflows ? (\n <div\n ref={trackRef}\n className={b('scrollbar-track')}\n onPointerDown={handleTrackPointerDown}\n aria-hidden=\"true\"\n >\n <div\n ref={thumbRef}\n className={b('scrollbar-thumb')}\n style={{transform: `translateY(${thumb.top}px)`, height: thumb.height}}\n onPointerDown={handleThumbPointerDown}\n />\n </div>\n ) : null}\n </div>\n );\n};\n"],"names":["createBlock","styles","useScrollableScrollbarSync","useEffect","AsideDivider"],"mappings":";;;;;;;;AASA,MAAM,CAAC,GAAGA,cAAW,CAAC,2BAA2B,EAAEC,sCAAM,CAAC;AAU1D;AACA;AACA;AACA;AACa,MAAA,uBAAuB,GAAqC,CAAC,EACtE,QAAQ,EACR,SAAS,EACT,kBAAkB,GAAG,KAAK,EAC1B,gBAAgB,GACnB,KAAI;IACD,MAAM,EACF,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,aAAa,EACb,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,GACzB,GAAGC,qDAA0B,EAAE;IAEhCC,eAAS,CAAC,MAAK;AACX,QAAA,gBAAgB,aAAhB,gBAAgB,KAAA,SAAA,GAAA,SAAA,GAAhB,gBAAgB,CAAG,SAAS,CAAC;AACjC,KAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAEjCA,eAAS,CAAC,MAAK;QACX,OAAO,MAAM,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,SAAA,GAAA,SAAA,GAAhB,gBAAgB,CAAG,KAAK,CAAC;AAC1C,KAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAEtB,IAAA,QACI,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,EAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAC,EAAE,SAAS,CAAC,EAAA;AACpF,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAChC,QAAQ,EAAE,cAAc,EAAA,0BAAA,EAAA,IAAA,EAAA,EAGvB,QAAQ,CACP;AAEL,QAAA,kBAAkB,KACf,KAAC,CAAA,aAAA,CAAA,KAAK,CAAC,QAAQ,EAAA,IAAA;YACX,KAAC,CAAA,aAAA,CAAAC,yBAAY,IACT,YAAY,EAAC,cAAc,EAC3B,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAC,CAAC,EACrE,CAAA;YACF,KAAC,CAAA,aAAA,CAAAA,yBAAY,EACT,EAAA,YAAY,EAAC,YAAY,EACzB,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAAE,EAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAC,CAAC,EACrE,CAAA,CACW,CACpB;QACA,SAAS,IACN,6BACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,aAAa,EAAE,sBAAsB,iBACzB,MAAM,EAAA;AAElB,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,KAAK,EAAE,EAAC,SAAS,EAAE,CAAA,WAAA,EAAc,KAAK,CAAC,GAAG,CAAK,GAAA,CAAA,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAC,EACtE,aAAa,EAAE,sBAAsB,EACvC,CAAA,CACA,IACN,IAAI,CACN;AAEd;;;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var styles = {"gn-scrollable-with-scrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gnScrollableWithScrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gn-scrollable-with-scrollbar_bottom-shadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gnScrollableWithScrollbarBottomShadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gn-scrollable-with-scrollbar__scrollable-inner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gnScrollableWithScrollbarScrollableInner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gn-scrollable-with-scrollbar__scrollbar-track":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gnScrollableWithScrollbarScrollbarTrack":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gn-scrollable-with-scrollbar__scrollbar-thumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h","gnScrollableWithScrollbarScrollbarThumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h"};
5
+ var styles = {"gn-scrollable-with-scrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gnScrollableWithScrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gn-scrollable-with-scrollbar_shadow-start":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-start___dQ8Jw","gnScrollableWithScrollbarShadowStart":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-start___dQ8Jw","gn-scrollable-with-scrollbar_shadow-end":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-end___WH4ZY","gnScrollableWithScrollbarShadowEnd":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_shadow-end___WH4ZY","gn-scrollable-with-scrollbar__scrollable-inner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gnScrollableWithScrollbarScrollableInner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gn-scrollable-with-scrollbar__scroll-divider":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider___QV96G","gnScrollableWithScrollbarScrollDivider":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider___QV96G","gn-scrollable-with-scrollbar__scroll-divider_start":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_start___jneED","gnScrollableWithScrollbarScrollDividerStart":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_start___jneED","gn-scrollable-with-scrollbar__scroll-divider_end":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_end___YqNPa","gnScrollableWithScrollbarScrollDividerEnd":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_end___YqNPa","gn-scrollable-with-scrollbar__scroll-divider_visible":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_visible___B7td6","gnScrollableWithScrollbarScrollDividerVisible":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scroll-divider_visible___B7td6","gn-scrollable-with-scrollbar__scrollbar-track":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gnScrollableWithScrollbarScrollbarTrack":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gn-scrollable-with-scrollbar__scrollbar-thumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h","gnScrollableWithScrollbarScrollbarThumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h"};
6
6
 
7
7
  exports.default = styles;
8
8
  //# sourceMappingURL=ScrollableWithScrollbar.module.scss.js.map
@@ -7,22 +7,22 @@ type UseScrollableScrollbarSyncResult = {
7
7
  scrollRef: React.RefObject<HTMLDivElement>;
8
8
  trackRef: React.RefObject<HTMLDivElement>;
9
9
  thumbRef: React.RefObject<HTMLDivElement>;
10
- hasContentBelow: boolean;
11
10
  overflows: boolean;
11
+ canScrollUp: boolean;
12
+ canScrollDown: boolean;
12
13
  thumb: ThumbGeometry;
13
14
  scheduleUpdate: () => void;
14
15
  handleThumbPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
15
16
  handleTrackPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
16
17
  };
17
18
  /**
18
- * Keeps a custom scrollbar thumb and bottom shadow in sync with a native
19
- * scroll layer. The scroll element handles touch/keyboard; wheel events on the
20
- * overlay track are forwarded to it (the track sits above the scroller, so
21
- * they would not scroll otherwise). Wheel, touch, and keyboard on the
22
- * scrollable area itself are unchanged.
19
+ * Keeps a custom scrollbar thumb in sync with a native scroll layer. The
20
+ * scroll element handles touch/keyboard; wheel events on the overlay track are
21
+ * forwarded to it (the track sits above the scroller, so they would not scroll
22
+ * otherwise). Wheel, touch, and keyboard on the scrollable area itself are
23
+ * unchanged.
23
24
  *
24
- * @param recalcDeps - extra deps that should trigger thumb/shadow recalculation
25
25
  * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI
26
26
  */
27
- export declare function useScrollableScrollbarSync(recalcDeps?: React.DependencyList): UseScrollableScrollbarSyncResult;
27
+ export declare function useScrollableScrollbarSync(): UseScrollableScrollbarSyncResult;
28
28
  export {};