@gravity-ui/navigation 6.6.0 → 7.0.0-beta.1

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 (298) hide show
  1. package/build/cjs/components/AsideHeader/AsideHeader.css +11 -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__/DecorationExample.d.ts +7 -0
  13. package/build/cjs/components/AsideHeader/__playwright__/QuickAccessOverflowExample.d.ts +8 -0
  14. package/build/cjs/components/AsideHeader/__playwright__/currentIndicatorPaint.d.ts +21 -0
  15. package/build/cjs/components/AsideHeader/__playwright__/transitionTestUtils.d.ts +4 -0
  16. package/build/cjs/components/AsideHeader/__stories__/fullNavigationMoc.d.ts +6 -0
  17. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +2 -4
  18. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -1
  19. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js +7 -2
  20. package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js.map +1 -1
  21. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -3
  22. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
  23. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
  24. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +2 -4
  25. package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
  26. package/build/cjs/components/AsideHeader/components/AsideDivider.d.ts +7 -0
  27. package/build/cjs/components/AsideHeader/components/AsideDivider.js +13 -0
  28. package/build/cjs/components/AsideHeader/components/AsideDivider.js.map +1 -0
  29. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
  30. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +3 -1
  31. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js +12 -8
  32. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
  33. package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
  34. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.d.ts +20 -0
  35. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js +170 -0
  36. package/build/cjs/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js.map +1 -0
  37. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.css +3 -1
  38. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +13 -2
  39. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js +53 -39
  40. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
  41. package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
  42. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
  43. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js +4 -2
  44. package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js.map +1 -1
  45. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.css +33 -1
  46. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js +161 -43
  47. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
  48. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
  49. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +27 -4
  50. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +19 -0
  51. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +137 -20
  52. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -1
  53. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.d.ts +7 -0
  54. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js +25 -0
  55. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js.map +1 -0
  56. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +1 -1
  57. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +5 -1
  58. package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -1
  59. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
  60. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -6
  61. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +14 -5
  62. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
  63. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
  64. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +8 -8
  65. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +68 -33
  66. package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -1
  67. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.d.ts +1 -0
  68. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.js +2 -0
  69. package/build/cjs/components/AsideHeader/components/CompositeBar/constants.js.map +1 -1
  70. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.d.ts +24 -0
  71. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.js +39 -0
  72. package/build/cjs/components/AsideHeader/components/CompositeBar/presentationCurrent.js.map +1 -0
  73. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.d.ts +12 -7
  74. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js +42 -35
  75. package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
  76. package/build/cjs/components/AsideHeader/components/FirstPanel.js +129 -10
  77. package/build/cjs/components/AsideHeader/components/FirstPanel.js.map +1 -1
  78. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
  79. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js +18 -2
  80. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
  81. package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
  82. package/build/cjs/components/AsideHeader/components/Header.js +7 -4
  83. package/build/cjs/components/AsideHeader/components/Header.js.map +1 -1
  84. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.css +11 -1
  85. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.d.ts +1 -0
  86. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js +13 -7
  87. package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
  88. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.d.ts +80 -0
  89. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js +600 -0
  90. package/build/cjs/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js.map +1 -0
  91. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.d.ts +14 -0
  92. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js +164 -0
  93. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js.map +1 -0
  94. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.d.ts +14 -0
  95. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js +94 -0
  96. package/build/cjs/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js.map +1 -0
  97. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.css +11 -1
  98. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -1
  99. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js +14 -5
  100. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
  101. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.css +11 -1
  102. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
  103. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js +5 -2
  104. package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
  105. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.d.ts +7 -0
  106. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.js +25 -0
  107. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorDom.js.map +1 -0
  108. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.d.ts +25 -0
  109. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.js +89 -0
  110. package/build/cjs/components/AsideHeader/components/PageLayout/currentIndicatorModel.js.map +1 -0
  111. package/build/cjs/components/AsideHeader/components/Panels.js +2 -2
  112. package/build/cjs/components/AsideHeader/components/Panels.js.map +1 -1
  113. package/build/cjs/components/AsideHeader/density.d.ts +22 -0
  114. package/build/cjs/components/AsideHeader/density.js +67 -0
  115. package/build/cjs/components/AsideHeader/density.js.map +1 -0
  116. package/build/cjs/components/AsideHeader/i18n/__mocks__/index.d.ts +1 -0
  117. package/build/cjs/components/AsideHeader/i18n/en.json.js +10 -1
  118. package/build/cjs/components/AsideHeader/i18n/en.json.js.map +1 -1
  119. package/build/cjs/components/AsideHeader/i18n/index.d.ts +4 -4
  120. package/build/cjs/components/AsideHeader/i18n/ru.json.js +10 -1
  121. package/build/cjs/components/AsideHeader/i18n/ru.json.js.map +1 -1
  122. package/build/cjs/components/AsideHeader/index.d.ts +1 -0
  123. package/build/cjs/components/AsideHeader/quickAccess.d.ts +9 -0
  124. package/build/cjs/components/AsideHeader/quickAccess.js +31 -0
  125. package/build/cjs/components/AsideHeader/quickAccess.js.map +1 -0
  126. package/build/cjs/components/AsideHeader/types.d.ts +50 -5
  127. package/build/cjs/components/AsideHeader/types.js.map +1 -1
  128. package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js +18 -3
  129. package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
  130. package/build/cjs/components/AsideHeader/utils.d.ts +1 -0
  131. package/build/cjs/components/AsideHeader/utils.js +2 -0
  132. package/build/cjs/components/AsideHeader/utils.js.map +1 -1
  133. package/build/cjs/components/Footer/desktop/Footer.css +1 -1
  134. package/build/cjs/components/Footer/mobile/Footer.css +1 -1
  135. package/build/cjs/components/HotkeysPanel/HotkeysPanel.css +1 -1
  136. package/build/cjs/components/HotkeysPanel/HotkeysPanel.js +1 -1
  137. package/build/cjs/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
  138. package/build/cjs/components/HotkeysPanel/HotkeysPanel.module.scss.js +1 -1
  139. package/build/cjs/components/Logo/Logo.css +1 -1
  140. package/build/cjs/components/Logo/Logo.d.ts +1 -0
  141. package/build/cjs/components/Logo/Logo.js +4 -4
  142. package/build/cjs/components/Logo/Logo.js.map +1 -1
  143. package/build/cjs/components/constants.d.ts +5 -0
  144. package/build/cjs/components/constants.js +6 -0
  145. package/build/cjs/components/constants.js.map +1 -1
  146. package/build/cjs/components/types.d.ts +4 -4
  147. package/build/docs/components/AsideHeader.md +243 -42
  148. package/build/esm/components/AsideHeader/AsideHeader.css +11 -1
  149. package/build/esm/components/AsideHeader/AsideHeader.js +2 -2
  150. package/build/esm/components/AsideHeader/AsideHeader.js.map +1 -1
  151. package/build/esm/components/AsideHeader/AsideHeader.module.scss.js +1 -1
  152. package/build/esm/components/AsideHeader/AsideHeaderContext.d.ts +5 -0
  153. package/build/esm/components/AsideHeader/AsideHeaderContext.js +2 -0
  154. package/build/esm/components/AsideHeader/AsideHeaderContext.js.map +1 -1
  155. package/build/esm/components/AsideHeader/__playwright__/AsideTransitionExample.d.ts +8 -0
  156. package/build/esm/components/AsideHeader/__playwright__/CollapseButtonExample.d.ts +14 -0
  157. package/build/esm/components/AsideHeader/__playwright__/CompactTransitionExample.d.ts +12 -0
  158. package/build/esm/components/AsideHeader/__playwright__/CurrentIndicatorExample.d.ts +20 -0
  159. package/build/esm/components/AsideHeader/__playwright__/DecorationExample.d.ts +7 -0
  160. package/build/esm/components/AsideHeader/__playwright__/QuickAccessOverflowExample.d.ts +8 -0
  161. package/build/esm/components/AsideHeader/__playwright__/currentIndicatorPaint.d.ts +21 -0
  162. package/build/esm/components/AsideHeader/__playwright__/transitionTestUtils.d.ts +4 -0
  163. package/build/esm/components/AsideHeader/__stories__/fullNavigationMoc.d.ts +6 -0
  164. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +3 -5
  165. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -1
  166. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js +7 -2
  167. package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js.map +1 -1
  168. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -3
  169. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
  170. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
  171. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +2 -4
  172. package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
  173. package/build/esm/components/AsideHeader/components/AsideDivider.d.ts +7 -0
  174. package/build/esm/components/AsideHeader/components/AsideDivider.js +11 -0
  175. package/build/esm/components/AsideHeader/components/AsideDivider.js.map +1 -0
  176. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
  177. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +3 -1
  178. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js +12 -8
  179. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
  180. package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
  181. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.d.ts +20 -0
  182. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js +167 -0
  183. package/build/esm/components/AsideHeader/components/CollapseButton/useCollapseAnchor.js.map +1 -0
  184. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.css +3 -1
  185. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +13 -2
  186. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js +54 -40
  187. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
  188. package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
  189. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
  190. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js +4 -2
  191. package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.js.map +1 -1
  192. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.css +33 -1
  193. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js +164 -46
  194. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
  195. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
  196. package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +27 -4
  197. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +19 -0
  198. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +139 -23
  199. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -1
  200. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.d.ts +7 -0
  201. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js +23 -0
  202. package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemQuickAccessPin.js.map +1 -0
  203. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +1 -1
  204. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +5 -1
  205. package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -1
  206. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
  207. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -6
  208. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +15 -6
  209. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
  210. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
  211. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +8 -8
  212. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +68 -33
  213. package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -1
  214. package/build/esm/components/AsideHeader/components/CompositeBar/constants.d.ts +1 -0
  215. package/build/esm/components/AsideHeader/components/CompositeBar/constants.js +2 -1
  216. package/build/esm/components/AsideHeader/components/CompositeBar/constants.js.map +1 -1
  217. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.d.ts +24 -0
  218. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.js +36 -0
  219. package/build/esm/components/AsideHeader/components/CompositeBar/presentationCurrent.js.map +1 -0
  220. package/build/esm/components/AsideHeader/components/CompositeBar/utils.d.ts +12 -7
  221. package/build/esm/components/AsideHeader/components/CompositeBar/utils.js +44 -35
  222. package/build/esm/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
  223. package/build/esm/components/AsideHeader/components/FirstPanel.js +131 -12
  224. package/build/esm/components/AsideHeader/components/FirstPanel.js.map +1 -1
  225. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
  226. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js +18 -2
  227. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
  228. package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
  229. package/build/esm/components/AsideHeader/components/Header.js +7 -4
  230. package/build/esm/components/AsideHeader/components/Header.js.map +1 -1
  231. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.css +11 -1
  232. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.d.ts +1 -0
  233. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js +13 -7
  234. package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
  235. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.d.ts +80 -0
  236. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js +598 -0
  237. package/build/esm/components/AsideHeader/components/PageLayout/AsideLayoutTransition.js.map +1 -0
  238. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.d.ts +14 -0
  239. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js +162 -0
  240. package/build/esm/components/AsideHeader/components/PageLayout/CurrentIndicatorTransition.js.map +1 -0
  241. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.d.ts +14 -0
  242. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js +92 -0
  243. package/build/esm/components/AsideHeader/components/PageLayout/CurrentPresentationObserver.js.map +1 -0
  244. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.css +11 -1
  245. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -1
  246. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js +15 -6
  247. package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
  248. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.css +11 -1
  249. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
  250. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js +5 -2
  251. package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
  252. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.d.ts +7 -0
  253. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.js +17 -0
  254. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorDom.js.map +1 -0
  255. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.d.ts +25 -0
  256. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.js +84 -0
  257. package/build/esm/components/AsideHeader/components/PageLayout/currentIndicatorModel.js.map +1 -0
  258. package/build/esm/components/AsideHeader/components/Panels.js +3 -3
  259. package/build/esm/components/AsideHeader/components/Panels.js.map +1 -1
  260. package/build/esm/components/AsideHeader/density.d.ts +22 -0
  261. package/build/esm/components/AsideHeader/density.js +63 -0
  262. package/build/esm/components/AsideHeader/density.js.map +1 -0
  263. package/build/esm/components/AsideHeader/i18n/__mocks__/index.d.ts +1 -0
  264. package/build/esm/components/AsideHeader/i18n/en.json.js +8 -2
  265. package/build/esm/components/AsideHeader/i18n/en.json.js.map +1 -1
  266. package/build/esm/components/AsideHeader/i18n/index.d.ts +4 -4
  267. package/build/esm/components/AsideHeader/i18n/ru.json.js +8 -2
  268. package/build/esm/components/AsideHeader/i18n/ru.json.js.map +1 -1
  269. package/build/esm/components/AsideHeader/index.d.ts +1 -0
  270. package/build/esm/components/AsideHeader/quickAccess.d.ts +9 -0
  271. package/build/esm/components/AsideHeader/quickAccess.js +27 -0
  272. package/build/esm/components/AsideHeader/quickAccess.js.map +1 -0
  273. package/build/esm/components/AsideHeader/types.d.ts +50 -5
  274. package/build/esm/components/AsideHeader/types.js.map +1 -1
  275. package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js +18 -3
  276. package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
  277. package/build/esm/components/AsideHeader/utils.d.ts +1 -0
  278. package/build/esm/components/AsideHeader/utils.js +2 -1
  279. package/build/esm/components/AsideHeader/utils.js.map +1 -1
  280. package/build/esm/components/Footer/desktop/Footer.css +1 -1
  281. package/build/esm/components/Footer/mobile/Footer.css +1 -1
  282. package/build/esm/components/HotkeysPanel/HotkeysPanel.css +1 -1
  283. package/build/esm/components/HotkeysPanel/HotkeysPanel.js +1 -1
  284. package/build/esm/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
  285. package/build/esm/components/HotkeysPanel/HotkeysPanel.module.scss.js +1 -1
  286. package/build/esm/components/Logo/Logo.css +1 -1
  287. package/build/esm/components/Logo/Logo.d.ts +1 -0
  288. package/build/esm/components/Logo/Logo.js +4 -4
  289. package/build/esm/components/Logo/Logo.js.map +1 -1
  290. package/build/esm/components/constants.d.ts +5 -0
  291. package/build/esm/components/constants.js +6 -1
  292. package/build/esm/components/constants.js.map +1 -1
  293. package/build/esm/components/types.d.ts +4 -4
  294. package/package.json +1 -1
  295. package/build/cjs/assets/icons/control-menu-button.svg.js +0 -41
  296. package/build/cjs/assets/icons/control-menu-button.svg.js.map +0 -1
  297. package/build/esm/assets/icons/control-menu-button.svg.js +0 -18
  298. package/build/esm/assets/icons/control-menu-button.svg.js.map +0 -1
@@ -2,25 +2,40 @@
2
2
 
3
3
  var React = require('react');
4
4
 
5
- const EMPTY_DEPS = [];
6
5
  const MIN_THUMB_HEIGHT = 24;
7
6
  /**
8
- * Keeps a custom scrollbar thumb and bottom shadow in sync with a native
9
- * scroll layer. The scroll element handles touch/keyboard; wheel events on the
10
- * overlay track are forwarded to it (the track sits above the scroller, so
11
- * they would not scroll otherwise). Wheel, touch, and keyboard on the
12
- * scrollable area itself are unchanged.
7
+ * A fractional container height can make the integer scrollHeight exceed clientHeight
8
+ * by this many pixels. Such a delta is sub-pixel rounding, not meaningfully scrollable
9
+ * content, so it is not reported as overflow.
10
+ */
11
+ const SUBPIXEL_OVERFLOW_PX = 1;
12
+ /**
13
+ * Keeps a custom scrollbar thumb in sync with a native scroll layer. The
14
+ * scroll element handles touch/keyboard; wheel events on the overlay track are
15
+ * forwarded to it (the track sits above the scroller, so they would not scroll
16
+ * otherwise). Wheel, touch, and keyboard on the scrollable area itself are
17
+ * unchanged.
13
18
  *
14
- * @param recalcDeps - extra deps that should trigger thumb/shadow recalculation
15
19
  * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI
16
20
  */
17
- function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
21
+ function useScrollableScrollbarSync() {
18
22
  const scrollRef = React.useRef(null);
19
23
  const trackRef = React.useRef(null);
20
24
  const thumbRef = React.useRef(null);
21
- const [hasContentBelow, setHasContentBelow] = React.useState(false);
22
25
  const [overflows, setOverflows] = React.useState(false);
23
- const [thumb, setThumb] = React.useState({ top: 0, height: 0 });
26
+ const [geometry, setGeometry] = React.useState({
27
+ thumb: { top: 0, height: 0 },
28
+ canScrollUp: false,
29
+ canScrollDown: false,
30
+ });
31
+ const updateGeometry = React.useCallback((next) => {
32
+ setGeometry((previous) => previous.thumb.top === next.thumb.top &&
33
+ previous.thumb.height === next.thumb.height &&
34
+ previous.canScrollUp === next.canScrollUp &&
35
+ previous.canScrollDown === next.canScrollDown
36
+ ? previous
37
+ : next);
38
+ }, []);
24
39
  const rafIdRef = React.useRef(null);
25
40
  const scheduleUpdate = React.useCallback(() => {
26
41
  if (rafIdRef.current !== null) {
@@ -32,39 +47,64 @@ function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
32
47
  if (!el) {
33
48
  return;
34
49
  }
35
- const { scrollTop, scrollHeight, clientHeight } = el;
36
- const isOverflowing = scrollHeight > clientHeight;
37
- // `-1` guards against subpixel rounding at the bottom.
38
- const notAtBottom = scrollTop + clientHeight < scrollHeight - 1;
50
+ const { scrollHeight, clientHeight } = el;
51
+ const isOverflowing = scrollHeight - clientHeight > SUBPIXEL_OVERFLOW_PX;
39
52
  setOverflows(isOverflowing);
40
- setHasContentBelow(isOverflowing && notAtBottom);
41
53
  if (!isOverflowing) {
42
- setThumb({ top: 0, height: 0 });
54
+ updateGeometry({
55
+ thumb: { top: 0, height: 0 },
56
+ canScrollUp: false,
57
+ canScrollDown: false,
58
+ });
43
59
  return;
44
60
  }
45
61
  const ratio = clientHeight / scrollHeight;
46
62
  const rawHeight = clientHeight * ratio;
47
63
  const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);
48
64
  const maxTop = clientHeight - height;
65
+ const { scrollTop } = el;
49
66
  const scrollRatio = scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;
50
67
  const top = maxTop * scrollRatio;
51
- setThumb({ top, height });
68
+ updateGeometry({
69
+ thumb: { top, height },
70
+ canScrollUp: isOverflowing && scrollTop > SUBPIXEL_OVERFLOW_PX,
71
+ canScrollDown: isOverflowing && scrollHeight - clientHeight - scrollTop > SUBPIXEL_OVERFLOW_PX,
72
+ });
52
73
  });
53
- }, []);
74
+ }, [updateGeometry]);
54
75
  React.useEffect(() => {
55
76
  const el = scrollRef.current;
56
77
  if (!el) {
57
78
  return undefined;
58
79
  }
59
80
  scheduleUpdate();
60
- if (typeof ResizeObserver === 'undefined') {
61
- return undefined;
81
+ // `ResizeObserver` is missing in jsdom, so keep it optional: the mutation
82
+ // observer below is set up either way.
83
+ const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleUpdate);
84
+ observer === null || observer === undefined ? undefined : observer.observe(el);
85
+ // Observe the direct content child as well: its content-box changes whenever
86
+ // the rendered content changes (rows, titles, adornments, groups, density).
87
+ const contentEl = el.firstElementChild;
88
+ if (contentEl) {
89
+ observer === null || observer === undefined ? undefined : observer.observe(contentEl);
62
90
  }
63
- const observer = new ResizeObserver(scheduleUpdate);
64
- observer.observe(el);
65
- return () => observer.disconnect();
66
- // eslint-disable-next-line react-hooks/exhaustive-deps
67
- }, [scheduleUpdate, ...recalcDeps]);
91
+ // Content can also change without resizing any observed box: the collapse-mode
92
+ // menu resizes its content wrapper via an inline style (AutoSizer), which
93
+ // changes scrollHeight while every observed box stays the same, leaving the
94
+ // overflow state stale. Re-measure on content mutations too (rAF-throttled
95
+ // by scheduleUpdate).
96
+ const mutationObserver = new MutationObserver(scheduleUpdate);
97
+ mutationObserver.observe(el, {
98
+ childList: true,
99
+ subtree: true,
100
+ characterData: true,
101
+ attributes: true,
102
+ });
103
+ return () => {
104
+ observer === null || observer === undefined ? undefined : observer.disconnect();
105
+ mutationObserver.disconnect();
106
+ };
107
+ }, [scheduleUpdate]);
68
108
  React.useEffect(() => {
69
109
  return () => {
70
110
  if (rafIdRef.current !== null) {
@@ -155,17 +195,12 @@ function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
155
195
  behavior: 'auto',
156
196
  });
157
197
  }, [cancelProgrammaticSmoothScroll]);
158
- return {
159
- scrollRef,
198
+ return Object.assign(Object.assign({ scrollRef,
160
199
  trackRef,
161
200
  thumbRef,
162
- hasContentBelow,
163
- overflows,
164
- thumb,
165
- scheduleUpdate,
201
+ overflows }, geometry), { scheduleUpdate,
166
202
  handleThumbPointerDown,
167
- handleTrackPointerDown,
168
- };
203
+ handleTrackPointerDown });
169
204
  }
170
205
 
171
206
  exports.useScrollableScrollbarSync = useScrollableScrollbarSync;
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollableScrollbarSync.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.ts"],"sourcesContent":["import React, {useCallback, useEffect, useLayoutEffect, useRef, useState} from 'react';\n\nconst EMPTY_DEPS: React.DependencyList = [];\n\nconst MIN_THUMB_HEIGHT = 24;\n\ntype ThumbGeometry = {\n top: number;\n height: number;\n};\n\ntype UseScrollableScrollbarSyncResult = {\n scrollRef: React.RefObject<HTMLDivElement>;\n trackRef: React.RefObject<HTMLDivElement>;\n thumbRef: React.RefObject<HTMLDivElement>;\n hasContentBelow: boolean;\n overflows: boolean;\n thumb: ThumbGeometry;\n scheduleUpdate: () => void;\n handleThumbPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n handleTrackPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\n/**\n * Keeps a custom scrollbar thumb and bottom shadow in sync with a native\n * scroll layer. The scroll element handles touch/keyboard; wheel events on the\n * overlay track are forwarded to it (the track sits above the scroller, so\n * they would not scroll otherwise). Wheel, touch, and keyboard on the\n * scrollable area itself are unchanged.\n *\n * @param recalcDeps - extra deps that should trigger thumb/shadow recalculation\n * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI\n */\nexport function useScrollableScrollbarSync(\n recalcDeps: React.DependencyList = EMPTY_DEPS,\n): UseScrollableScrollbarSyncResult {\n const scrollRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const [hasContentBelow, setHasContentBelow] = useState(false);\n const [overflows, setOverflows] = useState(false);\n const [thumb, setThumb] = useState<ThumbGeometry>({top: 0, height: 0});\n\n const rafIdRef = useRef<number | null>(null);\n const scheduleUpdate = useCallback(() => {\n if (rafIdRef.current !== null) {\n return;\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n\n const el = scrollRef.current;\n\n if (!el) {\n return;\n }\n\n const {scrollTop, scrollHeight, clientHeight} = el;\n const isOverflowing = scrollHeight > clientHeight;\n // `-1` guards against subpixel rounding at the bottom.\n const notAtBottom = scrollTop + clientHeight < scrollHeight - 1;\n\n setOverflows(isOverflowing);\n setHasContentBelow(isOverflowing && notAtBottom);\n\n if (!isOverflowing) {\n setThumb({top: 0, height: 0});\n return;\n }\n\n const ratio = clientHeight / scrollHeight;\n const rawHeight = clientHeight * ratio;\n const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);\n const maxTop = clientHeight - height;\n const scrollRatio =\n scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;\n const top = maxTop * scrollRatio;\n\n setThumb({top, height});\n });\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n\n if (!el) {\n return undefined;\n }\n\n scheduleUpdate();\n\n if (typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const observer = new ResizeObserver(scheduleUpdate);\n observer.observe(el);\n return () => observer.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scheduleUpdate, ...recalcDeps]);\n\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n };\n }, []);\n\n // Wheel events do not reach the native scroll layer when the cursor is over\n // the overlay track — forward them explicitly. `passive: false` is required\n // so `preventDefault` works in all browsers.\n useLayoutEffect(() => {\n if (!overflows) {\n return undefined;\n }\n\n const track = trackRef.current;\n const scrollEl = scrollRef.current;\n\n if (!track || !scrollEl) {\n return undefined;\n }\n\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n scrollEl.scrollTop += e.deltaY;\n };\n\n track.addEventListener('wheel', onWheel, {passive: false});\n return () => track.removeEventListener('wheel', onWheel);\n }, [overflows]);\n\n const cancelProgrammaticSmoothScroll = useCallback((scrollEl: HTMLDivElement) => {\n const top = scrollEl.scrollTop;\n scrollEl.scrollTo({top, behavior: 'auto'});\n }, []);\n\n const handleThumbPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (!scrollEl || !thumbEl || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const startY = event.clientY;\n const startScrollTop = scrollEl.scrollTop;\n const {scrollHeight, clientHeight} = scrollEl;\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const trackHeight = clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const deltaY = moveEvent.clientY - startY;\n const deltaScroll = (deltaY / maxThumbTop) * maxScrollTop;\n scrollEl.scrollTop = startScrollTop + deltaScroll;\n };\n\n const handlePointerUp = () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n const handleTrackPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (\n !scrollEl ||\n !thumbEl ||\n event.button !== 0 ||\n event.target !== event.currentTarget\n ) {\n return;\n }\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const trackRect = event.currentTarget.getBoundingClientRect();\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const clickY = event.clientY - trackRect.top;\n const targetThumbTop = Math.max(\n 0,\n Math.min(clickY - thumbHeight / 2, trackRect.height - thumbHeight),\n );\n const maxThumbTop = trackRect.height - thumbHeight;\n const maxScrollTop = scrollEl.scrollHeight - scrollEl.clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n // `auto` avoids racing with a subsequent thumb drag (smooth scroll would\n // still animate while pointer handlers update `scrollTop`).\n scrollEl.scrollTo({\n top: (targetThumbTop / maxThumbTop) * maxScrollTop,\n behavior: 'auto',\n });\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n return {\n scrollRef,\n trackRef,\n thumbRef,\n hasContentBelow,\n overflows,\n thumb,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n };\n}\n"],"names":["useRef","useState","useCallback","useEffect","useLayoutEffect"],"mappings":"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"}
1
+ {"version":3,"file":"useScrollableScrollbarSync.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.ts"],"sourcesContent":["import React, {useCallback, useEffect, useLayoutEffect, useRef, useState} from 'react';\n\nconst MIN_THUMB_HEIGHT = 24;\n\n/**\n * A fractional container height can make the integer scrollHeight exceed clientHeight\n * by this many pixels. Such a delta is sub-pixel rounding, not meaningfully scrollable\n * content, so it is not reported as overflow.\n */\nconst SUBPIXEL_OVERFLOW_PX = 1;\n\ntype ThumbGeometry = {\n top: number;\n height: number;\n};\n\ntype UseScrollableScrollbarSyncResult = {\n scrollRef: React.RefObject<HTMLDivElement>;\n trackRef: React.RefObject<HTMLDivElement>;\n thumbRef: React.RefObject<HTMLDivElement>;\n overflows: boolean;\n canScrollUp: boolean;\n canScrollDown: boolean;\n thumb: ThumbGeometry;\n scheduleUpdate: () => void;\n handleThumbPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n handleTrackPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\n/**\n * Keeps a custom scrollbar thumb in sync with a native scroll layer. The\n * scroll element handles touch/keyboard; wheel events on the overlay track are\n * forwarded to it (the track sits above the scroller, so they would not scroll\n * otherwise). Wheel, touch, and keyboard on the scrollable area itself are\n * unchanged.\n *\n * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI\n */\nexport function useScrollableScrollbarSync(): UseScrollableScrollbarSyncResult {\n const scrollRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const [overflows, setOverflows] = useState(false);\n const [geometry, setGeometry] = useState({\n thumb: {top: 0, height: 0} as ThumbGeometry,\n canScrollUp: false,\n canScrollDown: false,\n });\n\n const updateGeometry = useCallback((next: typeof geometry) => {\n setGeometry((previous) =>\n previous.thumb.top === next.thumb.top &&\n previous.thumb.height === next.thumb.height &&\n previous.canScrollUp === next.canScrollUp &&\n previous.canScrollDown === next.canScrollDown\n ? previous\n : next,\n );\n }, []);\n\n const rafIdRef = useRef<number | null>(null);\n const scheduleUpdate = useCallback(() => {\n if (rafIdRef.current !== null) {\n return;\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n\n const el = scrollRef.current;\n\n if (!el) {\n return;\n }\n\n const {scrollHeight, clientHeight} = el;\n const isOverflowing = scrollHeight - clientHeight > SUBPIXEL_OVERFLOW_PX;\n\n setOverflows(isOverflowing);\n\n if (!isOverflowing) {\n updateGeometry({\n thumb: {top: 0, height: 0},\n canScrollUp: false,\n canScrollDown: false,\n });\n return;\n }\n\n const ratio = clientHeight / scrollHeight;\n const rawHeight = clientHeight * ratio;\n const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);\n const maxTop = clientHeight - height;\n const {scrollTop} = el;\n const scrollRatio =\n scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;\n const top = maxTop * scrollRatio;\n\n updateGeometry({\n thumb: {top, height},\n canScrollUp: isOverflowing && scrollTop > SUBPIXEL_OVERFLOW_PX,\n canScrollDown:\n isOverflowing && scrollHeight - clientHeight - scrollTop > SUBPIXEL_OVERFLOW_PX,\n });\n });\n }, [updateGeometry]);\n\n useEffect(() => {\n const el = scrollRef.current;\n\n if (!el) {\n return undefined;\n }\n\n scheduleUpdate();\n\n // `ResizeObserver` is missing in jsdom, so keep it optional: the mutation\n // observer below is set up either way.\n const observer =\n typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleUpdate);\n observer?.observe(el);\n // Observe the direct content child as well: its content-box changes whenever\n // the rendered content changes (rows, titles, adornments, groups, density).\n const contentEl = el.firstElementChild;\n if (contentEl) {\n observer?.observe(contentEl);\n }\n\n // Content can also change without resizing any observed box: the collapse-mode\n // menu resizes its content wrapper via an inline style (AutoSizer), which\n // changes scrollHeight while every observed box stays the same, leaving the\n // overflow state stale. Re-measure on content mutations too (rAF-throttled\n // by scheduleUpdate).\n const mutationObserver = new MutationObserver(scheduleUpdate);\n mutationObserver.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n });\n\n return () => {\n observer?.disconnect();\n mutationObserver.disconnect();\n };\n }, [scheduleUpdate]);\n\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n };\n }, []);\n\n // Wheel events do not reach the native scroll layer when the cursor is over\n // the overlay track — forward them explicitly. `passive: false` is required\n // so `preventDefault` works in all browsers.\n useLayoutEffect(() => {\n if (!overflows) {\n return undefined;\n }\n\n const track = trackRef.current;\n const scrollEl = scrollRef.current;\n\n if (!track || !scrollEl) {\n return undefined;\n }\n\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n scrollEl.scrollTop += e.deltaY;\n };\n\n track.addEventListener('wheel', onWheel, {passive: false});\n return () => track.removeEventListener('wheel', onWheel);\n }, [overflows]);\n\n const cancelProgrammaticSmoothScroll = useCallback((scrollEl: HTMLDivElement) => {\n const top = scrollEl.scrollTop;\n scrollEl.scrollTo({top, behavior: 'auto'});\n }, []);\n\n const handleThumbPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (!scrollEl || !thumbEl || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const startY = event.clientY;\n const startScrollTop = scrollEl.scrollTop;\n const {scrollHeight, clientHeight} = scrollEl;\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const trackHeight = clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const deltaY = moveEvent.clientY - startY;\n const deltaScroll = (deltaY / maxThumbTop) * maxScrollTop;\n scrollEl.scrollTop = startScrollTop + deltaScroll;\n };\n\n const handlePointerUp = () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n const handleTrackPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (\n !scrollEl ||\n !thumbEl ||\n event.button !== 0 ||\n event.target !== event.currentTarget\n ) {\n return;\n }\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const trackRect = event.currentTarget.getBoundingClientRect();\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const clickY = event.clientY - trackRect.top;\n const targetThumbTop = Math.max(\n 0,\n Math.min(clickY - thumbHeight / 2, trackRect.height - thumbHeight),\n );\n const maxThumbTop = trackRect.height - thumbHeight;\n const maxScrollTop = scrollEl.scrollHeight - scrollEl.clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n // `auto` avoids racing with a subsequent thumb drag (smooth scroll would\n // still animate while pointer handlers update `scrollTop`).\n scrollEl.scrollTo({\n top: (targetThumbTop / maxThumbTop) * maxScrollTop,\n behavior: 'auto',\n });\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n return {\n scrollRef,\n trackRef,\n thumbRef,\n overflows,\n ...geometry,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n };\n}\n"],"names":["useRef","useState","useCallback","useEffect","useLayoutEffect"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export declare const ITEM_TYPE_REGULAR = "regular";
2
2
  export declare const COLLAPSE_ITEM_ID = "collapse-item-id";
3
+ export declare const COMPOSITE_BAR_ITEM_ID_ATTRIBUTE = "data-gn-composite-bar-item-id";
3
4
  /** Prefix for synthetic CompositeBar row ids for grouped section headers ({@link makeGroupHeaderAsideItem}). */
4
5
  export declare const COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX: "__gn-composite-bar__group-header__";
@@ -2,10 +2,12 @@
2
2
 
3
3
  const ITEM_TYPE_REGULAR = 'regular';
4
4
  const COLLAPSE_ITEM_ID = 'collapse-item-id';
5
+ const COMPOSITE_BAR_ITEM_ID_ATTRIBUTE = 'data-gn-composite-bar-item-id';
5
6
  /** Prefix for synthetic CompositeBar row ids for grouped section headers ({@link makeGroupHeaderAsideItem}). */
6
7
  const COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX = '__gn-composite-bar__group-header__';
7
8
 
8
9
  exports.COLLAPSE_ITEM_ID = COLLAPSE_ITEM_ID;
9
10
  exports.COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX = COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX;
11
+ exports.COMPOSITE_BAR_ITEM_ID_ATTRIBUTE = COMPOSITE_BAR_ITEM_ID_ATTRIBUTE;
10
12
  exports.ITEM_TYPE_REGULAR = ITEM_TYPE_REGULAR;
11
13
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/constants.ts"],"sourcesContent":["export const ITEM_TYPE_REGULAR = 'regular';\nexport const COLLAPSE_ITEM_ID = 'collapse-item-id';\n\n/** Prefix for synthetic CompositeBar row ids for grouped section headers ({@link makeGroupHeaderAsideItem}). */\nexport const COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX = '__gn-composite-bar__group-header__' as const;\n"],"names":[],"mappings":";;AAAO,MAAM,iBAAiB,GAAG;AAC1B,MAAM,gBAAgB,GAAG;AAEhC;AACO,MAAM,oCAAoC,GAAG;;;;;;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/constants.ts"],"sourcesContent":["export const ITEM_TYPE_REGULAR = 'regular';\nexport const COLLAPSE_ITEM_ID = 'collapse-item-id';\nexport const COMPOSITE_BAR_ITEM_ID_ATTRIBUTE = 'data-gn-composite-bar-item-id';\n\n/** Prefix for synthetic CompositeBar row ids for grouped section headers ({@link makeGroupHeaderAsideItem}). */\nexport const COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX = '__gn-composite-bar__group-header__' as const;\n"],"names":[],"mappings":";;AAAO,MAAM,iBAAiB,GAAG;AAC1B,MAAM,gBAAgB,GAAG;AACzB,MAAM,+BAA+B,GAAG;AAE/C;AACO,MAAM,oCAAoC,GAAG;;;;;;;"}
@@ -0,0 +1,24 @@
1
+ import type { AsideHeaderItem } from '../../types';
2
+ type PresentationCurrentOptions = {
3
+ suppressCurrentItemIds?: ReadonlySet<string>;
4
+ popupItems?: AsideHeaderItem[];
5
+ };
6
+ /**
7
+ * Resolves the semantic ids represented by a visually current row. Popup parents aggregate the
8
+ * ids recursively, while synthetic group and More rows contribute only their current descendants.
9
+ *
10
+ * @param item - The row item whose presentation state is being resolved.
11
+ * @param options - Suppression and optional popup children resolved by the caller.
12
+ * @returns Sorted unique ids of unsuppressed current items represented by the row.
13
+ */
14
+ export declare function getItemPresentationCurrentIds(item: AsideHeaderItem, options?: PresentationCurrentOptions): string[];
15
+ /**
16
+ * Resolves the visual current state without changing the public item. Popup parents aggregate the
17
+ * state recursively, so group and More rows follow the same suppression rules as leaf rows.
18
+ *
19
+ * @param item - The row item whose presentation state is being resolved.
20
+ * @param options - Suppression and optional popup children resolved by the caller.
21
+ * @returns Whether the row or one of its popup descendants should look current.
22
+ */
23
+ export declare function isItemPresentationCurrent(item: AsideHeaderItem, options?: PresentationCurrentOptions): boolean;
24
+ export {};
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ function collectItemPresentationCurrentIds(item, suppressCurrentItemIds, popupItems, currentIds) {
4
+ if (item.current && !(suppressCurrentItemIds === null || suppressCurrentItemIds === undefined ? undefined : suppressCurrentItemIds.has(item.id))) {
5
+ currentIds.add(item.id);
6
+ }
7
+ popupItems === null || popupItems === undefined ? undefined : popupItems.forEach((popupItem) => {
8
+ collectItemPresentationCurrentIds(popupItem, suppressCurrentItemIds, popupItem.compositeBarMenuPopupItems, currentIds);
9
+ });
10
+ }
11
+ /**
12
+ * Resolves the semantic ids represented by a visually current row. Popup parents aggregate the
13
+ * ids recursively, while synthetic group and More rows contribute only their current descendants.
14
+ *
15
+ * @param item - The row item whose presentation state is being resolved.
16
+ * @param options - Suppression and optional popup children resolved by the caller.
17
+ * @returns Sorted unique ids of unsuppressed current items represented by the row.
18
+ */
19
+ function getItemPresentationCurrentIds(item, options = {}) {
20
+ const { suppressCurrentItemIds, popupItems = item.compositeBarMenuPopupItems } = options;
21
+ const currentIds = new Set();
22
+ collectItemPresentationCurrentIds(item, suppressCurrentItemIds, popupItems, currentIds);
23
+ return Array.from(currentIds).sort();
24
+ }
25
+ /**
26
+ * Resolves the visual current state without changing the public item. Popup parents aggregate the
27
+ * state recursively, so group and More rows follow the same suppression rules as leaf rows.
28
+ *
29
+ * @param item - The row item whose presentation state is being resolved.
30
+ * @param options - Suppression and optional popup children resolved by the caller.
31
+ * @returns Whether the row or one of its popup descendants should look current.
32
+ */
33
+ function isItemPresentationCurrent(item, options = {}) {
34
+ return getItemPresentationCurrentIds(item, options).length > 0;
35
+ }
36
+
37
+ exports.getItemPresentationCurrentIds = getItemPresentationCurrentIds;
38
+ exports.isItemPresentationCurrent = isItemPresentationCurrent;
39
+ //# sourceMappingURL=presentationCurrent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentationCurrent.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/presentationCurrent.ts"],"sourcesContent":["import type {AsideHeaderItem} from '../../types';\n\ntype PresentationCurrentOptions = {\n suppressCurrentItemIds?: ReadonlySet<string>;\n popupItems?: AsideHeaderItem[];\n};\n\nfunction collectItemPresentationCurrentIds(\n item: AsideHeaderItem,\n suppressCurrentItemIds: ReadonlySet<string> | undefined,\n popupItems: AsideHeaderItem[] | undefined,\n currentIds: Set<string>,\n) {\n if (item.current && !suppressCurrentItemIds?.has(item.id)) {\n currentIds.add(item.id);\n }\n\n popupItems?.forEach((popupItem) => {\n collectItemPresentationCurrentIds(\n popupItem,\n suppressCurrentItemIds,\n popupItem.compositeBarMenuPopupItems,\n currentIds,\n );\n });\n}\n\n/**\n * Resolves the semantic ids represented by a visually current row. Popup parents aggregate the\n * ids recursively, while synthetic group and More rows contribute only their current descendants.\n *\n * @param item - The row item whose presentation state is being resolved.\n * @param options - Suppression and optional popup children resolved by the caller.\n * @returns Sorted unique ids of unsuppressed current items represented by the row.\n */\nexport function getItemPresentationCurrentIds(\n item: AsideHeaderItem,\n options: PresentationCurrentOptions = {},\n): string[] {\n const {suppressCurrentItemIds, popupItems = item.compositeBarMenuPopupItems} = options;\n const currentIds = new Set<string>();\n\n collectItemPresentationCurrentIds(item, suppressCurrentItemIds, popupItems, currentIds);\n\n return Array.from(currentIds).sort();\n}\n\n/**\n * Resolves the visual current state without changing the public item. Popup parents aggregate the\n * state recursively, so group and More rows follow the same suppression rules as leaf rows.\n *\n * @param item - The row item whose presentation state is being resolved.\n * @param options - Suppression and optional popup children resolved by the caller.\n * @returns Whether the row or one of its popup descendants should look current.\n */\nexport function isItemPresentationCurrent(\n item: AsideHeaderItem,\n options: PresentationCurrentOptions = {},\n): boolean {\n return getItemPresentationCurrentIds(item, options).length > 0;\n}\n"],"names":[],"mappings":";;AAOA,SAAS,iCAAiC,CACtC,IAAqB,EACrB,sBAAuD,EACvD,UAAyC,EACzC,UAAuB,EAAA;IAEvB,IAAI,IAAI,CAAC,OAAO,IAAI,EAAC,sBAAsB,aAAtB,sBAAsB,KAAA,SAAA,GAAA,SAAA,GAAtB,sBAAsB,CAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,EAAE;AACvD,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;IAG3B,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,SAAA,GAAA,SAAA,GAAV,UAAU,CAAE,OAAO,CAAC,CAAC,SAAS,KAAI;QAC9B,iCAAiC,CAC7B,SAAS,EACT,sBAAsB,EACtB,SAAS,CAAC,0BAA0B,EACpC,UAAU,CACb;AACL,KAAC,CAAC;AACN;AAEA;;;;;;;AAOG;SACa,6BAA6B,CACzC,IAAqB,EACrB,UAAsC,EAAE,EAAA;IAExC,MAAM,EAAC,sBAAsB,EAAE,UAAU,GAAG,IAAI,CAAC,0BAA0B,EAAC,GAAG,OAAO;AACtF,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU;IAEpC,iCAAiC,CAAC,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU,CAAC;IAEvF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;AACxC;AAEA;;;;;;;AAOG;SACa,yBAAyB,CACrC,IAAqB,EACrB,UAAsC,EAAE,EAAA;IAExC,OAAO,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;AAClE;;;;;"}
@@ -1,12 +1,16 @@
1
1
  import { MenuGroup } from '../../../types';
2
+ import { AsideHeaderMenuDensity } from '../../density';
2
3
  import { AsideHeaderItem } from '../../types';
3
4
  import type { CompositeBarRow } from './grouping';
4
- export declare function getItemHeight(compositeItem: AsideHeaderItem): 40 | 50 | 15;
5
+ type CompositeBarItemLayoutOptions = {
6
+ /** Collapsed sidebar (icon-only rows): multi-line titles use the regular row height. */
7
+ sidebarCompact?: boolean;
8
+ };
9
+ export declare function getItemHeight(compositeItem: AsideHeaderItem, menuDensity?: AsideHeaderMenuDensity, layout?: CompositeBarItemLayoutOptions): number;
5
10
  export declare function getPopupItemHeight(compositeItem: AsideHeaderItem): 32 | 50 | 15;
6
- export declare function getItemsHeight<T extends AsideHeaderItem>(items: T[]): number;
11
+ export declare function getItemsHeight<T extends AsideHeaderItem>(items: T[], menuDensity?: AsideHeaderMenuDensity, layout?: CompositeBarItemLayoutOptions): number;
7
12
  export declare function getPopupItemsHeight<T extends AsideHeaderItem>(items: T[]): number;
8
- export declare function getSelectedItemIndex(compositeItems: AsideHeaderItem[]): number | undefined;
9
- export declare function getMoreButtonItem(menuMoreTitle?: string): AsideHeaderItem;
13
+ export declare function getMoreButtonItem(menuMoreTitle?: string, menuDensity?: AsideHeaderMenuDensity): AsideHeaderItem;
10
14
  export declare function makeGroupHeaderAsideItem(group: MenuGroup): AsideHeaderItem;
11
15
  /**
12
16
  * Moves rows whose item has `afterMoreButton` to the end (parity with scroll vs collapse DOM order).
@@ -15,9 +19,10 @@ export declare function makeGroupHeaderAsideItem(group: MenuGroup): AsideHeaderI
15
19
  * @returns Rows with `afterMoreButton` item rows last, or the same array reference when none.
16
20
  */
17
21
  export declare function getReorderedCompositeBarRows(rows: CompositeBarRow[]): CompositeBarRow[];
18
- export declare function getCompositeBarRowsMinHeight(rows: CompositeBarRow[]): number;
19
- export declare function getSelectedCompositeBarRowIndex(rows: CompositeBarRow[]): number | undefined;
20
- export declare function getAutosizeCompositeBarRows(rows: CompositeBarRow[], height: number, collapseItem: AsideHeaderItem): {
22
+ export declare function getCompositeBarRowsMinHeight(rows: CompositeBarRow[], menuDensity?: AsideHeaderMenuDensity, layout?: CompositeBarItemLayoutOptions): number;
23
+ export declare function getSelectedCompositeBarRowIndex(rows: CompositeBarRow[], suppressCurrentItemIds?: ReadonlySet<string>): number | undefined;
24
+ export declare function getAutosizeCompositeBarRows(rows: CompositeBarRow[], height: number, collapseItem: AsideHeaderItem, menuDensity?: AsideHeaderMenuDensity, layout?: CompositeBarItemLayoutOptions): {
21
25
  listRows: CompositeBarRow[];
22
26
  collapseItems: AsideHeaderItem[];
23
27
  };
28
+ export {};
@@ -2,16 +2,24 @@
2
2
 
3
3
  var icons = require('@gravity-ui/icons');
4
4
  var constants$1 = require('../../../constants.js');
5
+ var density = require('../../density.js');
5
6
  var constants = require('./constants.js');
7
+ var presentationCurrent = require('./presentationCurrent.js');
6
8
 
7
- function getItemHeight(compositeItem) {
9
+ function getRegularItemHeight(compositeItem, menuDensity, layout) {
10
+ const config = density.getAsideHeaderDensityConfig(menuDensity);
11
+ return compositeItem.titleLines === 2 && !(layout === null || layout === undefined ? undefined : layout.sidebarCompact)
12
+ ? config.twoLineItemHeight
13
+ : config.itemHeight;
14
+ }
15
+ function getItemHeight(compositeItem, menuDensity = 'default', layout) {
8
16
  switch (compositeItem.type) {
9
17
  case 'action':
10
- return 50;
18
+ return density.getAsideHeaderDensityConfig(menuDensity).actionItemHeight;
11
19
  case 'divider':
12
20
  return 15;
13
21
  default:
14
- return constants$1.ITEM_HEIGHT;
22
+ return getRegularItemHeight(compositeItem, menuDensity, layout);
15
23
  }
16
24
  }
17
25
  function getPopupItemHeight(compositeItem) {
@@ -24,15 +32,8 @@ function getPopupItemHeight(compositeItem) {
24
32
  return constants$1.POPUP_REGULAR_ITEM_HEIGHT;
25
33
  }
26
34
  }
27
- function getItemsHeight(items) {
28
- return items.reduce((sum, item) => sum + getItemHeight(item), 0);
29
- }
30
- function getPopupItemsHeight(items) {
31
- return items.reduce((sum, item) => sum + getPopupItemHeight(item), 0);
32
- }
33
- function getSelectedItemIndex(compositeItems) {
34
- const index = compositeItems.findIndex(({ current }) => Boolean(current));
35
- return index === -1 ? undefined : index;
35
+ function getItemsHeight(items, menuDensity = 'default', layout) {
36
+ return items.reduce((sum, item) => sum + getItemHeight(item, menuDensity, layout), 0);
36
37
  }
37
38
  function getPinnedItems(compositeItems) {
38
39
  const pinnedItems = [];
@@ -48,19 +49,21 @@ function getPinnedItems(compositeItems) {
48
49
  }
49
50
  return pinnedItems;
50
51
  }
51
- function getItemsMinHeight(compositeItems) {
52
+ function getItemsMinHeight(compositeItems, menuDensity = 'default', layout) {
52
53
  const pinnedItems = getPinnedItems(compositeItems);
53
54
  const afterMoreButtonItems = compositeItems.filter(({ afterMoreButton }) => afterMoreButton);
54
- return (getItemsHeight(pinnedItems) +
55
- getItemsHeight(afterMoreButtonItems) +
56
- (pinnedItems.length === compositeItems.length ? 0 : constants$1.ITEM_HEIGHT));
55
+ const { itemHeight } = density.getAsideHeaderDensityConfig(menuDensity);
56
+ return (getItemsHeight(pinnedItems, menuDensity, layout) +
57
+ getItemsHeight(afterMoreButtonItems, menuDensity, layout) +
58
+ (pinnedItems.length === compositeItems.length ? 0 : itemHeight));
57
59
  }
58
- function getMoreButtonItem(menuMoreTitle) {
60
+ function getMoreButtonItem(menuMoreTitle, menuDensity = 'default') {
61
+ const { iconSize } = density.getAsideHeaderDensityConfig(menuDensity);
59
62
  return {
60
63
  id: constants.COLLAPSE_ITEM_ID,
61
64
  title: menuMoreTitle,
62
65
  icon: icons.Ellipsis,
63
- iconSize: 18,
66
+ iconSize,
64
67
  };
65
68
  }
66
69
  function makeGroupHeaderAsideItem(group) {
@@ -69,8 +72,10 @@ function makeGroupHeaderAsideItem(group) {
69
72
  title: group.title,
70
73
  icon: group.icon,
71
74
  iconSize: group.iconSize,
72
- // Do not set `current` from children: only nested items should show selection;
73
- // otherwise the group header and root List row highlight the whole group block.
75
+ // `current` comes only from the group itself (its own page), never from
76
+ // children: nested items show their own selection, and the root List row
77
+ // must not highlight the whole group block.
78
+ current: group.current,
74
79
  };
75
80
  }
76
81
  function makeOverflowGroupAsideItem(group, children) {
@@ -78,15 +83,19 @@ function makeOverflowGroupAsideItem(group, children) {
78
83
  id: `__gn-composite-bar__group-overflow__${group.id}`,
79
84
  title: group.title,
80
85
  icon: group.icon,
86
+ iconSize: group.iconSize,
87
+ current: group.current,
88
+ href: group.href,
89
+ onItemClick: group.onItemClick,
81
90
  compositeBarMenuPopupItems: children,
82
91
  compositeBarMenuPopupTitle: group.popupTitle,
83
92
  };
84
93
  }
85
- function getCompositeBarRowLayoutHeight(row) {
94
+ function getCompositeBarRowLayoutHeight(row, menuDensity = 'default', layout) {
86
95
  if (row.kind === 'item') {
87
- return getItemHeight(row.item);
96
+ return getItemHeight(row.item, menuDensity, layout);
88
97
  }
89
- return getItemHeight(makeGroupHeaderAsideItem(row.group));
98
+ return getItemHeight(makeGroupHeaderAsideItem(row.group), menuDensity, layout);
90
99
  }
91
100
  /**
92
101
  * Moves rows whose item has `afterMoreButton` to the end (parity with scroll vs collapse DOM order).
@@ -114,29 +123,29 @@ function compositeBarRowsToFlatForMinHeight(rows) {
114
123
  }
115
124
  return out;
116
125
  }
117
- function getCompositeBarRowsMinHeight(rows) {
118
- return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows));
126
+ function getCompositeBarRowsMinHeight(rows, menuDensity = 'default', layout) {
127
+ return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows), menuDensity, layout);
119
128
  }
120
- function getSelectedCompositeBarRowIndex(rows) {
129
+ function getSelectedCompositeBarRowIndex(rows, suppressCurrentItemIds) {
121
130
  const index = rows.findIndex((row) => {
122
131
  if (row.kind === 'item') {
123
- return Boolean(row.item.current);
132
+ return presentationCurrent.isItemPresentationCurrent(row.item, { suppressCurrentItemIds });
124
133
  }
125
134
  // Group rows embed their own List; selection is on nested items, not this root row.
126
135
  return false;
127
136
  });
128
137
  return index === -1 ? undefined : index;
129
138
  }
130
- function getAutosizeCompositeBarRows(rows, height, collapseItem) {
139
+ function getAutosizeCompositeBarRows(rows, height, collapseItem, menuDensity = 'default', layout) {
131
140
  const ordered = getReorderedCompositeBarRows(rows);
132
141
  const afterMoreRows = ordered.filter((r) => r.kind === 'item' && r.item.afterMoreButton);
133
142
  const regularRows = ordered.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));
134
143
  const listRows = [...regularRows, ...afterMoreRows];
135
- const allRowsHeight = listRows.reduce((sum, row) => sum + getCompositeBarRowLayoutHeight(row), 0);
144
+ const allRowsHeight = listRows.reduce((sum, row) => sum + getCompositeBarRowLayoutHeight(row, menuDensity, layout), 0);
136
145
  if (allRowsHeight <= height) {
137
146
  return { listRows, collapseItems: [] };
138
147
  }
139
- const collapseItemHeight = getItemHeight(collapseItem);
148
+ const collapseItemHeight = getItemHeight(collapseItem, menuDensity, layout);
140
149
  listRows.splice(regularRows.length, 0, { kind: 'item', item: collapseItem });
141
150
  const collapseItems = [];
142
151
  let listHeight = allRowsHeight + collapseItemHeight;
@@ -159,18 +168,18 @@ function getAutosizeCompositeBarRows(rows, height, collapseItem) {
159
168
  if (index + 1 < listRows.length &&
160
169
  (nextRow === null || nextRow === undefined ? undefined : nextRow.kind) === 'item' &&
161
170
  nextRow.item.type === 'divider') {
162
- listHeight -= getItemHeight(compositeItem);
171
+ listHeight -= getItemHeight(compositeItem, menuDensity, layout);
163
172
  listRows.splice(index, 1);
164
173
  }
165
174
  continue;
166
175
  }
167
- listHeight -= getItemHeight(compositeItem);
176
+ listHeight -= getItemHeight(compositeItem, menuDensity, layout);
168
177
  collapseItems.unshift(...listRows
169
178
  .splice(index, 1)
170
179
  .map((r) => r.item));
171
180
  }
172
181
  else {
173
- listHeight -= getCompositeBarRowLayoutHeight(row);
182
+ listHeight -= getCompositeBarRowLayoutHeight(row, menuDensity, layout);
174
183
  const [removed] = listRows.splice(index, 1);
175
184
  if ((removed === null || removed === undefined ? undefined : removed.kind) === 'group') {
176
185
  collapseItems.unshift(makeOverflowGroupAsideItem(removed.group, removed.items));
@@ -193,9 +202,7 @@ exports.getItemHeight = getItemHeight;
193
202
  exports.getItemsHeight = getItemsHeight;
194
203
  exports.getMoreButtonItem = getMoreButtonItem;
195
204
  exports.getPopupItemHeight = getPopupItemHeight;
196
- exports.getPopupItemsHeight = getPopupItemsHeight;
197
205
  exports.getReorderedCompositeBarRows = getReorderedCompositeBarRows;
198
206
  exports.getSelectedCompositeBarRowIndex = getSelectedCompositeBarRowIndex;
199
- exports.getSelectedItemIndex = getSelectedItemIndex;
200
207
  exports.makeGroupHeaderAsideItem = makeGroupHeaderAsideItem;
201
208
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/utils.ts"],"sourcesContent":["import {Ellipsis} from '@gravity-ui/icons';\n\nimport {ITEM_HEIGHT, POPUP_REGULAR_ITEM_HEIGHT} from '../../../constants';\nimport {MenuGroup} from '../../../types';\nimport {AsideHeaderItem} from '../../types';\n\nimport {COLLAPSE_ITEM_ID, COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX} from './constants';\nimport type {CompositeBarRow} from './grouping';\n\nexport function getItemHeight(compositeItem: AsideHeaderItem) {\n switch (compositeItem.type) {\n case 'action':\n return 50;\n case 'divider':\n return 15;\n\n default:\n return ITEM_HEIGHT;\n }\n}\n\nexport function getPopupItemHeight(compositeItem: AsideHeaderItem) {\n switch (compositeItem.type) {\n case 'action':\n return 50;\n case 'divider':\n return 15;\n\n default:\n return POPUP_REGULAR_ITEM_HEIGHT;\n }\n}\n\nexport function getItemsHeight<T extends AsideHeaderItem>(items: T[]) {\n return items.reduce((sum, item) => sum + getItemHeight(item), 0);\n}\n\nexport function getPopupItemsHeight<T extends AsideHeaderItem>(items: T[]) {\n return items.reduce((sum, item) => sum + getPopupItemHeight(item), 0);\n}\n\nexport function getSelectedItemIndex(compositeItems: AsideHeaderItem[]) {\n const index = compositeItems.findIndex(({current}) => Boolean(current));\n return index === -1 ? undefined : index;\n}\n\nfunction getPinnedItems(compositeItems: AsideHeaderItem[]) {\n const pinnedItems: AsideHeaderItem[] = [];\n for (const compositeItem of compositeItems) {\n if (compositeItem.pinned) {\n pinnedItems.push(compositeItem);\n } else if (compositeItem.type === 'divider') {\n if (pinnedItems.length > 0 && pinnedItems[pinnedItems.length - 1].type !== 'divider') {\n pinnedItems.push(compositeItem);\n }\n }\n }\n return pinnedItems;\n}\n\nfunction getItemsMinHeight(compositeItems: AsideHeaderItem[]) {\n const pinnedItems = getPinnedItems(compositeItems);\n const afterMoreButtonItems = compositeItems.filter(({afterMoreButton}) => afterMoreButton);\n\n return (\n getItemsHeight(pinnedItems) +\n getItemsHeight(afterMoreButtonItems) +\n (pinnedItems.length === compositeItems.length ? 0 : ITEM_HEIGHT)\n );\n}\n\nexport function getMoreButtonItem(menuMoreTitle?: string): AsideHeaderItem {\n return {\n id: COLLAPSE_ITEM_ID,\n title: menuMoreTitle,\n icon: Ellipsis,\n iconSize: 18,\n };\n}\n\nexport function makeGroupHeaderAsideItem(group: MenuGroup): AsideHeaderItem {\n return {\n id: `${COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX}${group.id}`,\n title: group.title,\n icon: group.icon,\n iconSize: group.iconSize,\n // Do not set `current` from children: only nested items should show selection;\n // otherwise the group header and root List row highlight the whole group block.\n };\n}\n\nfunction makeOverflowGroupAsideItem(\n group: MenuGroup,\n children: AsideHeaderItem[],\n): AsideHeaderItem {\n return {\n id: `__gn-composite-bar__group-overflow__${group.id}`,\n title: group.title,\n icon: group.icon,\n compositeBarMenuPopupItems: children,\n compositeBarMenuPopupTitle: group.popupTitle,\n };\n}\n\nfunction getCompositeBarRowLayoutHeight(row: CompositeBarRow): number {\n if (row.kind === 'item') {\n return getItemHeight(row.item);\n }\n return getItemHeight(makeGroupHeaderAsideItem(row.group));\n}\n\n/**\n * Moves rows whose item has `afterMoreButton` to the end (parity with scroll vs collapse DOM order).\n *\n * @param rows Composite bar rows before ordering.\n * @returns Rows with `afterMoreButton` item rows last, or the same array reference when none.\n */\nexport function getReorderedCompositeBarRows(rows: CompositeBarRow[]): CompositeBarRow[] {\n const afterMoreRows = rows.filter((r) => r.kind === 'item' && r.item.afterMoreButton);\n\n if (afterMoreRows.length === 0) {\n return rows;\n }\n\n const regularRows = rows.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));\n\n return [...regularRows, ...afterMoreRows];\n}\n\nfunction compositeBarRowsToFlatForMinHeight(rows: CompositeBarRow[]): AsideHeaderItem[] {\n const out: AsideHeaderItem[] = [];\n for (const row of rows) {\n if (row.kind === 'item') {\n out.push(row.item);\n } else {\n out.push(makeGroupHeaderAsideItem(row.group));\n }\n }\n return out;\n}\n\nexport function getCompositeBarRowsMinHeight(rows: CompositeBarRow[]): number {\n return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows));\n}\n\nexport function getSelectedCompositeBarRowIndex(rows: CompositeBarRow[]): number | undefined {\n const index = rows.findIndex((row) => {\n if (row.kind === 'item') {\n return Boolean(row.item.current);\n }\n // Group rows embed their own List; selection is on nested items, not this root row.\n return false;\n });\n return index === -1 ? undefined : index;\n}\n\nexport function getAutosizeCompositeBarRows(\n rows: CompositeBarRow[],\n height: number,\n collapseItem: AsideHeaderItem,\n): {\n listRows: CompositeBarRow[];\n collapseItems: AsideHeaderItem[];\n} {\n const ordered = getReorderedCompositeBarRows(rows);\n const afterMoreRows = ordered.filter((r) => r.kind === 'item' && r.item.afterMoreButton);\n const regularRows = ordered.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));\n const listRows: CompositeBarRow[] = [...regularRows, ...afterMoreRows];\n\n const allRowsHeight = listRows.reduce(\n (sum, row) => sum + getCompositeBarRowLayoutHeight(row),\n 0,\n );\n if (allRowsHeight <= height) {\n return {listRows, collapseItems: []};\n }\n\n const collapseItemHeight = getItemHeight(collapseItem);\n\n listRows.splice(regularRows.length, 0, {kind: 'item', item: collapseItem});\n const collapseItems: AsideHeaderItem[] = [];\n\n let listHeight = allRowsHeight + collapseItemHeight;\n let index = listRows.length;\n while (listHeight > height) {\n if (index === 0) {\n break;\n }\n index--;\n\n const row = listRows[index];\n if (row.kind === 'item') {\n const compositeItem = row.item;\n if (\n compositeItem.pinned ||\n compositeItem.id === COLLAPSE_ITEM_ID ||\n compositeItem.afterMoreButton\n ) {\n continue;\n }\n if (compositeItem.type === 'divider') {\n const nextRow = listRows[index + 1];\n if (\n index + 1 < listRows.length &&\n nextRow?.kind === 'item' &&\n nextRow.item.type === 'divider'\n ) {\n listHeight -= getItemHeight(compositeItem);\n listRows.splice(index, 1);\n }\n continue;\n }\n listHeight -= getItemHeight(compositeItem);\n collapseItems.unshift(\n ...listRows\n .splice(index, 1)\n .map((r) => (r as Extract<CompositeBarRow, {kind: 'item'}>).item),\n );\n } else {\n listHeight -= getCompositeBarRowLayoutHeight(row);\n const [removed] = listRows.splice(index, 1);\n if (removed?.kind === 'group') {\n collapseItems.unshift(makeOverflowGroupAsideItem(removed.group, removed.items));\n }\n }\n }\n const at = listRows[index];\n const prev = listRows[index - 1];\n if (\n at?.kind === 'item' &&\n at.item.type === 'divider' &&\n (index === 0 || (prev?.kind === 'item' && prev.item.type === 'divider'))\n ) {\n listRows.splice(index, 1);\n }\n\n return {listRows, collapseItems};\n}\n"],"names":["ITEM_HEIGHT","POPUP_REGULAR_ITEM_HEIGHT","COLLAPSE_ITEM_ID","Ellipsis","COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX"],"mappings":";;;;;;AASM,SAAU,aAAa,CAAC,aAA8B,EAAA;AACxD,IAAA,QAAQ,aAAa,CAAC,IAAI;AACtB,QAAA,KAAK,QAAQ;AACT,YAAA,OAAO,EAAE;AACb,QAAA,KAAK,SAAS;AACV,YAAA,OAAO,EAAE;AAEb,QAAA;AACI,YAAA,OAAOA,uBAAW;;AAE9B;AAEM,SAAU,kBAAkB,CAAC,aAA8B,EAAA;AAC7D,IAAA,QAAQ,aAAa,CAAC,IAAI;AACtB,QAAA,KAAK,QAAQ;AACT,YAAA,OAAO,EAAE;AACb,QAAA,KAAK,SAAS;AACV,YAAA,OAAO,EAAE;AAEb,QAAA;AACI,YAAA,OAAOC,qCAAyB;;AAE5C;AAEM,SAAU,cAAc,CAA4B,KAAU,EAAA;IAChE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpE;AAEM,SAAU,mBAAmB,CAA4B,KAAU,EAAA;IACrE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzE;AAEM,SAAU,oBAAoB,CAAC,cAAiC,EAAA;AAClE,IAAA,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,EAAC,OAAO,EAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AACvE,IAAA,OAAO,KAAK,KAAK,EAAE,GAAG,SAAS,GAAG,KAAK;AAC3C;AAEA,SAAS,cAAc,CAAC,cAAiC,EAAA;IACrD,MAAM,WAAW,GAAsB,EAAE;AACzC,IAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AACxC,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE;AACtB,YAAA,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;;AAC5B,aAAA,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;AACzC,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE;AAClF,gBAAA,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;;;;AAI3C,IAAA,OAAO,WAAW;AACtB;AAEA,SAAS,iBAAiB,CAAC,cAAiC,EAAA;AACxD,IAAA,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC;AAClD,IAAA,MAAM,oBAAoB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,EAAC,eAAe,EAAC,KAAK,eAAe,CAAC;AAE1F,IAAA,QACI,cAAc,CAAC,WAAW,CAAC;QAC3B,cAAc,CAAC,oBAAoB,CAAC;AACpC,SAAC,WAAW,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,GAAGD,uBAAW,CAAC;AAExE;AAEM,SAAU,iBAAiB,CAAC,aAAsB,EAAA;IACpD,OAAO;AACH,QAAA,EAAE,EAAEE,0BAAgB;AACpB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,IAAI,EAAEC,cAAQ;AACd,QAAA,QAAQ,EAAE,EAAE;KACf;AACL;AAEM,SAAU,wBAAwB,CAAC,KAAgB,EAAA;IACrD,OAAO;AACH,QAAA,EAAE,EAAE,CAAG,EAAAC,8CAAoC,GAAG,KAAK,CAAC,EAAE,CAAE,CAAA;QACxD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;;;KAG3B;AACL;AAEA,SAAS,0BAA0B,CAC/B,KAAgB,EAChB,QAA2B,EAAA;IAE3B,OAAO;AACH,QAAA,EAAE,EAAE,CAAA,oCAAA,EAAuC,KAAK,CAAC,EAAE,CAAE,CAAA;QACrD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,0BAA0B,EAAE,QAAQ;QACpC,0BAA0B,EAAE,KAAK,CAAC,UAAU;KAC/C;AACL;AAEA,SAAS,8BAA8B,CAAC,GAAoB,EAAA;AACxD,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACrB,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;;IAElC,OAAO,aAAa,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7D;AAEA;;;;;AAKG;AACG,SAAU,4BAA4B,CAAC,IAAuB,EAAA;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;AAErF,IAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,QAAA,OAAO,IAAI;;IAGf,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAEtF,IAAA,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC;AAC7C;AAEA,SAAS,kCAAkC,CAAC,IAAuB,EAAA;IAC/D,MAAM,GAAG,GAAsB,EAAE;AACjC,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACpB,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACrB,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;aACf;YACH,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;;AAGrD,IAAA,OAAO,GAAG;AACd;AAEM,SAAU,4BAA4B,CAAC,IAAuB,EAAA;AAChE,IAAA,OAAO,iBAAiB,CAAC,kCAAkC,CAAC,IAAI,CAAC,CAAC;AACtE;AAEM,SAAU,+BAA+B,CAAC,IAAuB,EAAA;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AACjC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;YACrB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;;;AAGpC,QAAA,OAAO,KAAK;AAChB,KAAC,CAAC;AACF,IAAA,OAAO,KAAK,KAAK,EAAE,GAAG,SAAS,GAAG,KAAK;AAC3C;SAEgB,2BAA2B,CACvC,IAAuB,EACvB,MAAc,EACd,YAA6B,EAAA;AAK7B,IAAA,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IACxF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAsB,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC;IAEtE,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,8BAA8B,CAAC,GAAG,CAAC,EACvD,CAAC,CACJ;AACD,IAAA,IAAI,aAAa,IAAI,MAAM,EAAE;AACzB,QAAA,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAC;;AAGxC,IAAA,MAAM,kBAAkB,GAAG,aAAa,CAAC,YAAY,CAAC;AAEtD,IAAA,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC;IAC1E,MAAM,aAAa,GAAsB,EAAE;AAE3C,IAAA,IAAI,UAAU,GAAG,aAAa,GAAG,kBAAkB;AACnD,IAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;AAC3B,IAAA,OAAO,UAAU,GAAG,MAAM,EAAE;AACxB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACb;;AAEJ,QAAA,KAAK,EAAE;AAEP,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACrB,YAAA,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI;YAC9B,IACI,aAAa,CAAC,MAAM;gBACpB,aAAa,CAAC,EAAE,KAAKF,0BAAgB;gBACrC,aAAa,CAAC,eAAe,EAC/B;gBACE;;AAEJ,YAAA,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;gBAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;AACnC,gBAAA,IACI,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM;oBAC3B,CAAA,OAAO,aAAP,OAAO,KAAA,SAAA,GAAA,SAAA,GAAP,OAAO,CAAE,IAAI,MAAK,MAAM;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EACjC;AACE,oBAAA,UAAU,IAAI,aAAa,CAAC,aAAa,CAAC;AAC1C,oBAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;gBAE7B;;AAEJ,YAAA,UAAU,IAAI,aAAa,CAAC,aAAa,CAAC;AAC1C,YAAA,aAAa,CAAC,OAAO,CACjB,GAAG;AACE,iBAAA,MAAM,CAAC,KAAK,EAAE,CAAC;iBACf,GAAG,CAAC,CAAC,CAAC,KAAM,CAA8C,CAAC,IAAI,CAAC,CACxE;;aACE;AACH,YAAA,UAAU,IAAI,8BAA8B,CAAC,GAAG,CAAC;AACjD,YAAA,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,SAAA,GAAA,SAAA,GAAP,OAAO,CAAE,IAAI,MAAK,OAAO,EAAE;AAC3B,gBAAA,aAAa,CAAC,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;;;;AAI3F,IAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;IAChC,IACI,CAAA,EAAE,KAAF,IAAA,IAAA,EAAE,6BAAF,EAAE,CAAE,IAAI,MAAK,MAAM;AACnB,QAAA,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;SACzB,KAAK,KAAK,CAAC,KAAK,CAAA,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,SAAA,GAAA,SAAA,GAAA,IAAI,CAAE,IAAI,MAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,EAC1E;AACE,QAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;AAG7B,IAAA,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC;AACpC;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/utils.ts"],"sourcesContent":["import {Ellipsis} from '@gravity-ui/icons';\n\nimport {POPUP_REGULAR_ITEM_HEIGHT} from '../../../constants';\nimport {MenuGroup} from '../../../types';\nimport {AsideHeaderMenuDensity, getAsideHeaderDensityConfig} from '../../density';\nimport {AsideHeaderItem} from '../../types';\n\nimport {COLLAPSE_ITEM_ID, COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX} from './constants';\nimport type {CompositeBarRow} from './grouping';\nimport {isItemPresentationCurrent} from './presentationCurrent';\n\ntype CompositeBarItemLayoutOptions = {\n /** Collapsed sidebar (icon-only rows): multi-line titles use the regular row height. */\n sidebarCompact?: boolean;\n};\n\nfunction getRegularItemHeight(\n compositeItem: AsideHeaderItem,\n menuDensity: AsideHeaderMenuDensity,\n layout?: CompositeBarItemLayoutOptions,\n) {\n const config = getAsideHeaderDensityConfig(menuDensity);\n\n return compositeItem.titleLines === 2 && !layout?.sidebarCompact\n ? config.twoLineItemHeight\n : config.itemHeight;\n}\n\nexport function getItemHeight(\n compositeItem: AsideHeaderItem,\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n) {\n switch (compositeItem.type) {\n case 'action':\n return getAsideHeaderDensityConfig(menuDensity).actionItemHeight;\n case 'divider':\n return 15;\n\n default:\n return getRegularItemHeight(compositeItem, menuDensity, layout);\n }\n}\n\nexport function getPopupItemHeight(compositeItem: AsideHeaderItem) {\n switch (compositeItem.type) {\n case 'action':\n return 50;\n case 'divider':\n return 15;\n\n default:\n return POPUP_REGULAR_ITEM_HEIGHT;\n }\n}\n\nexport function getItemsHeight<T extends AsideHeaderItem>(\n items: T[],\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n) {\n return items.reduce((sum, item) => sum + getItemHeight(item, menuDensity, layout), 0);\n}\n\nexport function getPopupItemsHeight<T extends AsideHeaderItem>(items: T[]) {\n return items.reduce((sum, item) => sum + getPopupItemHeight(item), 0);\n}\n\nfunction getPinnedItems(compositeItems: AsideHeaderItem[]) {\n const pinnedItems: AsideHeaderItem[] = [];\n for (const compositeItem of compositeItems) {\n if (compositeItem.pinned) {\n pinnedItems.push(compositeItem);\n } else if (compositeItem.type === 'divider') {\n if (pinnedItems.length > 0 && pinnedItems[pinnedItems.length - 1].type !== 'divider') {\n pinnedItems.push(compositeItem);\n }\n }\n }\n return pinnedItems;\n}\n\nfunction getItemsMinHeight(\n compositeItems: AsideHeaderItem[],\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n) {\n const pinnedItems = getPinnedItems(compositeItems);\n const afterMoreButtonItems = compositeItems.filter(({afterMoreButton}) => afterMoreButton);\n const {itemHeight} = getAsideHeaderDensityConfig(menuDensity);\n\n return (\n getItemsHeight(pinnedItems, menuDensity, layout) +\n getItemsHeight(afterMoreButtonItems, menuDensity, layout) +\n (pinnedItems.length === compositeItems.length ? 0 : itemHeight)\n );\n}\n\nexport function getMoreButtonItem(\n menuMoreTitle?: string,\n menuDensity: AsideHeaderMenuDensity = 'default',\n): AsideHeaderItem {\n const {iconSize} = getAsideHeaderDensityConfig(menuDensity);\n\n return {\n id: COLLAPSE_ITEM_ID,\n title: menuMoreTitle,\n icon: Ellipsis,\n iconSize,\n };\n}\n\nexport function makeGroupHeaderAsideItem(group: MenuGroup): AsideHeaderItem {\n return {\n id: `${COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX}${group.id}`,\n title: group.title,\n icon: group.icon,\n iconSize: group.iconSize,\n // `current` comes only from the group itself (its own page), never from\n // children: nested items show their own selection, and the root List row\n // must not highlight the whole group block.\n current: group.current,\n };\n}\n\nfunction makeOverflowGroupAsideItem(\n group: MenuGroup,\n children: AsideHeaderItem[],\n): AsideHeaderItem {\n return {\n id: `__gn-composite-bar__group-overflow__${group.id}`,\n title: group.title,\n icon: group.icon,\n iconSize: group.iconSize,\n current: group.current,\n href: group.href,\n onItemClick: group.onItemClick,\n compositeBarMenuPopupItems: children,\n compositeBarMenuPopupTitle: group.popupTitle,\n };\n}\n\nfunction getCompositeBarRowLayoutHeight(\n row: CompositeBarRow,\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n): number {\n if (row.kind === 'item') {\n return getItemHeight(row.item, menuDensity, layout);\n }\n return getItemHeight(makeGroupHeaderAsideItem(row.group), menuDensity, layout);\n}\n\n/**\n * Moves rows whose item has `afterMoreButton` to the end (parity with scroll vs collapse DOM order).\n *\n * @param rows Composite bar rows before ordering.\n * @returns Rows with `afterMoreButton` item rows last, or the same array reference when none.\n */\nexport function getReorderedCompositeBarRows(rows: CompositeBarRow[]): CompositeBarRow[] {\n const afterMoreRows = rows.filter((r) => r.kind === 'item' && r.item.afterMoreButton);\n\n if (afterMoreRows.length === 0) {\n return rows;\n }\n\n const regularRows = rows.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));\n\n return [...regularRows, ...afterMoreRows];\n}\n\nfunction compositeBarRowsToFlatForMinHeight(rows: CompositeBarRow[]): AsideHeaderItem[] {\n const out: AsideHeaderItem[] = [];\n for (const row of rows) {\n if (row.kind === 'item') {\n out.push(row.item);\n } else {\n out.push(makeGroupHeaderAsideItem(row.group));\n }\n }\n return out;\n}\n\nexport function getCompositeBarRowsMinHeight(\n rows: CompositeBarRow[],\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n): number {\n return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows), menuDensity, layout);\n}\n\nexport function getSelectedCompositeBarRowIndex(\n rows: CompositeBarRow[],\n suppressCurrentItemIds?: ReadonlySet<string>,\n): number | undefined {\n const index = rows.findIndex((row) => {\n if (row.kind === 'item') {\n return isItemPresentationCurrent(row.item, {suppressCurrentItemIds});\n }\n // Group rows embed their own List; selection is on nested items, not this root row.\n return false;\n });\n return index === -1 ? undefined : index;\n}\n\nexport function getAutosizeCompositeBarRows(\n rows: CompositeBarRow[],\n height: number,\n collapseItem: AsideHeaderItem,\n menuDensity: AsideHeaderMenuDensity = 'default',\n layout?: CompositeBarItemLayoutOptions,\n): {\n listRows: CompositeBarRow[];\n collapseItems: AsideHeaderItem[];\n} {\n const ordered = getReorderedCompositeBarRows(rows);\n const afterMoreRows = ordered.filter((r) => r.kind === 'item' && r.item.afterMoreButton);\n const regularRows = ordered.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));\n const listRows: CompositeBarRow[] = [...regularRows, ...afterMoreRows];\n\n const allRowsHeight = listRows.reduce(\n (sum, row) => sum + getCompositeBarRowLayoutHeight(row, menuDensity, layout),\n 0,\n );\n if (allRowsHeight <= height) {\n return {listRows, collapseItems: []};\n }\n\n const collapseItemHeight = getItemHeight(collapseItem, menuDensity, layout);\n\n listRows.splice(regularRows.length, 0, {kind: 'item', item: collapseItem});\n const collapseItems: AsideHeaderItem[] = [];\n\n let listHeight = allRowsHeight + collapseItemHeight;\n let index = listRows.length;\n while (listHeight > height) {\n if (index === 0) {\n break;\n }\n index--;\n\n const row = listRows[index];\n if (row.kind === 'item') {\n const compositeItem = row.item;\n if (\n compositeItem.pinned ||\n compositeItem.id === COLLAPSE_ITEM_ID ||\n compositeItem.afterMoreButton\n ) {\n continue;\n }\n if (compositeItem.type === 'divider') {\n const nextRow = listRows[index + 1];\n if (\n index + 1 < listRows.length &&\n nextRow?.kind === 'item' &&\n nextRow.item.type === 'divider'\n ) {\n listHeight -= getItemHeight(compositeItem, menuDensity, layout);\n listRows.splice(index, 1);\n }\n continue;\n }\n listHeight -= getItemHeight(compositeItem, menuDensity, layout);\n collapseItems.unshift(\n ...listRows\n .splice(index, 1)\n .map((r) => (r as Extract<CompositeBarRow, {kind: 'item'}>).item),\n );\n } else {\n listHeight -= getCompositeBarRowLayoutHeight(row, menuDensity, layout);\n const [removed] = listRows.splice(index, 1);\n if (removed?.kind === 'group') {\n collapseItems.unshift(makeOverflowGroupAsideItem(removed.group, removed.items));\n }\n }\n }\n const at = listRows[index];\n const prev = listRows[index - 1];\n if (\n at?.kind === 'item' &&\n at.item.type === 'divider' &&\n (index === 0 || (prev?.kind === 'item' && prev.item.type === 'divider'))\n ) {\n listRows.splice(index, 1);\n }\n\n return {listRows, collapseItems};\n}\n"],"names":["getAsideHeaderDensityConfig","POPUP_REGULAR_ITEM_HEIGHT","COLLAPSE_ITEM_ID","Ellipsis","COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX","isItemPresentationCurrent"],"mappings":"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"}