@sberbusiness/triplex-next 1.43.0 → 1.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/chunks/{AlertProcessSpoiler-Dw-s37ux.js → AlertProcessSpoiler-BKFq5HKa.js} +16 -16
  2. package/chunks/{AlertProcessSpoiler-Dw-s37ux.js.map → AlertProcessSpoiler-BKFq5HKa.js.map} +1 -1
  3. package/chunks/{CalendarViewItem-DdKK7cTU.js → CalendarViewItem-IqO8CpCn.js} +20 -20
  4. package/chunks/{CalendarViewItem-DdKK7cTU.js.map → CalendarViewItem-IqO8CpCn.js.map} +1 -1
  5. package/chunks/Card.module-DvHL4Oak.js +32 -0
  6. package/chunks/Card.module-DvHL4Oak.js.map +1 -0
  7. package/chunks/Carousel.module-B1uqtX8a.js +34 -0
  8. package/chunks/Carousel.module-B1uqtX8a.js.map +1 -0
  9. package/chunks/CheckboxTreeExtended.module-nKSCkiBt.js +24 -0
  10. package/chunks/CheckboxTreeExtended.module-nKSCkiBt.js.map +1 -0
  11. package/chunks/{Chip-DMOFGadD.js → Chip-BpCsNJTt.js} +16 -16
  12. package/chunks/{Chip-DMOFGadD.js.map → Chip-BpCsNJTt.js.map} +1 -1
  13. package/chunks/Confirm.module-BhW4bMM_.js +24 -0
  14. package/chunks/Confirm.module-BhW4bMM_.js.map +1 -0
  15. package/chunks/{DropdownListItem-hLJFQ_q0.js → DropdownListItem-DOjFvzKN.js} +10 -10
  16. package/chunks/{DropdownListItem-hLJFQ_q0.js.map → DropdownListItem-DOjFvzKN.js.map} +1 -1
  17. package/chunks/DropdownMobile.module-DZDL8Gw8.js +40 -0
  18. package/chunks/DropdownMobile.module-DZDL8Gw8.js.map +1 -0
  19. package/chunks/Footer.module-DUG9712L.js +12 -0
  20. package/chunks/Footer.module-DUG9712L.js.map +1 -0
  21. package/chunks/{HeaderLayoutSidebar.module-Du7oNhcA.js → HeaderLayoutSidebar.module-IW43j7gL.js} +4 -4
  22. package/chunks/HeaderLayoutSidebar.module-IW43j7gL.js.map +1 -0
  23. package/chunks/HeaderTabs.module-DfEbH7Kd.js +12 -0
  24. package/chunks/HeaderTabs.module-DfEbH7Kd.js.map +1 -0
  25. package/chunks/{HeaderTitle.module-BpjoBzW6.js → HeaderTitle.module-G4qS0aG1.js} +4 -4
  26. package/chunks/HeaderTitle.module-G4qS0aG1.js.map +1 -0
  27. package/chunks/ImageGalleryExtendedMain.module-Bj1ndZgo.js +28 -0
  28. package/chunks/ImageGalleryExtendedMain.module-Bj1ndZgo.js.map +1 -0
  29. package/chunks/{ImageGalleryExtendedThumb-2kNnHEuL.js → ImageGalleryExtendedThumb-ZBgC8mAZ.js} +5 -5
  30. package/chunks/{ImageGalleryExtendedThumb-2kNnHEuL.js.map → ImageGalleryExtendedThumb-ZBgC8mAZ.js.map} +1 -1
  31. package/chunks/IslandAccordion.module-BFj1LZrN.js +44 -0
  32. package/chunks/IslandAccordion.module-BFj1LZrN.js.map +1 -0
  33. package/chunks/IslandWidgetFooter.module-DVKw7F37.js +18 -0
  34. package/chunks/IslandWidgetFooter.module-DVKw7F37.js.map +1 -0
  35. package/chunks/IslandWidgetHeader.module-DHAKalQf.js +28 -0
  36. package/chunks/IslandWidgetHeader.module-DHAKalQf.js.map +1 -0
  37. package/chunks/{LightBoxContent-D9EyEoR0.js → LightBoxContent-DmLo1lK3.js} +21 -17
  38. package/chunks/{LightBoxContent-D9EyEoR0.js.map → LightBoxContent-DmLo1lK3.js.map} +1 -1
  39. package/chunks/LightBoxControls.module-BfIgufzK.js +26 -0
  40. package/chunks/LightBoxControls.module-BfIgufzK.js.map +1 -0
  41. package/chunks/{LightBoxSideOverlayClose.module-B0uNmLho.js → LightBoxSideOverlayClose.module-Dznuf6b3.js} +4 -4
  42. package/chunks/LightBoxSideOverlayClose.module-Dznuf6b3.js.map +1 -0
  43. package/chunks/{ListItemControlsButton-CgcAyPtd.js → ListItemControlsButton-BFkW7b6S.js} +9 -9
  44. package/chunks/{ListItemControlsButton-CgcAyPtd.js.map → ListItemControlsButton-BFkW7b6S.js.map} +1 -1
  45. package/chunks/ListItemTail.module-DjYk6epy.js +18 -0
  46. package/chunks/ListItemTail.module-DjYk6epy.js.map +1 -0
  47. package/chunks/ListMasterFooter.module-B5viguka.js +14 -0
  48. package/chunks/ListMasterFooter.module-B5viguka.js.map +1 -0
  49. package/chunks/ModalWindow.module-C0p5ZVLh.js +28 -0
  50. package/chunks/ModalWindow.module-C0p5ZVLh.js.map +1 -0
  51. package/chunks/Notification.module-DuwX9b1Z.js +34 -0
  52. package/chunks/Notification.module-DuwX9b1Z.js.map +1 -0
  53. package/chunks/Overlay.module-Cuh6SDnR.js +30 -0
  54. package/chunks/Overlay.module-Cuh6SDnR.js.map +1 -0
  55. package/chunks/Page.module-Bso9TRUt.js +15 -0
  56. package/chunks/Page.module-Bso9TRUt.js.map +1 -0
  57. package/chunks/SMSField.module-DHnJVbUI.js +26 -0
  58. package/chunks/SMSField.module-DHnJVbUI.js.map +1 -0
  59. package/chunks/SliderExtendedMarks.module-CuyZnXA3.js +24 -0
  60. package/chunks/SliderExtendedMarks.module-CuyZnXA3.js.map +1 -0
  61. package/chunks/{SliderExtendedRail-BrLpOwFy.js → SliderExtendedRail-CBpr9S0R.js} +5 -5
  62. package/chunks/{SliderExtendedRail-BrLpOwFy.js.map → SliderExtendedRail-CBpr9S0R.js.map} +1 -1
  63. package/chunks/StatusTracker.module-CXFyhzFa.js +44 -0
  64. package/chunks/StatusTracker.module-CXFyhzFa.js.map +1 -0
  65. package/chunks/{StepperStepArrowBorder-Cp0G1HTs.js → StepperStepArrowBorder-0FWauWM_.js} +16 -16
  66. package/chunks/{StepperStepArrowBorder-Cp0G1HTs.js.map → StepperStepArrowBorder-0FWauWM_.js.map} +1 -1
  67. package/chunks/{SuggestFieldMobileDropdownHint-BLnAqUOu.js → SuggestFieldMobileDropdownHint-BfrLhHXK.js} +3 -3
  68. package/chunks/{SuggestFieldMobileDropdownHint-BLnAqUOu.js.map → SuggestFieldMobileDropdownHint-BfrLhHXK.js.map} +1 -1
  69. package/chunks/TableFooter.module-DRlxkZoa.js +22 -0
  70. package/chunks/TableFooter.module-DRlxkZoa.js.map +1 -0
  71. package/chunks/TabsExtended.module-DJH-YNzW.js +26 -0
  72. package/chunks/TabsExtended.module-DJH-YNzW.js.map +1 -0
  73. package/chunks/TabsLine.module-_HQwnwAW.js +36 -0
  74. package/chunks/TabsLine.module-_HQwnwAW.js.map +1 -0
  75. package/chunks/TooltipDesktop.module-B54hNcxs.js +32 -0
  76. package/chunks/TooltipDesktop.module-B54hNcxs.js.map +1 -0
  77. package/chunks/TreeView.module-CmItPF1_.js +12 -0
  78. package/chunks/TreeView.module-CmItPF1_.js.map +1 -0
  79. package/chunks/{UploadZoneInput-BU3nt7wc.js → UploadZoneInput-CBw00-1a.js} +5 -5
  80. package/chunks/{UploadZoneInput-BU3nt7wc.js.map → UploadZoneInput-CBw00-1a.js.map} +1 -1
  81. package/chunks/{constants-BxSYvMoV.js → constants-zAYZ7mgb.js} +27 -27
  82. package/chunks/{constants-BxSYvMoV.js.map → constants-zAYZ7mgb.js.map} +1 -1
  83. package/chunks/{utils-B25Ic6iq.js → utils-BL5AUOKS.js} +28 -28
  84. package/chunks/{utils-B25Ic6iq.js.map → utils-BL5AUOKS.js.map} +1 -1
  85. package/chunks/{utils-DjmAjzcV.js → utils-C8wwfWT9.js} +12 -10
  86. package/chunks/{utils-DjmAjzcV.js.map → utils-C8wwfWT9.js.map} +1 -1
  87. package/chunks/{utils-Cc9JBJpf.js → utils-CTCsYynd.js} +11 -11
  88. package/chunks/{utils-Cc9JBJpf.js.map → utils-CTCsYynd.js.map} +1 -1
  89. package/chunks/{utils-CLqTYw8x.js → utils-W5dHMPw5.js} +6 -6
  90. package/chunks/{utils-CLqTYw8x.js.map → utils-W5dHMPw5.js.map} +1 -1
  91. package/components/Alert/AlertContext/AlertContext.js +7 -7
  92. package/components/Alert/AlertProcess/AlertProcess.js +2 -2
  93. package/components/Alert/AlertProcess/components/AlertProcessSpoiler.js +1 -1
  94. package/components/Amount/Amount.js +2 -2
  95. package/components/Avatar/Avatar.js +13 -13
  96. package/components/Badge/Badge.js +4 -4
  97. package/components/Badge/BadgeDot.js +4 -4
  98. package/components/Badge/components/BadgeContent.js +6 -6
  99. package/components/Badge/components/BadgePostfix.js +1 -1
  100. package/components/Badge/components/BadgePrefix.js +1 -1
  101. package/components/Body/Body.js +3 -3
  102. package/components/Button/Button.js +20 -20
  103. package/components/Button/ButtonBase.js +1 -1
  104. package/components/Button/ButtonDropdown.js +8 -8
  105. package/components/Button/ButtonDropdownExtended.js +2 -2
  106. package/components/Button/ButtonIcon.js +3 -3
  107. package/components/Calendar/Calendar.js +4 -4
  108. package/components/Calendar/components/CalendarControls.js +1 -1
  109. package/components/Calendar/components/CalendarFooter.js +1 -1
  110. package/components/Calendar/components/CalendarViewDays.js +1 -1
  111. package/components/Calendar/components/CalendarViewItem.js +1 -1
  112. package/components/Calendar/components/CalendarViewMonths.js +1 -1
  113. package/components/Calendar/components/CalendarViewYears.js +1 -1
  114. package/components/Card/CardAction.js +5 -5
  115. package/components/Card/CardStatic.js +2 -2
  116. package/components/Card/components/CardContent/CardContent.js +1 -1
  117. package/components/Card/components/CardContent/components/CardContentBody.js +1 -1
  118. package/components/Card/components/CardContent/components/CardContentFooter.js +1 -1
  119. package/components/Card/components/CardContent/components/CardContentHeader.js +1 -1
  120. package/components/Card/components/CardMedia.js +1 -1
  121. package/components/Card/utils.js +1 -1
  122. package/components/Carousel/Carousel.js +1 -1
  123. package/components/Carousel/CarouselButton.js +5 -5
  124. package/components/Carousel/CarouselButton.js.map +1 -1
  125. package/components/Carousel/CarouselIndicators.js +24 -7
  126. package/components/Carousel/CarouselIndicators.js.map +1 -1
  127. package/components/Carousel/CarouselItem.js +1 -1
  128. package/components/Carousel/CarouselTrack.js +1 -1
  129. package/components/Carousel/CarouselViewport.js +1 -1
  130. package/components/CarouselExtended/CarouselExtended.js +1 -1
  131. package/components/Checkbox/Checkbox.js +10 -10
  132. package/components/Checkbox/CheckboxXGroup.js +8 -8
  133. package/components/Checkbox/CheckboxYGroup.js +1 -1
  134. package/components/CheckboxTreeExtended/CheckboxTreeExtended.js +1 -1
  135. package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedArrow.js +1 -1
  136. package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedCheckbox.js +1 -1
  137. package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedNode.js +1 -1
  138. package/components/Chip/Chip.js +1 -1
  139. package/components/Chip/ChipClearButton.js +1 -1
  140. package/components/Chip/ChipDatePicker/ChipDatePicker.js +1 -1
  141. package/components/Chip/ChipDatePicker/ChipDatePickerTarget.js +1 -1
  142. package/components/Chip/ChipDropdownArrow.js +2 -2
  143. package/components/Chip/ChipIcon.js +1 -1
  144. package/components/Chip/ChipMultiselect.js +1 -1
  145. package/components/Chip/ChipOptions.js +2 -2
  146. package/components/Chip/ChipSelect/ChipSelect.js +1 -1
  147. package/components/Chip/ChipSelect/ChipSelectTarget.js +1 -1
  148. package/components/Chip/ChipSort.js +1 -1
  149. package/components/Chip/ChipSuggest/ChipSuggest.js +1 -1
  150. package/components/Chip/ChipSuggest/ChipSuggestDropdown.js +1 -1
  151. package/components/Chip/ChipSuggest/ChipSuggestTarget.js +1 -1
  152. package/components/Chip/ChipSuggest/desktop/ChipSuggestDesktopDropdownField.js +1 -1
  153. package/components/Chip/index.js +1 -1
  154. package/components/ChipGroup/ChipGroup.js +7 -7
  155. package/components/Col/Col.js +132 -132
  156. package/components/CollapsibleTree/CollapsibleTree.js +1 -1
  157. package/components/CollapsibleTree/components/CollapsibleTreeLeafContent.js +1 -1
  158. package/components/CollapsibleTree/components/CollapsibleTreeLeafNode.js +1 -1
  159. package/components/CollapsibleTree/components/CollapsibleTreeNodeHeader.js +4 -4
  160. package/components/CollapsibleTreeExtended/components/CollapsibleTreeExtendedNode.js +1 -1
  161. package/components/Confirm/Confirm.js +1 -1
  162. package/components/Confirm/components/ConfirmCloseButton.js +1 -1
  163. package/components/Confirm/components/ConfirmContent.js +1 -1
  164. package/components/Confirm/components/ConfirmContentTitle.js +1 -1
  165. package/components/Confirm/components/ConfirmControls.js +1 -1
  166. package/components/DateField/DateFieldTarget.js +4 -4
  167. package/components/DatePickerExtended/DatePickerExtended.js +28 -23
  168. package/components/DatePickerExtended/DatePickerExtended.js.map +1 -1
  169. package/components/DatePickerExtended/DatePickerExtendedContext.js.map +1 -1
  170. package/components/DatePickerExtended/DatePickerExtendedDropdown.js +12 -5
  171. package/components/DatePickerExtended/DatePickerExtendedDropdown.js.map +1 -1
  172. package/components/DatePickerExtended/index.js +3 -1
  173. package/components/DatePickerExtended/index.js.map +1 -1
  174. package/components/DateRange/DateRange.js +3 -3
  175. package/components/DesignTokens/DesignTokenUtils.js +1 -1
  176. package/components/DesignTokens/components/Button.js +1 -1
  177. package/components/DesignTokens/components/Button.js.map +1 -1
  178. package/components/DesignTokens/components/Skeleton.js +18 -12
  179. package/components/DesignTokens/components/Skeleton.js.map +1 -1
  180. package/components/Divider/Divider.js +17 -17
  181. package/components/DocumentNumberEdit/DocumentNumberEdit.js +3 -3
  182. package/components/Dropdown/desktop/DropdownDesktop.js +6 -6
  183. package/components/Dropdown/desktop/DropdownList.js +1 -1
  184. package/components/Dropdown/desktop/DropdownListItem.js +1 -1
  185. package/components/Dropdown/desktop/index.js +1 -1
  186. package/components/Dropdown/index.js +1 -1
  187. package/components/Dropdown/mobile/DropdownMobile.js +2 -2
  188. package/components/Dropdown/mobile/DropdownMobileBody.js +1 -1
  189. package/components/Dropdown/mobile/DropdownMobileClose.js +1 -1
  190. package/components/Dropdown/mobile/DropdownMobileFooter.js +1 -1
  191. package/components/Dropdown/mobile/DropdownMobileHeader.js +1 -1
  192. package/components/Dropdown/mobile/DropdownMobileInner.js +1 -1
  193. package/components/Dropdown/mobile/DropdownMobileInput.js +1 -1
  194. package/components/Dropdown/mobile/DropdownMobileList.js +1 -1
  195. package/components/Dropdown/mobile/DropdownMobileListItem.js +1 -1
  196. package/components/Dropdown/mobile/DropdownMobileLoader.js +1 -1
  197. package/components/Dropdown/mobile/DropdownMobileMaskedInput.js +1 -1
  198. package/components/Ellipsis/Ellipsis.js +3 -3
  199. package/components/EmptyView/EmptyView.js +4 -4
  200. package/components/ExpandAnimation/ExpandAnimation.js +15 -10
  201. package/components/ExpandAnimation/ExpandAnimation.js.map +1 -1
  202. package/components/Footer/Footer.js +1 -1
  203. package/components/Footer/Footer.js.map +1 -1
  204. package/components/Footer/components/FooterDescription.js +1 -1
  205. package/components/Footer/components/FooterDescription.js.map +1 -1
  206. package/components/Footer/components/FooterDescriptionContent.js +1 -1
  207. package/components/Footer/components/FooterDescriptionContent.js.map +1 -1
  208. package/components/Footer/components/FooterDescriptionControls.js +1 -1
  209. package/components/FormField/FormField.js +11 -11
  210. package/components/FormField/components/FormFieldClear.js +1 -1
  211. package/components/FormField/components/FormFieldCounter.js +1 -1
  212. package/components/FormField/components/FormFieldDescription.js +2 -2
  213. package/components/FormField/components/FormFieldInput.js +4 -4
  214. package/components/FormField/components/FormFieldLabel.js +7 -7
  215. package/components/FormField/components/FormFieldMaskedInput.js +6 -6
  216. package/components/FormField/components/FormFieldPostfix.js +1 -1
  217. package/components/FormField/components/FormFieldPrefix.js +1 -1
  218. package/components/FormField/components/FormFieldTarget.js +8 -8
  219. package/components/FormField/components/FormFieldTextarea.js +4 -4
  220. package/components/Gap/Gap.js +8 -8
  221. package/components/Header/Header.js +1 -1
  222. package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebar.js +1 -1
  223. package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebarContent.js +1 -1
  224. package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebarSidebar.js +1 -1
  225. package/components/Header/components/HeaderSubheader/HeaderSubheader.js +2 -2
  226. package/components/Header/components/HeaderTabs/HeaderTabs.js +1 -1
  227. package/components/Header/components/HeaderTabs/HeaderTabsContent.js +1 -1
  228. package/components/Header/components/HeaderTabs/HeaderTabsControls.js +1 -1
  229. package/components/Header/components/HeaderTitle/HeaderTitle.js +1 -1
  230. package/components/Header/components/HeaderTitle/HeaderTitleContent.js +1 -1
  231. package/components/Header/components/HeaderTitle/HeaderTitleControls.js +1 -1
  232. package/components/HelpBox/HelpBox.js +1 -1
  233. package/components/IconWrapper/IconWrapper.js +2 -2
  234. package/components/ImageGallery/ImageGallery.js +1 -1
  235. package/components/ImageGalleryExtended/ImageGalleryExtended.js +2 -2
  236. package/components/ImageGalleryExtended/components/ImageGalleryExtendedArrow.js +1 -1
  237. package/components/ImageGalleryExtended/components/ImageGalleryExtendedDots.js +3 -3
  238. package/components/ImageGalleryExtended/components/ImageGalleryExtendedMain.js +1 -1
  239. package/components/ImageGalleryExtended/components/ImageGalleryExtendedSlide.js +1 -1
  240. package/components/ImageGalleryExtended/components/ImageGalleryExtendedSwipeTrack.js +1 -1
  241. package/components/ImageGalleryExtended/components/ImageGalleryExtendedThumb.js +1 -1
  242. package/components/ImageGalleryExtended/components/ImageGalleryExtendedThumbnails.js +1 -1
  243. package/components/ImageGalleryExtended/components/index.js +1 -1
  244. package/components/ImageGalleryExtended/index.js +1 -1
  245. package/components/Island/Island.js +9 -2
  246. package/components/Island/Island.js.map +1 -1
  247. package/components/Island/components/IslandBody.js +1 -1
  248. package/components/Island/components/IslandFooter.js +1 -1
  249. package/components/Island/components/IslandHeader.js +1 -1
  250. package/components/Island/utils.js +1 -1
  251. package/components/IslandAccordion/IslandAccordion.js +2 -2
  252. package/components/IslandAccordion/components/IslandAccordionContent.js +1 -1
  253. package/components/IslandAccordion/components/IslandAccordionFooter.js +1 -1
  254. package/components/IslandAccordion/components/IslandAccordionItem.js +2 -2
  255. package/components/IslandWidget/IslandWidget.js +8 -18
  256. package/components/IslandWidget/IslandWidget.js.map +1 -1
  257. package/components/IslandWidget/IslandWidgetContext.js +3 -1
  258. package/components/IslandWidget/IslandWidgetContext.js.map +1 -1
  259. package/components/IslandWidget/components/IslandWidgetBody.js +14 -3
  260. package/components/IslandWidget/components/IslandWidgetBody.js.map +1 -1
  261. package/components/IslandWidget/components/IslandWidgetExtraFooter.js +1 -1
  262. package/components/IslandWidget/components/IslandWidgetFooter.js +14 -2
  263. package/components/IslandWidget/components/IslandWidgetFooter.js.map +1 -1
  264. package/components/IslandWidget/components/IslandWidgetFooterContent.js +1 -1
  265. package/components/IslandWidget/components/IslandWidgetFooterControls.js +1 -1
  266. package/components/IslandWidget/components/IslandWidgetHeader.js +7 -4
  267. package/components/IslandWidget/components/IslandWidgetHeader.js.map +1 -1
  268. package/components/IslandWidget/components/IslandWidgetHeaderContent.js +1 -1
  269. package/components/IslandWidget/components/IslandWidgetHeaderControls.js +1 -1
  270. package/components/IslandWidget/components/IslandWidgetHeaderDescription.js +1 -1
  271. package/components/IslandWidget/components/IslandWidgetHeaderTitle.js +1 -1
  272. package/components/IslandWidget/components/IslandWidgetWrapper.js +1 -1
  273. package/components/LightBox/LightBox.js +6 -5
  274. package/components/LightBox/LightBox.js.map +1 -1
  275. package/components/LightBox/LightBoxContent.js +1 -1
  276. package/components/LightBox/LightBoxControls/LightBoxArrow.js +1 -1
  277. package/components/LightBox/LightBoxControls/LightBoxClose.js +1 -1
  278. package/components/LightBox/LightBoxControls/LightBoxControls.js +1 -1
  279. package/components/LightBox/LightBoxControls/LightBoxNext.js +1 -1
  280. package/components/LightBox/LightBoxControls/LightBoxPrev.js +1 -1
  281. package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlay.js +12 -12
  282. package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayCloseDesktop.js +1 -1
  283. package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayCloseMobile.js +1 -1
  284. package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayLoader.js +1 -1
  285. package/components/LightBox/LightBoxSidebars/LightBoxLeftSidebar.js +3 -3
  286. package/components/LightBox/LightBoxSidebars/LightBoxRightSidebar.js +3 -3
  287. package/components/Link/Link.js +5 -5
  288. package/components/List/List.js +3 -3
  289. package/components/List/components/ListActionItem.js +1 -1
  290. package/components/List/components/ListEmptyState.js +1 -1
  291. package/components/List/components/ListItem.js +1 -1
  292. package/components/List/components/ListItemContent.js +4 -4
  293. package/components/List/components/ListItemControls.js +1 -1
  294. package/components/List/components/ListItemControlsButton.js +1 -1
  295. package/components/List/components/ListItemControlsButtonDropdown.js +1 -1
  296. package/components/List/components/ListItemLoading.js +1 -1
  297. package/components/List/components/ListItemSelectable.js +6 -6
  298. package/components/List/components/ListItemTailLeft.js +1 -1
  299. package/components/List/components/ListItemTailRight.js +1 -1
  300. package/components/List/components/ListSortableItem.js +2 -2
  301. package/components/List/components/ListSortableItemControls.js +1 -1
  302. package/components/List/components/ListSortableItemTarget.js +4 -4
  303. package/components/List/components/ListTableItem.js +3 -3
  304. package/components/List/index.js +1 -1
  305. package/components/ListMaster/ListMaster.js +1 -1
  306. package/components/ListMaster/components/ListMasterBody.js +1 -1
  307. package/components/ListMaster/components/ListMasterChipGroup.js +1 -1
  308. package/components/ListMaster/components/ListMasterFooter.js +1 -1
  309. package/components/ListMaster/components/ListMasterFooterControls.js +1 -1
  310. package/components/ListMaster/components/ListMasterFooterDescription.js +1 -1
  311. package/components/ListMaster/components/ListMasterHeader.js +2 -2
  312. package/components/ListMaster/components/SelectionControls.js +2 -2
  313. package/components/Loader/LoaderMiddle/LoaderMiddle.js +8 -8
  314. package/components/Loader/LoaderSmall/LoaderSmall.js +10 -10
  315. package/components/LoaderScreen/LoaderScreen.js +5 -5
  316. package/components/Marker/Marker.js +1 -1
  317. package/components/Marker/utils.js +1 -1
  318. package/components/MarkerStatus/MarkerStatus.js +7 -7
  319. package/components/ModalWindow/ModalWindow.js +1 -1
  320. package/components/ModalWindow/components/ModalWindowBody.js +1 -1
  321. package/components/ModalWindow/components/ModalWindowClose.js +1 -1
  322. package/components/ModalWindow/components/ModalWindowContent.js +1 -1
  323. package/components/ModalWindow/components/ModalWindowHeader.js +1 -1
  324. package/components/ModalWindow/components/ModalWindowViewManager.js +1 -1
  325. package/components/MonthYearField/MonthYearFieldTarget.js +4 -4
  326. package/components/MonthYearRange/MonthYearRange.js +3 -3
  327. package/components/MultiselectField/components/MultiselectFieldDropdown.js +1 -1
  328. package/components/MultiselectField/components/MultiselectFieldDropdownContent.js +5 -5
  329. package/components/MultiselectField/components/MultiselectFieldDropdownFooter.js +1 -1
  330. package/components/MultiselectField/components/MultiselectFieldDropdownHeader.js +1 -1
  331. package/components/Notification/Notification.js +2 -2
  332. package/components/Notification/NotificationGrouped.js +1 -1
  333. package/components/Notification/components/NotificationBody.js +1 -1
  334. package/components/Notification/components/NotificationBodyList.js +1 -1
  335. package/components/Notification/components/NotificationClose.js +1 -1
  336. package/components/Notification/components/NotificationFooter.js +1 -1
  337. package/components/Notification/components/NotificationGroupedFooter.js +1 -1
  338. package/components/Notification/components/NotificationHeader.js +1 -1
  339. package/components/Notification/components/NotificationIcon.js +1 -1
  340. package/components/Notification/components/NotificationTime.js +1 -1
  341. package/components/OrderedList/OrderedList.js +2 -2
  342. package/components/OrderedList/OrderedListItem.js +2 -2
  343. package/components/Overlay/Overlay.js +1 -1
  344. package/components/Overlay/OverlayBase.js +4 -0
  345. package/components/Overlay/OverlayBase.js.map +1 -1
  346. package/components/Overlay/OverlayMask.js +1 -1
  347. package/components/Overlay/OverlayPanel.js +1 -1
  348. package/components/Page/Page.js +1 -1
  349. package/components/Page/components/BodyPage.js +36 -9
  350. package/components/Page/components/BodyPage.js.map +1 -1
  351. package/components/Page/components/FooterPage.js +1 -1
  352. package/components/Page/components/HeaderPage.js +1 -1
  353. package/components/Page/components/enums.js +1 -0
  354. package/components/Page/components/enums.js.map +1 -1
  355. package/components/Pagination/Pagination.js +1 -1
  356. package/components/Pagination/Pagination.js.map +1 -1
  357. package/components/Pagination/components/PaginationExtended.js +2 -2
  358. package/components/Pagination/components/PaginationNavigation.js +4 -3
  359. package/components/Pagination/components/PaginationNavigation.js.map +1 -1
  360. package/components/Pagination/components/PaginationNavigationButton.js +2 -2
  361. package/components/Pagination/components/PaginationNavigationExtended.js +1 -1
  362. package/components/Pagination/components/PaginationPageButton.js +2 -2
  363. package/components/Pagination/components/PaginationPageEllipsis.js +1 -1
  364. package/components/Pagination/components/PaginationSelect.js +2 -2
  365. package/components/Radio/Radio.js +9 -9
  366. package/components/Radio/RadioXGroup.js +8 -8
  367. package/components/Radio/RadioYGroup.js +1 -1
  368. package/components/Row/Row.js +4 -4
  369. package/components/SMSField/SMSField.js +2 -2
  370. package/components/SMSField/components/RefreshIcon.js +1 -1
  371. package/components/SMSField/components/SMSFieldInput.js +1 -1
  372. package/components/SMSField/components/SMSFieldRefresh.js +1 -1
  373. package/components/SMSField/components/SMSFieldSubmit.js +1 -1
  374. package/components/SegmentedControl/SegmentedControl.js +9 -9
  375. package/components/SegmentedControl/SegmentedControlSegment.js +3 -3
  376. package/components/SelectExtendedField/SelectExtendedField.js +1 -1
  377. package/components/SelectExtendedField/components/SelectExtendedFieldDropdown.js +1 -1
  378. package/components/SelectExtendedField/components/SelectExtendedFieldDropdownDefault.js +1 -1
  379. package/components/SelectExtendedField/components/SelectExtendedFieldTarget.js +7 -7
  380. package/components/SelectField/SelectField.js +1 -1
  381. package/components/Skeleton/Skeleton.js +19 -11
  382. package/components/Skeleton/Skeleton.js.map +1 -1
  383. package/components/Skeleton/enums.js +3 -2
  384. package/components/Skeleton/enums.js.map +1 -1
  385. package/components/SliderExtended/SliderExtended.js +2 -2
  386. package/components/SliderExtended/components/SliderExtendedDot/SliderExtendedDot.js +5 -5
  387. package/components/SliderExtended/components/SliderExtendedMarks/SliderExtendedMark.js +1 -1
  388. package/components/SliderExtended/components/SliderExtendedMarks/SliderExtendedMarks.js +1 -1
  389. package/components/SliderExtended/components/SliderExtendedRail.js +1 -1
  390. package/components/SliderExtended/components/SliderExtendedTooltip/SliderExtendedTooltip.js +4 -4
  391. package/components/SliderExtended/components/SliderExtendedTrack/SliderExtendedTrack.js +6 -6
  392. package/components/SmallInput/SmallInput.js +1 -1
  393. package/components/Spoiler/Spoiler.js +10 -10
  394. package/components/StatusTracker/StatusTracker.js +2 -2
  395. package/components/StatusTracker/components/StatusTrackerAlert.js +1 -1
  396. package/components/StatusTracker/components/StatusTrackerBody.js +1 -1
  397. package/components/StatusTracker/components/StatusTrackerButton.js +1 -1
  398. package/components/StatusTracker/components/StatusTrackerDescription.js +1 -1
  399. package/components/StatusTracker/components/StatusTrackerFooter.js +1 -1
  400. package/components/StatusTracker/components/StatusTrackerHeader.js +1 -1
  401. package/components/StatusTracker/components/StatusTrackerMedia.js +1 -1
  402. package/components/StatusTracker/components/StatusTrackerStatus.js +1 -1
  403. package/components/StatusTracker/components/StatusTrackerStatusGroup.js +1 -1
  404. package/components/StatusTracker/components/StatusTrackerSum.js +1 -1
  405. package/components/StatusTracker/components/StatusTrackerTitle.js +1 -1
  406. package/components/Step/Step.js +10 -10
  407. package/components/Stepper/Stepper.js +8 -8
  408. package/components/Stepper/StepperExtended.js +1 -1
  409. package/components/Stepper/StepperStep.js +2 -2
  410. package/components/Stepper/StepperStepArrowBorder.js +1 -1
  411. package/components/Suggest/SuggestMobileDropdownContent.js +3 -3
  412. package/components/SuggestField/SuggestField.js +1 -1
  413. package/components/SuggestField/desktop/SuggestFieldDesktop.js +1 -1
  414. package/components/SuggestField/desktop/SuggestFieldDesktopDropdown.js +1 -1
  415. package/components/SuggestField/index.js +1 -1
  416. package/components/SuggestField/mobile/SuggestFieldMobile.js +1 -1
  417. package/components/SuggestField/mobile/SuggestFieldMobileDropdown.js +2 -2
  418. package/components/SuggestField/mobile/SuggestFieldMobileDropdownHint.js +1 -1
  419. package/components/SuggestField/mobile/index.js +1 -1
  420. package/components/SwipeableArea/SwipeableArea.js +8 -8
  421. package/components/Table/ChipPanel.js +1 -1
  422. package/components/Table/ChipPanelLinks.js +1 -1
  423. package/components/Table/FilterPanel.js +2 -2
  424. package/components/Table/MasterTable.js +2 -2
  425. package/components/Table/NoColumns.js +2 -2
  426. package/components/Table/PaginationPanel.js +2 -2
  427. package/components/Table/TableBasic/TableBasic.js +58 -58
  428. package/components/Table/TableBasic/TableBasic.js.map +1 -1
  429. package/components/Table/TableBasic/components/TableBasicBody.js +2 -3
  430. package/components/Table/TableBasic/components/TableBasicBody.js.map +1 -1
  431. package/components/Table/TableBasic/components/TableBasicHeader.js +48 -65
  432. package/components/Table/TableBasic/components/TableBasicHeader.js.map +1 -1
  433. package/components/Table/TableBasic/components/TableBasicRow.js +24 -27
  434. package/components/Table/TableBasic/components/TableBasicRow.js.map +1 -1
  435. package/components/Table/TableBasicSettings/TableBasicSettings.js +2 -2
  436. package/components/Table/TableBasicSettings/components/ColumnSettingsSortableListItemTarget.js +2 -2
  437. package/components/Table/TableBasicSettings/components/ColumnSettingsStaticListItem.js +1 -1
  438. package/components/Table/TableBasicSettings/components/TableBasicSettingsBody.js +1 -1
  439. package/components/Table/TableBasicSettings/components/TableBasicSettingsFooter.js +1 -1
  440. package/components/Table/TableBasicSettings/components/TableBasicSettingsHeader.js +1 -1
  441. package/components/Table/TableFooter/TableFooter.js +1 -1
  442. package/components/Table/TableFooter/components/TableFooterSummary.js +1 -1
  443. package/components/Table/TableFooter/components/TableFooterSummaryAmount.js +1 -1
  444. package/components/Table/TableFooter/components/TableFooterSummarySelectAllButton.js +1 -1
  445. package/components/Table/TableFooter/components/TableFooterSummarySelectedCount.js +1 -1
  446. package/components/Table/utils.js +1 -1
  447. package/components/Tabs/Tabs.js +25 -9
  448. package/components/Tabs/Tabs.js.map +1 -1
  449. package/components/TabsExtended/TabsExtended.js +2 -2
  450. package/components/TabsExtended/components/TabsExtendedContent.js +1 -1
  451. package/components/TabsExtended/components/TabsExtendedDropdownWrapper.js +1 -1
  452. package/components/TabsExtended/components/TabsExtendedTab.js +1 -1
  453. package/components/TabsExtended/components/TabsExtendedTabButton.js +1 -1
  454. package/components/TabsExtended/components/TabsExtendedTabsWrapper.js +1 -1
  455. package/components/TabsExtended/utils.js +1 -1
  456. package/components/TabsLine/TabsLine.js +1 -1
  457. package/components/TabsLine/components/TabsLineDesktop.js +1 -1
  458. package/components/TabsLine/components/TabsLineDropdown.js +2 -2
  459. package/components/TabsLine/components/TabsLineItem.js +1 -1
  460. package/components/TabsLine/components/TabsLineMobile.js +2 -2
  461. package/components/Tag/Tag.js +50 -55
  462. package/components/Tag/Tag.js.map +1 -1
  463. package/components/TagColor/TagColor.js +10 -10
  464. package/components/TagGroup/TagGroup.js +4 -4
  465. package/components/Tooltip/components/common/TooltipBody.js +1 -1
  466. package/components/Tooltip/components/common/TooltipLink.js +4 -4
  467. package/components/Tooltip/components/common/TooltipXButton.js +1 -1
  468. package/components/Tooltip/components/desktop/components/TooltipDesktopBase.js +1 -1
  469. package/components/Tooltip/components/desktop/components/TooltipDesktopTip.js +1 -1
  470. package/components/Tooltip/components/mobile/TooltipMobile.js +4 -4
  471. package/components/TopOverlay/TopOverlay.js +106 -97
  472. package/components/TopOverlay/TopOverlay.js.map +1 -1
  473. package/components/TopOverlay/utils.js +8 -0
  474. package/components/TopOverlay/utils.js.map +1 -0
  475. package/components/TreeView/TreeView.js +41 -16
  476. package/components/TreeView/TreeView.js.map +1 -1
  477. package/components/TreeView/TreeViewAbstractNodeUtils.js +30 -34
  478. package/components/TreeView/TreeViewAbstractNodeUtils.js.map +1 -1
  479. package/components/TreeView/TreeViewContext.js +0 -2
  480. package/components/TreeView/TreeViewContext.js.map +1 -1
  481. package/components/TreeView/components/TreeViewGroup.js +10 -2
  482. package/components/TreeView/components/TreeViewGroup.js.map +1 -1
  483. package/components/TreeView/components/TreeViewNode.js +8 -10
  484. package/components/TreeView/components/TreeViewNode.js.map +1 -1
  485. package/components/Typography/Caption.js +7 -7
  486. package/components/Typography/CodeText.js +2 -2
  487. package/components/Typography/Text.js +9 -9
  488. package/components/Typography/Title.js +9 -9
  489. package/components/Typography/constants.js +1 -1
  490. package/components/UnorderedListExtended/UnorderedListExtended.js +2 -2
  491. package/components/UnorderedListExtended/UnorderedListExtendedItem.js +2 -2
  492. package/components/UnorderedListExtended/UnorderedListExtendedItemMarker.js +3 -3
  493. package/components/UploadZone/UploadZone.js +2 -2
  494. package/components/UploadZone/components/UploadZoneInput.js +1 -1
  495. package/components/UploadZone/index.js +1 -1
  496. package/components/index.js +8 -24
  497. package/components/index.js.map +1 -1
  498. package/index.d.ts +168 -94
  499. package/index.js +8 -6
  500. package/index.js.map +1 -1
  501. package/package.json +1 -1
  502. package/styles/triplex-next.css +6294 -6160
  503. package/chunks/Card.module-CJKLM6En.js +0 -32
  504. package/chunks/Card.module-CJKLM6En.js.map +0 -1
  505. package/chunks/Carousel.module-g5TYfNRR.js +0 -30
  506. package/chunks/Carousel.module-g5TYfNRR.js.map +0 -1
  507. package/chunks/CheckboxTreeExtended.module-3Qs071eq.js +0 -24
  508. package/chunks/CheckboxTreeExtended.module-3Qs071eq.js.map +0 -1
  509. package/chunks/Confirm.module-fkOpZSTz.js +0 -24
  510. package/chunks/Confirm.module-fkOpZSTz.js.map +0 -1
  511. package/chunks/DropdownMobile.module-Ddqns0Cv.js +0 -40
  512. package/chunks/DropdownMobile.module-Ddqns0Cv.js.map +0 -1
  513. package/chunks/Footer.module-Drrxy-6W.js +0 -12
  514. package/chunks/Footer.module-Drrxy-6W.js.map +0 -1
  515. package/chunks/HeaderLayoutSidebar.module-Du7oNhcA.js.map +0 -1
  516. package/chunks/HeaderTabs.module-DuLER5cV.js +0 -12
  517. package/chunks/HeaderTabs.module-DuLER5cV.js.map +0 -1
  518. package/chunks/HeaderTitle.module-BpjoBzW6.js.map +0 -1
  519. package/chunks/ImageGalleryExtendedMain.module-DdtxKZVk.js +0 -28
  520. package/chunks/ImageGalleryExtendedMain.module-DdtxKZVk.js.map +0 -1
  521. package/chunks/IslandAccordion.module-BSKYPAWV.js +0 -44
  522. package/chunks/IslandAccordion.module-BSKYPAWV.js.map +0 -1
  523. package/chunks/IslandWidgetFooter.module-Iynlil69.js +0 -12
  524. package/chunks/IslandWidgetFooter.module-Iynlil69.js.map +0 -1
  525. package/chunks/IslandWidgetHeader.module-DhLpsPi3.js +0 -20
  526. package/chunks/IslandWidgetHeader.module-DhLpsPi3.js.map +0 -1
  527. package/chunks/LightBoxControls.module-DrWaO0Tw.js +0 -26
  528. package/chunks/LightBoxControls.module-DrWaO0Tw.js.map +0 -1
  529. package/chunks/LightBoxSideOverlayClose.module-B0uNmLho.js.map +0 -1
  530. package/chunks/ListItemTail.module-BJTp-HUl.js +0 -18
  531. package/chunks/ListItemTail.module-BJTp-HUl.js.map +0 -1
  532. package/chunks/ListMasterFooter.module-CPTuou5-.js +0 -14
  533. package/chunks/ListMasterFooter.module-CPTuou5-.js.map +0 -1
  534. package/chunks/ModalWindow.module-ClLy376h.js +0 -28
  535. package/chunks/ModalWindow.module-ClLy376h.js.map +0 -1
  536. package/chunks/Notification.module-DAhgj_4u.js +0 -34
  537. package/chunks/Notification.module-DAhgj_4u.js.map +0 -1
  538. package/chunks/Overlay.module-DstpCyQx.js +0 -30
  539. package/chunks/Overlay.module-DstpCyQx.js.map +0 -1
  540. package/chunks/Page.module-BlMfM_F-.js +0 -15
  541. package/chunks/Page.module-BlMfM_F-.js.map +0 -1
  542. package/chunks/SMSField.module-e3cgZTSU.js +0 -26
  543. package/chunks/SMSField.module-e3cgZTSU.js.map +0 -1
  544. package/chunks/SliderExtendedMarks.module-DpSsY-cL.js +0 -24
  545. package/chunks/SliderExtendedMarks.module-DpSsY-cL.js.map +0 -1
  546. package/chunks/StatusTracker.module-D4AWWtIs.js +0 -44
  547. package/chunks/StatusTracker.module-D4AWWtIs.js.map +0 -1
  548. package/chunks/TableFooter.module-BNzWbmoH.js +0 -22
  549. package/chunks/TableFooter.module-BNzWbmoH.js.map +0 -1
  550. package/chunks/TabsExtended.module-X9j6lOjE.js +0 -26
  551. package/chunks/TabsExtended.module-X9j6lOjE.js.map +0 -1
  552. package/chunks/TabsLine.module-ChL37SLq.js +0 -36
  553. package/chunks/TabsLine.module-ChL37SLq.js.map +0 -1
  554. package/chunks/TooltipDesktop.module-CnBq_TZS.js +0 -32
  555. package/chunks/TooltipDesktop.module-CnBq_TZS.js.map +0 -1
  556. package/chunks/TreeView.module-C5KrbQR8.js +0 -12
  557. package/chunks/TreeView.module-C5KrbQR8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TopOverlay.js","sources":["../../../src/components/TopOverlay/TopOverlay.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { FocusTrapExtended, IFocusTrapExtendedProps } from \"../FocusTrapExtended\";\nimport { Overlay, IOverlayProps } from \"../Overlay/Overlay\";\nimport { EOverlayDirection, IOverlayChildrenProvideProps } from \"../Overlay/OverlayBase\";\nimport styles from \"./styles/TopOverlay.module.less\";\n\n/** Свойства компонента TopOverlay. */\nexport interface ITopOverlayProps extends Pick<IOverlayProps, \"opened\" | \"onOpen\" | \"onClose\"> {\n children?: React.ReactNode;\n /** Свойства компонента FocusTrapExtended. */\n focusTrapProps?: IFocusTrapExtendedProps;\n}\n\nexport const TopOverlay: React.FC<ITopOverlayProps> = ({\n children,\n focusTrapProps,\n opened,\n onClose,\n onOpen,\n ...OverlayBaseProps\n}) => {\n // Флаг, в текущий момент оверлей закрывается.\n const [closing, setClosing] = useState(false);\n // FocusTrap активен.\n const [activeFocusTrap, setActiveFocusTrap] = useState(false);\n // Позиция top для lightBoxTopOverlayWrapper, высчитывается исходя из scrollTop родителя.\n const [overlayWrapperTopPosition, setOverlayWrapperTopPosition] = useState<number | string>(0);\n // Предыдущее состояние открыт/закрыт.\n const prevOpened = useRef(opened);\n // Ref контейнера.\n const overlayWrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Пересчет позиционирования оверлея. Бывает неверная позиция, например, при открытии во время скролла.\n const updateTopPosition = () => {\n // Перерасчет позиционирования оверлея, если он был открыт во время скролла родителя.\n if (overlayWrapperRef.current) {\n // Верхняя позиция LightBox.\n const lightBoxTopPosition =\n getComputedStyle(overlayWrapperRef.current).getPropertyValue(\"--lightBox-screen-top\") || \"0\";\n // Текущее положение оверлея.\n const position = overlayWrapperRef.current.getBoundingClientRect();\n // Оверлей расположен выше, чем нужно.\n if (position.top < 0) {\n setOverlayWrapperTopPosition(\n (overlayWrapperTopPositionPrev) =>\n parseInt(overlayWrapperTopPositionPrev as string, 10) +\n Math.abs(position.top) +\n parseInt(lightBoxTopPosition, 10),\n );\n } else {\n setOverlayWrapperTopPosition(\n // Оверлей расположен ниже, чем нужно.\n (overlayWrapperTopPositionPrev) =>\n parseInt(overlayWrapperTopPositionPrev as string, 10) -\n position.top +\n parseInt(lightBoxTopPosition, 10),\n );\n }\n }\n };\n\n const handleOpen = () => {\n updateTopPosition();\n setActiveFocusTrap(true);\n onOpen?.();\n };\n\n useEffect(() => {\n // Флаг opened поменялся на false.\n if (prevOpened.current && !opened) {\n setClosing(true);\n\n // Флаг opened поменялся на true.\n } else if (!prevOpened.current && opened) {\n updateTopPosition();\n }\n\n prevOpened.current = opened;\n }, [opened]);\n\n const handleClose = () => {\n setClosing(false);\n setOverlayWrapperTopPosition(0);\n onClose?.();\n };\n\n const handleClosing = () => setActiveFocusTrap(false);\n\n const renderOverlay = (overlayProps: IOverlayChildrenProvideProps) => (\n <>\n <Overlay.Mask opened={overlayProps.opened} className={styles.topOverlayMask} />\n <Overlay.Panel className={styles.topOverlayPanel} {...overlayProps}>\n {children}\n </Overlay.Panel>\n </>\n );\n\n const setOpened = () => {};\n\n const classNameOverlayWrapper = clsx(styles.topOverlayWrapper, {\n [styles.closing]: closing,\n [styles.opened]: opened,\n });\n\n return (\n <FocusTrapExtended\n active={activeFocusTrap}\n {...focusTrapProps}\n focusTrapOptions={{\n preventScroll: true,\n ...focusTrapProps?.focusTrapOptions,\n }}\n >\n <div\n className={classNameOverlayWrapper}\n ref={overlayWrapperRef}\n style={overlayWrapperTopPosition ? { top: `${overlayWrapperTopPosition}px` } : undefined}\n >\n <Overlay\n onClose={handleClose}\n onClosing={handleClosing}\n onOpen={handleOpen}\n opened={opened}\n setOpened={setOpened}\n {...OverlayBaseProps}\n className={styles.topOverlay}\n direction={EOverlayDirection.TOP}\n >\n {renderOverlay}\n </Overlay>\n </div>\n </FocusTrapExtended>\n );\n};\n"],"names":["opened","closing"],"mappings":";;;;;;;;;;;;;;;;;;;;AAcO,MAAM,aAAyC,CAAC;AAAA,EACnD;AAAA,EACA;AAAA,EACA,QAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AAEF,QAAM,CAACC,UAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAE5D,QAAM,CAAC,2BAA2B,4BAA4B,IAAI,SAA0B,CAAC;AAE7F,QAAM,aAAa,OAAOD,OAAM;AAEhC,QAAM,oBAAoB,OAA8B,IAAI;AAG5D,QAAM,oBAAoB,MAAM;AAE5B,QAAI,kBAAkB,SAAS;AAE3B,YAAM,sBACF,iBAAiB,kBAAkB,OAAO,EAAE,iBAAiB,uBAAuB,KAAK;AAE7F,YAAM,WAAW,kBAAkB,QAAQ,sBAAA;AAE3C,UAAI,SAAS,MAAM,GAAG;AAClB;AAAA,UACI,CAAC,kCACG,SAAS,+BAAyC,EAAE,IACpD,KAAK,IAAI,SAAS,GAAG,IACrB,SAAS,qBAAqB,EAAE;AAAA,QAAA;AAAA,MAE5C,OAAO;AACH;AAAA;AAAA,UAEI,CAAC,kCACG,SAAS,+BAAyC,EAAE,IACpD,SAAS,MACT,SAAS,qBAAqB,EAAE;AAAA,QAAA;AAAA,MAE5C;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,aAAa,MAAM;AACrB,sBAAA;AACA,uBAAmB,IAAI;AACvB;AAAA,EACJ;AAEA,YAAU,MAAM;AAEZ,QAAI,WAAW,WAAW,CAACA,SAAQ;AAC/B,iBAAW,IAAI;AAAA,IAGnB,WAAW,CAAC,WAAW,WAAWA,SAAQ;AACtC,wBAAA;AAAA,IACJ;AAEA,eAAW,UAAUA;AAAA,EACzB,GAAG,CAACA,OAAM,CAAC;AAEX,QAAM,cAAc,MAAM;AACtB,eAAW,KAAK;AAChB,iCAA6B,CAAC;AAC9B;AAAA,EACJ;AAEA,QAAM,gBAAgB,MAAM,mBAAmB,KAAK;AAEpD,QAAM,gBAAgB,CAAC,iBACnB,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,QAAQ,MAAR,EAAa,QAAQ,aAAa,QAAQ,WAAW,OAAO,gBAAgB;AAAA,IAC7E,oBAAC,QAAQ,OAAR,EAAc,WAAW,OAAO,iBAAkB,GAAG,cACjD,SAAA,CACL;AAAA,EAAA,GACJ;AAGJ,QAAM,YAAY,MAAM;AAAA,EAAC;AAEzB,QAAM,0BAA0B,KAAK,OAAO,mBAAmB;AAAA,IAC3D,CAAC,OAAO,OAAO,GAAGC;AAAA,IAClB,CAAC,OAAO,MAAM,GAAGD;AAAA,EAAA,CACpB;AAED,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,QAAQ;AAAA,MACP,GAAG;AAAA,MACJ,kBAAkB;AAAA,QACd,eAAe;AAAA,QACf,GAAG,iDAAgB;AAAA,MAAA;AAAA,MAGvB,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO,4BAA4B,EAAE,KAAK,GAAG,yBAAyB,SAAS;AAAA,UAE/E,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,QAAAA;AAAA,cACA;AAAA,cACC,GAAG;AAAA,cACJ,WAAW,OAAO;AAAA,cAClB,WAAW,kBAAkB;AAAA,cAE5B,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGZ;"}
1
+ {"version":3,"file":"TopOverlay.js","sources":["../../../src/components/TopOverlay/TopOverlay.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { FocusTrapExtended, IFocusTrapExtendedProps } from \"../FocusTrapExtended\";\nimport { Overlay, IOverlayProps } from \"../Overlay/Overlay\";\nimport { EOverlayDirection, IOverlayChildrenProvideProps } from \"../Overlay/OverlayBase\";\nimport { getLightBoxScreenTop, getNextTopPosition } from \"./utils\";\nimport styles from \"./styles/TopOverlay.module.less\";\n\n/** Свойства компонента TopOverlay. */\nexport interface ITopOverlayProps\n extends\n Pick<IOverlayProps, \"opened\" | \"onOpen\" | \"onClose\">,\n Omit<React.HTMLAttributes<HTMLDivElement>, \"children\" | \"onClose\"> {\n /** Содержимое верхней панели. */\n children?: React.ReactNode;\n /** Свойства компонента FocusTrapExtended. */\n focusTrapProps?: IFocusTrapExtendedProps;\n}\n\n/** Inline-стиль обёртки: рассчитанная позиция уходит в runtime-переменную, а не в свойство top. */\ninterface ITopOverlayWrapperStyle extends React.CSSProperties {\n \"--triplex-next-runtime-TopOverlay-Top\"?: string;\n}\n\n// Overlay требует setOpened, но TopOverlay полностью управляется свойством opened и наружу состояние не поднимает.\nconst noopSetOpened = () => {};\n\n/**\n * Верхняя панель поверх контента LightBox: затемняющая маска на всю ширину экрана и выезжающая сверху панель.\n * Открытием управляет свойство `opened`, на время открытия фокус удерживается внутри панели.\n */\nexport const TopOverlay = React.forwardRef<HTMLDivElement, ITopOverlayProps>(\n ({ children, className, focusTrapProps, opened, onClose, onOpen, style, ...htmlDivAttributes }, ref) => {\n // Флаг, в текущий момент оверлей закрывается.\n const [closing, setClosing] = useState(false);\n // FocusTrap активен.\n const [activeFocusTrap, setActiveFocusTrap] = useState(false);\n // Позиция top обёртки оверлея, высчитывается исходя из scrollTop родителя. undefined — ещё не рассчитана.\n const [overlayWrapperTopPosition, setOverlayWrapperTopPosition] = useState<number | undefined>(undefined);\n // Предыдущее состояние открыт/закрыт.\n const prevOpened = useRef(opened);\n // Флаг первого рендера. Отличает открытие на маунте от открытия переходом.\n const isFirstRender = useRef(true);\n // Ref контейнера.\n const overlayWrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Пересчет позиционирования оверлея. Бывает неверная позиция, например, при открытии во время скролла родителя.\n const updateTopPosition = () => {\n const overlayWrapper = overlayWrapperRef.current;\n\n if (!overlayWrapper) {\n return;\n }\n\n // Верхняя граница экрана LightBox.\n const lightBoxScreenTop = getLightBoxScreenTop(overlayWrapper);\n // Текущее положение оверлея во вьюпорте.\n const { top } = overlayWrapper.getBoundingClientRect();\n\n setOverlayWrapperTopPosition((topPosition) => getNextTopPosition(topPosition ?? 0, top, lightBoxScreenTop));\n };\n\n const handleOpen = () => {\n // При открытии на маунте позиция не пересчитывается: лайтбокс в этот момент ещё не на своём месте\n // (у него собственная анимация появления), а getBoundingClientRect учитывает transform родителей —\n // измерение дало бы смещение в никуда. Позиция остаётся заданной стилями, коррекция применяется\n // при следующем открытии переходом false → true.\n if (!isFirstRender.current) {\n updateTopPosition();\n }\n\n setActiveFocusTrap(true);\n onOpen?.();\n };\n\n useEffect(() => {\n isFirstRender.current = false;\n }, []);\n\n useEffect(() => {\n // Флаг opened поменялся на false.\n if (prevOpened.current && !opened) {\n setClosing(true);\n\n // Флаг opened поменялся на true.\n } else if (!prevOpened.current && opened) {\n updateTopPosition();\n }\n\n prevOpened.current = opened;\n }, [opened]);\n\n const handleClose = () => {\n setClosing(false);\n setOverlayWrapperTopPosition(undefined);\n onClose?.();\n };\n\n const handleClosing = () => setActiveFocusTrap(false);\n\n const setOverlayWrapperRef = (instance: HTMLDivElement | null) => {\n overlayWrapperRef.current = instance;\n\n if (typeof ref === \"function\") {\n ref(instance);\n } else if (ref) {\n ref.current = instance;\n }\n };\n\n const renderOverlay = (overlayProps: IOverlayChildrenProvideProps) => (\n <>\n <Overlay.Mask opened={overlayProps.opened} className={styles.topOverlayMask} />\n <Overlay.Panel className={styles.topOverlayPanel} {...overlayProps}>\n {children}\n </Overlay.Panel>\n </>\n );\n\n // Рассчитанная позиция публикуется runtime-переменной, которую читает .topOverlayWrapper в LESS: inline\n // styles в компонентах запрещены (docs/ai/codestyle.md). Ноль здесь такой же результат расчёта, как любой\n // другой, поэтому признак «не рассчитано» — undefined, а не 0.\n const wrapperStyle: ITopOverlayWrapperStyle | undefined =\n overlayWrapperTopPosition === undefined\n ? style\n : { ...style, \"--triplex-next-runtime-TopOverlay-Top\": `${overlayWrapperTopPosition}px` };\n\n const classNameOverlayWrapper = clsx(\n styles.topOverlayWrapper,\n {\n [styles.closing]: closing,\n [styles.opened]: opened,\n },\n className,\n );\n\n return (\n <FocusTrapExtended\n active={activeFocusTrap}\n {...focusTrapProps}\n focusTrapOptions={{\n preventScroll: true,\n ...focusTrapProps?.focusTrapOptions,\n }}\n >\n <div\n className={classNameOverlayWrapper}\n {...htmlDivAttributes}\n style={wrapperStyle}\n ref={setOverlayWrapperRef}\n >\n <Overlay\n onClose={handleClose}\n onClosing={handleClosing}\n onOpen={handleOpen}\n opened={opened}\n setOpened={noopSetOpened}\n className={styles.topOverlay}\n direction={EOverlayDirection.TOP}\n >\n {renderOverlay}\n </Overlay>\n </div>\n </FocusTrapExtended>\n );\n },\n);\n\nTopOverlay.displayName = \"TopOverlay\";\n"],"names":["React","opened","closing"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ const LIGHT_BOX_SCREEN_TOP_CSS_VAR = "--lightBox-screen-top";
2
+ const getLightBoxScreenTop = (element) => parseInt(getComputedStyle(element).getPropertyValue(LIGHT_BOX_SCREEN_TOP_CSS_VAR) || "0", 10);
3
+ const getNextTopPosition = (topPosition, elementTopPosition, lightBoxScreenTop) => Math.trunc(topPosition) - elementTopPosition + lightBoxScreenTop;
4
+ export {
5
+ getLightBoxScreenTop,
6
+ getNextTopPosition
7
+ };
8
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../src/components/TopOverlay/utils.ts"],"sourcesContent":["/** CSS-переменная LightBox с верхней границей его экрана. */\nconst LIGHT_BOX_SCREEN_TOP_CSS_VAR = \"--lightBox-screen-top\";\n\n/**\n * Читает верхнюю границу экрана LightBox из CSS-переменной элемента.\n * Возвращает 0, если переменная не задана (оверлей отрисован вне LightBox).\n */\nexport const getLightBoxScreenTop = (element: HTMLElement): number =>\n parseInt(getComputedStyle(element).getPropertyValue(LIGHT_BOX_SCREEN_TOP_CSS_VAR) || \"0\", 10);\n\n/**\n * Вычисляет новую позицию top обёртки оверлея.\n *\n * Обёртка позиционируется относительно родителя, поэтому её реальное положение во вьюпорте (`elementTopPosition`)\n * зависит от прокрутки родителя. Смещение считается инкрементально: к текущему `topPosition` добавляется разница\n * между желаемой верхней границей экрана LightBox и фактическим положением обёртки.\n *\n * Накопленное смещение усекается до целого перед каждым пересчётом — так же, как это делал `parseInt` до вынесения\n * формулы в отдельную функцию. Пересчёт при открытии происходит дважды, и без усечения второй проход дал бы\n * субпиксельный `top`, то есть сдвиг панели относительно прежнего поведения.\n *\n * @param topPosition Текущее смещение обёртки, px.\n * @param elementTopPosition Фактическая верхняя граница обёртки во вьюпорте (`getBoundingClientRect().top`), px.\n * @param lightBoxScreenTop Верхняя граница экрана LightBox, px.\n */\nexport const getNextTopPosition = (\n topPosition: number,\n elementTopPosition: number,\n lightBoxScreenTop: number,\n): number => Math.trunc(topPosition) - elementTopPosition + lightBoxScreenTop;\n"],"names":[],"mappings":"AACA,MAAM,+BAA+B;AAM9B,MAAM,uBAAuB,CAAC,YACjC,SAAS,iBAAiB,OAAO,EAAE,iBAAiB,4BAA4B,KAAK,KAAK,EAAE;AAiBzF,MAAM,qBAAqB,CAC9B,aACA,oBACA,sBACS,KAAK,MAAM,WAAW,IAAI,qBAAqB;"}
@@ -10,13 +10,21 @@ import { TreeViewAbstractNode } from "./TreeViewAbstractNode.js";
10
10
  import { TreeViewNode } from "./components/TreeViewNode.js";
11
11
  import { TreeViewGroup } from "./components/TreeViewGroup.js";
12
12
  import { c as clsx } from "../../chunks/vendor-D4wvHis9.js";
13
- import { s as styles } from "../../chunks/TreeView.module-C5KrbQR8.js";
13
+ import { s as styles } from "../../chunks/TreeView.module-CmItPF1_.js";
14
14
  const rootNodeId = "rootNode";
15
15
  class TreeView extends React__default.Component {
16
16
  constructor(props) {
17
17
  super(props);
18
18
  __publicField(this, "abstractRootNode");
19
- __publicField(this, "treeNode", null);
19
+ /** Глобальный слушатель keydown подписан. Он нужен только пока в дереве есть активная нода. */
20
+ __publicField(this, "keyDownListenerAttached", false);
21
+ /**
22
+ * Увеличивает счетчик обновлений абстрактного дерева.
23
+ * Значение попадает в контекст и сигнализирует дочерним нодам, что мутируемое дерево изменилось.
24
+ */
25
+ __publicField(this, "incrementUpdateCount", () => {
26
+ this.setState(({ updateCount }) => ({ updateCount: updateCount + 1 }));
27
+ });
20
28
  /**
21
29
  * Обработка изменения контекста.
22
30
  * Установка tabIndex={0} для первой ноды, и tabIndex={-1} для остальных.
@@ -34,34 +42,54 @@ class TreeView extends React__default.Component {
34
42
  }
35
43
  });
36
44
  if (isContextChanged) {
37
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
45
+ this.incrementUpdateCount();
38
46
  }
39
47
  });
40
48
  /** Добавляет ноду в родительскую ноду. */
41
49
  __publicField(this, "registerNode", (node, parentNode, prevNode, nextNode) => {
42
50
  parentNode.addChild(node, prevNode, nextNode);
43
51
  this.updateTabIndexNodes();
44
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
52
+ this.incrementUpdateCount();
45
53
  });
46
54
  /** Удаляет ноду из родительской ноды. */
47
55
  __publicField(this, "removeNode", (node) => {
48
56
  var _a;
49
57
  (_a = node.getParent()) == null ? void 0 : _a.removeChild(node);
50
58
  this.updateTabIndexNodes();
59
+ this.syncKeyDownListener();
60
+ this.incrementUpdateCount();
51
61
  });
52
62
  /** Установка флага активности ноды. */
53
63
  __publicField(this, "setActiveNode", (node, active) => {
54
64
  TreeViewAbstractNodeUtils.setActiveNode(node, this.abstractRootNode, active);
55
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
65
+ this.syncKeyDownListener();
66
+ this.incrementUpdateCount();
67
+ });
68
+ /**
69
+ * Подписывает и отписывает глобальный слушатель keydown по наличию активной ноды.
70
+ * Пока активной ноды нет, дерево не обрабатывает стрелки и не отменяет скролл страницы.
71
+ */
72
+ __publicField(this, "syncKeyDownListener", () => {
73
+ const hasActiveNode = Boolean(TreeViewAbstractNodeUtils.getActiveNode(this.abstractRootNode));
74
+ if (hasActiveNode && !this.keyDownListenerAttached) {
75
+ window.addEventListener("keydown", this.handleKeyDown);
76
+ this.keyDownListenerAttached = true;
77
+ } else if (!hasActiveNode && this.keyDownListenerAttached) {
78
+ this.detachKeyDownListener();
79
+ }
80
+ });
81
+ /** Отписывает глобальный слушатель keydown. */
82
+ __publicField(this, "detachKeyDownListener", () => {
83
+ window.removeEventListener("keydown", this.handleKeyDown);
84
+ this.keyDownListenerAttached = false;
56
85
  });
57
86
  /** Установка флага opened ноды. */
58
87
  __publicField(this, "setOpenedNode", (node, opened) => {
59
88
  node.setOpened(opened);
60
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
89
+ this.incrementUpdateCount();
61
90
  });
62
91
  /** Возвращает AbstractNode по id. */
63
92
  __publicField(this, "getNode", (nodeId) => TreeViewAbstractNodeUtils.getNode(nodeId, this.abstractRootNode));
64
- __publicField(this, "setTreeDOMNode", (DOMNode) => this.treeNode = DOMNode);
65
93
  /** Обработка нажатия на клавиш для навигации с клавиатуры. */
66
94
  __publicField(this, "handleKeyDown", (event) => {
67
95
  if (!TreeViewAbstractNodeUtils.getActiveNode(this.abstractRootNode)) {
@@ -69,24 +97,21 @@ class TreeView extends React__default.Component {
69
97
  }
70
98
  if (EVENT_KEY_CODES.ARROW_DOWN === event.keyCode) {
71
99
  TreeViewAbstractNodeUtils.setActiveNextNode(this.abstractRootNode);
72
- event.preventDefault();
73
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
74
100
  } else if (EVENT_KEY_CODES.ARROW_UP === event.keyCode) {
75
101
  TreeViewAbstractNodeUtils.setActivePrevNode(this.abstractRootNode);
76
- event.preventDefault();
77
- this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));
102
+ } else {
103
+ return;
78
104
  }
105
+ event.preventDefault();
106
+ this.incrementUpdateCount();
79
107
  });
80
108
  this.abstractRootNode = new TreeViewAbstractNode({ id: rootNodeId });
81
109
  this.state = {
82
110
  updateCount: 0
83
111
  };
84
112
  }
85
- componentDidMount() {
86
- window.addEventListener("keydown", this.handleKeyDown);
87
- }
88
113
  componentWillUnmount() {
89
- window.removeEventListener("keydown", this.handleKeyDown);
114
+ this.detachKeyDownListener();
90
115
  }
91
116
  render() {
92
117
  const { children, className, ...props } = this.props;
@@ -104,7 +129,7 @@ class TreeView extends React__default.Component {
104
129
  setOpenedNode: this.setOpenedNode,
105
130
  updateCount
106
131
  },
107
- children: /* @__PURE__ */ jsx("ul", { className: clsx(styles.treeView, className), role: "tree", ...props, ref: this.setTreeDOMNode, children })
132
+ children: /* @__PURE__ */ jsx("ul", { className: clsx(styles.treeView, className), ...props, role: "tree", children })
108
133
  }
109
134
  );
110
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreeView.js","sources":["../../../src/components/TreeView/TreeView.tsx"],"sourcesContent":["import { EVENT_KEY_CODES } from \"@sberbusiness/triplex-next/utils/keyboard\";\nimport React from \"react\";\nimport { TreeViewAbstractNodeUtils } from \"./TreeViewAbstractNodeUtils\";\nimport {\n TreeViewContext,\n TTreeViewContextGetNode,\n TTreeViewContextRegisterNode,\n TTreeViewContextRemoveNode,\n TTreeViewContextSetActiveNode,\n TTreeViewContextSetOpenedNode,\n} from \"./TreeViewContext\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\nimport { TreeViewNode } from \"./components/TreeViewNode\";\nimport { TreeViewGroup } from \"./components/TreeViewGroup\";\nimport clsx from \"clsx\";\nimport styles from \"./styles/TreeView.module.less\";\n\n/** Свойства TreeView. */\nexport interface ITreeViewProps extends React.HTMLAttributes<HTMLUListElement> {\n children: React.ReactNode;\n}\n\n/** Состояние TreeView. */\ninterface ITreeViewState {\n /**\n * Число обновлений абстрактного дерева.\n * Используется для индикации изменения дереве т.к. изменение мутируемого объекта rootNode не вызывает триггер изменения контекста.\n */\n updateCount: number;\n}\n\n/** Идентификатор первой ноды дерева. */\nconst rootNodeId = \"rootNode\";\n\n/**\n * Базовый компонент визуального дерева.\n * Добавляет нужную семантическую разметку.\n * Создает абстрактное дерево на основе текущего.\n * Устанавливает контекст для дочерних нод.\n * Реализует навигацию по дереву.\n *\n * Accessibility требования:\n * https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2a.html\n */\nexport class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {\n public static displayName = \"TreeView\";\n public static Node = TreeViewNode;\n public static Group = TreeViewGroup;\n\n private readonly abstractRootNode: TreeViewAbstractNode;\n private treeNode: HTMLUListElement | null = null;\n\n constructor(props: ITreeViewProps) {\n super(props);\n\n this.abstractRootNode = new TreeViewAbstractNode({ id: rootNodeId });\n\n this.state = {\n updateCount: 0,\n };\n }\n\n public componentDidMount(): void {\n window.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n\n public render(): JSX.Element {\n const { children, className, ...props } = this.props;\n const { updateCount } = this.state;\n\n return (\n <TreeViewContext.Provider\n value={{\n getNode: this.getNode,\n parentNode: this.abstractRootNode,\n registerNode: this.registerNode,\n removeNode: this.removeNode,\n rootNode: this.abstractRootNode,\n setActiveNode: this.setActiveNode,\n setOpenedNode: this.setOpenedNode,\n updateCount,\n }}\n >\n <ul className={clsx(styles.treeView, className)} role=\"tree\" {...props} ref={this.setTreeDOMNode}>\n {children}\n </ul>\n </TreeViewContext.Provider>\n );\n }\n\n /**\n * Обработка изменения контекста.\n * Установка tabIndex={0} для первой ноды, и tabIndex={-1} для остальных.\n */\n private updateTabIndexNodes = () => {\n // Ноды первого уровня вложенности.\n const firstLevelNodes = this.abstractRootNode.getChildren();\n let isContextChanged = false;\n\n firstLevelNodes.forEach((node, index) => {\n if (index === 0 && node.getTabIndex() !== 0) {\n node.setTabIndex(0);\n isContextChanged = true;\n } else if (index !== 0 && node.getTabIndex() === 0) {\n node.setTabIndex(-1);\n isContextChanged = true;\n }\n });\n\n if (isContextChanged) {\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n }\n };\n\n /** Добавляет ноду в родительскую ноду. */\n private registerNode: TTreeViewContextRegisterNode = (node, parentNode, prevNode, nextNode) => {\n parentNode.addChild(node, prevNode, nextNode);\n this.updateTabIndexNodes();\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n };\n\n /** Удаляет ноду из родительской ноды. */\n private removeNode: TTreeViewContextRemoveNode = (node) => {\n node.getParent()?.removeChild(node);\n this.updateTabIndexNodes();\n };\n\n /** Установка флага активности ноды. */\n private setActiveNode: TTreeViewContextSetActiveNode = (node, active) => {\n TreeViewAbstractNodeUtils.setActiveNode(node, this.abstractRootNode, active);\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n };\n\n /** Установка флага opened ноды. */\n private setOpenedNode: TTreeViewContextSetOpenedNode = (node, opened) => {\n node.setOpened(opened);\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n };\n\n /** Возвращает AbstractNode по id. */\n private getNode: TTreeViewContextGetNode = (nodeId) =>\n TreeViewAbstractNodeUtils.getNode(nodeId, this.abstractRootNode);\n\n private setTreeDOMNode = (DOMNode: HTMLUListElement) => (this.treeNode = DOMNode);\n\n /** Обработка нажатия на клавиш для навигации с клавиатуры. */\n private handleKeyDown = (event: KeyboardEvent) => {\n // Перемещение с клавиатуры активно, когда есть активная нода.\n if (!TreeViewAbstractNodeUtils.getActiveNode(this.abstractRootNode)) {\n return;\n }\n\n if (EVENT_KEY_CODES.ARROW_DOWN === event.keyCode) {\n // Устанавливает активность следующей ноды.\n TreeViewAbstractNodeUtils.setActiveNextNode(this.abstractRootNode);\n // Предотвращает скролл страницы.\n event.preventDefault();\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n } else if (EVENT_KEY_CODES.ARROW_UP === event.keyCode) {\n // Устанавливает активность предыдущей ноды.\n TreeViewAbstractNodeUtils.setActivePrevNode(this.abstractRootNode);\n // Предотвращает скролл страницы.\n event.preventDefault();\n this.setState(({ updateCount: prevCount }) => ({ updateCount: prevCount++ }));\n }\n };\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TreeView.js","sources":["../../../src/components/TreeView/TreeView.tsx"],"sourcesContent":["import { EVENT_KEY_CODES } from \"@sberbusiness/triplex-next/utils/keyboard\";\nimport React from \"react\";\nimport { TreeViewAbstractNodeUtils } from \"./TreeViewAbstractNodeUtils\";\nimport {\n TreeViewContext,\n TTreeViewContextGetNode,\n TTreeViewContextRegisterNode,\n TTreeViewContextRemoveNode,\n TTreeViewContextSetActiveNode,\n TTreeViewContextSetOpenedNode,\n} from \"./TreeViewContext\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\nimport { TreeViewNode } from \"./components/TreeViewNode\";\nimport { TreeViewGroup } from \"./components/TreeViewGroup\";\nimport clsx from \"clsx\";\nimport styles from \"./styles/TreeView.module.less\";\n\n/** Свойства TreeView. */\nexport interface ITreeViewProps extends React.HTMLAttributes<HTMLUListElement> {\n /** Ноды дерева — TreeView.Node (напрямую или через компоненты-обёртки над ним). */\n children: React.ReactNode;\n}\n\n/** Состояние TreeView. */\ninterface ITreeViewState {\n /**\n * Число обновлений абстрактного дерева.\n * Используется для индикации изменения дерева т.к. изменение мутируемого объекта rootNode не вызывает триггер изменения контекста.\n */\n updateCount: number;\n}\n\n/** Идентификатор первой ноды дерева. */\nconst rootNodeId = \"rootNode\";\n\n/**\n * Базовый компонент визуального дерева.\n * Добавляет нужную семантическую разметку.\n * Создает абстрактное дерево на основе текущего.\n * Устанавливает контекст для дочерних нод.\n * Реализует навигацию по дереву.\n *\n * Accessibility требования:\n * https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2a.html\n */\nexport class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {\n public static displayName = \"TreeView\";\n public static Node = TreeViewNode;\n public static Group = TreeViewGroup;\n\n private readonly abstractRootNode: TreeViewAbstractNode;\n /** Глобальный слушатель keydown подписан. Он нужен только пока в дереве есть активная нода. */\n private keyDownListenerAttached = false;\n\n constructor(props: ITreeViewProps) {\n super(props);\n\n this.abstractRootNode = new TreeViewAbstractNode({ id: rootNodeId });\n\n this.state = {\n updateCount: 0,\n };\n }\n\n public componentWillUnmount(): void {\n this.detachKeyDownListener();\n }\n\n public render(): JSX.Element {\n const { children, className, ...props } = this.props;\n const { updateCount } = this.state;\n\n return (\n <TreeViewContext.Provider\n value={{\n getNode: this.getNode,\n parentNode: this.abstractRootNode,\n registerNode: this.registerNode,\n removeNode: this.removeNode,\n rootNode: this.abstractRootNode,\n setActiveNode: this.setActiveNode,\n setOpenedNode: this.setOpenedNode,\n updateCount,\n }}\n >\n {/* role после {...props}: семантика дерева - контракт компонента, потребитель ее не переопределяет. */}\n <ul className={clsx(styles.treeView, className)} {...props} role=\"tree\">\n {children}\n </ul>\n </TreeViewContext.Provider>\n );\n }\n\n /**\n * Увеличивает счетчик обновлений абстрактного дерева.\n * Значение попадает в контекст и сигнализирует дочерним нодам, что мутируемое дерево изменилось.\n */\n private incrementUpdateCount = () => {\n this.setState(({ updateCount }) => ({ updateCount: updateCount + 1 }));\n };\n\n /**\n * Обработка изменения контекста.\n * Установка tabIndex={0} для первой ноды, и tabIndex={-1} для остальных.\n */\n private updateTabIndexNodes = () => {\n // Ноды первого уровня вложенности.\n const firstLevelNodes = this.abstractRootNode.getChildren();\n let isContextChanged = false;\n\n firstLevelNodes.forEach((node, index) => {\n if (index === 0 && node.getTabIndex() !== 0) {\n node.setTabIndex(0);\n isContextChanged = true;\n } else if (index !== 0 && node.getTabIndex() === 0) {\n node.setTabIndex(-1);\n isContextChanged = true;\n }\n });\n\n if (isContextChanged) {\n this.incrementUpdateCount();\n }\n };\n\n /** Добавляет ноду в родительскую ноду. */\n private registerNode: TTreeViewContextRegisterNode = (node, parentNode, prevNode, nextNode) => {\n parentNode.addChild(node, prevNode, nextNode);\n this.updateTabIndexNodes();\n this.incrementUpdateCount();\n };\n\n /** Удаляет ноду из родительской ноды. */\n private removeNode: TTreeViewContextRemoveNode = (node) => {\n node.getParent()?.removeChild(node);\n this.updateTabIndexNodes();\n // Удалена могла быть активная нода - тогда слушатель стрелок больше не нужен.\n this.syncKeyDownListener();\n // Соседние ноды должны перерисоваться: после удаления у них могли измениться hasChildNodes и isLastNode.\n this.incrementUpdateCount();\n };\n\n /** Установка флага активности ноды. */\n private setActiveNode: TTreeViewContextSetActiveNode = (node, active) => {\n TreeViewAbstractNodeUtils.setActiveNode(node, this.abstractRootNode, active);\n this.syncKeyDownListener();\n this.incrementUpdateCount();\n };\n\n /**\n * Подписывает и отписывает глобальный слушатель keydown по наличию активной ноды.\n * Пока активной ноды нет, дерево не обрабатывает стрелки и не отменяет скролл страницы.\n */\n private syncKeyDownListener = () => {\n const hasActiveNode = Boolean(TreeViewAbstractNodeUtils.getActiveNode(this.abstractRootNode));\n\n if (hasActiveNode && !this.keyDownListenerAttached) {\n window.addEventListener(\"keydown\", this.handleKeyDown);\n this.keyDownListenerAttached = true;\n } else if (!hasActiveNode && this.keyDownListenerAttached) {\n this.detachKeyDownListener();\n }\n };\n\n /** Отписывает глобальный слушатель keydown. */\n private detachKeyDownListener = () => {\n window.removeEventListener(\"keydown\", this.handleKeyDown);\n this.keyDownListenerAttached = false;\n };\n\n /** Установка флага opened ноды. */\n private setOpenedNode: TTreeViewContextSetOpenedNode = (node, opened) => {\n node.setOpened(opened);\n this.incrementUpdateCount();\n };\n\n /** Возвращает AbstractNode по id. */\n private getNode: TTreeViewContextGetNode = (nodeId) =>\n TreeViewAbstractNodeUtils.getNode(nodeId, this.abstractRootNode);\n\n /** Обработка нажатия на клавиш для навигации с клавиатуры. */\n private handleKeyDown = (event: KeyboardEvent) => {\n // Перемещение с клавиатуры активно, когда есть активная нода.\n if (!TreeViewAbstractNodeUtils.getActiveNode(this.abstractRootNode)) {\n return;\n }\n\n if (EVENT_KEY_CODES.ARROW_DOWN === event.keyCode) {\n // Устанавливает активность следующей ноды.\n TreeViewAbstractNodeUtils.setActiveNextNode(this.abstractRootNode);\n } else if (EVENT_KEY_CODES.ARROW_UP === event.keyCode) {\n // Устанавливает активность предыдущей ноды.\n TreeViewAbstractNodeUtils.setActivePrevNode(this.abstractRootNode);\n } else {\n return;\n }\n\n // Предотвращает скролл страницы.\n event.preventDefault();\n this.incrementUpdateCount();\n };\n}\n"],"names":["React"],"mappings":"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"}
@@ -1,4 +1,19 @@
1
1
  import { traverseAbstractTree } from "../AbstractTree/AbstractTreeNode.js";
2
+ const getLastChildNode = (node) => {
3
+ const children = node.getChildren();
4
+ return children[children.length - 1];
5
+ };
6
+ const getDeepestVisibleLastChildNode = (node) => {
7
+ let lastNode = node;
8
+ while (lastNode.getOpened() && lastNode.getChildren().length) {
9
+ lastNode = getLastChildNode(lastNode);
10
+ }
11
+ return lastNode;
12
+ };
13
+ const getNodeIndexInParent = (node, parentNodeChildren) => {
14
+ const index = parentNodeChildren.findIndex((n) => n.getId() === node.getId());
15
+ return index === -1 ? 0 : index;
16
+ };
2
17
  const TreeViewAbstractNodeUtils = {
3
18
  getActiveNode: (node) => {
4
19
  let activeNode;
@@ -43,17 +58,11 @@ const TreeViewAbstractNodeUtils = {
43
58
  return void 0;
44
59
  }
45
60
  const parentNodeChildren = parentNode.getChildren();
46
- let currentActiveNodeIndex = 0;
47
- parentNodeChildren.some((n, index) => {
48
- if (n.getId() === node.getId()) {
49
- currentActiveNodeIndex = index;
50
- return true;
51
- }
52
- });
53
- if (currentActiveNodeIndex === parentNodeChildren.length - 1) {
61
+ const currentNodeIndex = getNodeIndexInParent(node, parentNodeChildren);
62
+ if (currentNodeIndex === parentNodeChildren.length - 1) {
54
63
  return void 0;
55
64
  }
56
- return parentNodeChildren[currentActiveNodeIndex + 1];
65
+ return parentNodeChildren[currentNodeIndex + 1];
57
66
  },
58
67
  getNode: (nodeId, rootNode) => {
59
68
  let result;
@@ -73,23 +82,10 @@ const TreeViewAbstractNodeUtils = {
73
82
  if (parentNode.getParent()) {
74
83
  return parentNode;
75
84
  } else {
76
- let lastChild = parentNode.getChildren()[parentNode.getChildren().length - 1];
77
- while (lastChild.getChildren().length > 0) {
78
- lastChild = lastChild.getChildren()[lastChild.getChildren().length - 1];
79
- }
80
- return lastChild;
85
+ return getDeepestVisibleLastChildNode(getLastChildNode(parentNode));
81
86
  }
82
87
  }
83
- let prevNode = prevSiblingNode;
84
- while (true) {
85
- const prevNodeChildren = prevNode.getChildren();
86
- if (prevNode.getOpened() && prevNodeChildren.length) {
87
- prevNode = prevNode.getChildren()[prevNode.getChildren().length - 1];
88
- } else {
89
- break;
90
- }
91
- }
92
- return prevNode;
88
+ return getDeepestVisibleLastChildNode(prevSiblingNode);
93
89
  },
94
90
  getPrevSiblingNode: (node) => {
95
91
  const parentNode = node.getParent();
@@ -97,22 +93,16 @@ const TreeViewAbstractNodeUtils = {
97
93
  return void 0;
98
94
  }
99
95
  const parentNodeChildren = parentNode.getChildren();
100
- let currentActiveNodeIndex = 0;
101
- parentNodeChildren.some((n, index) => {
102
- if (n.getId() === node.getId()) {
103
- currentActiveNodeIndex = index;
104
- return true;
105
- }
106
- });
107
- if (currentActiveNodeIndex === 0) {
96
+ const currentNodeIndex = getNodeIndexInParent(node, parentNodeChildren);
97
+ if (currentNodeIndex === 0) {
108
98
  return void 0;
109
99
  }
110
- return parentNodeChildren[currentActiveNodeIndex - 1];
100
+ return parentNodeChildren[currentNodeIndex - 1];
111
101
  },
112
102
  isLastNode: (node) => {
113
103
  const parentNode = node.getParent();
114
104
  if (parentNode) {
115
- if (parentNode.getChildren()[parentNode.getChildren().length - 1] == node) {
105
+ if (getLastChildNode(parentNode) === node) {
116
106
  return TreeViewAbstractNodeUtils.isLastNode(parentNode);
117
107
  }
118
108
  } else {
@@ -138,6 +128,12 @@ const TreeViewAbstractNodeUtils = {
138
128
  });
139
129
  } else {
140
130
  node.setActive(false);
131
+ traverseAbstractTree(rootNode, (n) => {
132
+ if (n.getActive()) {
133
+ n.setActive(false);
134
+ }
135
+ return true;
136
+ });
141
137
  }
142
138
  },
143
139
  setActivePrevNode: (rootNode) => {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeViewAbstractNodeUtils.js","sources":["../../../src/components/TreeView/TreeViewAbstractNodeUtils.ts"],"sourcesContent":["import { traverseAbstractTree } from \"../AbstractTree/AbstractTreeNode\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\n\n/** Утилиты для работы с AbstractNode. */\ninterface ITreeViewAbstractNodeUtils {\n // Возвращает активную ноду в случае ее наличия.\n getActiveNode: (node: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n // Возвращает следующую ноду текущего уровня. Если prevNode имеет дочерние ноды, и prevNode.getOpened() === true будет возвращена первая дочерняя нода. Если prevNode - последняя нода текущего уровня, будет возвращена следующая нода\n // верхнего уровня. Если верхний уровень - rootNode, будет возвращена первая дочерняя нода rootNode.\n getNextNode: (prevNode: TreeViewAbstractNode) => TreeViewAbstractNode;\n // Возвращает следующую ноду ткущего уровня. Если prevNode - последняя нода, будет возвращено undefined.\n getNextSiblingNode: (prevNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n // Возвращает AbstractNode по id.\n getNode: (nodeId: string, rootNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n // Возвращает предыдущую ноду текущего уровня дерева. Если предыдущая нода имеет детей и она раскрыта, будет возвращена последняя ее дочерняя нода. Если nextNode - первая нода, будет возвращена родительская нода. Если верхний\n // уровень - rootNode, будет возвращена последняя дочерняя нода rootNode.\n getPrevNode: (nextNode: TreeViewAbstractNode) => TreeViewAbstractNode;\n // Возвращает предыдущую ноду текущего уровня дерева. В случае если nextNode - первая нода, будет возвращено undefined.\n getPrevSiblingNode: (nextNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n // Возвращает true если нода - последняя в дереве.\n isLastNode: (node: TreeViewAbstractNode) => boolean;\n // Устанавливает флаг активности AbstractNode для следующей ноды дерева. Если нода раскрыта, будет активна первая дочерняя нода, если нода закрыта - будет активирована следующая нода этого же уровня.\n setActiveNextNode: (rootNode: TreeViewAbstractNode) => void;\n // Устанавливает флаг активности AbstractNode.\n setActiveNode: (node: TreeViewAbstractNode, rootNode: TreeViewAbstractNode, isActive: boolean) => void;\n // Устанавливает флаг активности AbstractNode для предыдущей ноды дерева.\n setActivePrevNode: (rootNode: TreeViewAbstractNode) => void;\n}\n\n/** Утилиты для работы с AbstractNode. */\nexport const TreeViewAbstractNodeUtils: ITreeViewAbstractNodeUtils = {\n getActiveNode: (node) => {\n let activeNode: TreeViewAbstractNode | undefined;\n\n traverseAbstractTree(node, (n) => {\n if (n.getActive()) {\n activeNode = n;\n // Прервать обход дерева.\n return false;\n }\n\n // Продолжить обход дерева.\n return true;\n });\n\n return activeNode;\n },\n getNextNode: (node) => {\n const childrenNodes = node.getChildren();\n // Нода раскрыта и имеются дочерние ноды: следующей нодой будет первая дочерняя нода.\n if (node.getOpened() && childrenNodes.length) {\n return childrenNodes[0];\n }\n\n const nextSiblingNode = TreeViewAbstractNodeUtils.getNextSiblingNode(node);\n // Найдена следующая нода текущего уровня вложенности.\n if (nextSiblingNode) {\n return nextSiblingNode;\n }\n\n let nextNode = node;\n\n while (true) {\n // as TreeViewAbstractNode потому что .getParent() может вернуть null только для rootNode, prevNode не может быть rootNode.\n const parentNode = nextNode.getParent() as TreeViewAbstractNode;\n\n if (parentNode.getParent()) {\n const nextSiblingParenNode = TreeViewAbstractNodeUtils.getNextSiblingNode(parentNode);\n // Найдена следующая нода верхнего уровня вложенности.\n if (nextSiblingParenNode) {\n nextNode = nextSiblingParenNode;\n break;\n }\n }\n // Если parentNode является rootNode.\n else {\n // Следующая нода - первая нода дерева.\n nextNode = parentNode.getChildren()[0];\n break;\n }\n\n nextNode = parentNode;\n }\n\n return nextNode;\n },\n getNextSiblingNode: (node) => {\n const parentNode = node.getParent();\n // node является rootNode.\n if (!parentNode) {\n return undefined;\n }\n\n const parentNodeChildren = parentNode.getChildren();\n // Индекс текущей активной ноды в parentNodeChildren.\n let currentActiveNodeIndex = 0;\n // Поиск индекса текущей активной ноды в parentNodeChildren.\n parentNodeChildren.some((n, index) => {\n if (n.getId() === node.getId()) {\n currentActiveNodeIndex = index;\n return true;\n }\n });\n\n // Текущая активная нода - последняя.\n if (currentActiveNodeIndex === parentNodeChildren.length - 1) {\n return undefined;\n }\n\n // Возвращается следующая нода.\n return parentNodeChildren[currentActiveNodeIndex + 1];\n },\n getNode: (nodeId, rootNode) => {\n let result;\n traverseAbstractTree(rootNode, (node) => {\n if (node.getId() === nodeId) {\n result = node;\n // Прервать обход дерева.\n return false;\n }\n // Продолжить обход дерева.\n return true;\n });\n\n return result;\n },\n getPrevNode: (node) => {\n const prevSiblingNode = TreeViewAbstractNodeUtils.getPrevSiblingNode(node);\n\n // Предыдущая нода текущего уровня вложенности не найдена.\n if (!prevSiblingNode) {\n // as TreeViewAbstractNode потому что .getParent() может вернуть null только для rootNode, nextNode не может быть rootNode.\n const parentNode = node.getParent() as TreeViewAbstractNode;\n\n if (parentNode.getParent()) {\n return parentNode;\n }\n // Если patentNode является rootNode.\n else {\n let lastChild = parentNode.getChildren()[parentNode.getChildren().length - 1];\n\n while (lastChild.getChildren().length > 0) {\n lastChild = lastChild.getChildren()[lastChild.getChildren().length - 1];\n }\n // Предыдущая нода - последняя нода дерева.\n return lastChild;\n }\n }\n\n let prevNode = prevSiblingNode;\n\n while (true) {\n const prevNodeChildren = prevNode.getChildren();\n // Предыдущая нода раскрыта и имеет дочерние ноды. Предыдущей станет последняя ее дочерняя нода.\n if (prevNode.getOpened() && prevNodeChildren.length) {\n prevNode = prevNode.getChildren()[prevNode.getChildren().length - 1];\n } else {\n break;\n }\n }\n\n return prevNode;\n },\n getPrevSiblingNode: (node) => {\n const parentNode = node.getParent();\n // node является rootNode.\n if (!parentNode) {\n return undefined;\n }\n\n const parentNodeChildren = parentNode.getChildren();\n // Индекс текущей активной ноды в массиве parentNode.getChildren().\n let currentActiveNodeIndex = 0;\n // Поиск индекса текущей активной ноды в массиве parentNode.getChildren().\n parentNodeChildren.some((n, index) => {\n if (n.getId() === node.getId()) {\n currentActiveNodeIndex = index;\n return true;\n }\n });\n\n // Текущая активная нода - первая.\n if (currentActiveNodeIndex === 0) {\n return undefined;\n }\n\n // Возвращается предыдущая нода.\n return parentNodeChildren[currentActiveNodeIndex - 1];\n },\n isLastNode: (node) => {\n const parentNode = node.getParent();\n\n if (parentNode) {\n // Если нода является последней на текущем уровне.\n if (parentNode.getChildren()[parentNode.getChildren().length - 1] == node) {\n return TreeViewAbstractNodeUtils.isLastNode(parentNode);\n }\n }\n // node является rootNode.\n else {\n return true;\n }\n\n return false;\n },\n setActiveNextNode: (rootNode) => {\n const activeNode = TreeViewAbstractNodeUtils.getActiveNode(rootNode);\n\n if (activeNode) {\n const nextNode = TreeViewAbstractNodeUtils.getNextNode(activeNode);\n\n TreeViewAbstractNodeUtils.setActiveNode(nextNode, rootNode, true);\n }\n },\n setActiveNode: (node, rootNode, isActive) => {\n if (isActive) {\n node.setActive(true);\n\n traverseAbstractTree(rootNode, (n) => {\n if (n.getActive() && n.getId() !== node.getId()) {\n // Сброс флага активности всех других нод, активная может быть только одна нода.\n n.setActive(false);\n }\n\n // Продолжить обход дерева.\n return true;\n });\n } else {\n node.setActive(false);\n }\n },\n setActivePrevNode: (rootNode) => {\n const activeNode = TreeViewAbstractNodeUtils.getActiveNode(rootNode);\n\n if (activeNode) {\n const prevNode = TreeViewAbstractNodeUtils.getPrevNode(activeNode);\n\n TreeViewAbstractNodeUtils.setActiveNode(prevNode, rootNode, true);\n }\n },\n};\n"],"names":[],"mappings":";AA8BO,MAAM,4BAAwD;AAAA,EACjE,eAAe,CAAC,SAAS;AACrB,QAAI;AAEJ,yBAAqB,MAAM,CAAC,MAAM;AAC9B,UAAI,EAAE,aAAa;AACf,qBAAa;AAEb,eAAO;AAAA,MACX;AAGA,aAAO;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,aAAa,CAAC,SAAS;AACnB,UAAM,gBAAgB,KAAK,YAAA;AAE3B,QAAI,KAAK,eAAe,cAAc,QAAQ;AAC1C,aAAO,cAAc,CAAC;AAAA,IAC1B;AAEA,UAAM,kBAAkB,0BAA0B,mBAAmB,IAAI;AAEzE,QAAI,iBAAiB;AACjB,aAAO;AAAA,IACX;AAEA,QAAI,WAAW;AAEf,WAAO,MAAM;AAET,YAAM,aAAa,SAAS,UAAA;AAE5B,UAAI,WAAW,aAAa;AACxB,cAAM,uBAAuB,0BAA0B,mBAAmB,UAAU;AAEpF,YAAI,sBAAsB;AACtB,qBAAW;AACX;AAAA,QACJ;AAAA,MACJ,OAEK;AAED,mBAAW,WAAW,YAAA,EAAc,CAAC;AACrC;AAAA,MACJ;AAEA,iBAAW;AAAA,IACf;AAEA,WAAO;AAAA,EACX;AAAA,EACA,oBAAoB,CAAC,SAAS;AAC1B,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,CAAC,YAAY;AACb,aAAO;AAAA,IACX;AAEA,UAAM,qBAAqB,WAAW,YAAA;AAEtC,QAAI,yBAAyB;AAE7B,uBAAmB,KAAK,CAAC,GAAG,UAAU;AAClC,UAAI,EAAE,MAAA,MAAY,KAAK,SAAS;AAC5B,iCAAyB;AACzB,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAGD,QAAI,2BAA2B,mBAAmB,SAAS,GAAG;AAC1D,aAAO;AAAA,IACX;AAGA,WAAO,mBAAmB,yBAAyB,CAAC;AAAA,EACxD;AAAA,EACA,SAAS,CAAC,QAAQ,aAAa;AAC3B,QAAI;AACJ,yBAAqB,UAAU,CAAC,SAAS;AACrC,UAAI,KAAK,MAAA,MAAY,QAAQ;AACzB,iBAAS;AAET,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,aAAa,CAAC,SAAS;AACnB,UAAM,kBAAkB,0BAA0B,mBAAmB,IAAI;AAGzE,QAAI,CAAC,iBAAiB;AAElB,YAAM,aAAa,KAAK,UAAA;AAExB,UAAI,WAAW,aAAa;AACxB,eAAO;AAAA,MACX,OAEK;AACD,YAAI,YAAY,WAAW,YAAA,EAAc,WAAW,YAAA,EAAc,SAAS,CAAC;AAE5E,eAAO,UAAU,cAAc,SAAS,GAAG;AACvC,sBAAY,UAAU,YAAA,EAAc,UAAU,YAAA,EAAc,SAAS,CAAC;AAAA,QAC1E;AAEA,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,QAAI,WAAW;AAEf,WAAO,MAAM;AACT,YAAM,mBAAmB,SAAS,YAAA;AAElC,UAAI,SAAS,eAAe,iBAAiB,QAAQ;AACjD,mBAAW,SAAS,YAAA,EAAc,SAAS,YAAA,EAAc,SAAS,CAAC;AAAA,MACvE,OAAO;AACH;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EACA,oBAAoB,CAAC,SAAS;AAC1B,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,CAAC,YAAY;AACb,aAAO;AAAA,IACX;AAEA,UAAM,qBAAqB,WAAW,YAAA;AAEtC,QAAI,yBAAyB;AAE7B,uBAAmB,KAAK,CAAC,GAAG,UAAU;AAClC,UAAI,EAAE,MAAA,MAAY,KAAK,SAAS;AAC5B,iCAAyB;AACzB,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAGD,QAAI,2BAA2B,GAAG;AAC9B,aAAO;AAAA,IACX;AAGA,WAAO,mBAAmB,yBAAyB,CAAC;AAAA,EACxD;AAAA,EACA,YAAY,CAAC,SAAS;AAClB,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,YAAY;AAEZ,UAAI,WAAW,cAAc,WAAW,cAAc,SAAS,CAAC,KAAK,MAAM;AACvE,eAAO,0BAA0B,WAAW,UAAU;AAAA,MAC1D;AAAA,IACJ,OAEK;AACD,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,CAAC,aAAa;AAC7B,UAAM,aAAa,0BAA0B,cAAc,QAAQ;AAEnE,QAAI,YAAY;AACZ,YAAM,WAAW,0BAA0B,YAAY,UAAU;AAEjE,gCAA0B,cAAc,UAAU,UAAU,IAAI;AAAA,IACpE;AAAA,EACJ;AAAA,EACA,eAAe,CAAC,MAAM,UAAU,aAAa;AACzC,QAAI,UAAU;AACV,WAAK,UAAU,IAAI;AAEnB,2BAAqB,UAAU,CAAC,MAAM;AAClC,YAAI,EAAE,eAAe,EAAE,YAAY,KAAK,SAAS;AAE7C,YAAE,UAAU,KAAK;AAAA,QACrB;AAGA,eAAO;AAAA,MACX,CAAC;AAAA,IACL,OAAO;AACH,WAAK,UAAU,KAAK;AAAA,IACxB;AAAA,EACJ;AAAA,EACA,mBAAmB,CAAC,aAAa;AAC7B,UAAM,aAAa,0BAA0B,cAAc,QAAQ;AAEnE,QAAI,YAAY;AACZ,YAAM,WAAW,0BAA0B,YAAY,UAAU;AAEjE,gCAA0B,cAAc,UAAU,UAAU,IAAI;AAAA,IACpE;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"TreeViewAbstractNodeUtils.js","sources":["../../../src/components/TreeView/TreeViewAbstractNodeUtils.ts"],"sourcesContent":["import { traverseAbstractTree } from \"../AbstractTree/AbstractTreeNode\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\n\n/** Утилиты для работы с AbstractNode. */\ninterface ITreeViewAbstractNodeUtils {\n /** Возвращает активную ноду в случае ее наличия. */\n getActiveNode: (node: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n /**\n * Возвращает следующую ноду текущего уровня. Если prevNode имеет дочерние ноды, и prevNode.getOpened() === true будет\n * возвращена первая дочерняя нода. Если prevNode - последняя нода текущего уровня, будет возвращена следующая нода\n * верхнего уровня. Если верхний уровень - rootNode, будет возвращена первая дочерняя нода rootNode.\n */\n getNextNode: (prevNode: TreeViewAbstractNode) => TreeViewAbstractNode;\n /** Возвращает следующую ноду текущего уровня. Если prevNode - последняя нода, будет возвращено undefined. */\n getNextSiblingNode: (prevNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n /** Возвращает AbstractNode по id. */\n getNode: (nodeId: string, rootNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n /**\n * Возвращает предыдущую ноду текущего уровня дерева. Если предыдущая нода имеет детей и она раскрыта, будет возвращена\n * последняя ее дочерняя нода. Если nextNode - первая нода, будет возвращена родительская нода. Если верхний\n * уровень - rootNode, будет возвращена последняя видимая нода дерева - ноды внутри свернутых веток пропускаются.\n */\n getPrevNode: (nextNode: TreeViewAbstractNode) => TreeViewAbstractNode;\n /** Возвращает предыдущую ноду текущего уровня дерева. В случае если nextNode - первая нода, будет возвращено undefined. */\n getPrevSiblingNode: (nextNode: TreeViewAbstractNode) => TreeViewAbstractNode | undefined;\n /** Возвращает true если нода - последняя в дереве. */\n isLastNode: (node: TreeViewAbstractNode) => boolean;\n /**\n * Устанавливает флаг активности AbstractNode для следующей ноды дерева. Если нода раскрыта, будет активна первая\n * дочерняя нода, если нода закрыта - будет активирована следующая нода этого же уровня.\n */\n setActiveNextNode: (rootNode: TreeViewAbstractNode) => void;\n /** Устанавливает флаг активности AbstractNode. */\n setActiveNode: (node: TreeViewAbstractNode, rootNode: TreeViewAbstractNode, isActive: boolean) => void;\n /** Устанавливает флаг активности AbstractNode для предыдущей ноды дерева. */\n setActivePrevNode: (rootNode: TreeViewAbstractNode) => void;\n}\n\n/** Возвращает последнюю дочернюю ноду. Вызывается только для нод, у которых есть дочерние ноды. */\nconst getLastChildNode = (node: TreeViewAbstractNode): TreeViewAbstractNode => {\n const children = node.getChildren();\n\n return children[children.length - 1];\n};\n\n/**\n * Спускается от ноды к последней видимой дочерней ноде: пока нода раскрыта и имеет детей,\n * переходит к последнему ребенку. Ноды внутри свернутых веток пропускаются.\n */\nconst getDeepestVisibleLastChildNode = (node: TreeViewAbstractNode): TreeViewAbstractNode => {\n let lastNode = node;\n\n while (lastNode.getOpened() && lastNode.getChildren().length) {\n lastNode = getLastChildNode(lastNode);\n }\n\n return lastNode;\n};\n\n/**\n * Возвращает индекс ноды среди дочерних нод родителя.\n * Если нода среди них не найдена, возвращает 0 - нода трактуется как первая.\n */\nconst getNodeIndexInParent = (node: TreeViewAbstractNode, parentNodeChildren: TreeViewAbstractNode[]): number => {\n const index = parentNodeChildren.findIndex((n) => n.getId() === node.getId());\n\n return index === -1 ? 0 : index;\n};\n\n/** Утилиты для работы с AbstractNode. */\nexport const TreeViewAbstractNodeUtils: ITreeViewAbstractNodeUtils = {\n getActiveNode: (node) => {\n let activeNode: TreeViewAbstractNode | undefined;\n\n traverseAbstractTree(node, (n) => {\n if (n.getActive()) {\n activeNode = n;\n // Не углубляться в дочерние ноды.\n return false;\n }\n\n // Продолжить обход дерева.\n return true;\n });\n\n return activeNode;\n },\n getNextNode: (node) => {\n const childrenNodes = node.getChildren();\n // Нода раскрыта и имеются дочерние ноды: следующей нодой будет первая дочерняя нода.\n if (node.getOpened() && childrenNodes.length) {\n return childrenNodes[0];\n }\n\n const nextSiblingNode = TreeViewAbstractNodeUtils.getNextSiblingNode(node);\n // Найдена следующая нода текущего уровня вложенности.\n if (nextSiblingNode) {\n return nextSiblingNode;\n }\n\n let nextNode = node;\n\n while (true) {\n // as TreeViewAbstractNode потому что .getParent() может вернуть null только для rootNode, prevNode не может быть rootNode.\n const parentNode = nextNode.getParent() as TreeViewAbstractNode;\n\n if (parentNode.getParent()) {\n const nextSiblingParenNode = TreeViewAbstractNodeUtils.getNextSiblingNode(parentNode);\n // Найдена следующая нода верхнего уровня вложенности.\n if (nextSiblingParenNode) {\n nextNode = nextSiblingParenNode;\n break;\n }\n }\n // Если parentNode является rootNode.\n else {\n // Следующая нода - первая нода дерева.\n nextNode = parentNode.getChildren()[0];\n break;\n }\n\n nextNode = parentNode;\n }\n\n return nextNode;\n },\n getNextSiblingNode: (node) => {\n const parentNode = node.getParent();\n // node является rootNode.\n if (!parentNode) {\n return undefined;\n }\n\n const parentNodeChildren = parentNode.getChildren();\n // Индекс текущей ноды среди дочерних нод родителя.\n const currentNodeIndex = getNodeIndexInParent(node, parentNodeChildren);\n\n // Текущая нода - последняя.\n if (currentNodeIndex === parentNodeChildren.length - 1) {\n return undefined;\n }\n\n // Возвращается следующая нода.\n return parentNodeChildren[currentNodeIndex + 1];\n },\n getNode: (nodeId, rootNode) => {\n let result: TreeViewAbstractNode | undefined;\n\n traverseAbstractTree(rootNode, (node) => {\n if (node.getId() === nodeId) {\n result = node;\n // Не углубляться в дочерние ноды.\n return false;\n }\n\n // Продолжить обход дерева.\n return true;\n });\n\n return result;\n },\n getPrevNode: (node) => {\n const prevSiblingNode = TreeViewAbstractNodeUtils.getPrevSiblingNode(node);\n\n // Предыдущая нода текущего уровня вложенности не найдена.\n if (!prevSiblingNode) {\n // as TreeViewAbstractNode потому что .getParent() может вернуть null только для rootNode, nextNode не может быть rootNode.\n const parentNode = node.getParent() as TreeViewAbstractNode;\n\n if (parentNode.getParent()) {\n return parentNode;\n }\n // Если parentNode является rootNode.\n else {\n // Предыдущая нода - последняя видимая нода дерева.\n return getDeepestVisibleLastChildNode(getLastChildNode(parentNode));\n }\n }\n\n // Предыдущая нода раскрыта и имеет дочерние ноды. Предыдущей станет последняя ее видимая дочерняя нода.\n return getDeepestVisibleLastChildNode(prevSiblingNode);\n },\n getPrevSiblingNode: (node) => {\n const parentNode = node.getParent();\n // node является rootNode.\n if (!parentNode) {\n return undefined;\n }\n\n const parentNodeChildren = parentNode.getChildren();\n // Индекс текущей ноды среди дочерних нод родителя.\n const currentNodeIndex = getNodeIndexInParent(node, parentNodeChildren);\n\n // Текущая нода - первая.\n if (currentNodeIndex === 0) {\n return undefined;\n }\n\n // Возвращается предыдущая нода.\n return parentNodeChildren[currentNodeIndex - 1];\n },\n isLastNode: (node) => {\n const parentNode = node.getParent();\n\n if (parentNode) {\n // Если нода является последней на текущем уровне.\n if (getLastChildNode(parentNode) === node) {\n return TreeViewAbstractNodeUtils.isLastNode(parentNode);\n }\n }\n // node является rootNode.\n else {\n return true;\n }\n\n return false;\n },\n setActiveNextNode: (rootNode) => {\n const activeNode = TreeViewAbstractNodeUtils.getActiveNode(rootNode);\n\n if (activeNode) {\n const nextNode = TreeViewAbstractNodeUtils.getNextNode(activeNode);\n\n TreeViewAbstractNodeUtils.setActiveNode(nextNode, rootNode, true);\n }\n },\n setActiveNode: (node, rootNode, isActive) => {\n if (isActive) {\n node.setActive(true);\n\n traverseAbstractTree(rootNode, (n) => {\n if (n.getActive() && n.getId() !== node.getId()) {\n // Сброс флага активности всех других нод, активная может быть только одна нода.\n n.setActive(false);\n }\n\n // Продолжить обход дерева.\n return true;\n });\n } else {\n node.setActive(false);\n\n // Активность снимается со всего дерева: стрелки могли увести ее на другую ноду, пока DOM-фокус\n // оставался на этой. Иначе после ухода фокуса дерево продолжало бы забирать стрелки у страницы.\n traverseAbstractTree(rootNode, (n) => {\n if (n.getActive()) {\n n.setActive(false);\n }\n\n // Продолжить обход дерева.\n return true;\n });\n }\n },\n setActivePrevNode: (rootNode) => {\n const activeNode = TreeViewAbstractNodeUtils.getActiveNode(rootNode);\n\n if (activeNode) {\n const prevNode = TreeViewAbstractNodeUtils.getPrevNode(activeNode);\n\n TreeViewAbstractNodeUtils.setActiveNode(prevNode, rootNode, true);\n }\n },\n};\n"],"names":[],"mappings":";AAuCA,MAAM,mBAAmB,CAAC,SAAqD;AAC3E,QAAM,WAAW,KAAK,YAAA;AAEtB,SAAO,SAAS,SAAS,SAAS,CAAC;AACvC;AAMA,MAAM,iCAAiC,CAAC,SAAqD;AACzF,MAAI,WAAW;AAEf,SAAO,SAAS,UAAA,KAAe,SAAS,YAAA,EAAc,QAAQ;AAC1D,eAAW,iBAAiB,QAAQ;AAAA,EACxC;AAEA,SAAO;AACX;AAMA,MAAM,uBAAuB,CAAC,MAA4B,uBAAuD;AAC7G,QAAM,QAAQ,mBAAmB,UAAU,CAAC,MAAM,EAAE,MAAA,MAAY,KAAK,OAAO;AAE5E,SAAO,UAAU,KAAK,IAAI;AAC9B;AAGO,MAAM,4BAAwD;AAAA,EACjE,eAAe,CAAC,SAAS;AACrB,QAAI;AAEJ,yBAAqB,MAAM,CAAC,MAAM;AAC9B,UAAI,EAAE,aAAa;AACf,qBAAa;AAEb,eAAO;AAAA,MACX;AAGA,aAAO;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,aAAa,CAAC,SAAS;AACnB,UAAM,gBAAgB,KAAK,YAAA;AAE3B,QAAI,KAAK,eAAe,cAAc,QAAQ;AAC1C,aAAO,cAAc,CAAC;AAAA,IAC1B;AAEA,UAAM,kBAAkB,0BAA0B,mBAAmB,IAAI;AAEzE,QAAI,iBAAiB;AACjB,aAAO;AAAA,IACX;AAEA,QAAI,WAAW;AAEf,WAAO,MAAM;AAET,YAAM,aAAa,SAAS,UAAA;AAE5B,UAAI,WAAW,aAAa;AACxB,cAAM,uBAAuB,0BAA0B,mBAAmB,UAAU;AAEpF,YAAI,sBAAsB;AACtB,qBAAW;AACX;AAAA,QACJ;AAAA,MACJ,OAEK;AAED,mBAAW,WAAW,YAAA,EAAc,CAAC;AACrC;AAAA,MACJ;AAEA,iBAAW;AAAA,IACf;AAEA,WAAO;AAAA,EACX;AAAA,EACA,oBAAoB,CAAC,SAAS;AAC1B,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,CAAC,YAAY;AACb,aAAO;AAAA,IACX;AAEA,UAAM,qBAAqB,WAAW,YAAA;AAEtC,UAAM,mBAAmB,qBAAqB,MAAM,kBAAkB;AAGtE,QAAI,qBAAqB,mBAAmB,SAAS,GAAG;AACpD,aAAO;AAAA,IACX;AAGA,WAAO,mBAAmB,mBAAmB,CAAC;AAAA,EAClD;AAAA,EACA,SAAS,CAAC,QAAQ,aAAa;AAC3B,QAAI;AAEJ,yBAAqB,UAAU,CAAC,SAAS;AACrC,UAAI,KAAK,MAAA,MAAY,QAAQ;AACzB,iBAAS;AAET,eAAO;AAAA,MACX;AAGA,aAAO;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EACA,aAAa,CAAC,SAAS;AACnB,UAAM,kBAAkB,0BAA0B,mBAAmB,IAAI;AAGzE,QAAI,CAAC,iBAAiB;AAElB,YAAM,aAAa,KAAK,UAAA;AAExB,UAAI,WAAW,aAAa;AACxB,eAAO;AAAA,MACX,OAEK;AAED,eAAO,+BAA+B,iBAAiB,UAAU,CAAC;AAAA,MACtE;AAAA,IACJ;AAGA,WAAO,+BAA+B,eAAe;AAAA,EACzD;AAAA,EACA,oBAAoB,CAAC,SAAS;AAC1B,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,CAAC,YAAY;AACb,aAAO;AAAA,IACX;AAEA,UAAM,qBAAqB,WAAW,YAAA;AAEtC,UAAM,mBAAmB,qBAAqB,MAAM,kBAAkB;AAGtE,QAAI,qBAAqB,GAAG;AACxB,aAAO;AAAA,IACX;AAGA,WAAO,mBAAmB,mBAAmB,CAAC;AAAA,EAClD;AAAA,EACA,YAAY,CAAC,SAAS;AAClB,UAAM,aAAa,KAAK,UAAA;AAExB,QAAI,YAAY;AAEZ,UAAI,iBAAiB,UAAU,MAAM,MAAM;AACvC,eAAO,0BAA0B,WAAW,UAAU;AAAA,MAC1D;AAAA,IACJ,OAEK;AACD,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,CAAC,aAAa;AAC7B,UAAM,aAAa,0BAA0B,cAAc,QAAQ;AAEnE,QAAI,YAAY;AACZ,YAAM,WAAW,0BAA0B,YAAY,UAAU;AAEjE,gCAA0B,cAAc,UAAU,UAAU,IAAI;AAAA,IACpE;AAAA,EACJ;AAAA,EACA,eAAe,CAAC,MAAM,UAAU,aAAa;AACzC,QAAI,UAAU;AACV,WAAK,UAAU,IAAI;AAEnB,2BAAqB,UAAU,CAAC,MAAM;AAClC,YAAI,EAAE,eAAe,EAAE,YAAY,KAAK,SAAS;AAE7C,YAAE,UAAU,KAAK;AAAA,QACrB;AAGA,eAAO;AAAA,MACX,CAAC;AAAA,IACL,OAAO;AACH,WAAK,UAAU,KAAK;AAIpB,2BAAqB,UAAU,CAAC,MAAM;AAClC,YAAI,EAAE,aAAa;AACf,YAAE,UAAU,KAAK;AAAA,QACrB;AAGA,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,mBAAmB,CAAC,aAAa;AAC7B,UAAM,aAAa,0BAA0B,cAAc,QAAQ;AAEnE,QAAI,YAAY;AACZ,YAAM,WAAW,0BAA0B,YAAY,UAAU;AAEjE,gCAA0B,cAAc,UAAU,UAAU,IAAI;AAAA,IACpE;AAAA,EACJ;AACJ;"}
@@ -2,7 +2,6 @@ import { jsx } from "react/jsx-runtime";
2
2
  import React__default from "react";
3
3
  import { TreeViewAbstractNode } from "./TreeViewAbstractNode.js";
4
4
  const initialTreeContext = {
5
- /** eslint-disable @typescript-eslint/no-empty-function */
6
5
  getNode: () => void 0,
7
6
  parentNode: new TreeViewAbstractNode({ id: "contextNode" }),
8
7
  registerNode: () => {
@@ -15,7 +14,6 @@ const initialTreeContext = {
15
14
  setOpenedNode: () => {
16
15
  },
17
16
  updateCount: 0
18
- /** eslint-enable @typescript-eslint/no-empty-function */
19
17
  };
20
18
  const TreeViewContext = React__default.createContext(initialTreeContext);
21
19
  function withTreeViewContext(WrapperComponent) {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeViewContext.js","sources":["../../../src/components/TreeView/TreeViewContext.tsx"],"sourcesContent":["import React from \"react\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\n\n/**\n * Возвращаем AbstractNode по id.\n */\nexport type TTreeViewContextGetNode = (nodeId: string) => TreeViewAbstractNode | undefined;\n\n/**\n * Добавляем AbstractNode в AbstractTree. AbstractTree является AbstractNode.\n */\nexport type TTreeViewContextRegisterNode = (\n node: TreeViewAbstractNode,\n parentNode: TreeViewAbstractNode,\n prevNode?: TreeViewAbstractNode,\n nextNode?: TreeViewAbstractNode,\n) => void;\n\n/**\n * Удаляет AbstractNode из AbstractTree.\n */\nexport type TTreeViewContextRemoveNode = (node: TreeViewAbstractNode) => void;\n\n/**\n * Устанавливает флаг активности AbstractNode.\n */\nexport type TTreeViewContextSetActiveNode = (node: TreeViewAbstractNode, active: boolean) => void;\n\n/**\n * Устанавливает флаг opened AbstractNode.\n */\nexport type TTreeViewContextSetOpenedNode = (node: TreeViewAbstractNode, opened: boolean) => void;\n\n/**\n * Контекст TreeView.\n *\n * @param {number} updateCount - Число обновлений абстрактного дерева. Используется для индикации изменения дерева т.к. изменение мутируемого объекта rootNode не вызывает триггер изменения контекста.\n * @param {TTreeViewContextGetNode} getNode - Возвращает TreeViewAbstractNode по id.\n * @param {TreeViewAbstractNode} parentNode - Родительская TreeViewAbstractNode.\n * @param {TreeViewAbstractNode | null} rootNode - Рутовая нода абстрактного дерева.\n * @param {TTreeViewContextRegisterNode} registerNode - Добавляет TreeViewAbstractNode в AbstractTree. AbstractTree также является AbstractNode.\n * @param {TTreeViewContextSetActiveNode} setActiveNode - Устанавливает флаг активности AbstractNode.\n * @param {TTreeViewContextSetOpenedNode} setOpenedNode - Устанавливает флаг раскрытости AbstractNode.\n */\nexport interface ITreeViewContext {\n updateCount: number;\n getNode: TTreeViewContextGetNode;\n parentNode: TreeViewAbstractNode;\n rootNode: TreeViewAbstractNode | null;\n registerNode: TTreeViewContextRegisterNode;\n removeNode: TTreeViewContextRemoveNode;\n setActiveNode: TTreeViewContextSetActiveNode;\n setOpenedNode: TTreeViewContextSetOpenedNode;\n}\n\n// Начальное значение контекста. Здесь нужно только для типизации и будет заполнено в @sber-business/triplex/components/TreeView/TreeView.tsx\nexport const initialTreeContext = {\n /** eslint-disable @typescript-eslint/no-empty-function */\n getNode: (): TreeViewAbstractNode | undefined => undefined,\n parentNode: new TreeViewAbstractNode({ id: \"contextNode\" }),\n registerNode: (): void => {},\n removeNode: (): void => {},\n rootNode: null,\n setActiveNode: (): void => {},\n setOpenedNode: (): void => {},\n updateCount: 0,\n /** eslint-enable @typescript-eslint/no-empty-function */\n};\n\nexport const TreeViewContext = React.createContext<ITreeViewContext>(initialTreeContext);\n\n/**\n * Свойства контекста, добавляемые WithTreeViewContext.\n */\nexport interface IWithTreeViewContextProps {\n treeViewContext: ITreeViewContext;\n}\n\n/**\n * HOC, предоставляющий TreeViewContext.\n */\nexport function withTreeViewContext<T extends IWithTreeViewContextProps>(\n WrapperComponent: React.ComponentType<T>,\n): React.ComponentType<Omit<T, keyof IWithTreeViewContextProps>> {\n const displayName = WrapperComponent.displayName || WrapperComponent.name || \"Component\";\n\n const ComponentWithTreeViewContext = (props: Omit<T, keyof IWithTreeViewContextProps>) => (\n <TreeViewContext.Consumer>\n {(context) => <WrapperComponent {...(props as T)} treeViewContext={context} />}\n </TreeViewContext.Consumer>\n );\n\n ComponentWithTreeViewContext.displayName = `WithTreeViewContext(${displayName})`;\n\n return ComponentWithTreeViewContext;\n}\n"],"names":["React"],"mappings":";;;AAwDO,MAAM,qBAAqB;AAAA;AAAA,EAE9B,SAAS,MAAwC;AAAA,EACjD,YAAY,IAAI,qBAAqB,EAAE,IAAI,eAAe;AAAA,EAC1D,cAAc,MAAY;AAAA,EAAC;AAAA,EAC3B,YAAY,MAAY;AAAA,EAAC;AAAA,EACzB,UAAU;AAAA,EACV,eAAe,MAAY;AAAA,EAAC;AAAA,EAC5B,eAAe,MAAY;AAAA,EAAC;AAAA,EAC5B,aAAa;AAAA;AAEjB;AAEO,MAAM,kBAAkBA,eAAM,cAAgC,kBAAkB;AAYhF,SAAS,oBACZ,kBAC6D;AAC7D,QAAM,cAAc,iBAAiB,eAAe,iBAAiB,QAAQ;AAE7E,QAAM,+BAA+B,CAAC,UAClC,oBAAC,gBAAgB,UAAhB,EACI,UAAA,CAAC,gCAAa,kBAAA,EAAkB,GAAI,OAAa,iBAAiB,SAAS,GAChF;AAGJ,+BAA6B,cAAc,uBAAuB,WAAW;AAE7E,SAAO;AACX;"}
1
+ {"version":3,"file":"TreeViewContext.js","sources":["../../../src/components/TreeView/TreeViewContext.tsx"],"sourcesContent":["import React from \"react\";\nimport { TreeViewAbstractNode } from \"./TreeViewAbstractNode\";\n\n/** Возвращает AbstractNode по id. */\nexport type TTreeViewContextGetNode = (nodeId: string) => TreeViewAbstractNode | undefined;\n\n/** Добавляет AbstractNode в AbstractTree. AbstractTree является AbstractNode. */\nexport type TTreeViewContextRegisterNode = (\n node: TreeViewAbstractNode,\n parentNode: TreeViewAbstractNode,\n prevNode?: TreeViewAbstractNode,\n nextNode?: TreeViewAbstractNode,\n) => void;\n\n/** Удаляет AbstractNode из AbstractTree. */\nexport type TTreeViewContextRemoveNode = (node: TreeViewAbstractNode) => void;\n\n/** Устанавливает флаг активности AbstractNode. */\nexport type TTreeViewContextSetActiveNode = (node: TreeViewAbstractNode, active: boolean) => void;\n\n/** Устанавливает флаг opened AbstractNode. */\nexport type TTreeViewContextSetOpenedNode = (node: TreeViewAbstractNode, opened: boolean) => void;\n\n/** Контекст TreeView. */\nexport interface ITreeViewContext {\n /**\n * Число обновлений абстрактного дерева.\n * Используется для индикации изменения дерева т.к. изменение мутируемого объекта rootNode не вызывает триггер изменения контекста.\n */\n updateCount: number;\n /** Возвращает TreeViewAbstractNode по id. */\n getNode: TTreeViewContextGetNode;\n /** Родительская TreeViewAbstractNode. Каждая нода переопределяет ее для своих детей. */\n parentNode: TreeViewAbstractNode;\n /** Рутовая нода абстрактного дерева. */\n rootNode: TreeViewAbstractNode | null;\n /** Добавляет TreeViewAbstractNode в AbstractTree. AbstractTree также является AbstractNode. */\n registerNode: TTreeViewContextRegisterNode;\n /** Удаляет TreeViewAbstractNode из AbstractTree. */\n removeNode: TTreeViewContextRemoveNode;\n /** Устанавливает флаг активности AbstractNode. */\n setActiveNode: TTreeViewContextSetActiveNode;\n /** Устанавливает флаг раскрытости AbstractNode. */\n setOpenedNode: TTreeViewContextSetOpenedNode;\n}\n\n/**\n * Начальное значение контекста.\n * Используется только для типизации createContext, реальные значения устанавливает TreeView.\n */\nexport const initialTreeContext: ITreeViewContext = {\n getNode: () => undefined,\n parentNode: new TreeViewAbstractNode({ id: \"contextNode\" }),\n registerNode: () => {},\n removeNode: () => {},\n rootNode: null,\n setActiveNode: () => {},\n setOpenedNode: () => {},\n updateCount: 0,\n};\n\nexport const TreeViewContext = React.createContext<ITreeViewContext>(initialTreeContext);\n\n/** Свойства контекста, добавляемые withTreeViewContext. */\nexport interface IWithTreeViewContextProps {\n /** Контекст TreeView. Подставляется HOC-ом withTreeViewContext, снаружи передавать не нужно. */\n treeViewContext: ITreeViewContext;\n}\n\n/** HOC, предоставляющий TreeViewContext через prop treeViewContext. */\nexport function withTreeViewContext<T extends IWithTreeViewContextProps>(\n WrapperComponent: React.ComponentType<T>,\n): React.ComponentType<Omit<T, keyof IWithTreeViewContextProps>> {\n const displayName = WrapperComponent.displayName || WrapperComponent.name || \"Component\";\n\n const ComponentWithTreeViewContext = (props: Omit<T, keyof IWithTreeViewContextProps>) => (\n <TreeViewContext.Consumer>\n {(context) => <WrapperComponent {...(props as T)} treeViewContext={context} />}\n </TreeViewContext.Consumer>\n );\n\n ComponentWithTreeViewContext.displayName = `WithTreeViewContext(${displayName})`;\n\n return ComponentWithTreeViewContext;\n}\n"],"names":["React"],"mappings":";;;AAkDO,MAAM,qBAAuC;AAAA,EAChD,SAAS,MAAM;AAAA,EACf,YAAY,IAAI,qBAAqB,EAAE,IAAI,eAAe;AAAA,EAC1D,cAAc,MAAM;AAAA,EAAC;AAAA,EACrB,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,UAAU;AAAA,EACV,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,aAAa;AACjB;AAEO,MAAM,kBAAkBA,eAAM,cAAgC,kBAAkB;AAShF,SAAS,oBACZ,kBAC6D;AAC7D,QAAM,cAAc,iBAAiB,eAAe,iBAAiB,QAAQ;AAE7E,QAAM,+BAA+B,CAAC,UAClC,oBAAC,gBAAgB,UAAhB,EACI,UAAA,CAAC,gCAAa,kBAAA,EAAkB,GAAI,OAAa,iBAAiB,SAAS,GAChF;AAGJ,+BAA6B,cAAc,uBAAuB,WAAW;AAE7E,SAAO;AACX;"}
@@ -1,6 +1,14 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { s as styles } from "../../../chunks/TreeView.module-C5KrbQR8.js";
3
- const TreeViewGroup = ({ children, ...props }) => /* @__PURE__ */ jsx("ul", { role: "group", className: styles.treeViewGroup, ...props, children });
2
+ import React__default from "react";
3
+ import { c as clsx } from "../../../chunks/vendor-D4wvHis9.js";
4
+ import { s as styles } from "../../../chunks/TreeView.module-CmItPF1_.js";
5
+ const TreeViewGroup = React__default.forwardRef(
6
+ ({ children, className, ...props }, ref) => (
7
+ // role после {...props}: семантика группы - контракт компонента, потребитель ее не переопределяет.
8
+ /* @__PURE__ */ jsx("ul", { className: clsx(styles.treeViewGroup, className), ...props, role: "group", ref, children })
9
+ )
10
+ );
11
+ TreeViewGroup.displayName = "TreeViewGroup";
4
12
  export {
5
13
  TreeViewGroup
6
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TreeViewGroup.js","sources":["../../../../src/components/TreeView/components/TreeViewGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport styles from \"../styles/TreeView.module.less\";\n\n/** Свойства компонента TreeViewGroup. */\nexport interface ITreeViewGroupProps extends React.HTMLAttributes<HTMLUListElement> {}\n\n/** Обертка для вложенных TreeNode. */\nexport const TreeViewGroup: React.FC<ITreeViewGroupProps> = ({ children, ...props }) => (\n <ul role=\"group\" className={styles.treeViewGroup} {...props}>\n {children}\n </ul>\n);\n"],"names":[],"mappings":";;AAOO,MAAM,gBAA+C,CAAC,EAAE,UAAU,GAAG,YACxE,oBAAC,MAAA,EAAG,MAAK,SAAQ,WAAW,OAAO,eAAgB,GAAG,OACjD,SAAA,CACL;"}
1
+ {"version":3,"file":"TreeViewGroup.js","sources":["../../../../src/components/TreeView/components/TreeViewGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport clsx from \"clsx\";\nimport styles from \"../styles/TreeView.module.less\";\n\n/** Свойства компонента TreeViewGroup. */\nexport interface ITreeViewGroupProps extends React.HTMLAttributes<HTMLUListElement> {}\n\n/** Обертка для вложенных TreeViewNode. Задает семантику группы дочерних нод (role=\"group\"). */\nexport const TreeViewGroup = React.forwardRef<HTMLUListElement, ITreeViewGroupProps>(\n ({ children, className, ...props }, ref) => (\n // role после {...props}: семантика группы - контракт компонента, потребитель ее не переопределяет.\n <ul className={clsx(styles.treeViewGroup, className)} {...props} role=\"group\" ref={ref}>\n {children}\n </ul>\n ),\n);\n\nTreeViewGroup.displayName = \"TreeViewGroup\";\n"],"names":["React"],"mappings":";;;;AAQO,MAAM,gBAAgBA,eAAM;AAAA,EAC/B,CAAC,EAAE,UAAU,WAAW,GAAG,SAAS;AAAA;AAAA,IAEhC,oBAAC,MAAA,EAAG,WAAW,KAAK,OAAO,eAAe,SAAS,GAAI,GAAG,OAAO,MAAK,SAAQ,KACzE,SAAA,CACL;AAAA;AAER;AAEA,cAAc,cAAc;"}
@@ -7,12 +7,11 @@ import { TreeViewContext, withTreeViewContext } from "../TreeViewContext.js";
7
7
  import { TreeViewAbstractNode } from "../TreeViewAbstractNode.js";
8
8
  import { TreeViewAbstractNodeUtils } from "../TreeViewAbstractNodeUtils.js";
9
9
  import { c as clsx } from "../../../chunks/vendor-D4wvHis9.js";
10
- import { s as styles } from "../../../chunks/TreeView.module-C5KrbQR8.js";
10
+ import { s as styles } from "../../../chunks/TreeView.module-CmItPF1_.js";
11
11
  class TreeViewNodeWithContext extends React__default.Component {
12
12
  constructor(props) {
13
13
  super(props);
14
- __publicField(this, "containerDOMNode");
15
- // Абстрактная нода текущей ViewNode.
14
+ /** Абстрактная нода текущей ViewNode. */
16
15
  __publicField(this, "abstractNode");
17
16
  /**
18
17
  * Обработчик события blur.
@@ -34,9 +33,8 @@ class TreeViewNodeWithContext extends React__default.Component {
34
33
  treeViewContext.setActiveNode(this.abstractNode, true);
35
34
  onFocus == null ? void 0 : onFocus(event);
36
35
  });
37
- __publicField(this, "setContainerDOMNode", (DOMNode) => this.containerDOMNode = DOMNode);
38
- /** Устанавливает флаг opened ноды. */
39
- __publicField(this, "setOpenedNode", () => (opened) => {
36
+ /** Устанавливает флаг opened ноды. Передается в render-функцию children. */
37
+ __publicField(this, "setOpenedNode", (opened) => {
40
38
  this.props.treeViewContext.setOpenedNode(this.abstractNode, opened);
41
39
  });
42
40
  const { treeViewContext } = props;
@@ -68,25 +66,25 @@ class TreeViewNodeWithContext extends React__default.Component {
68
66
  return /* @__PURE__ */ jsx(TreeViewContext.Provider, { value: { ...treeViewContext, parentNode: this.abstractNode }, children: /* @__PURE__ */ jsx(
69
67
  "li",
70
68
  {
71
- role: "treeitem",
72
69
  tabIndex: this.abstractNode.getTabIndex(),
73
- "aria-expanded": this.abstractNode.getOpened(),
74
70
  className: clsx(styles.treeViewNode, className),
75
71
  ...props,
72
+ role: "treeitem",
73
+ "aria-expanded": this.abstractNode.getOpened(),
76
74
  onBlur: this.handleBlur,
77
75
  onFocus: this.handleFocus,
78
- ref: this.setContainerDOMNode,
79
76
  children: children({
80
77
  activeNode: this.abstractNode.getActive(),
81
78
  hasChildNodes: Boolean(this.abstractNode.getChildren().length),
82
79
  isLastNode: TreeViewAbstractNodeUtils.isLastNode(this.abstractNode),
83
80
  openedNode: this.abstractNode.getOpened(),
84
- setOpenedNode: this.setOpenedNode()
81
+ setOpenedNode: this.setOpenedNode
85
82
  })
86
83
  }
87
84
  ) });
88
85
  }
89
86
  }
87
+ __publicField(TreeViewNodeWithContext, "displayName", "TreeViewNodeWithContext");
90
88
  const TreeViewNode = withTreeViewContext(TreeViewNodeWithContext);
91
89
  export {
92
90
  TreeViewNode,