@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
@@ -1,24 +1,39 @@
1
1
  import { useRef, useState, useCallback, useEffect, useLayoutEffect } from 'react';
2
2
 
3
- const EMPTY_DEPS = [];
4
3
  const MIN_THUMB_HEIGHT = 24;
5
4
  /**
6
- * Keeps a custom scrollbar thumb and bottom shadow in sync with a native
7
- * scroll layer. The scroll element handles touch/keyboard; wheel events on the
8
- * overlay track are forwarded to it (the track sits above the scroller, so
9
- * they would not scroll otherwise). Wheel, touch, and keyboard on the
10
- * scrollable area itself are unchanged.
5
+ * A fractional container height can make the integer scrollHeight exceed clientHeight
6
+ * by this many pixels. Such a delta is sub-pixel rounding, not meaningfully scrollable
7
+ * content, so it is not reported as overflow.
8
+ */
9
+ const SUBPIXEL_OVERFLOW_PX = 1;
10
+ /**
11
+ * Keeps a custom scrollbar thumb in sync with a native scroll layer. The
12
+ * scroll element handles touch/keyboard; wheel events on the overlay track are
13
+ * forwarded to it (the track sits above the scroller, so they would not scroll
14
+ * otherwise). Wheel, touch, and keyboard on the scrollable area itself are
15
+ * unchanged.
11
16
  *
12
- * @param recalcDeps - extra deps that should trigger thumb/shadow recalculation
13
17
  * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI
14
18
  */
15
- function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
19
+ function useScrollableScrollbarSync() {
16
20
  const scrollRef = useRef(null);
17
21
  const trackRef = useRef(null);
18
22
  const thumbRef = useRef(null);
19
- const [hasContentBelow, setHasContentBelow] = useState(false);
20
23
  const [overflows, setOverflows] = useState(false);
21
- const [thumb, setThumb] = useState({ top: 0, height: 0 });
24
+ const [geometry, setGeometry] = useState({
25
+ thumb: { top: 0, height: 0 },
26
+ canScrollUp: false,
27
+ canScrollDown: false,
28
+ });
29
+ const updateGeometry = useCallback((next) => {
30
+ setGeometry((previous) => previous.thumb.top === next.thumb.top &&
31
+ previous.thumb.height === next.thumb.height &&
32
+ previous.canScrollUp === next.canScrollUp &&
33
+ previous.canScrollDown === next.canScrollDown
34
+ ? previous
35
+ : next);
36
+ }, []);
22
37
  const rafIdRef = useRef(null);
23
38
  const scheduleUpdate = useCallback(() => {
24
39
  if (rafIdRef.current !== null) {
@@ -30,39 +45,64 @@ function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
30
45
  if (!el) {
31
46
  return;
32
47
  }
33
- const { scrollTop, scrollHeight, clientHeight } = el;
34
- const isOverflowing = scrollHeight > clientHeight;
35
- // `-1` guards against subpixel rounding at the bottom.
36
- const notAtBottom = scrollTop + clientHeight < scrollHeight - 1;
48
+ const { scrollHeight, clientHeight } = el;
49
+ const isOverflowing = scrollHeight - clientHeight > SUBPIXEL_OVERFLOW_PX;
37
50
  setOverflows(isOverflowing);
38
- setHasContentBelow(isOverflowing && notAtBottom);
39
51
  if (!isOverflowing) {
40
- setThumb({ top: 0, height: 0 });
52
+ updateGeometry({
53
+ thumb: { top: 0, height: 0 },
54
+ canScrollUp: false,
55
+ canScrollDown: false,
56
+ });
41
57
  return;
42
58
  }
43
59
  const ratio = clientHeight / scrollHeight;
44
60
  const rawHeight = clientHeight * ratio;
45
61
  const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);
46
62
  const maxTop = clientHeight - height;
63
+ const { scrollTop } = el;
47
64
  const scrollRatio = scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;
48
65
  const top = maxTop * scrollRatio;
49
- setThumb({ top, height });
66
+ updateGeometry({
67
+ thumb: { top, height },
68
+ canScrollUp: isOverflowing && scrollTop > SUBPIXEL_OVERFLOW_PX,
69
+ canScrollDown: isOverflowing && scrollHeight - clientHeight - scrollTop > SUBPIXEL_OVERFLOW_PX,
70
+ });
50
71
  });
51
- }, []);
72
+ }, [updateGeometry]);
52
73
  useEffect(() => {
53
74
  const el = scrollRef.current;
54
75
  if (!el) {
55
76
  return undefined;
56
77
  }
57
78
  scheduleUpdate();
58
- if (typeof ResizeObserver === 'undefined') {
59
- return undefined;
79
+ // `ResizeObserver` is missing in jsdom, so keep it optional: the mutation
80
+ // observer below is set up either way.
81
+ const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleUpdate);
82
+ observer === null || observer === undefined ? undefined : observer.observe(el);
83
+ // Observe the direct content child as well: its content-box changes whenever
84
+ // the rendered content changes (rows, titles, adornments, groups, density).
85
+ const contentEl = el.firstElementChild;
86
+ if (contentEl) {
87
+ observer === null || observer === undefined ? undefined : observer.observe(contentEl);
60
88
  }
61
- const observer = new ResizeObserver(scheduleUpdate);
62
- observer.observe(el);
63
- return () => observer.disconnect();
64
- // eslint-disable-next-line react-hooks/exhaustive-deps
65
- }, [scheduleUpdate, ...recalcDeps]);
89
+ // Content can also change without resizing any observed box: the collapse-mode
90
+ // menu resizes its content wrapper via an inline style (AutoSizer), which
91
+ // changes scrollHeight while every observed box stays the same, leaving the
92
+ // overflow state stale. Re-measure on content mutations too (rAF-throttled
93
+ // by scheduleUpdate).
94
+ const mutationObserver = new MutationObserver(scheduleUpdate);
95
+ mutationObserver.observe(el, {
96
+ childList: true,
97
+ subtree: true,
98
+ characterData: true,
99
+ attributes: true,
100
+ });
101
+ return () => {
102
+ observer === null || observer === undefined ? undefined : observer.disconnect();
103
+ mutationObserver.disconnect();
104
+ };
105
+ }, [scheduleUpdate]);
66
106
  useEffect(() => {
67
107
  return () => {
68
108
  if (rafIdRef.current !== null) {
@@ -153,17 +193,12 @@ function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
153
193
  behavior: 'auto',
154
194
  });
155
195
  }, [cancelProgrammaticSmoothScroll]);
156
- return {
157
- scrollRef,
196
+ return Object.assign(Object.assign({ scrollRef,
158
197
  trackRef,
159
198
  thumbRef,
160
- hasContentBelow,
161
- overflows,
162
- thumb,
163
- scheduleUpdate,
199
+ overflows }, geometry), { scheduleUpdate,
164
200
  handleThumbPointerDown,
165
- handleTrackPointerDown,
166
- };
201
+ handleTrackPointerDown });
167
202
  }
168
203
 
169
204
  export { 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":[],"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":[],"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__";
@@ -1,7 +1,8 @@
1
1
  const ITEM_TYPE_REGULAR = 'regular';
2
2
  const COLLAPSE_ITEM_ID = 'collapse-item-id';
3
+ 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
  const COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX = '__gn-composite-bar__group-header__';
5
6
 
6
- export { COLLAPSE_ITEM_ID, COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX, ITEM_TYPE_REGULAR };
7
+ export { COLLAPSE_ITEM_ID, COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX, COMPOSITE_BAR_ITEM_ID_ATTRIBUTE, ITEM_TYPE_REGULAR };
7
8
  //# 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,36 @@
1
+ function collectItemPresentationCurrentIds(item, suppressCurrentItemIds, popupItems, currentIds) {
2
+ if (item.current && !(suppressCurrentItemIds === null || suppressCurrentItemIds === undefined ? undefined : suppressCurrentItemIds.has(item.id))) {
3
+ currentIds.add(item.id);
4
+ }
5
+ popupItems === null || popupItems === undefined ? undefined : popupItems.forEach((popupItem) => {
6
+ collectItemPresentationCurrentIds(popupItem, suppressCurrentItemIds, popupItem.compositeBarMenuPopupItems, currentIds);
7
+ });
8
+ }
9
+ /**
10
+ * Resolves the semantic ids represented by a visually current row. Popup parents aggregate the
11
+ * ids recursively, while synthetic group and More rows contribute only their current descendants.
12
+ *
13
+ * @param item - The row item whose presentation state is being resolved.
14
+ * @param options - Suppression and optional popup children resolved by the caller.
15
+ * @returns Sorted unique ids of unsuppressed current items represented by the row.
16
+ */
17
+ function getItemPresentationCurrentIds(item, options = {}) {
18
+ const { suppressCurrentItemIds, popupItems = item.compositeBarMenuPopupItems } = options;
19
+ const currentIds = new Set();
20
+ collectItemPresentationCurrentIds(item, suppressCurrentItemIds, popupItems, currentIds);
21
+ return Array.from(currentIds).sort();
22
+ }
23
+ /**
24
+ * Resolves the visual current state without changing the public item. Popup parents aggregate the
25
+ * state recursively, so group and More rows follow the same suppression rules as leaf rows.
26
+ *
27
+ * @param item - The row item whose presentation state is being resolved.
28
+ * @param options - Suppression and optional popup children resolved by the caller.
29
+ * @returns Whether the row or one of its popup descendants should look current.
30
+ */
31
+ function isItemPresentationCurrent(item, options = {}) {
32
+ return getItemPresentationCurrentIds(item, options).length > 0;
33
+ }
34
+
35
+ export { getItemPresentationCurrentIds, isItemPresentationCurrent };
36
+ //# 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 {};
@@ -1,15 +1,23 @@
1
1
  import { Ellipsis } from '@gravity-ui/icons';
2
- import { ITEM_HEIGHT, POPUP_REGULAR_ITEM_HEIGHT } from '../../../constants.js';
2
+ import { POPUP_REGULAR_ITEM_HEIGHT } from '../../../constants.js';
3
+ import { getAsideHeaderDensityConfig } from '../../density.js';
3
4
  import { COLLAPSE_ITEM_ID, COMPOSITE_BAR_GROUP_HEADER_ID_PREFIX } from './constants.js';
5
+ import { isItemPresentationCurrent } from './presentationCurrent.js';
4
6
 
5
- function getItemHeight(compositeItem) {
7
+ function getRegularItemHeight(compositeItem, menuDensity, layout) {
8
+ const config = getAsideHeaderDensityConfig(menuDensity);
9
+ return compositeItem.titleLines === 2 && !(layout === null || layout === undefined ? undefined : layout.sidebarCompact)
10
+ ? config.twoLineItemHeight
11
+ : config.itemHeight;
12
+ }
13
+ function getItemHeight(compositeItem, menuDensity = 'default', layout) {
6
14
  switch (compositeItem.type) {
7
15
  case 'action':
8
- return 50;
16
+ return getAsideHeaderDensityConfig(menuDensity).actionItemHeight;
9
17
  case 'divider':
10
18
  return 15;
11
19
  default:
12
- return ITEM_HEIGHT;
20
+ return getRegularItemHeight(compositeItem, menuDensity, layout);
13
21
  }
14
22
  }
15
23
  function getPopupItemHeight(compositeItem) {
@@ -22,15 +30,8 @@ function getPopupItemHeight(compositeItem) {
22
30
  return POPUP_REGULAR_ITEM_HEIGHT;
23
31
  }
24
32
  }
25
- function getItemsHeight(items) {
26
- return items.reduce((sum, item) => sum + getItemHeight(item), 0);
27
- }
28
- function getPopupItemsHeight(items) {
29
- return items.reduce((sum, item) => sum + getPopupItemHeight(item), 0);
30
- }
31
- function getSelectedItemIndex(compositeItems) {
32
- const index = compositeItems.findIndex(({ current }) => Boolean(current));
33
- return index === -1 ? undefined : index;
33
+ function getItemsHeight(items, menuDensity = 'default', layout) {
34
+ return items.reduce((sum, item) => sum + getItemHeight(item, menuDensity, layout), 0);
34
35
  }
35
36
  function getPinnedItems(compositeItems) {
36
37
  const pinnedItems = [];
@@ -46,19 +47,21 @@ function getPinnedItems(compositeItems) {
46
47
  }
47
48
  return pinnedItems;
48
49
  }
49
- function getItemsMinHeight(compositeItems) {
50
+ function getItemsMinHeight(compositeItems, menuDensity = 'default', layout) {
50
51
  const pinnedItems = getPinnedItems(compositeItems);
51
52
  const afterMoreButtonItems = compositeItems.filter(({ afterMoreButton }) => afterMoreButton);
52
- return (getItemsHeight(pinnedItems) +
53
- getItemsHeight(afterMoreButtonItems) +
54
- (pinnedItems.length === compositeItems.length ? 0 : ITEM_HEIGHT));
53
+ const { itemHeight } = getAsideHeaderDensityConfig(menuDensity);
54
+ return (getItemsHeight(pinnedItems, menuDensity, layout) +
55
+ getItemsHeight(afterMoreButtonItems, menuDensity, layout) +
56
+ (pinnedItems.length === compositeItems.length ? 0 : itemHeight));
55
57
  }
56
- function getMoreButtonItem(menuMoreTitle) {
58
+ function getMoreButtonItem(menuMoreTitle, menuDensity = 'default') {
59
+ const { iconSize } = getAsideHeaderDensityConfig(menuDensity);
57
60
  return {
58
61
  id: COLLAPSE_ITEM_ID,
59
62
  title: menuMoreTitle,
60
63
  icon: Ellipsis,
61
- iconSize: 18,
64
+ iconSize,
62
65
  };
63
66
  }
64
67
  function makeGroupHeaderAsideItem(group) {
@@ -67,8 +70,10 @@ function makeGroupHeaderAsideItem(group) {
67
70
  title: group.title,
68
71
  icon: group.icon,
69
72
  iconSize: group.iconSize,
70
- // Do not set `current` from children: only nested items should show selection;
71
- // otherwise the group header and root List row highlight the whole group block.
73
+ // `current` comes only from the group itself (its own page), never from
74
+ // children: nested items show their own selection, and the root List row
75
+ // must not highlight the whole group block.
76
+ current: group.current,
72
77
  };
73
78
  }
74
79
  function makeOverflowGroupAsideItem(group, children) {
@@ -76,15 +81,19 @@ function makeOverflowGroupAsideItem(group, children) {
76
81
  id: `__gn-composite-bar__group-overflow__${group.id}`,
77
82
  title: group.title,
78
83
  icon: group.icon,
84
+ iconSize: group.iconSize,
85
+ current: group.current,
86
+ href: group.href,
87
+ onItemClick: group.onItemClick,
79
88
  compositeBarMenuPopupItems: children,
80
89
  compositeBarMenuPopupTitle: group.popupTitle,
81
90
  };
82
91
  }
83
- function getCompositeBarRowLayoutHeight(row) {
92
+ function getCompositeBarRowLayoutHeight(row, menuDensity = 'default', layout) {
84
93
  if (row.kind === 'item') {
85
- return getItemHeight(row.item);
94
+ return getItemHeight(row.item, menuDensity, layout);
86
95
  }
87
- return getItemHeight(makeGroupHeaderAsideItem(row.group));
96
+ return getItemHeight(makeGroupHeaderAsideItem(row.group), menuDensity, layout);
88
97
  }
89
98
  /**
90
99
  * Moves rows whose item has `afterMoreButton` to the end (parity with scroll vs collapse DOM order).
@@ -112,29 +121,29 @@ function compositeBarRowsToFlatForMinHeight(rows) {
112
121
  }
113
122
  return out;
114
123
  }
115
- function getCompositeBarRowsMinHeight(rows) {
116
- return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows));
124
+ function getCompositeBarRowsMinHeight(rows, menuDensity = 'default', layout) {
125
+ return getItemsMinHeight(compositeBarRowsToFlatForMinHeight(rows), menuDensity, layout);
117
126
  }
118
- function getSelectedCompositeBarRowIndex(rows) {
127
+ function getSelectedCompositeBarRowIndex(rows, suppressCurrentItemIds) {
119
128
  const index = rows.findIndex((row) => {
120
129
  if (row.kind === 'item') {
121
- return Boolean(row.item.current);
130
+ return isItemPresentationCurrent(row.item, { suppressCurrentItemIds });
122
131
  }
123
132
  // Group rows embed their own List; selection is on nested items, not this root row.
124
133
  return false;
125
134
  });
126
135
  return index === -1 ? undefined : index;
127
136
  }
128
- function getAutosizeCompositeBarRows(rows, height, collapseItem) {
137
+ function getAutosizeCompositeBarRows(rows, height, collapseItem, menuDensity = 'default', layout) {
129
138
  const ordered = getReorderedCompositeBarRows(rows);
130
139
  const afterMoreRows = ordered.filter((r) => r.kind === 'item' && r.item.afterMoreButton);
131
140
  const regularRows = ordered.filter((r) => !(r.kind === 'item' && r.item.afterMoreButton));
132
141
  const listRows = [...regularRows, ...afterMoreRows];
133
- const allRowsHeight = listRows.reduce((sum, row) => sum + getCompositeBarRowLayoutHeight(row), 0);
142
+ const allRowsHeight = listRows.reduce((sum, row) => sum + getCompositeBarRowLayoutHeight(row, menuDensity, layout), 0);
134
143
  if (allRowsHeight <= height) {
135
144
  return { listRows, collapseItems: [] };
136
145
  }
137
- const collapseItemHeight = getItemHeight(collapseItem);
146
+ const collapseItemHeight = getItemHeight(collapseItem, menuDensity, layout);
138
147
  listRows.splice(regularRows.length, 0, { kind: 'item', item: collapseItem });
139
148
  const collapseItems = [];
140
149
  let listHeight = allRowsHeight + collapseItemHeight;
@@ -157,18 +166,18 @@ function getAutosizeCompositeBarRows(rows, height, collapseItem) {
157
166
  if (index + 1 < listRows.length &&
158
167
  (nextRow === null || nextRow === undefined ? undefined : nextRow.kind) === 'item' &&
159
168
  nextRow.item.type === 'divider') {
160
- listHeight -= getItemHeight(compositeItem);
169
+ listHeight -= getItemHeight(compositeItem, menuDensity, layout);
161
170
  listRows.splice(index, 1);
162
171
  }
163
172
  continue;
164
173
  }
165
- listHeight -= getItemHeight(compositeItem);
174
+ listHeight -= getItemHeight(compositeItem, menuDensity, layout);
166
175
  collapseItems.unshift(...listRows
167
176
  .splice(index, 1)
168
177
  .map((r) => r.item));
169
178
  }
170
179
  else {
171
- listHeight -= getCompositeBarRowLayoutHeight(row);
180
+ listHeight -= getCompositeBarRowLayoutHeight(row, menuDensity, layout);
172
181
  const [removed] = listRows.splice(index, 1);
173
182
  if ((removed === null || removed === undefined ? undefined : removed.kind) === 'group') {
174
183
  collapseItems.unshift(makeOverflowGroupAsideItem(removed.group, removed.items));
@@ -185,5 +194,5 @@ function getAutosizeCompositeBarRows(rows, height, collapseItem) {
185
194
  return { listRows, collapseItems };
186
195
  }
187
196
 
188
- export { getAutosizeCompositeBarRows, getCompositeBarRowsMinHeight, getItemHeight, getItemsHeight, getMoreButtonItem, getPopupItemHeight, getPopupItemsHeight, getReorderedCompositeBarRows, getSelectedCompositeBarRowIndex, getSelectedItemIndex, makeGroupHeaderAsideItem };
197
+ export { getAutosizeCompositeBarRows, getCompositeBarRowsMinHeight, getItemHeight, getItemsHeight, getMoreButtonItem, getPopupItemHeight, getReorderedCompositeBarRows, getSelectedCompositeBarRowIndex, makeGroupHeaderAsideItem };
189
198
  //# 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":[],"mappings":"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"}
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":[],"mappings":"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"}