@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.13

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 (281) hide show
  1. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -1
  2. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
  3. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  4. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  5. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  6. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  7. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  8. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  9. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  10. package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
  11. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  12. package/dist/select/model/useODataSelect.d.ts +1 -1
  13. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  14. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  15. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  16. package/dist/tree-select/index.js.map +1 -1
  17. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  18. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  19. package/package.json +3 -3
  20. package/storybook-static/assets/{Badge-BojMuOws.js → Badge-BFhBl7yM.js} +1 -1
  21. package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-BEu55X4s.js} +1 -1
  22. package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-mqmnGtRR.js} +1 -1
  23. package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-CESdnWrO.js} +1 -1
  24. package/storybook-static/assets/{Button-CrTHXWYk.js → Button-_YPAu9sd.js} +1 -1
  25. package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-B0Y_T17B.js} +1 -1
  26. package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-DLuO2Ywz.js} +1 -1
  27. package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-CGiNmAPT.js} +1 -1
  28. package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-l0pbBm9z.js} +1 -1
  29. package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-ROPAnqh8.js} +1 -1
  30. package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
  31. package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-Bob4DtRn.js} +1 -1
  32. package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-DxfUAeJS.js} +1 -1
  33. package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
  34. package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-DuEz9CXt.js} +1 -1
  35. package/storybook-static/assets/DateInput-BQ8SoeLE.js +1 -0
  36. package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DmNLD4Dz.js} +1 -1
  37. package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-sTpYf7Ob.js} +1 -1
  38. package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
  39. package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
  40. package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
  41. package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CJniLn1R.js} +1 -1
  42. package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-BXjdNaL-.js} +1 -1
  43. package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-D6a_qzr3.js} +1 -1
  44. package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DOYnnXlU.js} +1 -1
  45. package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-B1cZLRK3.js} +1 -1
  46. package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-Chh5o_0s.js} +1 -1
  47. package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
  48. package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-CRnQOgVj.js} +1 -1
  49. package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
  50. package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-Bm5gqdi9.js} +1 -1
  51. package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-C4L7JAlq.js} +1 -1
  52. package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-BhA9q8Qv.js} +1 -1
  53. package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-DtZNSUHF.js} +1 -1
  54. package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
  55. package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
  56. package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CJlia-8f.js} +1 -1
  57. package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-DCvfi1EY.js} +1 -1
  58. package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-CsnfPiwV.js} +1 -1
  59. package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
  60. package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-C-KwTRAM.js} +1 -1
  61. package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-CzbqknNR.js} +1 -1
  62. package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
  63. package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-IsNCXCrZ.js} +1 -1
  64. package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
  65. package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DY0UITYz.js} +1 -1
  66. package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories--9q9b9nv.js} +2 -2
  67. package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
  68. package/storybook-static/assets/{Input-op4j7Beh.js → Input-DLubbE7P.js} +1 -1
  69. package/storybook-static/assets/{Input-BUDNR96c.js → Input-Dw2JblYt.js} +1 -1
  70. package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-DQeyDULG.js} +1 -1
  71. package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-BRzl8Vrt.js} +1 -1
  72. package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
  73. package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-B8UroZji.js} +1 -1
  74. package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-DPftxjGw.js} +1 -1
  75. package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-C7yyqHqc.js} +1 -1
  76. package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-BQVXHVLy.js} +1 -1
  77. package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-UD_9S7-N.js} +1 -1
  78. package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
  79. package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-BNjijD3Y.js} +1 -1
  80. package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-C-pHr-Sx.js} +1 -1
  81. package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-DbcbqIhY.js} +1 -1
  82. package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-D-TC9r9t.js} +1 -1
  83. package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-DbhWgM9y.js} +1 -1
  84. package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
  85. package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-BoV_E3qt.js} +1 -1
  86. package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-w1EsRpYP.js} +1 -1
  87. package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
  88. package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-CzZRsr6a.js} +1 -1
  89. package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-qZdTi11b.js} +1 -1
  90. package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-C9k_1850.js} +1 -1
  91. package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-DCpul8QM.js} +1 -1
  92. package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-Cy0Xd4LF.js} +1 -1
  93. package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
  94. package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-BEQdl-F4.js} +1 -1
  95. package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-Dy4X94E2.js} +1 -1
  96. package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-FuzejJmz.js} +1 -1
  97. package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-BsQ9EfkA.js} +1 -1
  98. package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-BSrODvw7.js} +1 -1
  99. package/storybook-static/assets/NotificationsHost.stories-DeiWspcY.js +29 -0
  100. package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
  101. package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-BwMgAkbE.js} +2 -2
  102. package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-BgC7GHOv.js} +1 -1
  103. package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-DEIRAB-s.js} +2 -2
  104. package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
  105. package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
  106. package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
  107. package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
  108. package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-DycQ3RuL.js} +1 -1
  109. package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-taxbFfjo.js} +1 -1
  110. package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-Q0QaPCII.js} +1 -1
  111. package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DUJ2nF3F.js} +1 -1
  112. package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-DnM7x-uC.js} +1 -1
  113. package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
  114. package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
  115. package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-B6oidz5p.js} +1 -1
  116. package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-Tbhf8T81.js} +1 -1
  117. package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-DE1LxZvv.js} +1 -1
  118. package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
  119. package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
  120. package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
  121. package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-BPtAknAr.js} +1 -1
  122. package/storybook-static/assets/README--TpGcM95.js +110 -0
  123. package/storybook-static/assets/{README-MzcO5Z_P.js → README-4iBHWAP5.js} +1 -1
  124. package/storybook-static/assets/README-98KIgy5G.js +75 -0
  125. package/storybook-static/assets/README-B6II8p0W.js +154 -0
  126. package/storybook-static/assets/{README-CkWglKbS.js → README-B6vU5_7I.js} +1 -1
  127. package/storybook-static/assets/README-BFJVjjZR.js +325 -0
  128. package/storybook-static/assets/README-BIT4HlFP.js +441 -0
  129. package/storybook-static/assets/{README-DqQDgJN-.js → README-BK6Epio1.js} +1 -1
  130. package/storybook-static/assets/{README-DRnlD7y8.js → README-BRlPB5_k.js} +1 -1
  131. package/storybook-static/assets/README-BTFpEaXG.js +64 -0
  132. package/storybook-static/assets/README-BWhXgC_o.js +226 -0
  133. package/storybook-static/assets/README-BbNHvOoR.js +101 -0
  134. package/storybook-static/assets/README-BbunUo8b.js +118 -0
  135. package/storybook-static/assets/README-BmYpfZKr.js +1844 -0
  136. package/storybook-static/assets/README-Bu5uvhAT.js +230 -0
  137. package/storybook-static/assets/README-Bx6fvSBE.js +1282 -0
  138. package/storybook-static/assets/README-Bx6gIGiA.js +69 -0
  139. package/storybook-static/assets/README-ByhxsX44.js +324 -0
  140. package/storybook-static/assets/README-Byi1FFpw.js +98 -0
  141. package/storybook-static/assets/README-C3Is3a3B.js +208 -0
  142. package/storybook-static/assets/{README-C0BwTe5N.js → README-C6prwAXw.js} +1 -1
  143. package/storybook-static/assets/{README-BzVni2ve.js → README-C9S83J_G.js} +1 -1
  144. package/storybook-static/assets/{README-BHw6MVjD.js → README-CGgxP5Zo.js} +1 -1
  145. package/storybook-static/assets/README-CJ2ZVG2U.js +2124 -0
  146. package/storybook-static/assets/README-CNGCAm5d.js +95 -0
  147. package/storybook-static/assets/README-Cb_q420B.js +90 -0
  148. package/storybook-static/assets/README-CtIDPNJ3.js +186 -0
  149. package/storybook-static/assets/README-CzO3Dchr.js +64 -0
  150. package/storybook-static/assets/README-D0rzQthv.js +264 -0
  151. package/storybook-static/assets/README-DEQu7djz.js +1704 -0
  152. package/storybook-static/assets/README-DFihT_sm.js +296 -0
  153. package/storybook-static/assets/{README-CTIBG4zH.js → README-DMiWsyv_.js} +1 -1
  154. package/storybook-static/assets/README-DOx8lXXk.js +82 -0
  155. package/storybook-static/assets/{README-DzTc6XmY.js → README-DPhDjr43.js} +1 -1
  156. package/storybook-static/assets/{README-Dki94Nf2.js → README-D_NqWPa9.js} +1 -1
  157. package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
  158. package/storybook-static/assets/README-DlwhWCvQ.js +1146 -0
  159. package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
  160. package/storybook-static/assets/README-Dycov6NP.js +583 -0
  161. package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
  162. package/storybook-static/assets/README-Gfd9tLTw.js +672 -0
  163. package/storybook-static/assets/{README-B4zYJg6u.js → README-Kfawetke.js} +1 -1
  164. package/storybook-static/assets/{README-BzVHwvgo.js → README-UDBM7ZMT.js} +1 -1
  165. package/storybook-static/assets/{README-D-XjRtAE.js → README-VTWQxLm_.js} +1 -1
  166. package/storybook-static/assets/README-YHNWrTZv.js +400 -0
  167. package/storybook-static/assets/README-_0Otw0eD.js +448 -0
  168. package/storybook-static/assets/README-aw2Xu9xu.js +158 -0
  169. package/storybook-static/assets/README-eg1emlll.js +192 -0
  170. package/storybook-static/assets/README-iqQHdhZ4.js +416 -0
  171. package/storybook-static/assets/{README-BdPlV5nA.js → README-llxZAtCj.js} +1 -1
  172. package/storybook-static/assets/README-wFnEIGl4.js +95 -0
  173. package/storybook-static/assets/{README-Dx3cpFMr.js → README-webB1yH0.js} +1 -1
  174. package/storybook-static/assets/README-wtreGRCe.js +208 -0
  175. package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-CNOLDk_o.js} +1 -1
  176. package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-Ce05_q7s.js} +1 -1
  177. package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-CPd4lTl0.js} +1 -1
  178. package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BtfD5Szd.js} +1 -1
  179. package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-Ccm7G-dv.js} +1 -1
  180. package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
  181. package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-DvdBIeig.js} +1 -1
  182. package/storybook-static/assets/{Select-DQMoVjn4.js → Select-8PV9PBKF.js} +1 -1
  183. package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-G04B41FM.js} +1 -1
  184. package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-Cf6CBhV8.js} +1 -1
  185. package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-CdQdHIVp.js} +1 -1
  186. package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
  187. package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
  188. package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-DattLt6w.js} +1 -1
  189. package/storybook-static/assets/SingleDateTimeInput.stories-BLJV3jzV.js +48 -0
  190. package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-DKEI4cDd.js} +1 -1
  191. package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-Dci-mJt_.js} +1 -1
  192. package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-Dp7oQueF.js} +1 -1
  193. package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-BGPQmlgY.js} +1 -1
  194. package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BhjqGOKt.js} +1 -1
  195. package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-DXNhRU3X.js} +1 -1
  196. package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CMd9l1Gd.js} +1 -1
  197. package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-BN1cFEFJ.js} +1 -1
  198. package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-GL65TlI9.js} +1 -1
  199. package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-q5PlI6rB.js} +1 -1
  200. package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-Byik5-iZ.js} +1 -1
  201. package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-CT0JF2V6.js} +1 -1
  202. package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-pPEPmgnN.js} +1 -1
  203. package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-BQlFmCE7.js} +1 -1
  204. package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch--xGPiYk-.js} +1 -1
  205. package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-DhaLI9CG.js} +1 -1
  206. package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-5DisgIyj.js} +1 -1
  207. package/storybook-static/assets/{Table-BFAEcUde.js → Table-Bf6MicdG.js} +1 -1
  208. package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-CS7rQgj9.js} +2 -2
  209. package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-B4y4y8Ap.js} +1 -1
  210. package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-C0SpdGkh.js} +1 -1
  211. package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-C5LLLhnj.js} +1 -1
  212. package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-D4BpuCoH.js} +1 -1
  213. package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-rn2wtZP_.js} +1 -1
  214. package/storybook-static/assets/{Text-DK4jN26J.js → Text-BhBt9e7C.js} +1 -1
  215. package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-B-Hz7ujq.js} +1 -1
  216. package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-BHHxY5sd.js} +1 -1
  217. package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-CZ2kWz20.js} +1 -1
  218. package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-Cg8fgFsn.js} +1 -1
  219. package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-BxdwtK2e.js} +1 -1
  220. package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-BWwfk9fi.js} +1 -1
  221. package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-Ce9rbjBc.js} +1 -1
  222. package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-0fzcmzKy.js} +1 -1
  223. package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
  224. package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
  225. package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
  226. package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-qU2xPlar.js} +1 -1
  227. package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-BIHydJFy.js} +1 -1
  228. package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-BKnWu0C7.js} +1 -1
  229. package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
  230. package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-pVXjU9dG.js} +1 -1
  231. package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-CV_8Ui6R.js} +2 -2
  232. package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-BY40djCc.js} +3 -3
  233. package/storybook-static/assets/{check-CLkTJVXe.js → check-CVkPTDzp.js} +1 -1
  234. package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-BtNO4Vhe.js} +1 -1
  235. package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-kceSK3sZ.js} +1 -1
  236. package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-BA_LO2El.js} +1 -1
  237. package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
  238. package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B2m4a1zz.js} +1 -1
  239. package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-Cfjhotlm.js} +1 -1
  240. package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-D6yV8PLX.js} +3 -3
  241. package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B0pQBIW0.js} +1 -1
  242. package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
  243. package/storybook-static/assets/{download-eAKjms6q.js → download-Lba8elK9.js} +1 -1
  244. package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-BFNvfMpU.js} +1 -1
  245. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  246. package/storybook-static/assets/foundationApi-DZhnQ2cC.js +59 -0
  247. package/storybook-static/assets/foundationLib-CoVTo22U.js +30 -0
  248. package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-Cc6eXN6U.js} +1 -1
  249. package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
  250. package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-o7sH2IXC.js} +4 -4
  251. package/storybook-static/assets/{info-DhJTzwcL.js → info-BpsVP_dM.js} +1 -1
  252. package/storybook-static/assets/odata-CXsbxsRY.js +1 -0
  253. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  254. package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
  255. package/storybook-static/assets/{react-YFbUKK0m.js → react-DeJ0JTHb.js} +1 -1
  256. package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-BvGyjEXe.js} +1 -1
  257. package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-BdXxnHos.js} +1 -1
  258. package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-XkyN-9r5.js} +1 -1
  259. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
  260. package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-uPH9-fND.js} +1 -1
  261. package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-tT01vSMw.js} +1 -1
  262. package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
  263. package/storybook-static/assets/useODataTreeData-CU7Rqcb9.js +1 -0
  264. package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-D8GHQ6KR.js} +1 -1
  265. package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
  266. package/storybook-static/assets/{x-CqPSvWfo.js → x-BlAURbAH.js} +1 -1
  267. package/storybook-static/iframe.html +2 -2
  268. package/storybook-static/index.json +1 -1
  269. package/storybook-static/project.json +1 -1
  270. package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
  271. package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
  272. package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
  273. package/storybook-static/assets/async-SjiCjIjO.js +0 -625
  274. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  275. package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
  276. package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
  277. package/storybook-static/assets/odata-DhISMZkE.js +0 -1
  278. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  279. package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
  280. package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
  281. package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/tree-select/helpers.ts","../../src/tree-select/model/buildODataTreeNodes.ts","../../src/tree-select/model/resolveOrderedTreeSegmentItems.ts","../../src/tree-select/model/useODataTreeData.ts","../../src/tree-select/model/treeUtils.ts","../../src/tree-select/model/buildTreeColumnsLayoutDescriptor.ts","../../src/tree-select/model/resolveBalancedTreeColumnsLayout.ts","../../src/tree-select/TreeSelect.module.scss","../../src/tree-select/TreeNodeContent.tsx","../../src/tree-select/TreePickerBase.tsx","../../src/tree-select/TreeMultiSelect.tsx","../../src/tree-select/ODataTreeMultiSelect.tsx","../../src/tree-select/TreeSelect.tsx","../../src/tree-select/ODataTreeSelect.tsx"],"sourcesContent":["import { TreeMultiSelectValue, TreeSelectValue } from \"./types\";\n\nexport function treeSelectValueToSelectedFilters(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n","import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\nimport { compareStrings } from \"@ryuzaki13/react-foundation-lib/string-comparison\";\n\nimport { TreeSelectNode } from \"../types\";\n\ntype BuildODataTreeNodesArgs = {\n\titems: CollectionItem[];\n\torderedCodeKeys: string[];\n\tkeyPairsMap: Record<string, string>;\n\thiddenCodeKeys: Set<string>;\n\ttextValueCodeKeys?: Set<string>;\n\t/** Уровни, для которых пустой код остаётся структурным узлом вместо остановки ветки. */\n\tallowEmptyCodeKeys?: ReadonlySet<string>;\n\t/** Выбирает локальный порядок узлов: по исходному коду или отображаемому тексту. */\n\tsortByCode?: boolean;\n};\n\ntype MutableTreeNode = TreeSelectNode & {\n\t/**\n\t * Исходный код нужен только для локальной сортировки представления.\n\t * Он не зависит от hideCode/selectText и не попадает в публичный TreeSelectNode.\n\t */\n\tsortCode: string;\n\tchildren: MutableTreeNode[];\n\tchildByBranchKey: Map<string, MutableTreeNode>;\n};\n\nfunction createNodeId(parentId: string | undefined, codeKey: string, value: string) {\n\treturn parentId ? `${parentId}/${codeKey}:${value}` : `${codeKey}:${value}`;\n}\n\nfunction resolveNodeLabel(item: CollectionItem, codeKey: string, keyPairsMap: Record<string, string>) {\n\tconst textKey = keyPairsMap[codeKey];\n\treturn (textKey && item[textKey]) || item[codeKey];\n}\n\nfunction createSearchText(parts: Array<string | undefined>) {\n\treturn [...new Set(parts.filter(Boolean))].join(\" \");\n}\n\nfunction createMutableNode(args: {\n\tparentId?: string;\n\tcodeKey: string;\n\tvalue: string;\n\tlabel: string;\n\tcode?: string;\n\tsortCode: string;\n}): MutableTreeNode {\n\treturn {\n\t\tid: createNodeId(args.parentId, args.codeKey, args.value),\n\t\tcodeKey: args.codeKey,\n\t\tvalue: args.value,\n\t\tlabel: args.label,\n\t\tcode: args.code,\n\t\tsearchText: createSearchText([args.value, args.label, args.code]),\n\t\tsortCode: args.sortCode,\n\t\tchildren: [],\n\t\tchildByBranchKey: new Map()\n\t};\n}\n\n/**\n * Сортирует только массивы вновь построенного дерева, не меняя исходную OData-коллекцию\n * и не создавая отдельный Query cache для каждого способа отображения.\n */\nfunction sortMutableTree(nodes: MutableTreeNode[], sortByCode: boolean) {\n\tnodes.sort((left, right) => {\n\t\tconst leftValue = sortByCode ? left.sortCode : left.label;\n\t\tconst rightValue = sortByCode ? right.sortCode : right.label;\n\t\tconst valueOrder = compareStrings(leftValue, rightValue);\n\n\t\treturn valueOrder || compareStrings(left.sortCode, right.sortCode);\n\t});\n\n\tfor (const node of nodes) {\n\t\tsortMutableTree(node.children, sortByCode);\n\t}\n}\n\nfunction toPublicNode(node: MutableTreeNode): TreeSelectNode {\n\treturn {\n\t\tid: node.id,\n\t\tcodeKey: node.codeKey,\n\t\tvalue: node.value,\n\t\tlabel: node.label,\n\t\tcode: node.code,\n\t\tsearchText: node.searchText,\n\t\tchildren: node.children.length > 0 ? node.children.map(toPublicNode) : undefined\n\t};\n}\n\nexport function buildODataTreeNodes({\n\titems,\n\torderedCodeKeys,\n\tkeyPairsMap,\n\thiddenCodeKeys,\n\ttextValueCodeKeys,\n\tallowEmptyCodeKeys,\n\tsortByCode = true\n}: BuildODataTreeNodesArgs): TreeSelectNode[] {\n\tif (orderedCodeKeys.length === 0 || items.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst roots: MutableTreeNode[] = [];\n\tconst rootByBranchKey = new Map<string, MutableTreeNode>();\n\n\tfor (const item of items) {\n\t\tlet parentNode: MutableTreeNode | undefined;\n\n\t\tfor (const codeKey of orderedCodeKeys) {\n\t\t\tconst codeValue = String(item[codeKey] ?? \"\");\n\n\t\t\tif (!codeValue && !allowEmptyCodeKeys?.has(codeKey)) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst label = String(resolveNodeLabel(item, codeKey, keyPairsMap) ?? \"\");\n\t\t\tconst value = textValueCodeKeys?.has(codeKey) ? label : codeValue;\n\t\t\tconst branchKey = `${codeKey}:${value}`;\n\t\t\tconst container = parentNode ? parentNode.childByBranchKey : rootByBranchKey;\n\t\t\tlet currentNode = container.get(branchKey);\n\n\t\t\tif (!currentNode) {\n\t\t\t\tcurrentNode = createMutableNode({\n\t\t\t\t\tparentId: parentNode?.id,\n\t\t\t\t\tcodeKey,\n\t\t\t\t\tvalue,\n\t\t\t\t\tlabel,\n\t\t\t\t\tcode: hiddenCodeKeys.has(codeKey) ? undefined : codeValue,\n\t\t\t\t\tsortCode: codeValue\n\t\t\t\t});\n\t\t\t\tcontainer.set(branchKey, currentNode);\n\n\t\t\t\tif (parentNode) {\n\t\t\t\t\tparentNode.children.push(currentNode);\n\t\t\t\t} else {\n\t\t\t\t\troots.push(currentNode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparentNode = currentNode;\n\t\t}\n\t}\n\n\tsortMutableTree(roots, sortByCode);\n\n\treturn roots.map(toPublicNode);\n}\n","import { ODataDependentSegmentItem, sortODataDependentSegmentItemsByChains } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { ODataChainsMap } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nexport function resolveOrderedTreeSegmentItems(\n\titems: readonly ODataDependentSegmentItem[],\n\tchains: ODataChainsMap,\n\tsegmentOrder?: readonly string[]\n) {\n\treturn sortODataDependentSegmentItemsByChains(items, chains, segmentOrder);\n}\n","import { useMemo } from \"react\";\n\nimport {\n\tflattenODataDependentServices,\n\tODataCollectionModel,\n\tODataDependentBaseProps,\n\tODataDependentSegmentItem,\n\tuseODataCollection,\n\tuseODataCollectionChains,\n\tuseODataCollectionModel\n} from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { buildODataTreeNodes } from \"./buildODataTreeNodes\";\nimport { resolveOrderedTreeSegmentItems } from \"./resolveOrderedTreeSegmentItems\";\n\nfunction buildOrderedSegmentItems(\n\todata: ODataDependentBaseProps[\"odata\"],\n\tsegments: ODataDependentBaseProps[\"segments\"],\n\tmodel?: Omit<ODataCollectionModel, \"codeKey\">\n) {\n\treturn flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n}\n\nfunction getRootCodeKey(orderedSegmentItems: readonly ODataDependentSegmentItem[]) {\n\treturn orderedSegmentItems[0]?.id;\n}\n\ntype UseODataTreeDataProps = Pick<ODataDependentBaseProps, \"odata\" | \"segments\" | \"model\"> & {\n\t/** Явный порядок уровней поверх автоматически разрешённой metadata-chain. */\n\tsegmentOrder?: readonly string[];\n\t/** Уровни, на которых пустой код не должен обрывать последующие уровни дерева. */\n\tallowEmptyCodeKeys?: readonly string[];\n};\n\nexport function useODataTreeData({ odata, segments, model, segmentOrder, allowEmptyCodeKeys }: UseODataTreeDataProps) {\n\tconst serviceKey = `${odata.service}.${odata.target}`;\n\tconst baseSegmentItems = useMemo(() => buildOrderedSegmentItems(odata, segments, model), [odata, segments, model]);\n\tconst chains = useODataCollectionChains([odata]);\n\tconst orderedSegmentItems = useMemo(\n\t\t() => resolveOrderedTreeSegmentItems(baseSegmentItems, chains, segmentOrder),\n\t\t[baseSegmentItems, chains, segmentOrder]\n\t);\n\tconst orderedCodeKeys = useMemo(() => orderedSegmentItems.map((item) => item.id), [orderedSegmentItems]);\n\tconst allowedEmptyCodeKeys = useMemo(() => new Set(allowEmptyCodeKeys), [allowEmptyCodeKeys]);\n\tconst rootCodeKey = getRootCodeKey(orderedSegmentItems) ?? Object.keys(segments)[0];\n\tconst odataModel = useODataCollectionModel({\n\t\tcodeKey: rootCodeKey,\n\t\t...model\n\t});\n\tconst collection = useODataCollection({\n\t\todata,\n\t\tmodel: odataModel\n\t});\n\tconst { hiddenCodeKeys, textValueCodeKeys } = useMemo(() => {\n\t\tconst nextHiddenCodeKeys = new Set<string>();\n\t\tconst nextTextValueCodeKeys = new Set<string>();\n\n\t\tfor (const item of orderedSegmentItems) {\n\t\t\tif (item.segment.hideCode ?? odata.hideCode) {\n\t\t\t\tnextHiddenCodeKeys.add(item.id);\n\t\t\t}\n\t\t\tif (item.segment.selectText) {\n\t\t\t\tnextTextValueCodeKeys.add(item.id);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\thiddenCodeKeys: nextHiddenCodeKeys,\n\t\t\ttextValueCodeKeys: nextTextValueCodeKeys\n\t\t};\n\t}, [odata.hideCode, orderedSegmentItems]);\n\tconst nodes = useMemo(\n\t\t() =>\n\t\t\tbuildODataTreeNodes({\n\t\t\t\titems: collection.data?.items ?? [],\n\t\t\t\torderedCodeKeys,\n\t\t\t\tkeyPairsMap: collection.data?.keyPairsMap ?? {},\n\t\t\t\thiddenCodeKeys,\n\t\t\t\ttextValueCodeKeys,\n\t\t\t\tallowEmptyCodeKeys: allowedEmptyCodeKeys,\n\t\t\t\tsortByCode: odata.sortByCode\n\t\t\t}),\n\t\t[\n\t\t\tallowedEmptyCodeKeys,\n\t\t\tcollection.data?.items,\n\t\t\tcollection.data?.keyPairsMap,\n\t\t\thiddenCodeKeys,\n\t\t\todata.sortByCode,\n\t\t\torderedCodeKeys,\n\t\t\ttextValueCodeKeys\n\t\t]\n\t);\n\tconst placeholder = orderedSegmentItems[0]?.segment.placeholder ?? \"Выберите значение\";\n\tconst hasResolvedChain = Boolean(chains[serviceKey]?.length);\n\n\treturn {\n\t\tnodes,\n\t\torderedSegmentItems,\n\t\torderedCodeKeys,\n\t\tisLoading: collection.isLoading,\n\t\tisError: collection.isError,\n\t\tplaceholder,\n\t\thasResolvedChain\n\t};\n}\n","import { TreeMultiSelectValue, TreeSelectNode, TreeSelectValue } from \"../types\";\n\nexport type TreeNodeIndex = {\n\trootIds: string[];\n\tnodeById: Map<string, TreeSelectNode>;\n\tparentById: Map<string, string | undefined>;\n\tchildrenById: Map<string, string[]>;\n\tpreorderIndexById: Map<string, number>;\n\tnodeIdByCodeValue: Map<string, string>;\n\t/** Все визуальные узлы одного сериализуемого значения в порядке обхода дерева. */\n\tnodeIdsByCodeValue: Map<string, string[]>;\n\t/** Признак disabled-ограничения в узле или любом его потомке. */\n\tsubtreeContainsDisabledById: Map<string, boolean>;\n};\n\nexport type TreeNodeSelectionState = {\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n};\n\nexport type TreeVisibleEntry = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\tparentId?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tisLeaf: boolean;\n};\n\nfunction makeCodeValueKey(codeKey: string, value: string) {\n\treturn `${codeKey}::${value}`;\n}\n\nexport function createTreeNodeIndex(nodes: readonly TreeSelectNode[]): TreeNodeIndex {\n\tconst nodeById = new Map<string, TreeSelectNode>();\n\tconst parentById = new Map<string, string | undefined>();\n\tconst childrenById = new Map<string, string[]>();\n\tconst preorderIndexById = new Map<string, number>();\n\tconst nodeIdByCodeValue = new Map<string, string>();\n\tconst nodeIdsByCodeValue = new Map<string, string[]>();\n\tconst subtreeContainsDisabledById = new Map<string, boolean>();\n\tlet preorderIndex = 0;\n\n\tconst walk = (node: TreeSelectNode, parentId?: string) => {\n\t\tnodeById.set(node.id, node);\n\t\tparentById.set(node.id, parentId);\n\t\tpreorderIndexById.set(node.id, preorderIndex++);\n\t\tconst codeValueKey = makeCodeValueKey(node.codeKey, node.value);\n\t\tnodeIdByCodeValue.set(codeValueKey, node.id);\n\t\tconst equivalentNodeIds = nodeIdsByCodeValue.get(codeValueKey);\n\t\tif (equivalentNodeIds) {\n\t\t\tequivalentNodeIds.push(node.id);\n\t\t} else {\n\t\t\tnodeIdsByCodeValue.set(codeValueKey, [node.id]);\n\t\t}\n\n\t\tconst childIds = (node.children ?? []).map((child) => child.id);\n\t\tchildrenById.set(node.id, childIds);\n\n\t\tfor (const child of node.children ?? []) {\n\t\t\twalk(child, node.id);\n\t\t}\n\n\t\tsubtreeContainsDisabledById.set(\n\t\t\tnode.id,\n\t\t\tnode.disabled === true || childIds.some((childId) => subtreeContainsDisabledById.get(childId) === true)\n\t\t);\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node);\n\t}\n\n\treturn {\n\t\trootIds: nodes.map((node) => node.id),\n\t\tnodeById,\n\t\tparentById,\n\t\tchildrenById,\n\t\tpreorderIndexById,\n\t\tnodeIdByCodeValue,\n\t\tnodeIdsByCodeValue,\n\t\tsubtreeContainsDisabledById\n\t};\n}\n\n/** Возвращает все визуальные представления одного сериализуемого значения. */\nfunction getEquivalentTreeNodeIds(nodeId: string, index: TreeNodeIndex) {\n\tconst node = index.nodeById.get(nodeId);\n\tif (!node) return [];\n\n\treturn index.nodeIdsByCodeValue.get(makeCodeValueKey(node.codeKey, node.value)) ?? [];\n}\n\nexport function treeSelectValueToId(value: TreeSelectValue | undefined, index: TreeNodeIndex) {\n\tif (!value) return undefined;\n\treturn index.nodeIdByCodeValue.get(makeCodeValueKey(value.codeKey, value.value));\n}\n\nexport function treeMultiValueToSelectedIds(value: TreeMultiSelectValue | undefined, index: TreeNodeIndex) {\n\tconst selectedIds = new Set<string>();\n\n\tif (!value) {\n\t\treturn selectedIds;\n\t}\n\n\tfor (const [codeKey, values] of Object.entries(value)) {\n\t\tfor (const itemValue of values) {\n\t\t\tfor (const nodeId of index.nodeIdsByCodeValue.get(makeCodeValueKey(codeKey, itemValue)) ?? []) {\n\t\t\t\tselectedIds.add(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canonicalizeTreeSelection(selectedIds, index);\n}\n\nexport function treeSelectedIdsToMultiValue(selectedIds: Set<string>, index: TreeNodeIndex): TreeMultiSelectValue {\n\tconst orderedIds = [...selectedIds].sort(\n\t\t(leftId, rightId) =>\n\t\t\t(index.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t(index.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t);\n\tconst result: TreeMultiSelectValue = {};\n\tconst serializedCodeValues = new Set<string>();\n\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\t\tconst codeValueKey = makeCodeValueKey(node.codeKey, node.value);\n\t\tif (serializedCodeValues.has(codeValueKey)) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\n\t\tserializedCodeValues.add(codeValueKey);\n\t}\n\n\treturn result;\n}\n\nexport function treeSelectValueToMultiValue(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n\nfunction getAncestorIds(nodeId: string, index: TreeNodeIndex) {\n\tconst ancestors: string[] = [];\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tancestors.push(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn ancestors;\n}\n\nfunction isDescendantOf(nodeId: string, ancestorId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (currentId === ancestorId) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\n/**\n * Проверяет, можно ли безопасно синхронизировать повторные визуальные узлы\n * одним server predicate. Disabled-поддеревья, виртуальные группы и вложенные\n * дубли требуют более точного выбора на уровне доступных потомков.\n */\nfunction canSynchronizeEquivalentTreeNodes(nodeId: string, index: TreeNodeIndex) {\n\tconst equivalentNodeIds = getEquivalentTreeNodeIds(nodeId, index);\n\tif (!equivalentNodeIds.length) return false;\n\n\tif (\n\t\tequivalentNodeIds.some((equivalentNodeId) => {\n\t\t\tconst node = index.nodeById.get(equivalentNodeId);\n\t\t\treturn !node || node.selectionBehavior === \"descendants\" || index.subtreeContainsDisabledById.get(equivalentNodeId) === true;\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\n\treturn !equivalentNodeIds.some((candidateId, candidateIndex) =>\n\t\tequivalentNodeIds.some(\n\t\t\t(otherId, otherIndex) =>\n\t\t\t\tcandidateIndex !== otherIndex &&\n\t\t\t\t(isDescendantOf(candidateId, otherId, index) || isDescendantOf(otherId, candidateId, index))\n\t\t)\n\t);\n}\n\n/** Возвращает эквивалентные узлы только для безопасно синхронизируемого predicate. */\nfunction getSynchronizedEquivalentTreeNodeIds(nodeId: string, index: TreeNodeIndex) {\n\treturn canSynchronizeEquivalentTreeNodes(nodeId, index) ? getEquivalentTreeNodeIds(nodeId, index) : [nodeId];\n}\n\nfunction removeDescendantSelections(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tfor (const selectedId of [...selectedIds]) {\n\t\tif (isDescendantOf(selectedId, nodeId, index)) {\n\t\t\tselectedIds.delete(selectedId);\n\t\t}\n\t}\n}\n\n/**\n * Снимает все сериализуемые predicates, которыми полностью покрыто поддерево.\n * Эквивалентные id удаляются во всех ветвях, потому что внешний multi-value не\n * способен сохранить один визуальный экземпляр и исключить другой.\n */\nfunction removeSelectedSubtreePredicates(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tconst subtreeNodeIds = [nodeId];\n\n\tfor (let nodeIndex = 0; nodeIndex < subtreeNodeIds.length; nodeIndex += 1) {\n\t\tconst subtreeNodeId = subtreeNodeIds[nodeIndex];\n\t\tif (!subtreeNodeId) continue;\n\n\t\tsubtreeNodeIds.push(...(index.childrenById.get(subtreeNodeId) ?? []));\n\t\tfor (const equivalentNodeId of getEquivalentTreeNodeIds(subtreeNodeId, index)) {\n\t\t\tselectedIds.delete(equivalentNodeId);\n\t\t}\n\t}\n}\n\nfunction isNodeFullySelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\tif (index.nodeById.get(nodeId)?.disabled) {\n\t\treturn false;\n\t}\n\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\tif (children.length === 0) {\n\t\treturn false;\n\t}\n\n\treturn children.every((childId) => isNodeFullySelected(childId, selectedIds, index));\n}\n\n/**\n * Проверяет, что отфильтрованное представление содержит поддерево целиком.\n * Совпавший parent возвращается поиском со всеми потомками, а parent совпавших\n * descendants содержит только видимые ветви и потому не может сериализоваться\n * собственным predicate без расширения выбора на скрытые узлы.\n */\nfunction isTreeSelectionScopeComplete(nodeId: string, index: TreeNodeIndex, selectionScopeIndex: TreeNodeIndex): boolean {\n\tif (!selectionScopeIndex.nodeById.has(nodeId)) {\n\t\treturn false;\n\t}\n\n\tconst childIds = index.childrenById.get(nodeId) ?? [];\n\tconst scopedChildIds = selectionScopeIndex.childrenById.get(nodeId) ?? [];\n\n\treturn (\n\t\tchildIds.length === scopedChildIds.length &&\n\t\tchildIds.every(\n\t\t\t(childId, childIndex) =>\n\t\t\t\tscopedChildIds[childIndex] === childId && isTreeSelectionScopeComplete(childId, index, selectionScopeIndex)\n\t\t)\n\t);\n}\n\nexport function canonicalizeTreeSelection(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst nextSelectedIds = new Set(selectedIds);\n\n\t/*\n\t * Внешнее значение могло быть сохранено до того, как узел стал виртуальной\n\t * группой. Разворачиваем такой выбор в актуальное покрытие потомков, чтобы\n\t * group-id не протекал обратно в публичный TreeMultiSelectValue.\n\t */\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (index.nodeById.get(selectedId)?.selectionBehavior !== \"descendants\") continue;\n\n\t\tnextSelectedIds.delete(selectedId);\n\t\tfor (const descendantId of getSelectableTreeNodeIds(index, index.childrenById.get(selectedId) ?? [])) {\n\t\t\tnextSelectedIds.add(descendantId);\n\t\t}\n\t}\n\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (getAncestorIds(selectedId, index).some((ancestorId) => nextSelectedIds.has(ancestorId))) {\n\t\t\tnextSelectedIds.delete(selectedId);\n\t\t}\n\t}\n\n\tconst orderedNodeIds = [...index.nodeById.keys()].sort(\n\t\t(leftId, rightId) => (index.preorderIndexById.get(rightId) ?? 0) - (index.preorderIndexById.get(leftId) ?? 0)\n\t);\n\n\tfor (const nodeId of orderedNodeIds) {\n\t\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\t\tif (\n\t\t\tchildren.length === 0 ||\n\t\t\tnextSelectedIds.has(nodeId) ||\n\t\t\tindex.nodeById.get(nodeId)?.disabled ||\n\t\t\tindex.nodeById.get(nodeId)?.selectionBehavior === \"descendants\"\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (children.every((childId) => isNodeFullySelected(childId, nextSelectedIds, index))) {\n\t\t\tconst equivalentNodeIds = getEquivalentTreeNodeIds(nodeId, index);\n\t\t\tconst canCollapseEquivalentNodes =\n\t\t\t\tcanSynchronizeEquivalentTreeNodes(nodeId, index) &&\n\t\t\t\tequivalentNodeIds.every((equivalentNodeId) => {\n\t\t\t\t\tconst equivalentNode = index.nodeById.get(equivalentNodeId);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tequivalentNode &&\n\t\t\t\t\t\t!equivalentNode.disabled &&\n\t\t\t\t\t\tequivalentNode.selectionBehavior !== \"descendants\" &&\n\t\t\t\t\t\tisNodeFullySelected(equivalentNodeId, nextSelectedIds, index)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t/*\n\t\t\t * Одинаковый server predicate может быть показан в нескольких ветвях.\n\t\t\t * Схлопывать детей в parent безопасно только при полном покрытии всех\n\t\t\t * его визуальных представлений, иначе сериализация расширила бы выбор.\n\t\t\t */\n\t\t\tif (canCollapseEquivalentNodes) {\n\t\t\t\tfor (const equivalentNodeId of equivalentNodeIds) {\n\t\t\t\t\tremoveDescendantSelections(nextSelectedIds, equivalentNodeId, index);\n\t\t\t\t\tnextSelectedIds.add(equivalentNodeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nextSelectedIds;\n}\n\nfunction expandNearestSelectedAncestor(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (selectedIds.has(currentId)) {\n\t\t\tfor (const equivalentAncestorId of getEquivalentTreeNodeIds(currentId, index)) {\n\t\t\t\tif (!selectedIds.has(equivalentAncestorId)) continue;\n\t\t\t\tselectedIds.delete(equivalentAncestorId);\n\n\t\t\t\t/*\n\t\t\t\t * Узел мог стать disabled уже после сохранения выбора его ancestor.\n\t\t\t\t * При частичном снятии разворачиваем все представления одного server\n\t\t\t\t * predicate только в их актуально доступное покрытие.\n\t\t\t\t */\n\t\t\t\tfor (const childId of getSelectableTreeNodeIds(index, index.childrenById.get(equivalentAncestorId) ?? [])) {\n\t\t\t\t\tselectedIds.add(childId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nexport function isTreeNodeSelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\treturn getAncestorIds(nodeId, index).some((ancestorId) => selectedIds.has(ancestorId));\n}\n\nfunction resolveTreeSelectionState(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex, state: TreeNodeSelectionState) {\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\tif (selectedIds.has(nodeId)) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (children.length === 0) {\n\t\treturn { selected: false, partial: false };\n\t}\n\n\tconst childStates = children.map((childId) => resolveTreeSelectionState(childId, selectedIds, index, state));\n\tconst allSelected = childStates.every((childState) => childState.selected && !childState.partial);\n\tconst hasAnySelected = childStates.some((childState) => childState.selected || childState.partial);\n\n\tif (allSelected) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (hasAnySelected) {\n\t\tstate.partialIds.add(nodeId);\n\t\treturn { selected: false, partial: true };\n\t}\n\n\treturn { selected: false, partial: false };\n}\n\nexport function getTreeNodeSelectionState(selectedIds: Set<string>, index: TreeNodeIndex): TreeNodeSelectionState {\n\tconst state: TreeNodeSelectionState = {\n\t\tselectedIds: new Set(),\n\t\tpartialIds: new Set()\n\t};\n\n\tfor (const rootId of index.rootIds) {\n\t\tresolveTreeSelectionState(rootId, selectedIds, index, state);\n\t}\n\n\treturn state;\n}\n\n/**\n * Строит каноническое покрытие всех доступных узлов для массового выбора.\n * Ветка схлопывается в parent только тогда, когда внутри неё нет disabled-узлов;\n * иначе выбираются доступные дочерние поддеревья, не затрагивая запреты.\n */\nexport function getSelectableTreeNodeIds(index: TreeNodeIndex, rootIds: readonly string[] = index.rootIds): Set<string> {\n\tconst collectSubtree = (nodeId: string): { containsDisabled: boolean; selectedIds: string[] } => {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tconst childSelections = (index.childrenById.get(nodeId) ?? []).map(collectSubtree);\n\t\tconst selectedChildIds = childSelections.flatMap((selection) => selection.selectedIds);\n\t\tconst containsDisabled = node?.disabled === true || childSelections.some((selection) => selection.containsDisabled);\n\n\t\tif (!node || node.disabled) {\n\t\t\treturn { containsDisabled: true, selectedIds: selectedChildIds };\n\t\t}\n\t\tif (node.selectionBehavior === \"descendants\") {\n\t\t\treturn { containsDisabled, selectedIds: selectedChildIds };\n\t\t}\n\t\tconst containsUnsafeEquivalent = !canSynchronizeEquivalentTreeNodes(nodeId, index);\n\n\t\treturn containsDisabled || containsUnsafeEquivalent\n\t\t\t? { containsDisabled: true, selectedIds: selectedChildIds }\n\t\t\t: { containsDisabled: false, selectedIds: [nodeId] };\n\t};\n\n\treturn new Set(rootIds.flatMap((rootId) => collectSubtree(rootId).selectedIds));\n}\n\nexport function toggleTreeMultiSelection(\n\tcurrentValue: TreeMultiSelectValue | undefined,\n\ttargetNodeId: string,\n\tindex: TreeNodeIndex,\n\tselectionScopeIndex?: TreeNodeIndex\n) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\tconst hasRestrictedSelectionScope =\n\t\tselectionScopeIndex !== undefined && !isTreeSelectionScopeComplete(targetNodeId, index, selectionScopeIndex);\n\n\t/*\n\t * Derived-full ветка может содержать одновременно safe и unsafe predicates.\n\t * При повторном клике снимаем всё её фактическое покрытие до расчёта набора,\n\t * доступного для нового выбора: иначе safe subset оставил бы ветку partial.\n\t */\n\tif (!hasRestrictedSelectionScope && isNodeFullySelected(targetNodeId, selectedIds, index)) {\n\t\tremoveSelectedSubtreePredicates(selectedIds, targetNodeId, index);\n\t\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n\t}\n\n\tconst toggle = (targetId: string) => {\n\t\tif (selectedIds.has(targetId)) {\n\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\treturn;\n\t\t}\n\t\tif (isNodeFullySelected(targetId, selectedIds, index)) {\n\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\t/*\n\t\t\t\t * В глубоком дереве после одного разворачивания target может остаться\n\t\t\t\t * покрыт более близким ancestor — продолжаем разложение рекурсивно.\n\t\t\t\t * Если unsafe target выпал из доступного покрытия, всё равно удаляем\n\t\t\t\t * его predicate-класс, включая disabled-дубль вне целевой ветви.\n\t\t\t\t */\n\t\t\t\tif (isTreeNodeSelected(targetId, selectedIds, index) || isNodeFullySelected(targetId, selectedIds, index)) {\n\t\t\t\t\ttoggle(targetId);\n\t\t\t\t} else {\n\t\t\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const equivalentTargetId of getSynchronizedEquivalentTreeNodeIds(targetId, index)) {\n\t\t\tremoveDescendantSelections(selectedIds, equivalentTargetId, index);\n\t\t\tselectedIds.add(equivalentTargetId);\n\t\t}\n\t};\n\n\tconst collectScopedSelectableTargetIds = (nodeId: string): string[] => {\n\t\tif (!selectionScopeIndex?.nodeById.has(nodeId)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (isTreeSelectionScopeComplete(nodeId, index, selectionScopeIndex)) {\n\t\t\tconst selectableNodeIds = [...getSelectableTreeNodeIds(index, [nodeId])];\n\t\t\tif (selectableNodeIds.length > 0) {\n\t\t\t\treturn selectableNodeIds;\n\t\t\t}\n\n\t\t\t/* Небезопасный сохранённый predicate должен оставаться доступен для снятия. */\n\t\t\treturn isTreeNodeSelected(nodeId, selectedIds, index) || isNodeFullySelected(nodeId, selectedIds, index) ? [nodeId] : [];\n\t\t}\n\n\t\treturn (selectionScopeIndex.childrenById.get(nodeId) ?? []).flatMap(collectScopedSelectableTargetIds);\n\t};\n\tconst resolvedSelectableTargetIds = hasRestrictedSelectionScope\n\t\t? collectScopedSelectableTargetIds(targetNodeId)\n\t\t: [...getSelectableTreeNodeIds(index, [targetNodeId])];\n\t/* Небезопасный сохранённый predicate остаётся доступен для явного снятия. */\n\tconst selectableTargetIds =\n\t\tresolvedSelectableTargetIds.length === 0 &&\n\t\t(isTreeNodeSelected(targetNodeId, selectedIds, index) || isNodeFullySelected(targetNodeId, selectedIds, index))\n\t\t\t? [targetNodeId]\n\t\t\t: resolvedSelectableTargetIds;\n\tconst allSelectableTargetsSelected =\n\t\tselectableTargetIds.length > 0 &&\n\t\tselectableTargetIds.every(\n\t\t\t(nodeId) => isTreeNodeSelected(nodeId, selectedIds, index) || isNodeFullySelected(nodeId, selectedIds, index)\n\t\t);\n\n\tfor (const selectableTargetId of selectableTargetIds) {\n\t\tconst selected =\n\t\t\tisTreeNodeSelected(selectableTargetId, selectedIds, index) || isNodeFullySelected(selectableTargetId, selectedIds, index);\n\t\tif ((allSelectableTargetsSelected && selected) || (!allSelectableTargetsSelected && !selected)) {\n\t\t\ttoggle(selectableTargetId);\n\t\t}\n\t}\n\n\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n}\n\nfunction collectExpandedIds(nodeId: string, index: TreeNodeIndex, expandedIds: Set<string>) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\texpandedIds.add(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n}\n\nexport function getSelectionExpandedIds(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const selectedId of selectedIds) {\n\t\tcollectExpandedIds(selectedId, index, expandedIds);\n\t}\n\n\treturn expandedIds;\n}\n\n/**\n * Вычисляет базовое раскрытие дерева из политики уровней и ручных действий.\n *\n * Ручное значение хранится отдельно для каждого node id и имеет приоритет над\n * default уровня. Благодаря вычислению по актуальному индексу узлы, загруженные\n * асинхронно, получают настройку без синхронизации props в React state.\n */\nexport function getConfiguredTreeExpandedIds(\n\tindex: TreeNodeIndex,\n\tdefaultExpandedCodeKeys: ReadonlySet<string>,\n\tmanualExpansionById: ReadonlyMap<string, boolean>\n) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const [nodeId, childIds] of index.childrenById) {\n\t\tif (childIds.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (manualExpansionById.get(nodeId) ?? defaultExpandedCodeKeys.has(node.codeKey)) {\n\t\t\texpandedIds.add(nodeId);\n\t\t}\n\t}\n\n\treturn expandedIds;\n}\n\nfunction filterTreeNode(node: TreeSelectNode, normalizedQuery: string, expandedIds: Set<string>): TreeSelectNode | null {\n\tconst filteredChildren = (node.children ?? [])\n\t\t.map((childNode) => filterTreeNode(childNode, normalizedQuery, expandedIds))\n\t\t.filter((childNode): childNode is TreeSelectNode => Boolean(childNode));\n\tconst isMatched = node.searchText.toLowerCase().includes(normalizedQuery);\n\n\tif (!isMatched && filteredChildren.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (filteredChildren.length > 0) {\n\t\texpandedIds.add(node.id);\n\t}\n\n\tif (filteredChildren.length === 0) {\n\t\treturn node;\n\t}\n\n\treturn {\n\t\t...node,\n\t\tchildren: filteredChildren\n\t};\n}\n\nexport function filterTreeNodes(nodes: readonly TreeSelectNode[], query: string) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\n\tif (!normalizedQuery) {\n\t\treturn {\n\t\t\tnodes: [...nodes],\n\t\t\texpandedIds: new Set<string>()\n\t\t};\n\t}\n\n\tconst expandedIds = new Set<string>();\n\tconst filteredNodes = nodes\n\t\t.map((node) => filterTreeNode(node, normalizedQuery, expandedIds))\n\t\t.filter((node): node is TreeSelectNode => Boolean(node));\n\n\treturn {\n\t\tnodes: filteredNodes,\n\t\texpandedIds\n\t};\n}\n\nexport function flattenVisibleTreeNodes(nodes: readonly TreeSelectNode[], expandedIds: Set<string>): TreeVisibleEntry[] {\n\tconst entries: TreeVisibleEntry[] = [];\n\n\tconst walk = (node: TreeSelectNode, level: number, parentId?: string) => {\n\t\tconst hasChildren = (node.children?.length ?? 0) > 0;\n\t\tconst isExpanded = hasChildren && expandedIds.has(node.id);\n\n\t\tentries.push({\n\t\t\tnode,\n\t\t\tlevel,\n\t\t\tparentId,\n\t\t\thasChildren,\n\t\t\tisExpanded,\n\t\t\tisLeaf: !hasChildren\n\t\t});\n\n\t\tif (!isExpanded) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const childNode of node.children ?? []) {\n\t\t\twalk(childNode, level + 1, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node, 0);\n\t}\n\n\treturn entries;\n}\n","export type TreeColumnsLayoutEntryDescriptor = {\n\tlevel: number;\n};\n\n/** Границы одной root-группы в исходном DOM preorder. */\nexport type TreeColumnsRootGroupDescriptor = {\n\tstartIndex: number;\n\tendIndexExclusive: number;\n};\n\n/** Структурный вход columns-resolver и стабильная сигнатура для Floating UI. */\nexport type TreeColumnsLayoutDescriptor = {\n\titemCount: number;\n\tgroups: readonly TreeColumnsRootGroupDescriptor[];\n\tsignature: string;\n};\n\n/**\n * Описывает root-группы видимой части дерева, не меняя исходный preorder.\n *\n * Descriptor хранит только границы root-групп. Минимальное число строк,\n * необходимое для начала группы в текущем столбце, является invariant packing\n * и вычисляется resolver-ом без привязки к глубине отдельных descendants.\n */\nexport function buildTreeColumnsLayoutDescriptor(entries: readonly TreeColumnsLayoutEntryDescriptor[]): TreeColumnsLayoutDescriptor {\n\tconst groups: TreeColumnsRootGroupDescriptor[] = [];\n\tlet groupStartIndex = 0;\n\n\twhile (groupStartIndex < entries.length) {\n\t\tlet groupEndIndexExclusive = groupStartIndex + 1;\n\t\twhile (groupEndIndexExclusive < entries.length && entries[groupEndIndexExclusive]?.level !== 0) {\n\t\t\tgroupEndIndexExclusive += 1;\n\t\t}\n\n\t\tgroups.push({\n\t\t\tstartIndex: groupStartIndex,\n\t\t\tendIndexExclusive: groupEndIndexExclusive\n\t\t});\n\t\tgroupStartIndex = groupEndIndexExclusive;\n\t}\n\n\tconst signature = groups.map(({ startIndex, endIndexExclusive }) => `${startIndex}:${endIndexExclusive}`).join(\"|\");\n\n\treturn {\n\t\titemCount: entries.length,\n\t\tgroups,\n\t\tsignature: `${entries.length}|${signature}`\n\t};\n}\n","import type { TreeColumnsLayoutDescriptor, TreeColumnsRootGroupDescriptor } from \"./buildTreeColumnsLayoutDescriptor\";\n\nexport type BalancedTreeColumnsLayoutInput = {\n\tdescriptor: TreeColumnsLayoutDescriptor;\n\tavailableWidth: number;\n\tavailableHeight: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\treferenceWidth: number;\n};\n\nexport type BalancedTreeColumnsLayout = {\n\tcolumnCount: number;\n\trowCount: number;\n\twidth: number;\n\tminWidth: number;\n\tmaxHeight: number;\n\tplacements: readonly TreeColumnPlacement[];\n};\n\n/** Явная 1-based CSS-grid координата строки с неизменным option index. */\nexport type TreeColumnPlacement = {\n\tcolumn: number;\n\trow: number;\n};\n\nconst VIEWPORT_PADDING = 8;\nconst POPUP_HORIZONTAL_PADDING = 16;\nconst POPUP_CHROME_HEIGHT = 48;\nconst COLUMN_WIDTH = 224;\nconst COLUMN_GAP = 10;\nconst OPTION_HEIGHT = 32;\nconst MAX_COLUMN_COUNT = 6;\nconst MINIMUM_GROUP_START_ITEM_COUNT = 3;\n\nfunction normalizePositiveDimension(value: number, fallback: number) {\n\treturn Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\n/** Результат одной симуляции packing для заданной логической высоты колонки. */\nexport type ResolvedTreeColumnsPlacements = {\n\tplacements: TreeColumnPlacement[];\n\tusedColumnCount: number;\n\tintentionalGapCount: number;\n};\n\n/**\n * Возвращает минимальное число первых строк root-группы, которое должно\n * поместиться в остатке текущего столбца.\n *\n * Для группы из трёх и более элементов порог всегда равен трём: root и две\n * следующие видимые строки остаются вместе. Короткая группа защищается целиком,\n * а одиночный root использует последнюю свободную строку без лишнего переноса.\n */\nfunction resolveMinimumGroupStartItemCount(group: TreeColumnsRootGroupDescriptor) {\n\tconst groupSize = group.endIndexExclusive - group.startIndex;\n\treturn Math.min(MINIMUM_GROUP_START_ITEM_COUNT, groupSize);\n}\n\n/**\n * Симулирует CSS-grid packing и сохраняет DOM preorder через явные координаты.\n *\n * Намеренный перенос оставляет хвост предыдущей колонки пустым: последующие\n * группы не заполняют gap, поэтому визуальная последовательность не расходится\n * с option indexes, refs и keyboard navigation.\n */\nexport function resolveTreeColumnsPlacements(descriptor: TreeColumnsLayoutDescriptor, rowCount: number): ResolvedTreeColumnsPlacements {\n\tconst normalizedRowCount = Math.max(1, rowCount);\n\tconst placements: TreeColumnPlacement[] = [];\n\tlet column = 1;\n\tlet row = 1;\n\tlet intentionalGapCount = 0;\n\n\tfor (const group of descriptor.groups) {\n\t\tconst minimumGroupStartItemCount = resolveMinimumGroupStartItemCount(group);\n\t\tconst remainingRows = normalizedRowCount - row + 1;\n\n\t\tif (row > 1 && minimumGroupStartItemCount > remainingRows) {\n\t\t\tintentionalGapCount += remainingRows;\n\t\t\tcolumn += 1;\n\t\t\trow = 1;\n\t\t}\n\n\t\tfor (let index = group.startIndex; index < group.endIndexExclusive; index += 1) {\n\t\t\tplacements[index] = { column, row };\n\t\t\trow += 1;\n\n\t\t\tif (row > normalizedRowCount) {\n\t\t\t\tcolumn += 1;\n\t\t\t\trow = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tplacements,\n\t\tusedColumnCount: placements.length ? Math.max(...placements.map((placement) => placement.column)) : 1,\n\t\tintentionalGapCount\n\t};\n}\n\n/**\n * Выбирает количество колонок по фактически доступной Floating UI геометрии.\n * Для каждого candidate сначала выполняется group-aware packing. Если переносы\n * по трёхстрочному порогу создали лишнюю колонку, её высота увеличивается до\n * тех пор, пока placements не попадут в объявленный template grid.\n */\nexport function resolveBalancedTreeColumnsLayout({\n\tdescriptor,\n\tavailableWidth,\n\tavailableHeight,\n\tviewportWidth,\n\tviewportHeight,\n\treferenceWidth\n}: BalancedTreeColumnsLayoutInput): BalancedTreeColumnsLayout {\n\tconst normalizedItemCount = Math.max(0, Math.floor(Number.isFinite(descriptor.itemCount) ? descriptor.itemCount : 0));\n\tconst normalizedAvailableWidth = normalizePositiveDimension(availableWidth, COLUMN_WIDTH + POPUP_HORIZONTAL_PADDING);\n\tconst normalizedAvailableHeight = normalizePositiveDimension(availableHeight, OPTION_HEIGHT + POPUP_CHROME_HEIGHT);\n\tconst normalizedViewportWidth = normalizePositiveDimension(viewportWidth, normalizedAvailableWidth + VIEWPORT_PADDING * 2);\n\tconst normalizedViewportHeight = normalizePositiveDimension(viewportHeight, normalizedAvailableHeight);\n\tconst widthLimit = Math.max(1, Math.min(normalizedAvailableWidth, Math.max(1, normalizedViewportWidth - VIEWPORT_PADDING * 2)));\n\tconst heightLimit = Math.max(1, Math.min(normalizedAvailableHeight, normalizedViewportHeight - VIEWPORT_PADDING * 2));\n\tconst normalizedReferenceWidth = Math.max(1, normalizePositiveDimension(referenceWidth, 1));\n\tconst minWidth = Math.min(widthLimit, normalizedReferenceWidth);\n\tconst maxColumnsByWidth = Math.max(1, Math.floor((widthLimit - POPUP_HORIZONTAL_PADDING + COLUMN_GAP) / (COLUMN_WIDTH + COLUMN_GAP)));\n\tconst maxColumnCount = Math.max(1, Math.min(MAX_COLUMN_COUNT, maxColumnsByWidth, normalizedItemCount || 1));\n\tconst minimumGroupStartRows = descriptor.groups.reduce(\n\t\t(maximum, group) => Math.max(maximum, resolveMinimumGroupStartItemCount(group)),\n\t\t1\n\t);\n\n\tif (normalizedItemCount === 0) {\n\t\treturn {\n\t\t\tcolumnCount: 1,\n\t\t\trowCount: 1,\n\t\t\twidth: minWidth,\n\t\t\tminWidth,\n\t\t\tmaxHeight: heightLimit,\n\t\t\tplacements: []\n\t\t};\n\t}\n\n\tlet bestLayout: BalancedTreeColumnsLayout | undefined;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\n\tfor (let candidateColumnCount = 1; candidateColumnCount <= maxColumnCount; candidateColumnCount += 1) {\n\t\tlet rowCount = Math.max(minimumGroupStartRows, Math.ceil(normalizedItemCount / candidateColumnCount));\n\t\tlet packed = resolveTreeColumnsPlacements(descriptor, rowCount);\n\n\t\twhile (packed.usedColumnCount > candidateColumnCount && rowCount < normalizedItemCount) {\n\t\t\trowCount += 1;\n\t\t\tpacked = resolveTreeColumnsPlacements(descriptor, rowCount);\n\t\t}\n\n\t\tconst columnCount = packed.usedColumnCount;\n\t\tconst naturalWidth = Math.max(minWidth, POPUP_HORIZONTAL_PADDING + columnCount * COLUMN_WIDTH + (columnCount - 1) * COLUMN_GAP);\n\t\tconst naturalHeight = POPUP_CHROME_HEIGHT + rowCount * OPTION_HEIGHT;\n\t\tconst widthRatio = naturalWidth / widthLimit;\n\t\tconst heightRatio = naturalHeight / heightLimit;\n\t\tconst emptyCellPenalty = (columnCount * rowCount - normalizedItemCount) / normalizedItemCount;\n\t\tconst intentionalGapPenalty = packed.intentionalGapCount / normalizedItemCount;\n\t\tconst score =\n\t\t\tMath.max(widthRatio, heightRatio) +\n\t\t\t0.25 * Math.abs(widthRatio - heightRatio) +\n\t\t\t0.01 * emptyCellPenalty +\n\t\t\t0.02 * intentionalGapPenalty +\n\t\t\t0.04 * (columnCount - 1);\n\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestLayout = {\n\t\t\t\tcolumnCount,\n\t\t\t\trowCount,\n\t\t\t\twidth: Math.min(widthLimit, naturalWidth),\n\t\t\t\tminWidth,\n\t\t\t\tmaxHeight: heightLimit,\n\t\t\t\tplacements: packed.placements\n\t\t\t};\n\t\t}\n\t}\n\n\treturn (\n\t\tbestLayout ?? {\n\t\t\tcolumnCount: 1,\n\t\t\trowCount: normalizedItemCount,\n\t\t\twidth: minWidth,\n\t\t\tminWidth,\n\t\t\tmaxHeight: heightLimit,\n\t\t\tplacements: resolveTreeColumnsPlacements(descriptor, normalizedItemCount).placements\n\t\t}\n\t);\n}\n","@use \"@/styles/mixins\" as *;\n\n.treeNodeButton {\n\tgap: var(--space-sm);\n}\n\n.treePopupHeader {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n}\n\n.treeColumns {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--tree-column-count, 1), minmax(0, 1fr));\n\tgrid-template-rows: repeat(var(--tree-row-count, 1), minmax(var(--control-height), auto));\n\tcolumn-gap: var(--space-sm);\n\talign-content: start;\n\twidth: 100%;\n\tmin-width: 0;\n}\n\n.treeColumnRow {\n\tmin-width: 0;\n\tgrid-column-start: var(--tree-option-column);\n\tgrid-row-start: var(--tree-option-row);\n}\n\n// В columns внешний floating maxHeight уже учитывает доступную сторону и safe area.\n.treeColumnsPopupLayout {\n\tmax-height: none;\n}\n\n.treeColumnCheckBox {\n\tdisplay: inline-flex;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n}\n\n.treeIndent {\n\tflex-shrink: 0;\n\twidth: calc(var(--tree-level) * 1em);\n}\n\n.treeExpander,\n.treeExpanderPlaceholder {\n\tflex-shrink: 0;\n\twidth: var(--text-height);\n\theight: var(--text-height);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.treeExpander {\n\tbackground: transparent;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.treeExpanderIcon {\n\ttransition: transform var(--transition-fast) ease;\n}\n\n.treeExpanderIconExpanded {\n\ttransform: rotate(90deg);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronRightIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../check-box\";\nimport { OptionButton } from \"../option\";\n\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeMultiSelectOptionsLayout, TreeSelectNode } from \"./types\";\n\ntype TreeNodeContentProps = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\thighlight?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tselected: boolean;\n\tpartial: boolean;\n\tselectionMode: \"single\" | \"multi\";\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\tonToggleExpand?: () => void;\n\tonToggleSelection?: () => void;\n\tonActivate?: () => void;\n};\n\nexport function TreeNodeContent({\n\tnode,\n\tlevel,\n\thighlight,\n\thasChildren,\n\tisExpanded,\n\tselected,\n\tpartial,\n\tselectionMode,\n\toptionsLayout = \"tree\",\n\tonToggleExpand,\n\tonToggleSelection,\n\tonActivate\n}: TreeNodeContentProps) {\n\tconst showExpansionControl = optionsLayout === \"tree\";\n\tconst emphasizeRootContent = optionsLayout === \"columns\" && level === 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div className={styles.treeIndent} style={{ \"--tree-level\": level } as CSSProperties} aria-hidden=\"true\" />\n\t\t\t{showExpansionControl && hasChildren ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.treeExpander}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonToggleExpand?.();\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={isExpanded ? \"Свернуть ветку\" : \"Развернуть ветку\"}\n\t\t\t\t\tdata-ui=\"tree-select-expander\"\n\t\t\t\t\tdata-action={isExpanded ? \"collapse-tree-select-node\" : \"expand-tree-select-node\"}>\n\t\t\t\t\t<ChevronRightIcon className={cn(styles.treeExpanderIcon, isExpanded && styles.treeExpanderIconExpanded)} />\n\t\t\t\t</button>\n\t\t\t) : showExpansionControl ? (\n\t\t\t\t<div className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t) : null}\n\n\t\t\t{selectionMode === \"multi\" ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.treeColumnCheckBox}\n\t\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\t\tonClick={(event) => event.stopPropagation()}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tindeterminate={partial}\n\t\t\t\t\t\tdisabled={node.disabled}\n\t\t\t\t\t\taria-label={`Выбрать ${node.label}`}\n\t\t\t\t\t\tonChange={() => onToggleSelection?.()}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t<OptionButton\n\t\t\t\tclassName={styles.treeNodeButton}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tdisabled={node.disabled}\n\t\t\t\ttext={node.label}\n\t\t\t\tcode={node.code}\n\t\t\t\tsearchText={highlight}\n\t\t\t\temphasizeContent={emphasizeRootContent}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tonClick={onActivate}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import { type CSSProperties, type KeyboardEvent, ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type FloatingListboxSizeResolver } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport { cn, findFirstEnabledIndex, findLastEnabledIndex, findNextEnabledIndex } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputText } from \"../input\";\nimport { Option } from \"../option\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerSelectionToolbar,\n\tPickerStatus,\n\tPickerTrigger,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport { buildTreeColumnsLayoutDescriptor } from \"./model/buildTreeColumnsLayoutDescriptor\";\nimport { resolveBalancedTreeColumnsLayout } from \"./model/resolveBalancedTreeColumnsLayout\";\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\n\tgetConfiguredTreeExpandedIds,\n\tgetSelectionExpandedIds,\n\tisTreeNodeSelected,\n\ttype TreeNodeIndex,\n\tTreeVisibleEntry\n} from \"./model/treeUtils\";\nimport { TreeNodeContent } from \"./TreeNodeContent\";\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeMultiSelectOptionsLayout, TreeSelectNode } from \"./types\";\n\ntype TreePickerBulkActions = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n};\n\ntype TreePickerBaseProps = Omit<UiBaseProps<never>, \"value\" | \"onChange\"> & {\n\tnodes: readonly TreeSelectNode[];\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n\tselectionMode: \"single\" | \"multi\";\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\tdefaultExpandedCodeKeys?: readonly string[];\n\t/** Узлы, которые текущий multi-select contract не может безопасно сериализовать. */\n\tunavailableNodeIds?: ReadonlySet<string>;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tbulkActions?: TreePickerBulkActions;\n\ttriggerMode?: \"display\" | \"search\";\n\tselectedSummary?: ReactNode;\n\tselectedSummaryText?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\t/** Основное действие OptionButton выбирает узел и завершает текущий выбор. */\n\tonNodeActivate: (node: TreeSelectNode, selectionScopeIndex?: TreeNodeIndex) => void;\n\t/** Независимый checkbox меняет черновик, не закрывая popup. */\n\tonNodeToggleSelection?: (node: TreeSelectNode, selectionScopeIndex?: TreeNodeIndex) => void;\n\tonClearSelection?: () => void;\n\tisLoading?: boolean;\n\terror?: string;\n};\n\nexport function TreePickerBase({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\tnodes,\n\tselectedIds,\n\tpartialIds,\n\tselectionMode,\n\toptionsLayout = \"tree\",\n\tdefaultExpandedCodeKeys,\n\tunavailableNodeIds,\n\topen: controlledOpen,\n\tonOpenChange,\n\tbulkActions,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonNodeToggleSelection,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst selectAllButtonRef = useRef<HTMLButtonElement | null>(null);\n\tconst optionRefs = useRef<Array<HTMLDivElement | null>>([]);\n\t/** Явный owner open-state позволяет сбрасывать query непосредственно в close-событии. */\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\t/**\n\t * Сохраняет строку, в которую фокус вошёл через независимый expander или\n\t * checkbox. Это синхронизирует видимый active-state, не превращая строку в\n\t * единственный tab-stop и не меняя доступность вложенных контролов.\n\t */\n\tconst [focusedNodeId, setFocusedNodeId] = useState<string>();\n\tconst isOpenControlled = controlledOpen !== undefined;\n\tconst open = isOpenControlled ? controlledOpen : uncontrolledOpen;\n\tconst [manualExpansionById, setManualExpansionById] = useState<ReadonlyMap<string, boolean>>(() => new Map());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? (selectionMode === \"multi\" ? \"search-multi\" : \"search-single\") : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst defaultExpandedCodeKeySet = useMemo(() => new Set(defaultExpandedCodeKeys), [defaultExpandedCodeKeys]);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: resolvedTriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\t\tif (!nextOpen) {\n\t\t\tsetFocusedNodeId(undefined);\n\t\t}\n\n\t\tif (!isOpenControlled) {\n\t\t\tsetUncontrolledOpen(nextOpen);\n\t\t}\n\n\t\tonOpenChange?.(nextOpen);\n\t};\n\tconst { nodes: filteredNodes, expandedIds: searchExpandedIds } = useMemo(\n\t\t() => filterTreeNodes(nodes, currentQuery),\n\t\t[nodes, currentQuery]\n\t);\n\tconst filteredTreeIndex = useMemo(() => createTreeNodeIndex(filteredNodes), [filteredNodes]);\n\tconst selectionScopeIndex = currentQuery.trim().length > 0 ? filteredTreeIndex : undefined;\n\tconst selectedExpandedIds = useMemo(() => getSelectionExpandedIds(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst configuredExpandedIds = useMemo(\n\t\t() => getConfiguredTreeExpandedIds(treeIndex, defaultExpandedCodeKeySet, manualExpansionById),\n\t\t[defaultExpandedCodeKeySet, manualExpansionById, treeIndex]\n\t);\n\tconst allExpandedIds = useMemo(\n\t\t() => new Set([...treeIndex.childrenById].filter(([, childIds]) => childIds.length > 0).map(([nodeId]) => nodeId)),\n\t\t[treeIndex]\n\t);\n\tconst resolvedExpandedIds = useMemo(\n\t\t() =>\n\t\t\toptionsLayout === \"columns\"\n\t\t\t\t? allExpandedIds\n\t\t\t\t: new Set([...configuredExpandedIds, ...searchExpandedIds, ...selectedExpandedIds]),\n\t\t[allExpandedIds, configuredExpandedIds, optionsLayout, searchExpandedIds, selectedExpandedIds]\n\t);\n\tconst visibleEntries = useMemo(() => flattenVisibleTreeNodes(filteredNodes, resolvedExpandedIds), [filteredNodes, resolvedExpandedIds]);\n\tconst selectedIndex = useMemo(() => visibleEntries.findIndex((entry) => selectedIds.has(entry.node.id)), [selectedIds, visibleEntries]);\n\tconst isEntryDisabled = useCallback(\n\t\t(entry: TreeVisibleEntry) => entry.node.disabled === true || unavailableNodeIds?.has(entry.node.id) === true,\n\t\t[unavailableNodeIds]\n\t);\n\tconst columnsLayoutDescriptor = useMemo(() => buildTreeColumnsLayoutDescriptor(visibleEntries), [visibleEntries]);\n\tconst resolveColumnsFloatingSize = useCallback<FloatingListboxSizeResolver>(\n\t\t(context) => {\n\t\t\tconst layout = resolveBalancedTreeColumnsLayout({\n\t\t\t\t...context,\n\t\t\t\tdescriptor: columnsLayoutDescriptor\n\t\t\t});\n\t\t\tconst placementProperties: { [customProperty: `--${string}`]: string | undefined } = {};\n\t\t\tlayout.placements.forEach((placement, index) => {\n\t\t\t\tplacementProperties[`--tree-option-${index}-column`] = String(placement.column);\n\t\t\t\tplacementProperties[`--tree-option-${index}-row`] = String(placement.row);\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\twidth: `${layout.width}px`,\n\t\t\t\tminWidth: `${layout.minWidth}px`,\n\t\t\t\tmaxWidth: `${layout.width}px`,\n\t\t\t\tmaxHeight: `${layout.maxHeight}px`,\n\t\t\t\t\"--tree-column-count\": String(layout.columnCount),\n\t\t\t\t\"--tree-row-count\": String(layout.rowCount),\n\t\t\t\t...placementProperties\n\t\t\t};\n\t\t},\n\t\t[columnsLayoutDescriptor]\n\t);\n\tconst {\n\t\tactiveIndex: listboxActiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleEntries,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: (entry) => onNodeActivate(entry.node, selectionScopeIndex),\n\t\tgetOptionDisabled: isEntryDisabled,\n\t\tdisabled: disabled || isLoading,\n\t\t// selectOption вызывается только основной кнопкой; checkbox обходит его и остаётся в draft-режиме.\n\t\tcloseOnSelect: true,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode: resolvedTriggerMode,\n\t\tplacementStrategy: optionsLayout === \"columns\" ? \"auto\" : \"flip\",\n\t\tresolveFloatingSize: optionsLayout === \"columns\" ? resolveColumnsFloatingSize : undefined\n\t});\n\tconst focusedOptionIndex = focusedNodeId ? visibleEntries.findIndex((entry) => entry.node.id === focusedNodeId) : -1;\n\tconst renderedActiveIndex = focusedOptionIndex >= 0 ? focusedOptionIndex : listboxActiveIndex;\n\tconst updateFloatingLayout = context.update;\n\tconst hasSelection = selectedIds.size > 0;\n\tconst showTriggerQuery = triggerMode === \"search\" && (open || currentQuery.length > 0);\n\tconst triggerValue = showTriggerQuery ? currentQuery : (selectedSummaryText ?? \"\");\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: resolvedTriggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: Boolean(selectedSummaryText),\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst showBulkActions = optionsLayout === \"columns\" && selectionMode === \"multi\" && bulkActions;\n\tconst showPopupSearch = triggerMode === \"display\";\n\tconst popupHeader =\n\t\tshowBulkActions || showPopupSearch ? (\n\t\t\t<div className={styles.treePopupHeader}>\n\t\t\t\t{showBulkActions ? (\n\t\t\t\t\t<PickerSelectionToolbar\n\t\t\t\t\t\tonSelectAll={bulkActions.onSelectAll}\n\t\t\t\t\t\tonDeselectAll={bulkActions.onDeselectAll}\n\t\t\t\t\t\tselectAllButtonRef={selectAllButtonRef}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t{showPopupSearch ? (\n\t\t\t\t\t<InputText\n\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\tonChange={setQuery}\n\t\t\t\t\t\tonClear={() => setQuery(\"\")}\n\t\t\t\t\t\tplaceholder=\"Поиск по дереву\"\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.key !== \"Escape\" && event.key !== \"Tab\") {\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t) : undefined;\n\n\tuseLayoutEffect(() => {\n\t\tif (open && optionsLayout === \"columns\") {\n\t\t\tupdateFloatingLayout();\n\t\t}\n\t}, [columnsLayoutDescriptor.signature, open, optionsLayout, updateFloatingLayout]);\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClearSelection = () => {\n\t\tonClearSelection?.();\n\t\tsetQuery(\"\");\n\n\t\tif (selectionMode === \"single\") {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst toggleExpand = (entry: TreeVisibleEntry) => {\n\t\tif (!entry.hasChildren) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetManualExpansionById((currentExpansionById) => {\n\t\t\tconst nextExpansionById = new Map(currentExpansionById);\n\t\t\tconst isConfiguredExpanded = currentExpansionById.get(entry.node.id) ?? defaultExpandedCodeKeySet.has(entry.node.codeKey);\n\n\t\t\tnextExpansionById.set(entry.node.id, !isConfiguredExpanded);\n\n\t\t\treturn nextExpansionById;\n\t\t});\n\t};\n\tconst focusOptionAtIndex = (optionIndex: number) => {\n\t\toptionRefs.current[optionIndex]?.focus();\n\t};\n\t/**\n\t * Объединяет клавиатурную модель строки для внешней Option и её независимых\n\t * контролов: вертикальные клавиши перемещают строковый фокус, горизонтальные\n\t * управляют веткой, Space меняет checkbox, а Enter выполняет основное действие.\n\t */\n\tconst handleTreeOptionKeyDown = (event: KeyboardEvent<HTMLElement>, entry: TreeVisibleEntry, optionIndex: number) => {\n\t\tif (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n\t\t\tevent.preventDefault();\n\t\t\tconst direction = event.key === \"ArrowDown\" ? 1 : -1;\n\t\t\tfocusOptionAtIndex(findNextEnabledIndex(visibleEntries, optionIndex, direction, isEntryDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\" || event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tconst boundaryIndex =\n\t\t\t\tevent.key === \"Home\"\n\t\t\t\t\t? findFirstEnabledIndex(visibleEntries, isEntryDisabled)\n\t\t\t\t\t: findLastEnabledIndex(visibleEntries, isEntryDisabled);\n\t\t\tfocusOptionAtIndex(boundaryIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionsLayout === \"tree\" && event.key === \"ArrowRight\") {\n\t\t\tevent.preventDefault();\n\t\t\tif (entry.hasChildren && !entry.isExpanded) {\n\t\t\t\ttoggleExpand(entry);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst firstChildEntry = visibleEntries[optionIndex + 1];\n\t\t\tif (entry.isExpanded && firstChildEntry?.parentId === entry.node.id) {\n\t\t\t\tfocusOptionAtIndex(optionIndex + 1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionsLayout === \"tree\" && event.key === \"ArrowLeft\") {\n\t\t\tevent.preventDefault();\n\t\t\tif (entry.hasChildren && entry.isExpanded) {\n\t\t\t\ttoggleExpand(entry);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.parentId) {\n\t\t\t\tfocusOptionAtIndex(visibleEntries.findIndex((candidate) => candidate.node.id === entry.parentId));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \" \" && selectionMode === \"multi\" && !isEntryDisabled(entry)) {\n\t\t\tevent.preventDefault();\n\t\t\tonNodeToggleSelection?.(entry.node, selectionScopeIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Enter\" && !isEntryDisabled(entry)) {\n\t\t\tevent.preventDefault();\n\t\t\tselectOption(entry);\n\t\t}\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\t\t\t\tconst popupAriaLabel = typeof label === \"string\" ? label : placeholder;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={treeIndex.nodeById.size}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerValue}\n\t\t\t\t\t\t\tselectedValue={selectedSummary ?? selectedSummaryText}\n\t\t\t\t\t\t\thasSelection={hasSelection}\n\t\t\t\t\t\t\tshowSelectedValue={\n\t\t\t\t\t\t\t\thasSelection && (resolvedTriggerMode === \"search-multi\" ? currentQuery.length === 0 : !showTriggerQuery)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclearable={onClearSelection !== undefined}\n\t\t\t\t\t\t\tonClear={handleClearSelection}\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-label={labelId ? undefined : placeholder}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup={optionsLayout === \"columns\" ? \"dialog\" : \"listbox\"}\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={optionsLayout !== \"columns\" && triggerMode === \"search\" ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\t\toptionsLayout !== \"columns\" && open && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (triggerMode !== \"search\") {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\tsetFocusedNodeId(undefined);\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\" &&\n\t\t\t\t\t\t\t\t\topen &&\n\t\t\t\t\t\t\t\t\tevent.key === \"Tab\" &&\n\t\t\t\t\t\t\t\t\t!event.shiftKey &&\n\t\t\t\t\t\t\t\t\tselectAllButtonRef.current\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tselectAllButtonRef.current.focus();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeEntry = listboxActiveIndex >= 0 ? visibleEntries[listboxActiveIndex] : undefined;\n\t\t\t\t\t\t\t\t\t\tif (activeEntry) {\n\t\t\t\t\t\t\t\t\t\t\tselectOption(activeEntry);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: triggerMode === \"display\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tpopupAriaLabel={popupAriaLabel}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={\n\t\t\t\t\t\t\t\toptionsLayout !== \"columns\" && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tariaMultiselectable={optionsLayout !== \"columns\" && selectionMode === \"multi\"}\n\t\t\t\t\t\t\tpopupRole={optionsLayout === \"columns\" ? \"dialog\" : \"listbox\"}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tlayoutClassName={optionsLayout === \"columns\" ? styles.treeColumnsPopupLayout : undefined}\n\t\t\t\t\t\t\tbodyClassName=\"scrollable\"\n\t\t\t\t\t\t\ttoolbar={popupHeader}>\n\t\t\t\t\t\t\t<div className={cn(optionsLayout === \"columns\" && styles.treeColumns)}>\n\t\t\t\t\t\t\t\t{visibleEntries.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<PickerStatus errorState={error} emptyState={!error && !isLoading ? \"Нет данных\" : undefined} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvisibleEntries.map((entry, index) => {\n\t\t\t\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\t\t\t\tselectionMode === \"multi\"\n\t\t\t\t\t\t\t\t\t\t\t\t? isTreeNodeSelected(entry.node.id, selectedIds, treeIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t: selectedIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst partial = selectionMode === \"multi\" && !selected && partialIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst active = index === renderedActiveIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled =\n\t\t\t\t\t\t\t\t\t\t\tentry.node.disabled === true || unavailableNodeIds?.has(entry.node.id) === true;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Option\n\t\t\t\t\t\t\t\t\t\t\t\tkey={entry.node.id}\n\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"tree-select-option\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionRefs.current[index] = node;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetOptionRef(index, node);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\trole={optionsLayout === \"columns\" ? undefined : \"option\"}\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={optionsLayout === \"columns\" ? undefined : selected}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\tactive={active}\n\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedNodeId(entry.node.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => handleTreeOptionKeyDown(event, entry, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={optionsLayout === \"columns\" ? styles.treeColumnRow : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"--tree-option-column\": `var(--tree-option-${index}-column, auto)`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"--tree-option-row\": `var(--tree-option-${index}-row, auto)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} as CSSProperties)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t\t\t<TreeNodeContent\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode={optionDisabled ? { ...entry.node, disabled: true } : entry.node}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlevel={entry.level}\n\t\t\t\t\t\t\t\t\t\t\t\t\thighlight={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\t\t\thasChildren={entry.hasChildren}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisExpanded={entry.isExpanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpartial={partial}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout={optionsLayout}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleExpand={() => toggleExpand(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleSelection={() => onNodeToggleSelection?.(entry.node, selectionScopeIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonActivate={() => selectOption(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Option>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n","import { useMemo, useState } from \"react\";\n\nimport { formatOptionCount } from \"../multi-select/ui/defaultRenderers\";\nimport { usePickerSelectionLifecycle } from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tgetSelectableTreeNodeIds,\n\tgetTreeNodeSelectionState,\n\tisTreeNodeSelected,\n\ttoggleTreeMultiSelection,\n\ttreeMultiValueToSelectedIds,\n\ttreeSelectedIdsToMultiValue\n} from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeMultiSelectOptionsLayout, TreeMultiSelectValue, TreeSelectNode } from \"./types\";\n\nexport interface TreeMultiSelectProps extends Omit<UiBaseProps<TreeMultiSelectValue>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\t/** Определяет обычное раскрываемое дерево или полностью открытый адаптивный набор колонок. */\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\t/**\n\t * Ключи уровней, узлы которых раскрываются до ручного действия пользователя.\n\t * В режиме `columns` дерево по-прежнему отображается полностью раскрытым.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nfunction formatTreeMultiSummary(selectedIds: Set<string>, treeIndex: ReturnType<typeof createTreeNodeIndex>) {\n\tconst serializedValue = treeSelectedIdsToMultiValue(selectedIds, treeIndex);\n\tconst selectedPredicateCount = Object.values(serializedValue).reduce((count, values) => count + values.length, 0);\n\tif (selectedPredicateCount === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (selectedPredicateCount === 1) {\n\t\tconst selectedNodeId = [...selectedIds].sort(\n\t\t\t(leftId, rightId) =>\n\t\t\t\t(treeIndex.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t(treeIndex.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t\t)[0];\n\t\tconst selectedNode = treeIndex.nodeById.get(selectedNodeId);\n\n\t\tif (!selectedNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn selectedNode.label;\n\t}\n\n\treturn formatOptionCount(selectedPredicateCount);\n}\n\n/**\n * Сравнивает семантический выбор по каноническим id дерева. Порядок ключей и\n * значений во внешнем Record не должен приводить к лишнему commit при закрытии.\n */\nfunction areTreeMultiSelectionsEqual(\n\tleft: TreeMultiSelectValue,\n\tright: TreeMultiSelectValue,\n\ttreeIndex: ReturnType<typeof createTreeNodeIndex>\n) {\n\tconst leftIds = treeMultiValueToSelectedIds(left, treeIndex);\n\tconst rightIds = treeMultiValueToSelectedIds(right, treeIndex);\n\n\treturn leftIds.size === rightIds.size && [...leftIds].every((nodeId) => rightIds.has(nodeId));\n}\n\nexport function TreeMultiSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значения\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\toptionsLayout = \"tree\",\n\tdefaultExpandedCodeKeys\n}: TreeMultiSelectProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { draftValue, setDraftValue, prepareOpen } = usePickerSelectionLifecycle({\n\t\tvalue,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tisEqual: (left, right) => areTreeMultiSelectionsEqual(left, right, treeIndex)\n\t});\n\tconst currentValue = open ? draftValue : value;\n\tconst selectedIds = useMemo(() => treeMultiValueToSelectedIds(currentValue, treeIndex), [currentValue, treeIndex]);\n\tconst selectionState = useMemo(() => getTreeNodeSelectionState(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst unavailableNodeIds = useMemo(\n\t\t() =>\n\t\t\tnew Set(\n\t\t\t\t[...treeIndex.nodeById.keys()].filter(\n\t\t\t\t\t(nodeId) =>\n\t\t\t\t\t\ttreeIndex.nodeById.get(nodeId)?.disabled !== true &&\n\t\t\t\t\t\t!isTreeNodeSelected(nodeId, selectedIds, treeIndex) &&\n\t\t\t\t\t\t!selectionState.selectedIds.has(nodeId) &&\n\t\t\t\t\t\tgetSelectableTreeNodeIds(treeIndex, [nodeId]).size === 0\n\t\t\t\t)\n\t\t\t),\n\t\t[selectedIds, selectionState.selectedIds, treeIndex]\n\t);\n\tconst selectedSummary = useMemo(() => formatTreeMultiSummary(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (nextOpen && !open) {\n\t\t\tprepareOpen();\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst selectAll = () => {\n\t\tsetDraftValue(treeSelectedIdsToMultiValue(getSelectableTreeNodeIds(treeIndex), treeIndex));\n\t};\n\tconst clearSelection = () => {\n\t\tsetDraftValue({});\n\n\t\tif (!open) {\n\t\t\tonChange({});\n\t\t}\n\t};\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectionState.selectedIds}\n\t\t\tpartialIds={selectionState.partialIds}\n\t\t\tselectionMode=\"multi\"\n\t\t\toptionsLayout={optionsLayout}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tunavailableNodeIds={unavailableNodeIds}\n\t\t\topen={open}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t\tbulkActions={{\n\t\t\t\tonSelectAll: selectAll,\n\t\t\t\tonDeselectAll: () => setDraftValue({})\n\t\t\t}}\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummary={selectedSummary}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node, selectionScopeIndex) => {\n\t\t\t\tsetDraftValue(toggleTreeMultiSelection({}, node.id, treeIndex, selectionScopeIndex));\n\t\t\t}}\n\t\t\tonNodeToggleSelection={(node, selectionScopeIndex) => {\n\t\t\t\tsetDraftValue((currentDraftValue) => toggleTreeMultiSelection(currentDraftValue, node.id, treeIndex, selectionScopeIndex));\n\t\t\t}}\n\t\t\tonClearSelection={clearSelection}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n","import { useMemo } from \"react\";\n\nimport { ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { useODataTreeData } from \"./model/useODataTreeData\";\nimport { TreeMultiSelect } from \"./TreeMultiSelect\";\nimport { TreeMultiSelectOptionsLayout, TreeMultiSelectValue, TreeSelectNode } from \"./types\";\n\nexport type ODataTreeMultiSelectNodesTransformContext = {\n\t/** Фактический порядок запрошенных уровней после разрешения metadata-chain. */\n\torderedCodeKeys: readonly string[];\n};\n\nexport type ODataTreeMultiSelectNodesTransform = (\n\tnodes: readonly TreeSelectNode[],\n\tcontext: ODataTreeMultiSelectNodesTransformContext\n) => readonly TreeSelectNode[];\n\nexport interface ODataTreeMultiSelectProps\n\textends Omit<ODataDependentBaseProps, \"model\" | \"value\" | \"dependencies\">, Omit<UiBaseProps<TreeMultiSelectValue>, \"placeholder\"> {\n\tmodel?: ODataDependentBaseProps[\"model\"];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\t/** Переключает способ показа загруженного OData-дерева, не меняя формат value и запросов. */\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\t/**\n\t * Ключи OData-уровней, раскрываемых после появления загруженных узлов.\n\t * В режиме `columns` дерево по-прежнему отображается полностью раскрытым.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n\t/** Явный порядок уровней поверх порядка, автоматически полученного из metadata-chain. */\n\tsegmentOrder?: readonly string[];\n\t/** Уровни, на которых пустой код не обрывает последующие уровни дерева. */\n\tallowEmptyCodeKeys?: readonly string[];\n\t/**\n\t * Создаёт consumer-представление поверх уже загруженного OData-дерева.\n\t *\n\t * Преобразование не меняет Query cache и transport-запрос. Callback должен\n\t * оставаться чистым и возвращать новые узлы, не мутируя входное дерево.\n\t */\n\ttransformNodes?: ODataTreeMultiSelectNodesTransform;\n}\n\nexport function ODataTreeMultiSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tplaceholder,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\toptionsLayout,\n\tvalue,\n\tonChange,\n\todata,\n\tsegments,\n\tmodel,\n\tdefaultExpandedCodeKeys,\n\tsegmentOrder,\n\tallowEmptyCodeKeys,\n\ttransformNodes\n}: ODataTreeMultiSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel,\n\t\tsegmentOrder,\n\t\tallowEmptyCodeKeys\n\t});\n\tconst nodes = useMemo(\n\t\t() => transformNodes?.(treeData.nodes, { orderedCodeKeys: treeData.orderedCodeKeys }) ?? treeData.nodes,\n\t\t[transformNodes, treeData.nodes, treeData.orderedCodeKeys]\n\t);\n\n\treturn (\n\t\t<TreeMultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled || treeData.isLoading}\n\t\t\tsize={size}\n\t\t\tplaceholder={placeholder ?? treeData.placeholder}\n\t\t\tnodes={nodes}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\toptionsLayout={optionsLayout}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n}\n","import { useMemo } from \"react\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { createTreeNodeIndex, treeSelectValueToId } from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeSelectNode, TreeSelectValue } from \"./types\";\n\nexport interface TreeSelectProps extends Omit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\tclearable?: boolean;\n\t/**\n\t * Ключи уровней, узлы которых раскрываются до ручного действия пользователя.\n\t * Значения сопоставляются с `TreeSelectNode.codeKey`.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nfunction formatTreeNodeSummary(node: TreeSelectNode | undefined) {\n\tif (!node) {\n\t\treturn undefined;\n\t}\n\n\tif (node.code && node.code !== node.label) {\n\t\treturn `${node.label} · ${node.code}`;\n\t}\n\n\treturn node.label;\n}\n\nexport function TreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значение\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\tclearable = false,\n\tdefaultExpandedCodeKeys\n}: TreeSelectProps) {\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst selectedId = treeSelectValueToId(value, treeIndex);\n\tconst selectedNode = selectedId ? treeIndex.nodeById.get(selectedId) : undefined;\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectedId ? new Set([selectedId]) : new Set()}\n\t\t\tpartialIds={new Set()}\n\t\t\tselectionMode=\"single\"\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummaryText={formatTreeNodeSummary(selectedNode)}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => onChange({ codeKey: node.codeKey, value: node.value })}\n\t\t\tonClearSelection={clearable ? () => onChange(undefined) : undefined}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n","import { ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { useODataTreeData } from \"./model/useODataTreeData\";\nimport { TreeSelect } from \"./TreeSelect\";\nimport { TreeSelectValue } from \"./types\";\n\nexport interface ODataTreeSelectProps\n\textends\n\t\tOmit<ODataDependentBaseProps, \"model\" | \"value\" | \"dependencies\">,\n\t\tOmit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tmodel?: ODataDependentBaseProps[\"model\"];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tclearable?: boolean;\n\t/**\n\t * Ключи OData-уровней, раскрываемых после появления загруженных узлов.\n\t * Настройка влияет только на представление и не изменяет OData-запросы.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nexport function ODataTreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tplaceholder,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tvalue,\n\tonChange,\n\todata,\n\tsegments,\n\tmodel,\n\tclearable,\n\tdefaultExpandedCodeKeys\n}: ODataTreeSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel\n\t});\n\n\treturn (\n\t\t<TreeSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled || treeData.isLoading}\n\t\t\tsize={size}\n\t\t\tplaceholder={placeholder ?? treeData.placeholder}\n\t\t\tnodes={treeData.nodes}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t\tclearable={clearable}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/tree-select/helpers.ts","../../src/tree-select/model/buildODataTreeNodes.ts","../../src/tree-select/model/resolveOrderedTreeSegmentItems.ts","../../src/tree-select/model/useODataTreeData.ts","../../src/tree-select/model/treeUtils.ts","../../src/tree-select/model/buildTreeColumnsLayoutDescriptor.ts","../../src/tree-select/model/resolveBalancedTreeColumnsLayout.ts","../../src/tree-select/TreeSelect.module.scss","../../src/tree-select/TreeNodeContent.tsx","../../src/tree-select/TreePickerBase.tsx","../../src/tree-select/TreeMultiSelect.tsx","../../src/tree-select/ODataTreeMultiSelect.tsx","../../src/tree-select/TreeSelect.tsx","../../src/tree-select/ODataTreeSelect.tsx"],"sourcesContent":["import { TreeMultiSelectValue, TreeSelectValue } from \"./types\";\n\nexport function treeSelectValueToSelectedFilters(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n","import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport { compareStrings } from \"@ryuzaki13/react-foundation-lib/string-comparison\";\n\nimport { TreeSelectNode } from \"../types\";\n\ntype BuildODataTreeNodesArgs = {\n\titems: CollectionItem[];\n\torderedCodeKeys: string[];\n\tkeyPairsMap: Record<string, string>;\n\thiddenCodeKeys: Set<string>;\n\ttextValueCodeKeys?: Set<string>;\n\t/** Уровни, для которых пустой код остаётся структурным узлом вместо остановки ветки. */\n\tallowEmptyCodeKeys?: ReadonlySet<string>;\n\t/** Выбирает локальный порядок узлов: по исходному коду или отображаемому тексту. */\n\tsortByCode?: boolean;\n};\n\ntype MutableTreeNode = TreeSelectNode & {\n\t/**\n\t * Исходный код нужен только для локальной сортировки представления.\n\t * Он не зависит от hideCode/selectText и не попадает в публичный TreeSelectNode.\n\t */\n\tsortCode: string;\n\tchildren: MutableTreeNode[];\n\tchildByBranchKey: Map<string, MutableTreeNode>;\n};\n\nfunction createNodeId(parentId: string | undefined, codeKey: string, value: string) {\n\treturn parentId ? `${parentId}/${codeKey}:${value}` : `${codeKey}:${value}`;\n}\n\nfunction resolveNodeLabel(item: CollectionItem, codeKey: string, keyPairsMap: Record<string, string>) {\n\tconst textKey = keyPairsMap[codeKey];\n\treturn (textKey && item[textKey]) || item[codeKey];\n}\n\nfunction createSearchText(parts: Array<string | undefined>) {\n\treturn [...new Set(parts.filter(Boolean))].join(\" \");\n}\n\nfunction createMutableNode(args: {\n\tparentId?: string;\n\tcodeKey: string;\n\tvalue: string;\n\tlabel: string;\n\tcode?: string;\n\tsortCode: string;\n}): MutableTreeNode {\n\treturn {\n\t\tid: createNodeId(args.parentId, args.codeKey, args.value),\n\t\tcodeKey: args.codeKey,\n\t\tvalue: args.value,\n\t\tlabel: args.label,\n\t\tcode: args.code,\n\t\tsearchText: createSearchText([args.value, args.label, args.code]),\n\t\tsortCode: args.sortCode,\n\t\tchildren: [],\n\t\tchildByBranchKey: new Map()\n\t};\n}\n\n/**\n * Сортирует только массивы вновь построенного дерева, не меняя исходную OData-коллекцию\n * и не создавая отдельный Query cache для каждого способа отображения.\n */\nfunction sortMutableTree(nodes: MutableTreeNode[], sortByCode: boolean) {\n\tnodes.sort((left, right) => {\n\t\tconst leftValue = sortByCode ? left.sortCode : left.label;\n\t\tconst rightValue = sortByCode ? right.sortCode : right.label;\n\t\tconst valueOrder = compareStrings(leftValue, rightValue);\n\n\t\treturn valueOrder || compareStrings(left.sortCode, right.sortCode);\n\t});\n\n\tfor (const node of nodes) {\n\t\tsortMutableTree(node.children, sortByCode);\n\t}\n}\n\nfunction toPublicNode(node: MutableTreeNode): TreeSelectNode {\n\treturn {\n\t\tid: node.id,\n\t\tcodeKey: node.codeKey,\n\t\tvalue: node.value,\n\t\tlabel: node.label,\n\t\tcode: node.code,\n\t\tsearchText: node.searchText,\n\t\tchildren: node.children.length > 0 ? node.children.map(toPublicNode) : undefined\n\t};\n}\n\nexport function buildODataTreeNodes({\n\titems,\n\torderedCodeKeys,\n\tkeyPairsMap,\n\thiddenCodeKeys,\n\ttextValueCodeKeys,\n\tallowEmptyCodeKeys,\n\tsortByCode = true\n}: BuildODataTreeNodesArgs): TreeSelectNode[] {\n\tif (orderedCodeKeys.length === 0 || items.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst roots: MutableTreeNode[] = [];\n\tconst rootByBranchKey = new Map<string, MutableTreeNode>();\n\n\tfor (const item of items) {\n\t\tlet parentNode: MutableTreeNode | undefined;\n\n\t\tfor (const codeKey of orderedCodeKeys) {\n\t\t\tconst codeValue = String(item[codeKey] ?? \"\");\n\n\t\t\tif (!codeValue && !allowEmptyCodeKeys?.has(codeKey)) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst label = String(resolveNodeLabel(item, codeKey, keyPairsMap) ?? \"\");\n\t\t\tconst value = textValueCodeKeys?.has(codeKey) ? label : codeValue;\n\t\t\tconst branchKey = `${codeKey}:${value}`;\n\t\t\tconst container = parentNode ? parentNode.childByBranchKey : rootByBranchKey;\n\t\t\tlet currentNode = container.get(branchKey);\n\n\t\t\tif (!currentNode) {\n\t\t\t\tcurrentNode = createMutableNode({\n\t\t\t\t\tparentId: parentNode?.id,\n\t\t\t\t\tcodeKey,\n\t\t\t\t\tvalue,\n\t\t\t\t\tlabel,\n\t\t\t\t\tcode: hiddenCodeKeys.has(codeKey) ? undefined : codeValue,\n\t\t\t\t\tsortCode: codeValue\n\t\t\t\t});\n\t\t\t\tcontainer.set(branchKey, currentNode);\n\n\t\t\t\tif (parentNode) {\n\t\t\t\t\tparentNode.children.push(currentNode);\n\t\t\t\t} else {\n\t\t\t\t\troots.push(currentNode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparentNode = currentNode;\n\t\t}\n\t}\n\n\tsortMutableTree(roots, sortByCode);\n\n\treturn roots.map(toPublicNode);\n}\n","import { ODataDependentSegmentItem, sortODataDependentSegmentItemsByChains } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { ODataChainsMap } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nexport function resolveOrderedTreeSegmentItems(\n\titems: readonly ODataDependentSegmentItem[],\n\tchains: ODataChainsMap,\n\tsegmentOrder?: readonly string[]\n) {\n\treturn sortODataDependentSegmentItemsByChains(items, chains, segmentOrder);\n}\n","import { useMemo } from \"react\";\n\nimport {\n\tflattenODataDependentServices,\n\tODataCollectionModel,\n\tODataDependentBaseProps,\n\tODataDependentSegmentItem,\n\tuseODataCollection,\n\tuseODataCollectionChains,\n\tuseODataCollectionModel\n} from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { buildODataTreeNodes } from \"./buildODataTreeNodes\";\nimport { resolveOrderedTreeSegmentItems } from \"./resolveOrderedTreeSegmentItems\";\n\nfunction buildOrderedSegmentItems(\n\todata: ODataDependentBaseProps[\"odata\"],\n\tsegments: ODataDependentBaseProps[\"segments\"],\n\tmodel?: Omit<ODataCollectionModel, \"codeKey\">\n) {\n\treturn flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n}\n\nfunction getRootCodeKey(orderedSegmentItems: readonly ODataDependentSegmentItem[]) {\n\treturn orderedSegmentItems[0]?.id;\n}\n\ntype UseODataTreeDataProps = Pick<ODataDependentBaseProps, \"odata\" | \"segments\" | \"model\"> & {\n\t/** Явный порядок уровней поверх автоматически разрешённой metadata-chain. */\n\tsegmentOrder?: readonly string[];\n\t/** Уровни, на которых пустой код не должен обрывать последующие уровни дерева. */\n\tallowEmptyCodeKeys?: readonly string[];\n};\n\nexport function useODataTreeData({ odata, segments, model, segmentOrder, allowEmptyCodeKeys }: UseODataTreeDataProps) {\n\tconst serviceKey = `${odata.service}.${odata.target}`;\n\tconst baseSegmentItems = useMemo(() => buildOrderedSegmentItems(odata, segments, model), [odata, segments, model]);\n\tconst chains = useODataCollectionChains([odata]);\n\tconst orderedSegmentItems = useMemo(\n\t\t() => resolveOrderedTreeSegmentItems(baseSegmentItems, chains, segmentOrder),\n\t\t[baseSegmentItems, chains, segmentOrder]\n\t);\n\tconst orderedCodeKeys = useMemo(() => orderedSegmentItems.map((item) => item.id), [orderedSegmentItems]);\n\tconst allowedEmptyCodeKeys = useMemo(() => new Set(allowEmptyCodeKeys), [allowEmptyCodeKeys]);\n\tconst rootCodeKey = getRootCodeKey(orderedSegmentItems) ?? Object.keys(segments)[0];\n\tconst odataModel = useODataCollectionModel({\n\t\tcodeKey: rootCodeKey,\n\t\t...model\n\t});\n\tconst collection = useODataCollection({\n\t\todata,\n\t\tmodel: odataModel\n\t});\n\tconst { hiddenCodeKeys, textValueCodeKeys } = useMemo(() => {\n\t\tconst nextHiddenCodeKeys = new Set<string>();\n\t\tconst nextTextValueCodeKeys = new Set<string>();\n\n\t\tfor (const item of orderedSegmentItems) {\n\t\t\tif (item.segment.hideCode ?? odata.hideCode) {\n\t\t\t\tnextHiddenCodeKeys.add(item.id);\n\t\t\t}\n\t\t\tif (item.segment.selectText) {\n\t\t\t\tnextTextValueCodeKeys.add(item.id);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\thiddenCodeKeys: nextHiddenCodeKeys,\n\t\t\ttextValueCodeKeys: nextTextValueCodeKeys\n\t\t};\n\t}, [odata.hideCode, orderedSegmentItems]);\n\tconst nodes = useMemo(\n\t\t() =>\n\t\t\tbuildODataTreeNodes({\n\t\t\t\titems: collection.data?.items ?? [],\n\t\t\t\torderedCodeKeys,\n\t\t\t\tkeyPairsMap: collection.data?.keyPairsMap ?? {},\n\t\t\t\thiddenCodeKeys,\n\t\t\t\ttextValueCodeKeys,\n\t\t\t\tallowEmptyCodeKeys: allowedEmptyCodeKeys,\n\t\t\t\tsortByCode: odata.sortByCode\n\t\t\t}),\n\t\t[\n\t\t\tallowedEmptyCodeKeys,\n\t\t\tcollection.data?.items,\n\t\t\tcollection.data?.keyPairsMap,\n\t\t\thiddenCodeKeys,\n\t\t\todata.sortByCode,\n\t\t\torderedCodeKeys,\n\t\t\ttextValueCodeKeys\n\t\t]\n\t);\n\tconst placeholder = orderedSegmentItems[0]?.segment.placeholder ?? \"Выберите значение\";\n\tconst hasResolvedChain = Boolean(chains[serviceKey]?.length);\n\n\treturn {\n\t\tnodes,\n\t\torderedSegmentItems,\n\t\torderedCodeKeys,\n\t\tisLoading: collection.isLoading,\n\t\tisError: collection.isError,\n\t\tplaceholder,\n\t\thasResolvedChain\n\t};\n}\n","import { TreeMultiSelectValue, TreeSelectNode, TreeSelectValue } from \"../types\";\n\nexport type TreeNodeIndex = {\n\trootIds: string[];\n\tnodeById: Map<string, TreeSelectNode>;\n\tparentById: Map<string, string | undefined>;\n\tchildrenById: Map<string, string[]>;\n\tpreorderIndexById: Map<string, number>;\n\tnodeIdByCodeValue: Map<string, string>;\n\t/** Все визуальные узлы одного сериализуемого значения в порядке обхода дерева. */\n\tnodeIdsByCodeValue: Map<string, string[]>;\n\t/** Признак disabled-ограничения в узле или любом его потомке. */\n\tsubtreeContainsDisabledById: Map<string, boolean>;\n};\n\nexport type TreeNodeSelectionState = {\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n};\n\nexport type TreeVisibleEntry = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\tparentId?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tisLeaf: boolean;\n};\n\nfunction makeCodeValueKey(codeKey: string, value: string) {\n\treturn `${codeKey}::${value}`;\n}\n\nexport function createTreeNodeIndex(nodes: readonly TreeSelectNode[]): TreeNodeIndex {\n\tconst nodeById = new Map<string, TreeSelectNode>();\n\tconst parentById = new Map<string, string | undefined>();\n\tconst childrenById = new Map<string, string[]>();\n\tconst preorderIndexById = new Map<string, number>();\n\tconst nodeIdByCodeValue = new Map<string, string>();\n\tconst nodeIdsByCodeValue = new Map<string, string[]>();\n\tconst subtreeContainsDisabledById = new Map<string, boolean>();\n\tlet preorderIndex = 0;\n\n\tconst walk = (node: TreeSelectNode, parentId?: string) => {\n\t\tnodeById.set(node.id, node);\n\t\tparentById.set(node.id, parentId);\n\t\tpreorderIndexById.set(node.id, preorderIndex++);\n\t\tconst codeValueKey = makeCodeValueKey(node.codeKey, node.value);\n\t\tnodeIdByCodeValue.set(codeValueKey, node.id);\n\t\tconst equivalentNodeIds = nodeIdsByCodeValue.get(codeValueKey);\n\t\tif (equivalentNodeIds) {\n\t\t\tequivalentNodeIds.push(node.id);\n\t\t} else {\n\t\t\tnodeIdsByCodeValue.set(codeValueKey, [node.id]);\n\t\t}\n\n\t\tconst childIds = (node.children ?? []).map((child) => child.id);\n\t\tchildrenById.set(node.id, childIds);\n\n\t\tfor (const child of node.children ?? []) {\n\t\t\twalk(child, node.id);\n\t\t}\n\n\t\tsubtreeContainsDisabledById.set(\n\t\t\tnode.id,\n\t\t\tnode.disabled === true || childIds.some((childId) => subtreeContainsDisabledById.get(childId) === true)\n\t\t);\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node);\n\t}\n\n\treturn {\n\t\trootIds: nodes.map((node) => node.id),\n\t\tnodeById,\n\t\tparentById,\n\t\tchildrenById,\n\t\tpreorderIndexById,\n\t\tnodeIdByCodeValue,\n\t\tnodeIdsByCodeValue,\n\t\tsubtreeContainsDisabledById\n\t};\n}\n\n/** Возвращает все визуальные представления одного сериализуемого значения. */\nfunction getEquivalentTreeNodeIds(nodeId: string, index: TreeNodeIndex) {\n\tconst node = index.nodeById.get(nodeId);\n\tif (!node) return [];\n\n\treturn index.nodeIdsByCodeValue.get(makeCodeValueKey(node.codeKey, node.value)) ?? [];\n}\n\nexport function treeSelectValueToId(value: TreeSelectValue | undefined, index: TreeNodeIndex) {\n\tif (!value) return undefined;\n\treturn index.nodeIdByCodeValue.get(makeCodeValueKey(value.codeKey, value.value));\n}\n\nexport function treeMultiValueToSelectedIds(value: TreeMultiSelectValue | undefined, index: TreeNodeIndex) {\n\tconst selectedIds = new Set<string>();\n\n\tif (!value) {\n\t\treturn selectedIds;\n\t}\n\n\tfor (const [codeKey, values] of Object.entries(value)) {\n\t\tfor (const itemValue of values) {\n\t\t\tfor (const nodeId of index.nodeIdsByCodeValue.get(makeCodeValueKey(codeKey, itemValue)) ?? []) {\n\t\t\t\tselectedIds.add(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canonicalizeTreeSelection(selectedIds, index);\n}\n\nexport function treeSelectedIdsToMultiValue(selectedIds: Set<string>, index: TreeNodeIndex): TreeMultiSelectValue {\n\tconst orderedIds = [...selectedIds].sort(\n\t\t(leftId, rightId) =>\n\t\t\t(index.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t(index.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t);\n\tconst result: TreeMultiSelectValue = {};\n\tconst serializedCodeValues = new Set<string>();\n\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\t\tconst codeValueKey = makeCodeValueKey(node.codeKey, node.value);\n\t\tif (serializedCodeValues.has(codeValueKey)) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\n\t\tserializedCodeValues.add(codeValueKey);\n\t}\n\n\treturn result;\n}\n\nexport function treeSelectValueToMultiValue(value: TreeSelectValue | undefined): TreeMultiSelectValue {\n\tif (!value) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t[value.codeKey]: [value.value]\n\t};\n}\n\nfunction getAncestorIds(nodeId: string, index: TreeNodeIndex) {\n\tconst ancestors: string[] = [];\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tancestors.push(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn ancestors;\n}\n\nfunction isDescendantOf(nodeId: string, ancestorId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (currentId === ancestorId) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\n/**\n * Проверяет, можно ли безопасно синхронизировать повторные визуальные узлы\n * одним server predicate. Disabled-поддеревья, виртуальные группы и вложенные\n * дубли требуют более точного выбора на уровне доступных потомков.\n */\nfunction canSynchronizeEquivalentTreeNodes(nodeId: string, index: TreeNodeIndex) {\n\tconst equivalentNodeIds = getEquivalentTreeNodeIds(nodeId, index);\n\tif (!equivalentNodeIds.length) return false;\n\n\tif (\n\t\tequivalentNodeIds.some((equivalentNodeId) => {\n\t\t\tconst node = index.nodeById.get(equivalentNodeId);\n\t\t\treturn !node || node.selectionBehavior === \"descendants\" || index.subtreeContainsDisabledById.get(equivalentNodeId) === true;\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\n\treturn !equivalentNodeIds.some((candidateId, candidateIndex) =>\n\t\tequivalentNodeIds.some(\n\t\t\t(otherId, otherIndex) =>\n\t\t\t\tcandidateIndex !== otherIndex &&\n\t\t\t\t(isDescendantOf(candidateId, otherId, index) || isDescendantOf(otherId, candidateId, index))\n\t\t)\n\t);\n}\n\n/** Возвращает эквивалентные узлы только для безопасно синхронизируемого predicate. */\nfunction getSynchronizedEquivalentTreeNodeIds(nodeId: string, index: TreeNodeIndex) {\n\treturn canSynchronizeEquivalentTreeNodes(nodeId, index) ? getEquivalentTreeNodeIds(nodeId, index) : [nodeId];\n}\n\nfunction removeDescendantSelections(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tfor (const selectedId of [...selectedIds]) {\n\t\tif (isDescendantOf(selectedId, nodeId, index)) {\n\t\t\tselectedIds.delete(selectedId);\n\t\t}\n\t}\n}\n\n/**\n * Снимает все сериализуемые predicates, которыми полностью покрыто поддерево.\n * Эквивалентные id удаляются во всех ветвях, потому что внешний multi-value не\n * способен сохранить один визуальный экземпляр и исключить другой.\n */\nfunction removeSelectedSubtreePredicates(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tconst subtreeNodeIds = [nodeId];\n\n\tfor (let nodeIndex = 0; nodeIndex < subtreeNodeIds.length; nodeIndex += 1) {\n\t\tconst subtreeNodeId = subtreeNodeIds[nodeIndex];\n\t\tif (!subtreeNodeId) continue;\n\n\t\tsubtreeNodeIds.push(...(index.childrenById.get(subtreeNodeId) ?? []));\n\t\tfor (const equivalentNodeId of getEquivalentTreeNodeIds(subtreeNodeId, index)) {\n\t\t\tselectedIds.delete(equivalentNodeId);\n\t\t}\n\t}\n}\n\nfunction isNodeFullySelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\tif (index.nodeById.get(nodeId)?.disabled) {\n\t\treturn false;\n\t}\n\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\tif (children.length === 0) {\n\t\treturn false;\n\t}\n\n\treturn children.every((childId) => isNodeFullySelected(childId, selectedIds, index));\n}\n\n/**\n * Проверяет, что отфильтрованное представление содержит поддерево целиком.\n * Совпавший parent возвращается поиском со всеми потомками, а parent совпавших\n * descendants содержит только видимые ветви и потому не может сериализоваться\n * собственным predicate без расширения выбора на скрытые узлы.\n */\nfunction isTreeSelectionScopeComplete(nodeId: string, index: TreeNodeIndex, selectionScopeIndex: TreeNodeIndex): boolean {\n\tif (!selectionScopeIndex.nodeById.has(nodeId)) {\n\t\treturn false;\n\t}\n\n\tconst childIds = index.childrenById.get(nodeId) ?? [];\n\tconst scopedChildIds = selectionScopeIndex.childrenById.get(nodeId) ?? [];\n\n\treturn (\n\t\tchildIds.length === scopedChildIds.length &&\n\t\tchildIds.every(\n\t\t\t(childId, childIndex) =>\n\t\t\t\tscopedChildIds[childIndex] === childId && isTreeSelectionScopeComplete(childId, index, selectionScopeIndex)\n\t\t)\n\t);\n}\n\nexport function canonicalizeTreeSelection(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst nextSelectedIds = new Set(selectedIds);\n\n\t/*\n\t * Внешнее значение могло быть сохранено до того, как узел стал виртуальной\n\t * группой. Разворачиваем такой выбор в актуальное покрытие потомков, чтобы\n\t * group-id не протекал обратно в публичный TreeMultiSelectValue.\n\t */\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (index.nodeById.get(selectedId)?.selectionBehavior !== \"descendants\") continue;\n\n\t\tnextSelectedIds.delete(selectedId);\n\t\tfor (const descendantId of getSelectableTreeNodeIds(index, index.childrenById.get(selectedId) ?? [])) {\n\t\t\tnextSelectedIds.add(descendantId);\n\t\t}\n\t}\n\n\tfor (const selectedId of [...nextSelectedIds]) {\n\t\tif (getAncestorIds(selectedId, index).some((ancestorId) => nextSelectedIds.has(ancestorId))) {\n\t\t\tnextSelectedIds.delete(selectedId);\n\t\t}\n\t}\n\n\tconst orderedNodeIds = [...index.nodeById.keys()].sort(\n\t\t(leftId, rightId) => (index.preorderIndexById.get(rightId) ?? 0) - (index.preorderIndexById.get(leftId) ?? 0)\n\t);\n\n\tfor (const nodeId of orderedNodeIds) {\n\t\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\t\tif (\n\t\t\tchildren.length === 0 ||\n\t\t\tnextSelectedIds.has(nodeId) ||\n\t\t\tindex.nodeById.get(nodeId)?.disabled ||\n\t\t\tindex.nodeById.get(nodeId)?.selectionBehavior === \"descendants\"\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (children.every((childId) => isNodeFullySelected(childId, nextSelectedIds, index))) {\n\t\t\tconst equivalentNodeIds = getEquivalentTreeNodeIds(nodeId, index);\n\t\t\tconst canCollapseEquivalentNodes =\n\t\t\t\tcanSynchronizeEquivalentTreeNodes(nodeId, index) &&\n\t\t\t\tequivalentNodeIds.every((equivalentNodeId) => {\n\t\t\t\t\tconst equivalentNode = index.nodeById.get(equivalentNodeId);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tequivalentNode &&\n\t\t\t\t\t\t!equivalentNode.disabled &&\n\t\t\t\t\t\tequivalentNode.selectionBehavior !== \"descendants\" &&\n\t\t\t\t\t\tisNodeFullySelected(equivalentNodeId, nextSelectedIds, index)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t/*\n\t\t\t * Одинаковый server predicate может быть показан в нескольких ветвях.\n\t\t\t * Схлопывать детей в parent безопасно только при полном покрытии всех\n\t\t\t * его визуальных представлений, иначе сериализация расширила бы выбор.\n\t\t\t */\n\t\t\tif (canCollapseEquivalentNodes) {\n\t\t\t\tfor (const equivalentNodeId of equivalentNodeIds) {\n\t\t\t\t\tremoveDescendantSelections(nextSelectedIds, equivalentNodeId, index);\n\t\t\t\t\tnextSelectedIds.add(equivalentNodeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nextSelectedIds;\n}\n\nfunction expandNearestSelectedAncestor(selectedIds: Set<string>, nodeId: string, index: TreeNodeIndex) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\tif (selectedIds.has(currentId)) {\n\t\t\tfor (const equivalentAncestorId of getEquivalentTreeNodeIds(currentId, index)) {\n\t\t\t\tif (!selectedIds.has(equivalentAncestorId)) continue;\n\t\t\t\tselectedIds.delete(equivalentAncestorId);\n\n\t\t\t\t/*\n\t\t\t\t * Узел мог стать disabled уже после сохранения выбора его ancestor.\n\t\t\t\t * При частичном снятии разворачиваем все представления одного server\n\t\t\t\t * predicate только в их актуально доступное покрытие.\n\t\t\t\t */\n\t\t\t\tfor (const childId of getSelectableTreeNodeIds(index, index.childrenById.get(equivalentAncestorId) ?? [])) {\n\t\t\t\t\tselectedIds.add(childId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n\n\treturn false;\n}\n\nexport function isTreeNodeSelected(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex): boolean {\n\tif (selectedIds.has(nodeId)) {\n\t\treturn true;\n\t}\n\n\treturn getAncestorIds(nodeId, index).some((ancestorId) => selectedIds.has(ancestorId));\n}\n\nfunction resolveTreeSelectionState(nodeId: string, selectedIds: Set<string>, index: TreeNodeIndex, state: TreeNodeSelectionState) {\n\tconst children = index.childrenById.get(nodeId) ?? [];\n\n\tif (selectedIds.has(nodeId)) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (children.length === 0) {\n\t\treturn { selected: false, partial: false };\n\t}\n\n\tconst childStates = children.map((childId) => resolveTreeSelectionState(childId, selectedIds, index, state));\n\tconst allSelected = childStates.every((childState) => childState.selected && !childState.partial);\n\tconst hasAnySelected = childStates.some((childState) => childState.selected || childState.partial);\n\n\tif (allSelected) {\n\t\tstate.selectedIds.add(nodeId);\n\t\treturn { selected: true, partial: false };\n\t}\n\n\tif (hasAnySelected) {\n\t\tstate.partialIds.add(nodeId);\n\t\treturn { selected: false, partial: true };\n\t}\n\n\treturn { selected: false, partial: false };\n}\n\nexport function getTreeNodeSelectionState(selectedIds: Set<string>, index: TreeNodeIndex): TreeNodeSelectionState {\n\tconst state: TreeNodeSelectionState = {\n\t\tselectedIds: new Set(),\n\t\tpartialIds: new Set()\n\t};\n\n\tfor (const rootId of index.rootIds) {\n\t\tresolveTreeSelectionState(rootId, selectedIds, index, state);\n\t}\n\n\treturn state;\n}\n\n/**\n * Строит каноническое покрытие всех доступных узлов для массового выбора.\n * Ветка схлопывается в parent только тогда, когда внутри неё нет disabled-узлов;\n * иначе выбираются доступные дочерние поддеревья, не затрагивая запреты.\n */\nexport function getSelectableTreeNodeIds(index: TreeNodeIndex, rootIds: readonly string[] = index.rootIds): Set<string> {\n\tconst collectSubtree = (nodeId: string): { containsDisabled: boolean; selectedIds: string[] } => {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tconst childSelections = (index.childrenById.get(nodeId) ?? []).map(collectSubtree);\n\t\tconst selectedChildIds = childSelections.flatMap((selection) => selection.selectedIds);\n\t\tconst containsDisabled = node?.disabled === true || childSelections.some((selection) => selection.containsDisabled);\n\n\t\tif (!node || node.disabled) {\n\t\t\treturn { containsDisabled: true, selectedIds: selectedChildIds };\n\t\t}\n\t\tif (node.selectionBehavior === \"descendants\") {\n\t\t\treturn { containsDisabled, selectedIds: selectedChildIds };\n\t\t}\n\t\tconst containsUnsafeEquivalent = !canSynchronizeEquivalentTreeNodes(nodeId, index);\n\n\t\treturn containsDisabled || containsUnsafeEquivalent\n\t\t\t? { containsDisabled: true, selectedIds: selectedChildIds }\n\t\t\t: { containsDisabled: false, selectedIds: [nodeId] };\n\t};\n\n\treturn new Set(rootIds.flatMap((rootId) => collectSubtree(rootId).selectedIds));\n}\n\nexport function toggleTreeMultiSelection(\n\tcurrentValue: TreeMultiSelectValue | undefined,\n\ttargetNodeId: string,\n\tindex: TreeNodeIndex,\n\tselectionScopeIndex?: TreeNodeIndex\n) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\tconst hasRestrictedSelectionScope =\n\t\tselectionScopeIndex !== undefined && !isTreeSelectionScopeComplete(targetNodeId, index, selectionScopeIndex);\n\n\t/*\n\t * Derived-full ветка может содержать одновременно safe и unsafe predicates.\n\t * При повторном клике снимаем всё её фактическое покрытие до расчёта набора,\n\t * доступного для нового выбора: иначе safe subset оставил бы ветку partial.\n\t */\n\tif (!hasRestrictedSelectionScope && isNodeFullySelected(targetNodeId, selectedIds, index)) {\n\t\tremoveSelectedSubtreePredicates(selectedIds, targetNodeId, index);\n\t\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n\t}\n\n\tconst toggle = (targetId: string) => {\n\t\tif (selectedIds.has(targetId)) {\n\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\treturn;\n\t\t}\n\t\tif (isNodeFullySelected(targetId, selectedIds, index)) {\n\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\t/*\n\t\t\t\t * В глубоком дереве после одного разворачивания target может остаться\n\t\t\t\t * покрыт более близким ancestor — продолжаем разложение рекурсивно.\n\t\t\t\t * Если unsafe target выпал из доступного покрытия, всё равно удаляем\n\t\t\t\t * его predicate-класс, включая disabled-дубль вне целевой ветви.\n\t\t\t\t */\n\t\t\t\tif (isTreeNodeSelected(targetId, selectedIds, index) || isNodeFullySelected(targetId, selectedIds, index)) {\n\t\t\t\t\ttoggle(targetId);\n\t\t\t\t} else {\n\t\t\t\t\tremoveSelectedSubtreePredicates(selectedIds, targetId, index);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const equivalentTargetId of getSynchronizedEquivalentTreeNodeIds(targetId, index)) {\n\t\t\tremoveDescendantSelections(selectedIds, equivalentTargetId, index);\n\t\t\tselectedIds.add(equivalentTargetId);\n\t\t}\n\t};\n\n\tconst collectScopedSelectableTargetIds = (nodeId: string): string[] => {\n\t\tif (!selectionScopeIndex?.nodeById.has(nodeId)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (isTreeSelectionScopeComplete(nodeId, index, selectionScopeIndex)) {\n\t\t\tconst selectableNodeIds = [...getSelectableTreeNodeIds(index, [nodeId])];\n\t\t\tif (selectableNodeIds.length > 0) {\n\t\t\t\treturn selectableNodeIds;\n\t\t\t}\n\n\t\t\t/* Небезопасный сохранённый predicate должен оставаться доступен для снятия. */\n\t\t\treturn isTreeNodeSelected(nodeId, selectedIds, index) || isNodeFullySelected(nodeId, selectedIds, index) ? [nodeId] : [];\n\t\t}\n\n\t\treturn (selectionScopeIndex.childrenById.get(nodeId) ?? []).flatMap(collectScopedSelectableTargetIds);\n\t};\n\tconst resolvedSelectableTargetIds = hasRestrictedSelectionScope\n\t\t? collectScopedSelectableTargetIds(targetNodeId)\n\t\t: [...getSelectableTreeNodeIds(index, [targetNodeId])];\n\t/* Небезопасный сохранённый predicate остаётся доступен для явного снятия. */\n\tconst selectableTargetIds =\n\t\tresolvedSelectableTargetIds.length === 0 &&\n\t\t(isTreeNodeSelected(targetNodeId, selectedIds, index) || isNodeFullySelected(targetNodeId, selectedIds, index))\n\t\t\t? [targetNodeId]\n\t\t\t: resolvedSelectableTargetIds;\n\tconst allSelectableTargetsSelected =\n\t\tselectableTargetIds.length > 0 &&\n\t\tselectableTargetIds.every(\n\t\t\t(nodeId) => isTreeNodeSelected(nodeId, selectedIds, index) || isNodeFullySelected(nodeId, selectedIds, index)\n\t\t);\n\n\tfor (const selectableTargetId of selectableTargetIds) {\n\t\tconst selected =\n\t\t\tisTreeNodeSelected(selectableTargetId, selectedIds, index) || isNodeFullySelected(selectableTargetId, selectedIds, index);\n\t\tif ((allSelectableTargetsSelected && selected) || (!allSelectableTargetsSelected && !selected)) {\n\t\t\ttoggle(selectableTargetId);\n\t\t}\n\t}\n\n\treturn treeSelectedIdsToMultiValue(canonicalizeTreeSelection(selectedIds, index), index);\n}\n\nfunction collectExpandedIds(nodeId: string, index: TreeNodeIndex, expandedIds: Set<string>) {\n\tlet currentId = index.parentById.get(nodeId);\n\n\twhile (currentId) {\n\t\texpandedIds.add(currentId);\n\t\tcurrentId = index.parentById.get(currentId);\n\t}\n}\n\nexport function getSelectionExpandedIds(selectedIds: Set<string>, index: TreeNodeIndex) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const selectedId of selectedIds) {\n\t\tcollectExpandedIds(selectedId, index, expandedIds);\n\t}\n\n\treturn expandedIds;\n}\n\n/**\n * Вычисляет базовое раскрытие дерева из политики уровней и ручных действий.\n *\n * Ручное значение хранится отдельно для каждого node id и имеет приоритет над\n * default уровня. Благодаря вычислению по актуальному индексу узлы, загруженные\n * асинхронно, получают настройку без синхронизации props в React state.\n */\nexport function getConfiguredTreeExpandedIds(\n\tindex: TreeNodeIndex,\n\tdefaultExpandedCodeKeys: ReadonlySet<string>,\n\tmanualExpansionById: ReadonlyMap<string, boolean>\n) {\n\tconst expandedIds = new Set<string>();\n\n\tfor (const [nodeId, childIds] of index.childrenById) {\n\t\tif (childIds.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (manualExpansionById.get(nodeId) ?? defaultExpandedCodeKeys.has(node.codeKey)) {\n\t\t\texpandedIds.add(nodeId);\n\t\t}\n\t}\n\n\treturn expandedIds;\n}\n\nfunction filterTreeNode(node: TreeSelectNode, normalizedQuery: string, expandedIds: Set<string>): TreeSelectNode | null {\n\tconst filteredChildren = (node.children ?? [])\n\t\t.map((childNode) => filterTreeNode(childNode, normalizedQuery, expandedIds))\n\t\t.filter((childNode): childNode is TreeSelectNode => Boolean(childNode));\n\tconst isMatched = node.searchText.toLowerCase().includes(normalizedQuery);\n\n\tif (!isMatched && filteredChildren.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (filteredChildren.length > 0) {\n\t\texpandedIds.add(node.id);\n\t}\n\n\tif (filteredChildren.length === 0) {\n\t\treturn node;\n\t}\n\n\treturn {\n\t\t...node,\n\t\tchildren: filteredChildren\n\t};\n}\n\nexport function filterTreeNodes(nodes: readonly TreeSelectNode[], query: string) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\n\tif (!normalizedQuery) {\n\t\treturn {\n\t\t\tnodes: [...nodes],\n\t\t\texpandedIds: new Set<string>()\n\t\t};\n\t}\n\n\tconst expandedIds = new Set<string>();\n\tconst filteredNodes = nodes\n\t\t.map((node) => filterTreeNode(node, normalizedQuery, expandedIds))\n\t\t.filter((node): node is TreeSelectNode => Boolean(node));\n\n\treturn {\n\t\tnodes: filteredNodes,\n\t\texpandedIds\n\t};\n}\n\nexport function flattenVisibleTreeNodes(nodes: readonly TreeSelectNode[], expandedIds: Set<string>): TreeVisibleEntry[] {\n\tconst entries: TreeVisibleEntry[] = [];\n\n\tconst walk = (node: TreeSelectNode, level: number, parentId?: string) => {\n\t\tconst hasChildren = (node.children?.length ?? 0) > 0;\n\t\tconst isExpanded = hasChildren && expandedIds.has(node.id);\n\n\t\tentries.push({\n\t\t\tnode,\n\t\t\tlevel,\n\t\t\tparentId,\n\t\t\thasChildren,\n\t\t\tisExpanded,\n\t\t\tisLeaf: !hasChildren\n\t\t});\n\n\t\tif (!isExpanded) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const childNode of node.children ?? []) {\n\t\t\twalk(childNode, level + 1, node.id);\n\t\t}\n\t};\n\n\tfor (const node of nodes) {\n\t\twalk(node, 0);\n\t}\n\n\treturn entries;\n}\n","export type TreeColumnsLayoutEntryDescriptor = {\n\tlevel: number;\n};\n\n/** Границы одной root-группы в исходном DOM preorder. */\nexport type TreeColumnsRootGroupDescriptor = {\n\tstartIndex: number;\n\tendIndexExclusive: number;\n};\n\n/** Структурный вход columns-resolver и стабильная сигнатура для Floating UI. */\nexport type TreeColumnsLayoutDescriptor = {\n\titemCount: number;\n\tgroups: readonly TreeColumnsRootGroupDescriptor[];\n\tsignature: string;\n};\n\n/**\n * Описывает root-группы видимой части дерева, не меняя исходный preorder.\n *\n * Descriptor хранит только границы root-групп. Минимальное число строк,\n * необходимое для начала группы в текущем столбце, является invariant packing\n * и вычисляется resolver-ом без привязки к глубине отдельных descendants.\n */\nexport function buildTreeColumnsLayoutDescriptor(entries: readonly TreeColumnsLayoutEntryDescriptor[]): TreeColumnsLayoutDescriptor {\n\tconst groups: TreeColumnsRootGroupDescriptor[] = [];\n\tlet groupStartIndex = 0;\n\n\twhile (groupStartIndex < entries.length) {\n\t\tlet groupEndIndexExclusive = groupStartIndex + 1;\n\t\twhile (groupEndIndexExclusive < entries.length && entries[groupEndIndexExclusive]?.level !== 0) {\n\t\t\tgroupEndIndexExclusive += 1;\n\t\t}\n\n\t\tgroups.push({\n\t\t\tstartIndex: groupStartIndex,\n\t\t\tendIndexExclusive: groupEndIndexExclusive\n\t\t});\n\t\tgroupStartIndex = groupEndIndexExclusive;\n\t}\n\n\tconst signature = groups.map(({ startIndex, endIndexExclusive }) => `${startIndex}:${endIndexExclusive}`).join(\"|\");\n\n\treturn {\n\t\titemCount: entries.length,\n\t\tgroups,\n\t\tsignature: `${entries.length}|${signature}`\n\t};\n}\n","import type { TreeColumnsLayoutDescriptor, TreeColumnsRootGroupDescriptor } from \"./buildTreeColumnsLayoutDescriptor\";\n\nexport type BalancedTreeColumnsLayoutInput = {\n\tdescriptor: TreeColumnsLayoutDescriptor;\n\tavailableWidth: number;\n\tavailableHeight: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\treferenceWidth: number;\n};\n\nexport type BalancedTreeColumnsLayout = {\n\tcolumnCount: number;\n\trowCount: number;\n\twidth: number;\n\tminWidth: number;\n\tmaxHeight: number;\n\tplacements: readonly TreeColumnPlacement[];\n};\n\n/** Явная 1-based CSS-grid координата строки с неизменным option index. */\nexport type TreeColumnPlacement = {\n\tcolumn: number;\n\trow: number;\n};\n\nconst VIEWPORT_PADDING = 8;\nconst POPUP_HORIZONTAL_PADDING = 16;\nconst POPUP_CHROME_HEIGHT = 48;\nconst COLUMN_WIDTH = 224;\nconst COLUMN_GAP = 10;\nconst OPTION_HEIGHT = 32;\nconst MAX_COLUMN_COUNT = 6;\nconst MINIMUM_GROUP_START_ITEM_COUNT = 3;\n\nfunction normalizePositiveDimension(value: number, fallback: number) {\n\treturn Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\n/** Результат одной симуляции packing для заданной логической высоты колонки. */\nexport type ResolvedTreeColumnsPlacements = {\n\tplacements: TreeColumnPlacement[];\n\tusedColumnCount: number;\n\tintentionalGapCount: number;\n};\n\n/**\n * Возвращает минимальное число первых строк root-группы, которое должно\n * поместиться в остатке текущего столбца.\n *\n * Для группы из трёх и более элементов порог всегда равен трём: root и две\n * следующие видимые строки остаются вместе. Короткая группа защищается целиком,\n * а одиночный root использует последнюю свободную строку без лишнего переноса.\n */\nfunction resolveMinimumGroupStartItemCount(group: TreeColumnsRootGroupDescriptor) {\n\tconst groupSize = group.endIndexExclusive - group.startIndex;\n\treturn Math.min(MINIMUM_GROUP_START_ITEM_COUNT, groupSize);\n}\n\n/**\n * Симулирует CSS-grid packing и сохраняет DOM preorder через явные координаты.\n *\n * Намеренный перенос оставляет хвост предыдущей колонки пустым: последующие\n * группы не заполняют gap, поэтому визуальная последовательность не расходится\n * с option indexes, refs и keyboard navigation.\n */\nexport function resolveTreeColumnsPlacements(descriptor: TreeColumnsLayoutDescriptor, rowCount: number): ResolvedTreeColumnsPlacements {\n\tconst normalizedRowCount = Math.max(1, rowCount);\n\tconst placements: TreeColumnPlacement[] = [];\n\tlet column = 1;\n\tlet row = 1;\n\tlet intentionalGapCount = 0;\n\n\tfor (const group of descriptor.groups) {\n\t\tconst minimumGroupStartItemCount = resolveMinimumGroupStartItemCount(group);\n\t\tconst remainingRows = normalizedRowCount - row + 1;\n\n\t\tif (row > 1 && minimumGroupStartItemCount > remainingRows) {\n\t\t\tintentionalGapCount += remainingRows;\n\t\t\tcolumn += 1;\n\t\t\trow = 1;\n\t\t}\n\n\t\tfor (let index = group.startIndex; index < group.endIndexExclusive; index += 1) {\n\t\t\tplacements[index] = { column, row };\n\t\t\trow += 1;\n\n\t\t\tif (row > normalizedRowCount) {\n\t\t\t\tcolumn += 1;\n\t\t\t\trow = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tplacements,\n\t\tusedColumnCount: placements.length ? Math.max(...placements.map((placement) => placement.column)) : 1,\n\t\tintentionalGapCount\n\t};\n}\n\n/**\n * Выбирает количество колонок по фактически доступной Floating UI геометрии.\n * Для каждого candidate сначала выполняется group-aware packing. Если переносы\n * по трёхстрочному порогу создали лишнюю колонку, её высота увеличивается до\n * тех пор, пока placements не попадут в объявленный template grid.\n */\nexport function resolveBalancedTreeColumnsLayout({\n\tdescriptor,\n\tavailableWidth,\n\tavailableHeight,\n\tviewportWidth,\n\tviewportHeight,\n\treferenceWidth\n}: BalancedTreeColumnsLayoutInput): BalancedTreeColumnsLayout {\n\tconst normalizedItemCount = Math.max(0, Math.floor(Number.isFinite(descriptor.itemCount) ? descriptor.itemCount : 0));\n\tconst normalizedAvailableWidth = normalizePositiveDimension(availableWidth, COLUMN_WIDTH + POPUP_HORIZONTAL_PADDING);\n\tconst normalizedAvailableHeight = normalizePositiveDimension(availableHeight, OPTION_HEIGHT + POPUP_CHROME_HEIGHT);\n\tconst normalizedViewportWidth = normalizePositiveDimension(viewportWidth, normalizedAvailableWidth + VIEWPORT_PADDING * 2);\n\tconst normalizedViewportHeight = normalizePositiveDimension(viewportHeight, normalizedAvailableHeight);\n\tconst widthLimit = Math.max(1, Math.min(normalizedAvailableWidth, Math.max(1, normalizedViewportWidth - VIEWPORT_PADDING * 2)));\n\tconst heightLimit = Math.max(1, Math.min(normalizedAvailableHeight, normalizedViewportHeight - VIEWPORT_PADDING * 2));\n\tconst normalizedReferenceWidth = Math.max(1, normalizePositiveDimension(referenceWidth, 1));\n\tconst minWidth = Math.min(widthLimit, normalizedReferenceWidth);\n\tconst maxColumnsByWidth = Math.max(1, Math.floor((widthLimit - POPUP_HORIZONTAL_PADDING + COLUMN_GAP) / (COLUMN_WIDTH + COLUMN_GAP)));\n\tconst maxColumnCount = Math.max(1, Math.min(MAX_COLUMN_COUNT, maxColumnsByWidth, normalizedItemCount || 1));\n\tconst minimumGroupStartRows = descriptor.groups.reduce(\n\t\t(maximum, group) => Math.max(maximum, resolveMinimumGroupStartItemCount(group)),\n\t\t1\n\t);\n\n\tif (normalizedItemCount === 0) {\n\t\treturn {\n\t\t\tcolumnCount: 1,\n\t\t\trowCount: 1,\n\t\t\twidth: minWidth,\n\t\t\tminWidth,\n\t\t\tmaxHeight: heightLimit,\n\t\t\tplacements: []\n\t\t};\n\t}\n\n\tlet bestLayout: BalancedTreeColumnsLayout | undefined;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\n\tfor (let candidateColumnCount = 1; candidateColumnCount <= maxColumnCount; candidateColumnCount += 1) {\n\t\tlet rowCount = Math.max(minimumGroupStartRows, Math.ceil(normalizedItemCount / candidateColumnCount));\n\t\tlet packed = resolveTreeColumnsPlacements(descriptor, rowCount);\n\n\t\twhile (packed.usedColumnCount > candidateColumnCount && rowCount < normalizedItemCount) {\n\t\t\trowCount += 1;\n\t\t\tpacked = resolveTreeColumnsPlacements(descriptor, rowCount);\n\t\t}\n\n\t\tconst columnCount = packed.usedColumnCount;\n\t\tconst naturalWidth = Math.max(minWidth, POPUP_HORIZONTAL_PADDING + columnCount * COLUMN_WIDTH + (columnCount - 1) * COLUMN_GAP);\n\t\tconst naturalHeight = POPUP_CHROME_HEIGHT + rowCount * OPTION_HEIGHT;\n\t\tconst widthRatio = naturalWidth / widthLimit;\n\t\tconst heightRatio = naturalHeight / heightLimit;\n\t\tconst emptyCellPenalty = (columnCount * rowCount - normalizedItemCount) / normalizedItemCount;\n\t\tconst intentionalGapPenalty = packed.intentionalGapCount / normalizedItemCount;\n\t\tconst score =\n\t\t\tMath.max(widthRatio, heightRatio) +\n\t\t\t0.25 * Math.abs(widthRatio - heightRatio) +\n\t\t\t0.01 * emptyCellPenalty +\n\t\t\t0.02 * intentionalGapPenalty +\n\t\t\t0.04 * (columnCount - 1);\n\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestLayout = {\n\t\t\t\tcolumnCount,\n\t\t\t\trowCount,\n\t\t\t\twidth: Math.min(widthLimit, naturalWidth),\n\t\t\t\tminWidth,\n\t\t\t\tmaxHeight: heightLimit,\n\t\t\t\tplacements: packed.placements\n\t\t\t};\n\t\t}\n\t}\n\n\treturn (\n\t\tbestLayout ?? {\n\t\t\tcolumnCount: 1,\n\t\t\trowCount: normalizedItemCount,\n\t\t\twidth: minWidth,\n\t\t\tminWidth,\n\t\t\tmaxHeight: heightLimit,\n\t\t\tplacements: resolveTreeColumnsPlacements(descriptor, normalizedItemCount).placements\n\t\t}\n\t);\n}\n","@use \"@/styles/mixins\" as *;\n\n.treeNodeButton {\n\tgap: var(--space-sm);\n}\n\n.treePopupHeader {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n}\n\n.treeColumns {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--tree-column-count, 1), minmax(0, 1fr));\n\tgrid-template-rows: repeat(var(--tree-row-count, 1), minmax(var(--control-height), auto));\n\tcolumn-gap: var(--space-sm);\n\talign-content: start;\n\twidth: 100%;\n\tmin-width: 0;\n}\n\n.treeColumnRow {\n\tmin-width: 0;\n\tgrid-column-start: var(--tree-option-column);\n\tgrid-row-start: var(--tree-option-row);\n}\n\n// В columns внешний floating maxHeight уже учитывает доступную сторону и safe area.\n.treeColumnsPopupLayout {\n\tmax-height: none;\n}\n\n.treeColumnCheckBox {\n\tdisplay: inline-flex;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n}\n\n.treeIndent {\n\tflex-shrink: 0;\n\twidth: calc(var(--tree-level) * 1em);\n}\n\n.treeExpander,\n.treeExpanderPlaceholder {\n\tflex-shrink: 0;\n\twidth: var(--text-height);\n\theight: var(--text-height);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.treeExpander {\n\tbackground: transparent;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.treeExpanderIcon {\n\ttransition: transform var(--transition-fast) ease;\n}\n\n.treeExpanderIconExpanded {\n\ttransform: rotate(90deg);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronRightIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../check-box\";\nimport { OptionButton } from \"../option\";\n\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeMultiSelectOptionsLayout, TreeSelectNode } from \"./types\";\n\ntype TreeNodeContentProps = {\n\tnode: TreeSelectNode;\n\tlevel: number;\n\thighlight?: string;\n\thasChildren: boolean;\n\tisExpanded: boolean;\n\tselected: boolean;\n\tpartial: boolean;\n\tselectionMode: \"single\" | \"multi\";\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\tonToggleExpand?: () => void;\n\tonToggleSelection?: () => void;\n\tonActivate?: () => void;\n};\n\nexport function TreeNodeContent({\n\tnode,\n\tlevel,\n\thighlight,\n\thasChildren,\n\tisExpanded,\n\tselected,\n\tpartial,\n\tselectionMode,\n\toptionsLayout = \"tree\",\n\tonToggleExpand,\n\tonToggleSelection,\n\tonActivate\n}: TreeNodeContentProps) {\n\tconst showExpansionControl = optionsLayout === \"tree\";\n\tconst emphasizeRootContent = optionsLayout === \"columns\" && level === 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div className={styles.treeIndent} style={{ \"--tree-level\": level } as CSSProperties} aria-hidden=\"true\" />\n\t\t\t{showExpansionControl && hasChildren ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.treeExpander}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonToggleExpand?.();\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={isExpanded ? \"Свернуть ветку\" : \"Развернуть ветку\"}\n\t\t\t\t\tdata-ui=\"tree-select-expander\"\n\t\t\t\t\tdata-action={isExpanded ? \"collapse-tree-select-node\" : \"expand-tree-select-node\"}>\n\t\t\t\t\t<ChevronRightIcon className={cn(styles.treeExpanderIcon, isExpanded && styles.treeExpanderIconExpanded)} />\n\t\t\t\t</button>\n\t\t\t) : showExpansionControl ? (\n\t\t\t\t<div className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t) : null}\n\n\t\t\t{selectionMode === \"multi\" ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.treeColumnCheckBox}\n\t\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\t\tonClick={(event) => event.stopPropagation()}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tindeterminate={partial}\n\t\t\t\t\t\tdisabled={node.disabled}\n\t\t\t\t\t\taria-label={`Выбрать ${node.label}`}\n\t\t\t\t\t\tonChange={() => onToggleSelection?.()}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t<OptionButton\n\t\t\t\tclassName={styles.treeNodeButton}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tdisabled={node.disabled}\n\t\t\t\ttext={node.label}\n\t\t\t\tcode={node.code}\n\t\t\t\tsearchText={highlight}\n\t\t\t\temphasizeContent={emphasizeRootContent}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tonClick={onActivate}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import { type CSSProperties, type KeyboardEvent, ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type FloatingListboxSizeResolver } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport { cn, findFirstEnabledIndex, findLastEnabledIndex, findNextEnabledIndex } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputText } from \"../input\";\nimport { Option } from \"../option\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerSelectionToolbar,\n\tPickerStatus,\n\tPickerTrigger,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport { buildTreeColumnsLayoutDescriptor } from \"./model/buildTreeColumnsLayoutDescriptor\";\nimport { resolveBalancedTreeColumnsLayout } from \"./model/resolveBalancedTreeColumnsLayout\";\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\n\tgetConfiguredTreeExpandedIds,\n\tgetSelectionExpandedIds,\n\tisTreeNodeSelected,\n\ttype TreeNodeIndex,\n\tTreeVisibleEntry\n} from \"./model/treeUtils\";\nimport { TreeNodeContent } from \"./TreeNodeContent\";\nimport styles from \"./TreeSelect.module.scss\";\nimport { TreeMultiSelectOptionsLayout, TreeSelectNode } from \"./types\";\n\ntype TreePickerBulkActions = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n};\n\ntype TreePickerBaseProps = Omit<UiBaseProps<never>, \"value\" | \"onChange\"> & {\n\tnodes: readonly TreeSelectNode[];\n\tselectedIds: Set<string>;\n\tpartialIds: Set<string>;\n\tselectionMode: \"single\" | \"multi\";\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\tdefaultExpandedCodeKeys?: readonly string[];\n\t/** Узлы, которые текущий multi-select contract не может безопасно сериализовать. */\n\tunavailableNodeIds?: ReadonlySet<string>;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tbulkActions?: TreePickerBulkActions;\n\ttriggerMode?: \"display\" | \"search\";\n\tselectedSummary?: ReactNode;\n\tselectedSummaryText?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\t/** Основное действие OptionButton выбирает узел и завершает текущий выбор. */\n\tonNodeActivate: (node: TreeSelectNode, selectionScopeIndex?: TreeNodeIndex) => void;\n\t/** Независимый checkbox меняет черновик, не закрывая popup. */\n\tonNodeToggleSelection?: (node: TreeSelectNode, selectionScopeIndex?: TreeNodeIndex) => void;\n\tonClearSelection?: () => void;\n\tisLoading?: boolean;\n\terror?: string;\n};\n\nexport function TreePickerBase({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\tnodes,\n\tselectedIds,\n\tpartialIds,\n\tselectionMode,\n\toptionsLayout = \"tree\",\n\tdefaultExpandedCodeKeys,\n\tunavailableNodeIds,\n\topen: controlledOpen,\n\tonOpenChange,\n\tbulkActions,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonNodeToggleSelection,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst selectAllButtonRef = useRef<HTMLButtonElement | null>(null);\n\tconst optionRefs = useRef<Array<HTMLDivElement | null>>([]);\n\t/** Явный owner open-state позволяет сбрасывать query непосредственно в close-событии. */\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\t/**\n\t * Сохраняет строку, в которую фокус вошёл через независимый expander или\n\t * checkbox. Это синхронизирует видимый active-state, не превращая строку в\n\t * единственный tab-stop и не меняя доступность вложенных контролов.\n\t */\n\tconst [focusedNodeId, setFocusedNodeId] = useState<string>();\n\tconst isOpenControlled = controlledOpen !== undefined;\n\tconst open = isOpenControlled ? controlledOpen : uncontrolledOpen;\n\tconst [manualExpansionById, setManualExpansionById] = useState<ReadonlyMap<string, boolean>>(() => new Map());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? (selectionMode === \"multi\" ? \"search-multi\" : \"search-single\") : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst defaultExpandedCodeKeySet = useMemo(() => new Set(defaultExpandedCodeKeys), [defaultExpandedCodeKeys]);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: resolvedTriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\t\tif (!nextOpen) {\n\t\t\tsetFocusedNodeId(undefined);\n\t\t}\n\n\t\tif (!isOpenControlled) {\n\t\t\tsetUncontrolledOpen(nextOpen);\n\t\t}\n\n\t\tonOpenChange?.(nextOpen);\n\t};\n\tconst { nodes: filteredNodes, expandedIds: searchExpandedIds } = useMemo(\n\t\t() => filterTreeNodes(nodes, currentQuery),\n\t\t[nodes, currentQuery]\n\t);\n\tconst filteredTreeIndex = useMemo(() => createTreeNodeIndex(filteredNodes), [filteredNodes]);\n\tconst selectionScopeIndex = currentQuery.trim().length > 0 ? filteredTreeIndex : undefined;\n\tconst selectedExpandedIds = useMemo(() => getSelectionExpandedIds(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst configuredExpandedIds = useMemo(\n\t\t() => getConfiguredTreeExpandedIds(treeIndex, defaultExpandedCodeKeySet, manualExpansionById),\n\t\t[defaultExpandedCodeKeySet, manualExpansionById, treeIndex]\n\t);\n\tconst allExpandedIds = useMemo(\n\t\t() => new Set([...treeIndex.childrenById].filter(([, childIds]) => childIds.length > 0).map(([nodeId]) => nodeId)),\n\t\t[treeIndex]\n\t);\n\tconst resolvedExpandedIds = useMemo(\n\t\t() =>\n\t\t\toptionsLayout === \"columns\"\n\t\t\t\t? allExpandedIds\n\t\t\t\t: new Set([...configuredExpandedIds, ...searchExpandedIds, ...selectedExpandedIds]),\n\t\t[allExpandedIds, configuredExpandedIds, optionsLayout, searchExpandedIds, selectedExpandedIds]\n\t);\n\tconst visibleEntries = useMemo(() => flattenVisibleTreeNodes(filteredNodes, resolvedExpandedIds), [filteredNodes, resolvedExpandedIds]);\n\tconst selectedIndex = useMemo(() => visibleEntries.findIndex((entry) => selectedIds.has(entry.node.id)), [selectedIds, visibleEntries]);\n\tconst isEntryDisabled = useCallback(\n\t\t(entry: TreeVisibleEntry) => entry.node.disabled === true || unavailableNodeIds?.has(entry.node.id) === true,\n\t\t[unavailableNodeIds]\n\t);\n\tconst columnsLayoutDescriptor = useMemo(() => buildTreeColumnsLayoutDescriptor(visibleEntries), [visibleEntries]);\n\tconst resolveColumnsFloatingSize = useCallback<FloatingListboxSizeResolver>(\n\t\t(context) => {\n\t\t\tconst layout = resolveBalancedTreeColumnsLayout({\n\t\t\t\t...context,\n\t\t\t\tdescriptor: columnsLayoutDescriptor\n\t\t\t});\n\t\t\tconst placementProperties: { [customProperty: `--${string}`]: string | undefined } = {};\n\t\t\tlayout.placements.forEach((placement, index) => {\n\t\t\t\tplacementProperties[`--tree-option-${index}-column`] = String(placement.column);\n\t\t\t\tplacementProperties[`--tree-option-${index}-row`] = String(placement.row);\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\twidth: `${layout.width}px`,\n\t\t\t\tminWidth: `${layout.minWidth}px`,\n\t\t\t\tmaxWidth: `${layout.width}px`,\n\t\t\t\tmaxHeight: `${layout.maxHeight}px`,\n\t\t\t\t\"--tree-column-count\": String(layout.columnCount),\n\t\t\t\t\"--tree-row-count\": String(layout.rowCount),\n\t\t\t\t...placementProperties\n\t\t\t};\n\t\t},\n\t\t[columnsLayoutDescriptor]\n\t);\n\tconst {\n\t\tactiveIndex: listboxActiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleEntries,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: (entry) => onNodeActivate(entry.node, selectionScopeIndex),\n\t\tgetOptionDisabled: isEntryDisabled,\n\t\tdisabled: disabled || isLoading,\n\t\t// selectOption вызывается только основной кнопкой; checkbox обходит его и остаётся в draft-режиме.\n\t\tcloseOnSelect: true,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode: resolvedTriggerMode,\n\t\tplacementStrategy: optionsLayout === \"columns\" ? \"auto\" : \"flip\",\n\t\tresolveFloatingSize: optionsLayout === \"columns\" ? resolveColumnsFloatingSize : undefined\n\t});\n\tconst focusedOptionIndex = focusedNodeId ? visibleEntries.findIndex((entry) => entry.node.id === focusedNodeId) : -1;\n\tconst renderedActiveIndex = focusedOptionIndex >= 0 ? focusedOptionIndex : listboxActiveIndex;\n\tconst updateFloatingLayout = context.update;\n\tconst hasSelection = selectedIds.size > 0;\n\tconst showTriggerQuery = triggerMode === \"search\" && (open || currentQuery.length > 0);\n\tconst triggerValue = showTriggerQuery ? currentQuery : (selectedSummaryText ?? \"\");\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: resolvedTriggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: Boolean(selectedSummaryText),\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst showBulkActions = optionsLayout === \"columns\" && selectionMode === \"multi\" && bulkActions;\n\tconst showPopupSearch = triggerMode === \"display\";\n\tconst popupHeader =\n\t\tshowBulkActions || showPopupSearch ? (\n\t\t\t<div className={styles.treePopupHeader}>\n\t\t\t\t{showBulkActions ? (\n\t\t\t\t\t<PickerSelectionToolbar\n\t\t\t\t\t\tonSelectAll={bulkActions.onSelectAll}\n\t\t\t\t\t\tonDeselectAll={bulkActions.onDeselectAll}\n\t\t\t\t\t\tselectAllButtonRef={selectAllButtonRef}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t{showPopupSearch ? (\n\t\t\t\t\t<InputText\n\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\tonChange={setQuery}\n\t\t\t\t\t\tonClear={() => setQuery(\"\")}\n\t\t\t\t\t\tplaceholder=\"Поиск по дереву\"\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.key !== \"Escape\" && event.key !== \"Tab\") {\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t) : undefined;\n\n\tuseLayoutEffect(() => {\n\t\tif (open && optionsLayout === \"columns\") {\n\t\t\tupdateFloatingLayout();\n\t\t}\n\t}, [columnsLayoutDescriptor.signature, open, optionsLayout, updateFloatingLayout]);\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClearSelection = () => {\n\t\tonClearSelection?.();\n\t\tsetQuery(\"\");\n\n\t\tif (selectionMode === \"single\") {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst toggleExpand = (entry: TreeVisibleEntry) => {\n\t\tif (!entry.hasChildren) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetManualExpansionById((currentExpansionById) => {\n\t\t\tconst nextExpansionById = new Map(currentExpansionById);\n\t\t\tconst isConfiguredExpanded = currentExpansionById.get(entry.node.id) ?? defaultExpandedCodeKeySet.has(entry.node.codeKey);\n\n\t\t\tnextExpansionById.set(entry.node.id, !isConfiguredExpanded);\n\n\t\t\treturn nextExpansionById;\n\t\t});\n\t};\n\tconst focusOptionAtIndex = (optionIndex: number) => {\n\t\toptionRefs.current[optionIndex]?.focus();\n\t};\n\t/**\n\t * Объединяет клавиатурную модель строки для внешней Option и её независимых\n\t * контролов: вертикальные клавиши перемещают строковый фокус, горизонтальные\n\t * управляют веткой, Space меняет checkbox, а Enter выполняет основное действие.\n\t */\n\tconst handleTreeOptionKeyDown = (event: KeyboardEvent<HTMLElement>, entry: TreeVisibleEntry, optionIndex: number) => {\n\t\tif (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n\t\t\tevent.preventDefault();\n\t\t\tconst direction = event.key === \"ArrowDown\" ? 1 : -1;\n\t\t\tfocusOptionAtIndex(findNextEnabledIndex(visibleEntries, optionIndex, direction, isEntryDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\" || event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tconst boundaryIndex =\n\t\t\t\tevent.key === \"Home\"\n\t\t\t\t\t? findFirstEnabledIndex(visibleEntries, isEntryDisabled)\n\t\t\t\t\t: findLastEnabledIndex(visibleEntries, isEntryDisabled);\n\t\t\tfocusOptionAtIndex(boundaryIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionsLayout === \"tree\" && event.key === \"ArrowRight\") {\n\t\t\tevent.preventDefault();\n\t\t\tif (entry.hasChildren && !entry.isExpanded) {\n\t\t\t\ttoggleExpand(entry);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst firstChildEntry = visibleEntries[optionIndex + 1];\n\t\t\tif (entry.isExpanded && firstChildEntry?.parentId === entry.node.id) {\n\t\t\t\tfocusOptionAtIndex(optionIndex + 1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionsLayout === \"tree\" && event.key === \"ArrowLeft\") {\n\t\t\tevent.preventDefault();\n\t\t\tif (entry.hasChildren && entry.isExpanded) {\n\t\t\t\ttoggleExpand(entry);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.parentId) {\n\t\t\t\tfocusOptionAtIndex(visibleEntries.findIndex((candidate) => candidate.node.id === entry.parentId));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \" \" && selectionMode === \"multi\" && !isEntryDisabled(entry)) {\n\t\t\tevent.preventDefault();\n\t\t\tonNodeToggleSelection?.(entry.node, selectionScopeIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Enter\" && !isEntryDisabled(entry)) {\n\t\t\tevent.preventDefault();\n\t\t\tselectOption(entry);\n\t\t}\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\t\t\t\tconst popupAriaLabel = typeof label === \"string\" ? label : placeholder;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={treeIndex.nodeById.size}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerValue}\n\t\t\t\t\t\t\tselectedValue={selectedSummary ?? selectedSummaryText}\n\t\t\t\t\t\t\thasSelection={hasSelection}\n\t\t\t\t\t\t\tshowSelectedValue={\n\t\t\t\t\t\t\t\thasSelection && (resolvedTriggerMode === \"search-multi\" ? currentQuery.length === 0 : !showTriggerQuery)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclearable={onClearSelection !== undefined}\n\t\t\t\t\t\t\tonClear={handleClearSelection}\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-label={labelId ? undefined : placeholder}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup={optionsLayout === \"columns\" ? \"dialog\" : \"listbox\"}\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={optionsLayout !== \"columns\" && triggerMode === \"search\" ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\t\toptionsLayout !== \"columns\" && open && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (triggerMode !== \"search\") {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\tsetFocusedNodeId(undefined);\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\" &&\n\t\t\t\t\t\t\t\t\topen &&\n\t\t\t\t\t\t\t\t\tevent.key === \"Tab\" &&\n\t\t\t\t\t\t\t\t\t!event.shiftKey &&\n\t\t\t\t\t\t\t\t\tselectAllButtonRef.current\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tselectAllButtonRef.current.focus();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeEntry = listboxActiveIndex >= 0 ? visibleEntries[listboxActiveIndex] : undefined;\n\t\t\t\t\t\t\t\t\t\tif (activeEntry) {\n\t\t\t\t\t\t\t\t\t\t\tselectOption(activeEntry);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: triggerMode === \"display\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tpopupAriaLabel={popupAriaLabel}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={\n\t\t\t\t\t\t\t\toptionsLayout !== \"columns\" && visibleEntries.length > 0 ? getActiveOptionId(listId) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tariaMultiselectable={optionsLayout !== \"columns\" && selectionMode === \"multi\"}\n\t\t\t\t\t\t\tpopupRole={optionsLayout === \"columns\" ? \"dialog\" : \"listbox\"}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tlayoutClassName={optionsLayout === \"columns\" ? styles.treeColumnsPopupLayout : undefined}\n\t\t\t\t\t\t\tbodyClassName=\"scrollable\"\n\t\t\t\t\t\t\ttoolbar={popupHeader}>\n\t\t\t\t\t\t\t<div className={cn(optionsLayout === \"columns\" && styles.treeColumns)}>\n\t\t\t\t\t\t\t\t{visibleEntries.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<PickerStatus errorState={error} emptyState={!error && !isLoading ? \"Нет данных\" : undefined} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvisibleEntries.map((entry, index) => {\n\t\t\t\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\t\t\t\tselectionMode === \"multi\"\n\t\t\t\t\t\t\t\t\t\t\t\t? isTreeNodeSelected(entry.node.id, selectedIds, treeIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t: selectedIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst partial = selectionMode === \"multi\" && !selected && partialIds.has(entry.node.id);\n\t\t\t\t\t\t\t\t\t\tconst active = index === renderedActiveIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled =\n\t\t\t\t\t\t\t\t\t\t\tentry.node.disabled === true || unavailableNodeIds?.has(entry.node.id) === true;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Option\n\t\t\t\t\t\t\t\t\t\t\t\tkey={entry.node.id}\n\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"tree-select-option\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionRefs.current[index] = node;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetOptionRef(index, node);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\trole={optionsLayout === \"columns\" ? undefined : \"option\"}\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={optionsLayout === \"columns\" ? undefined : selected}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\tactive={active}\n\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedNodeId(entry.node.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => handleTreeOptionKeyDown(event, entry, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={optionsLayout === \"columns\" ? styles.treeColumnRow : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"--tree-option-column\": `var(--tree-option-${index}-column, auto)`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"--tree-option-row\": `var(--tree-option-${index}-row, auto)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} as CSSProperties)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t\t\t<TreeNodeContent\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode={optionDisabled ? { ...entry.node, disabled: true } : entry.node}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlevel={entry.level}\n\t\t\t\t\t\t\t\t\t\t\t\t\thighlight={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\t\t\thasChildren={entry.hasChildren}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisExpanded={entry.isExpanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpartial={partial}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout={optionsLayout}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleExpand={() => toggleExpand(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggleSelection={() => onNodeToggleSelection?.(entry.node, selectionScopeIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonActivate={() => selectOption(entry)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Option>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n","import { useMemo, useState } from \"react\";\n\nimport { formatOptionCount } from \"../multi-select/ui/defaultRenderers\";\nimport { usePickerSelectionLifecycle } from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tgetSelectableTreeNodeIds,\n\tgetTreeNodeSelectionState,\n\tisTreeNodeSelected,\n\ttoggleTreeMultiSelection,\n\ttreeMultiValueToSelectedIds,\n\ttreeSelectedIdsToMultiValue\n} from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeMultiSelectOptionsLayout, TreeMultiSelectValue, TreeSelectNode } from \"./types\";\n\nexport interface TreeMultiSelectProps extends Omit<UiBaseProps<TreeMultiSelectValue>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\t/** Определяет обычное раскрываемое дерево или полностью открытый адаптивный набор колонок. */\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\t/**\n\t * Ключи уровней, узлы которых раскрываются до ручного действия пользователя.\n\t * В режиме `columns` дерево по-прежнему отображается полностью раскрытым.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nfunction formatTreeMultiSummary(selectedIds: Set<string>, treeIndex: ReturnType<typeof createTreeNodeIndex>) {\n\tconst serializedValue = treeSelectedIdsToMultiValue(selectedIds, treeIndex);\n\tconst selectedPredicateCount = Object.values(serializedValue).reduce((count, values) => count + values.length, 0);\n\tif (selectedPredicateCount === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (selectedPredicateCount === 1) {\n\t\tconst selectedNodeId = [...selectedIds].sort(\n\t\t\t(leftId, rightId) =>\n\t\t\t\t(treeIndex.preorderIndexById.get(leftId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t(treeIndex.preorderIndexById.get(rightId) ?? Number.MAX_SAFE_INTEGER)\n\t\t)[0];\n\t\tconst selectedNode = treeIndex.nodeById.get(selectedNodeId);\n\n\t\tif (!selectedNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn selectedNode.label;\n\t}\n\n\treturn formatOptionCount(selectedPredicateCount);\n}\n\n/**\n * Сравнивает семантический выбор по каноническим id дерева. Порядок ключей и\n * значений во внешнем Record не должен приводить к лишнему commit при закрытии.\n */\nfunction areTreeMultiSelectionsEqual(\n\tleft: TreeMultiSelectValue,\n\tright: TreeMultiSelectValue,\n\ttreeIndex: ReturnType<typeof createTreeNodeIndex>\n) {\n\tconst leftIds = treeMultiValueToSelectedIds(left, treeIndex);\n\tconst rightIds = treeMultiValueToSelectedIds(right, treeIndex);\n\n\treturn leftIds.size === rightIds.size && [...leftIds].every((nodeId) => rightIds.has(nodeId));\n}\n\nexport function TreeMultiSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значения\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\toptionsLayout = \"tree\",\n\tdefaultExpandedCodeKeys\n}: TreeMultiSelectProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { draftValue, setDraftValue, prepareOpen } = usePickerSelectionLifecycle({\n\t\tvalue,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tisEqual: (left, right) => areTreeMultiSelectionsEqual(left, right, treeIndex)\n\t});\n\tconst currentValue = open ? draftValue : value;\n\tconst selectedIds = useMemo(() => treeMultiValueToSelectedIds(currentValue, treeIndex), [currentValue, treeIndex]);\n\tconst selectionState = useMemo(() => getTreeNodeSelectionState(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst unavailableNodeIds = useMemo(\n\t\t() =>\n\t\t\tnew Set(\n\t\t\t\t[...treeIndex.nodeById.keys()].filter(\n\t\t\t\t\t(nodeId) =>\n\t\t\t\t\t\ttreeIndex.nodeById.get(nodeId)?.disabled !== true &&\n\t\t\t\t\t\t!isTreeNodeSelected(nodeId, selectedIds, treeIndex) &&\n\t\t\t\t\t\t!selectionState.selectedIds.has(nodeId) &&\n\t\t\t\t\t\tgetSelectableTreeNodeIds(treeIndex, [nodeId]).size === 0\n\t\t\t\t)\n\t\t\t),\n\t\t[selectedIds, selectionState.selectedIds, treeIndex]\n\t);\n\tconst selectedSummary = useMemo(() => formatTreeMultiSummary(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (nextOpen && !open) {\n\t\t\tprepareOpen();\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst selectAll = () => {\n\t\tsetDraftValue(treeSelectedIdsToMultiValue(getSelectableTreeNodeIds(treeIndex), treeIndex));\n\t};\n\tconst clearSelection = () => {\n\t\tsetDraftValue({});\n\n\t\tif (!open) {\n\t\t\tonChange({});\n\t\t}\n\t};\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectionState.selectedIds}\n\t\t\tpartialIds={selectionState.partialIds}\n\t\t\tselectionMode=\"multi\"\n\t\t\toptionsLayout={optionsLayout}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tunavailableNodeIds={unavailableNodeIds}\n\t\t\topen={open}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t\tbulkActions={{\n\t\t\t\tonSelectAll: selectAll,\n\t\t\t\tonDeselectAll: () => setDraftValue({})\n\t\t\t}}\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummary={selectedSummary}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node, selectionScopeIndex) => {\n\t\t\t\tsetDraftValue(toggleTreeMultiSelection({}, node.id, treeIndex, selectionScopeIndex));\n\t\t\t}}\n\t\t\tonNodeToggleSelection={(node, selectionScopeIndex) => {\n\t\t\t\tsetDraftValue((currentDraftValue) => toggleTreeMultiSelection(currentDraftValue, node.id, treeIndex, selectionScopeIndex));\n\t\t\t}}\n\t\t\tonClearSelection={clearSelection}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n","import { useMemo } from \"react\";\n\nimport { ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { useODataTreeData } from \"./model/useODataTreeData\";\nimport { TreeMultiSelect } from \"./TreeMultiSelect\";\nimport { TreeMultiSelectOptionsLayout, TreeMultiSelectValue, TreeSelectNode } from \"./types\";\n\nexport type ODataTreeMultiSelectNodesTransformContext = {\n\t/** Фактический порядок запрошенных уровней после разрешения metadata-chain. */\n\torderedCodeKeys: readonly string[];\n};\n\nexport type ODataTreeMultiSelectNodesTransform = (\n\tnodes: readonly TreeSelectNode[],\n\tcontext: ODataTreeMultiSelectNodesTransformContext\n) => readonly TreeSelectNode[];\n\nexport interface ODataTreeMultiSelectProps\n\textends Omit<ODataDependentBaseProps, \"model\" | \"value\" | \"dependencies\">, Omit<UiBaseProps<TreeMultiSelectValue>, \"placeholder\"> {\n\tmodel?: ODataDependentBaseProps[\"model\"];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\t/** Переключает способ показа загруженного OData-дерева, не меняя формат value и запросов. */\n\toptionsLayout?: TreeMultiSelectOptionsLayout;\n\t/**\n\t * Ключи OData-уровней, раскрываемых после появления загруженных узлов.\n\t * В режиме `columns` дерево по-прежнему отображается полностью раскрытым.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n\t/** Явный порядок уровней поверх порядка, автоматически полученного из metadata-chain. */\n\tsegmentOrder?: readonly string[];\n\t/** Уровни, на которых пустой код не обрывает последующие уровни дерева. */\n\tallowEmptyCodeKeys?: readonly string[];\n\t/**\n\t * Создаёт consumer-представление поверх уже загруженного OData-дерева.\n\t *\n\t * Преобразование не меняет Query cache и transport-запрос. Callback должен\n\t * оставаться чистым и возвращать новые узлы, не мутируя входное дерево.\n\t */\n\ttransformNodes?: ODataTreeMultiSelectNodesTransform;\n}\n\nexport function ODataTreeMultiSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tplaceholder,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\toptionsLayout,\n\tvalue,\n\tonChange,\n\todata,\n\tsegments,\n\tmodel,\n\tdefaultExpandedCodeKeys,\n\tsegmentOrder,\n\tallowEmptyCodeKeys,\n\ttransformNodes\n}: ODataTreeMultiSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel,\n\t\tsegmentOrder,\n\t\tallowEmptyCodeKeys\n\t});\n\tconst nodes = useMemo(\n\t\t() => transformNodes?.(treeData.nodes, { orderedCodeKeys: treeData.orderedCodeKeys }) ?? treeData.nodes,\n\t\t[transformNodes, treeData.nodes, treeData.orderedCodeKeys]\n\t);\n\n\treturn (\n\t\t<TreeMultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled || treeData.isLoading}\n\t\t\tsize={size}\n\t\t\tplaceholder={placeholder ?? treeData.placeholder}\n\t\t\tnodes={nodes}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\toptionsLayout={optionsLayout}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n}\n","import { useMemo } from \"react\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { createTreeNodeIndex, treeSelectValueToId } from \"./model/treeUtils\";\nimport { TreePickerBase } from \"./TreePickerBase\";\nimport { TreeSelectNode, TreeSelectValue } from \"./types\";\n\nexport interface TreeSelectProps extends Omit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tnodes: readonly TreeSelectNode[];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tisLoading?: boolean;\n\terror?: string;\n\tclearable?: boolean;\n\t/**\n\t * Ключи уровней, узлы которых раскрываются до ручного действия пользователя.\n\t * Значения сопоставляются с `TreeSelectNode.codeKey`.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nfunction formatTreeNodeSummary(node: TreeSelectNode | undefined) {\n\tif (!node) {\n\t\treturn undefined;\n\t}\n\n\tif (node.code && node.code !== node.label) {\n\t\treturn `${node.label} · ${node.code}`;\n\t}\n\n\treturn node.label;\n}\n\nexport function TreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder = \"Выберите значение\",\n\tsize,\n\tnodes,\n\tvalue,\n\tonChange,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tisLoading,\n\terror,\n\tclearable = false,\n\tdefaultExpandedCodeKeys\n}: TreeSelectProps) {\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst selectedId = treeSelectValueToId(value, treeIndex);\n\tconst selectedNode = selectedId ? treeIndex.nodeById.get(selectedId) : undefined;\n\n\treturn (\n\t\t<TreePickerBase\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tnodes={nodes}\n\t\t\tselectedIds={selectedId ? new Set([selectedId]) : new Set()}\n\t\t\tpartialIds={new Set()}\n\t\t\tselectionMode=\"single\"\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummaryText={formatTreeNodeSummary(selectedNode)}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => onChange({ codeKey: node.codeKey, value: node.value })}\n\t\t\tonClearSelection={clearable ? () => onChange(undefined) : undefined}\n\t\t\tisLoading={isLoading}\n\t\t\terror={error}\n\t\t/>\n\t);\n}\n","import { ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../types\";\n\nimport { useODataTreeData } from \"./model/useODataTreeData\";\nimport { TreeSelect } from \"./TreeSelect\";\nimport { TreeSelectValue } from \"./types\";\n\nexport interface ODataTreeSelectProps\n\textends\n\t\tOmit<ODataDependentBaseProps, \"model\" | \"value\" | \"dependencies\">,\n\t\tOmit<UiBaseProps<TreeSelectValue | undefined>, \"placeholder\"> {\n\tmodel?: ODataDependentBaseProps[\"model\"];\n\tplaceholder?: string;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tclearable?: boolean;\n\t/**\n\t * Ключи OData-уровней, раскрываемых после появления загруженных узлов.\n\t * Настройка влияет только на представление и не изменяет OData-запросы.\n\t */\n\tdefaultExpandedCodeKeys?: readonly string[];\n}\n\nexport function ODataTreeSelect({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tplaceholder,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tvalue,\n\tonChange,\n\todata,\n\tsegments,\n\tmodel,\n\tclearable,\n\tdefaultExpandedCodeKeys\n}: ODataTreeSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel\n\t});\n\n\treturn (\n\t\t<TreeSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled || treeData.isLoading}\n\t\t\tsize={size}\n\t\t\tplaceholder={placeholder ?? treeData.placeholder}\n\t\t\tnodes={treeData.nodes}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tdefaultExpandedCodeKeys={defaultExpandedCodeKeys}\n\t\t\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t\tclearable={clearable}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { CollectionItem } from "@ryuzaki13/react-foundation-lib/odata";
1
+ import { CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
2
2
  import { TreeSelectNode } from "../types";
3
3
  type BuildODataTreeNodesArgs = {
4
4
  items: CollectionItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"buildODataTreeNodes.d.ts","sourceRoot":"","sources":["../../../src/tree-select/model/buildODataTreeNodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,KAAK,uBAAuB,GAAG;IAC9B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA4EF,wBAAgB,mBAAmB,CAAC,EACnC,KAAK,EACL,eAAe,EACf,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,UAAiB,EACjB,EAAE,uBAAuB,GAAG,cAAc,EAAE,CAiD5C"}
1
+ {"version":3,"file":"buildODataTreeNodes.d.ts","sourceRoot":"","sources":["../../../src/tree-select/model/buildODataTreeNodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,KAAK,uBAAuB,GAAG;IAC9B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA4EF,wBAAgB,mBAAmB,CAAC,EACnC,KAAK,EACL,eAAe,EACf,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,UAAiB,EACjB,EAAE,uBAAuB,GAAG,cAAc,EAAE,CAiD5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-ui",
3
- "version": "1.8.11",
3
+ "version": "1.8.13",
4
4
  "description": "Reusable React foundation UI primitives and Storybook stories.",
5
5
  "license": "MIT",
6
6
  "author": "Ryuzaki13",
@@ -472,8 +472,8 @@
472
472
  "@lexical/rich-text": "^0.49.0",
473
473
  "@lexical/selection": "^0.49.0",
474
474
  "@lexical/utils": "^0.49.0",
475
- "@ryuzaki13/react-foundation-api": "^1.1.16",
476
- "@ryuzaki13/react-foundation-lib": "^1.4.1",
475
+ "@ryuzaki13/react-foundation-api": "^1.1.18",
476
+ "@ryuzaki13/react-foundation-lib": "^1.4.3",
477
477
  "@storybook/addon-a11y": "^10.5.5",
478
478
  "@storybook/addon-docs": "^10.5.5",
479
479
  "@storybook/addon-vitest": "^10.5.5",
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Sr0umHM6.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-DndFRxxW.js";import{a as p,i as m,n as h,o as g,r as _,s as v,t as y}from"./Badge.stories-C9gJRuIO.js";function b(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(s,{of:h,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{a as p,i as m,n as h,o as g,r as _,s as v,t as y}from"./Badge.stories-BEu55X4s.js";function b(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(s,{of:h,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
2
2
  `,(0,S.jsx)(u,{children:`Badge`}),`
3
3
  `,(0,S.jsx)(o,{children:`Компактная текстовая метка для статусов, категорий, фильтров и коротких служебных пометок`}),`
4
4
  `,(0,S.jsx)(t.p,{children:`Badge подходит для коротких подписей, которые должны быстро читаться и не перегружать интерфейс:`}),`