@ryuzaki13/react-foundation-ui 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/dist/tree-select/ODataTreeMultiSelect.d.ts +3 -1
  2. package/dist/tree-select/ODataTreeMultiSelect.d.ts.map +1 -1
  3. package/dist/tree-select/index.js +259 -256
  4. package/dist/tree-select/index.js.map +1 -1
  5. package/dist/tree-select/model/buildODataTreeNodes.d.ts +3 -1
  6. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  7. package/dist/tree-select/model/useODataTreeData.d.ts +3 -1
  8. package/dist/tree-select/model/useODataTreeData.d.ts.map +1 -1
  9. package/package.json +1 -1
  10. package/storybook-static/assets/{Badge-BMre0xPE.js → Badge-BO92XAaZ.js} +1 -1
  11. package/storybook-static/assets/{Badge.stories-CAiQwpc2.js → Badge.stories-DphBeFms.js} +1 -1
  12. package/storybook-static/assets/{BadgeList-CR6uQVoG.js → BadgeList-DLOBwonr.js} +1 -1
  13. package/storybook-static/assets/{Button-B2JIv4ne.js → Button-BL9zhcVb.js} +1 -1
  14. package/storybook-static/assets/{Button-B95s8mZe.js → Button-C3hCmqfI.js} +1 -1
  15. package/storybook-static/assets/{Button.stories-D7l47m4L.js → Button.stories-8BRcincg.js} +1 -1
  16. package/storybook-static/assets/{CalendarView-MafDCsmM.js → CalendarView-B3ua0dXh.js} +1 -1
  17. package/storybook-static/assets/{CheckBox-zK4d81p2.js → CheckBox-BCoYlf-d.js} +1 -1
  18. package/storybook-static/assets/{CheckBox-DnRP80TF.js → CheckBox-C75yqSS0.js} +1 -1
  19. package/storybook-static/assets/{CheckBox.stories-DQdRmJWM.js → CheckBox.stories-C1kKY1Ep.js} +1 -1
  20. package/storybook-static/assets/{Color-6AOWCN3U-u7I1oO8P.js → Color-6AOWCN3U-CaBXevZX.js} +1 -1
  21. package/storybook-static/assets/{ContextMenu-MICxcRfu.js → ContextMenu-Be1OUlfQ.js} +1 -1
  22. package/storybook-static/assets/{ContextMenu-YzE_jJUw.js → ContextMenu-CvniLIOU.js} +1 -1
  23. package/storybook-static/assets/{ContextMenu.stories-BJjgOfeB.js → ContextMenu.stories-V8WHlmas.js} +1 -1
  24. package/storybook-static/assets/{DateInput-CcLb27Su.js → DateInput-BPoAtUFc.js} +1 -1
  25. package/storybook-static/assets/{DateInput-DTI4Z9V2.js → DateInput-noSTYrKD.js} +1 -1
  26. package/storybook-static/assets/{DateInput.stories-D7phgqSf.js → DateInput.stories-DLcGvFrw.js} +1 -1
  27. package/storybook-static/assets/{DateRangePresetSelect-rtOL-Z9R.js → DateRangePresetSelect-JBRiwEaO.js} +1 -1
  28. package/storybook-static/assets/{DateRangePresetSelect-DF1QlExa.js → DateRangePresetSelect-M_mC2ox7.js} +1 -1
  29. package/storybook-static/assets/{DateRangePresetSelect.stories-SNlqr2aA.js → DateRangePresetSelect.stories-C78KeQis.js} +1 -1
  30. package/storybook-static/assets/{Detail-DttSd-Xf.js → Detail-C7Tq8_iP.js} +1 -1
  31. package/storybook-static/assets/{Detail.stories-BKVM2njc.js → Detail.stories-DJXrdlwp.js} +1 -1
  32. package/storybook-static/assets/{Dialog-CcNcGzFe.js → Dialog-D2dZtKVy.js} +1 -1
  33. package/storybook-static/assets/{Dialog-BTOUhqzD.js → Dialog-fje-CyN_.js} +1 -1
  34. package/storybook-static/assets/{Dialog.stories-CsWtgi85.js → Dialog.stories-Dc6V41nq.js} +1 -1
  35. package/storybook-static/assets/{Disclosure-BZUNa5jf.js → Disclosure-BA4ksb8c.js} +1 -1
  36. package/storybook-static/assets/{Disclosure.stories-D0mpDu75.js → Disclosure.stories-DTyvzm8b.js} +1 -1
  37. package/storybook-static/assets/{DisclosureGroup-B7AgT12-.js → DisclosureGroup-9cjGiqTB.js} +1 -1
  38. package/storybook-static/assets/{DocsRenderer-JROSPFPF-S3rmr45a.js → DocsRenderer-JROSPFPF-CX3n6ybS.js} +1 -1
  39. package/storybook-static/assets/{DropZone-DbA0kHOi.js → DropZone-BSKkETTV.js} +1 -1
  40. package/storybook-static/assets/{DropZone-BserSCi0.js → DropZone-C7l_2i94.js} +1 -1
  41. package/storybook-static/assets/{DropZone.stories-C0us6D6_.js → DropZone.stories-DLcBPvsN.js} +1 -1
  42. package/storybook-static/assets/{DropdownMenu-C0dGI8-u.js → DropdownMenu-BBHmJglv.js} +1 -1
  43. package/storybook-static/assets/{ExpandableActionPanel-C3Suge_V.js → ExpandableActionPanel-Blj-_j3I.js} +1 -1
  44. package/storybook-static/assets/{ExpandableActionPanel.stories-BjRwyePX.js → ExpandableActionPanel.stories-eXDGek0U.js} +1 -1
  45. package/storybook-static/assets/{Flex-CFBnb6WV.js → Flex-Cx7rx8NQ.js} +1 -1
  46. package/storybook-static/assets/{Flex.stories-BrT0ecTl.js → Flex.stories-afvYrcji.js} +1 -1
  47. package/storybook-static/assets/{FloatingPopover-CI_Jz1zd.js → FloatingPopover-DqhpAE-b.js} +1 -1
  48. package/storybook-static/assets/{FormattedTableCell--dbt-Ub1.js → FormattedTableCell-B-xKZ-st.js} +1 -1
  49. package/storybook-static/assets/{Grid-BusV9y3I.js → Grid-Dx3pE6FN.js} +1 -1
  50. package/storybook-static/assets/{Grid.stories-QLg_LWpv.js → Grid.stories-beKScuiQ.js} +1 -1
  51. package/storybook-static/assets/{ImageCropper.stories-D7cduiMM.js → ImageCropper.stories-Cypxa8ki.js} +1 -1
  52. package/storybook-static/assets/{ImageRenderer-ixMyI5Sx.js → ImageRenderer-Z2fq9t4O.js} +1 -1
  53. package/storybook-static/assets/{ImageRenderer.stories-CkUlU4nG.js → ImageRenderer.stories-C-Eqy1RT.js} +1 -1
  54. package/storybook-static/assets/{ImageView.stories-DUUgC_68.js → ImageView.stories-7PTL4i4r.js} +1 -1
  55. package/storybook-static/assets/{ImageViewer.stories-Cd8z1-hS.js → ImageViewer.stories-DMttm7NJ.js} +2 -2
  56. package/storybook-static/assets/{ImageViewerRuntime-P--DpHN_.js → ImageViewerRuntime-P44GrX-2.js} +1 -1
  57. package/storybook-static/assets/{Input-DIuy7HqF.js → Input-3rRoURz6.js} +1 -1
  58. package/storybook-static/assets/{Input-BHfqiM6J.js → Input-B7WaTsXd.js} +1 -1
  59. package/storybook-static/assets/{Input.stories-CliRaODM.js → Input.stories-B0ksC1IC.js} +1 -1
  60. package/storybook-static/assets/{InputDateTime-DA0tmRn6.js → InputDateTime-CrtoaZaL.js} +1 -1
  61. package/storybook-static/assets/{InputDateTime.stories-BDhJxP20.js → InputDateTime.stories-DsrZBCes.js} +1 -1
  62. package/storybook-static/assets/{InputFile-C1Oe3M46.js → InputFile-By4OfFQE.js} +1 -1
  63. package/storybook-static/assets/{InputFile-CRqJlMJe.js → InputFile-CE_7l6EW.js} +1 -1
  64. package/storybook-static/assets/{InputFile.stories-D3bx63xD.js → InputFile.stories-CWF7bjs7.js} +1 -1
  65. package/storybook-static/assets/{InputFiles-BSgGSw5C.js → InputFiles-DzBOiMJ3.js} +1 -1
  66. package/storybook-static/assets/{InputFiles-CIW5-P8c.js → InputFiles-U1HTIe1W.js} +1 -1
  67. package/storybook-static/assets/{InputFiles.stories-BekoUbA3.js → InputFiles.stories-kTjO24xO.js} +1 -1
  68. package/storybook-static/assets/{InputFilesList-0CzmTOUa.js → InputFilesList-By2rmxTs.js} +1 -1
  69. package/storybook-static/assets/{InputImage-CMXx_6Ix.js → InputImage-BBeslRJY.js} +1 -1
  70. package/storybook-static/assets/{InputImage-D9QgM8V-.js → InputImage-DND66U5n.js} +1 -1
  71. package/storybook-static/assets/{InputImage.stories-BTwGNRAJ.js → InputImage.stories-lDO-pD7t.js} +1 -1
  72. package/storybook-static/assets/{InteractiveComponents-B80FjxKN.js → InteractiveComponents-DEayq5zo.js} +1 -1
  73. package/storybook-static/assets/{InteractiveComponents.stories-DIfUZsl7.js → InteractiveComponents.stories-DqHmmZ41.js} +1 -1
  74. package/storybook-static/assets/{LayoutPicker-DeX6BMt_.js → LayoutPicker-CRn9VKaX.js} +1 -1
  75. package/storybook-static/assets/{LayoutPicker-BPPJ24OQ.js → LayoutPicker-CgjcCrdd.js} +1 -1
  76. package/storybook-static/assets/{LayoutPicker.stories-kHpz02LG.js → LayoutPicker.stories-C3p41mUo.js} +1 -1
  77. package/storybook-static/assets/{Listbox-DKmgxwrH.js → Listbox-Chzx7yCR.js} +1 -1
  78. package/storybook-static/assets/{Listbox-BYci4wtR.js → Listbox-wF26v1OK.js} +1 -1
  79. package/storybook-static/assets/{Listbox.stories-Cgb_9UPN.js → Listbox.stories-D_1uVOlj.js} +1 -1
  80. package/storybook-static/assets/{Modal-BpWrgpi0.js → Modal-BQJ5po6t.js} +1 -1
  81. package/storybook-static/assets/{Modal.stories-CuOwKPOi.js → Modal.stories-CrK59fUv.js} +1 -1
  82. package/storybook-static/assets/{ModalManagerProvider-BSesgkaz.js → ModalManagerProvider-8_DMah64.js} +1 -1
  83. package/storybook-static/assets/{MultiSelect-B-noYhAw.js → MultiSelect-BfdD__Xs.js} +1 -1
  84. package/storybook-static/assets/{MultiSelect-iVhX6kL2.js → MultiSelect-Ctolc1wY.js} +1 -1
  85. package/storybook-static/assets/{MultiSelect.stories-Dq0wqGjk.js → MultiSelect.stories-DJXRg3xO.js} +1 -1
  86. package/storybook-static/assets/{NoData-CEtmNNMk.js → NoData-CFA9_yMt.js} +1 -1
  87. package/storybook-static/assets/{NotificationsHost-BKAeh4_V.js → NotificationsHost-CklDd8pr.js} +1 -1
  88. package/storybook-static/assets/{NotificationsHost.stories-CLcRbEmB.js → NotificationsHost.stories-LD9TGIG-.js} +1 -1
  89. package/storybook-static/assets/{ODataMultiSelect-CcVXy_lf.js → ODataMultiSelect-CPGYjDL_.js} +1 -1
  90. package/storybook-static/assets/{ODataMultiSelect.stories-CU4S6Tze.js → ODataMultiSelect.stories-BibBmJKg.js} +1 -1
  91. package/storybook-static/assets/{ODataSelect-D46PbwGK.js → ODataSelect-CdTyV4cc.js} +1 -1
  92. package/storybook-static/assets/{ODataSelect.stories-BvblJ0JR.js → ODataSelect.stories-BvQR2grd.js} +1 -1
  93. package/storybook-static/assets/{ODataTreeMultiSelect-C6_V5Yyh.js → ODataTreeMultiSelect-CxhnGeU4.js} +1 -1
  94. package/storybook-static/assets/{ODataTreeMultiSelect.stories-BJB0qs4_.js → ODataTreeMultiSelect.stories-CzXvHylV.js} +1 -1
  95. package/storybook-static/assets/{ODataTreeSelect-m2qcjlRN.js → ODataTreeSelect-D28LXfwr.js} +1 -1
  96. package/storybook-static/assets/{ODataTreeSelect.stories-DjVD4U8w.js → ODataTreeSelect.stories-O4zj2JgI.js} +1 -1
  97. package/storybook-static/assets/{OneStepScroller-CKF9deAV.js → OneStepScroller-DrfF4iDt.js} +1 -1
  98. package/storybook-static/assets/{PeriodSelect-BWIK5lBT.js → PeriodSelect-B4IURmaf.js} +1 -1
  99. package/storybook-static/assets/{PeriodSelect-1wjRr06A.js → PeriodSelect-D-AE9pNV.js} +1 -1
  100. package/storybook-static/assets/{PeriodSelect.stories-BNHhcv44.js → PeriodSelect.stories-BoT2t3ws.js} +1 -1
  101. package/storybook-static/assets/{PickerSelectionToolbar-5xaNoe6-.js → PickerSelectionToolbar-Dfpa-YQj.js} +1 -1
  102. package/storybook-static/assets/{PickerTriggerActions-BkUYA0rU.js → PickerTriggerActions-B8_dYrPj.js} +1 -1
  103. package/storybook-static/assets/{Popover-DB98Mfzu.js → Popover-BFk7Tkb-.js} +1 -1
  104. package/storybook-static/assets/{Popover-BtBrxjZm.js → Popover-BqONhZ-7.js} +1 -1
  105. package/storybook-static/assets/{Popover.stories-C7qtc5GE.js → Popover.stories-O42Eg4zZ.js} +1 -1
  106. package/storybook-static/assets/{PresetRangeDateInput-D-sQazqb.js → PresetRangeDateInput-6K7xQEZd.js} +1 -1
  107. package/storybook-static/assets/{PresetRangeDateInput-em-hITX1.js → PresetRangeDateInput-DbJm0IEf.js} +1 -1
  108. package/storybook-static/assets/{PresetRangeDateInput.stories-Cag3SobY.js → PresetRangeDateInput.stories-BmJ-C1zI.js} +1 -1
  109. package/storybook-static/assets/{PresetSelect-BIrbDtVR.js → PresetSelect-CBLy4IZi.js} +1 -1
  110. package/storybook-static/assets/{RadioButton-DKAMBrfG.js → RadioButton-5lHMfjaV.js} +1 -1
  111. package/storybook-static/assets/{RadioButton-C92HWCKo.js → RadioButton-Bba55NRW.js} +1 -1
  112. package/storybook-static/assets/{RadioButton.stories-wQ6mmQbN.js → RadioButton.stories-CMKvSdUT.js} +1 -1
  113. package/storybook-static/assets/{RadioGroup-BXnmRaqa.js → RadioGroup-BEYc6ubY.js} +1 -1
  114. package/storybook-static/assets/{RadioGroup-FSREFPnn.js → RadioGroup-CKzRQZYp.js} +1 -1
  115. package/storybook-static/assets/{RadioGroup.stories-BxBV4HUH.js → RadioGroup.stories-B-yEGyNj.js} +1 -1
  116. package/storybook-static/assets/{Scrollable-BA3-rf0w.js → Scrollable-U4nKWW5A.js} +1 -1
  117. package/storybook-static/assets/{Select-CrfnOhg5.js → Select-BgcU_Ix3.js} +1 -1
  118. package/storybook-static/assets/{Select--FylT2N6.js → Select-BljYlSNp.js} +1 -1
  119. package/storybook-static/assets/{Select.stories-CcNYQv5l.js → Select.stories-DyanuzZ7.js} +1 -1
  120. package/storybook-static/assets/{SelectOptionContent-D0RV-EJ7.js → SelectOptionContent-BBeqeQwJ.js} +1 -1
  121. package/storybook-static/assets/{SerializableSelect-0bWanrM0.js → SerializableSelect-C9awJv6e.js} +1 -1
  122. package/storybook-static/assets/{SerializableSelect.stories-HlKGeslu.js → SerializableSelect.stories-BatlvBb2.js} +1 -1
  123. package/storybook-static/assets/{SingleDateTimeInput-V7oPfJle.js → SingleDateTimeInput-Brr-Cs7l.js} +1 -1
  124. package/storybook-static/assets/{SingleDateTimeInput-BRkLYcIG.js → SingleDateTimeInput-DTBlenJ8.js} +1 -1
  125. package/storybook-static/assets/{SingleDateTimeInput.stories-D6A0fmcL.js → SingleDateTimeInput.stories-CiuC3HfE.js} +1 -1
  126. package/storybook-static/assets/{Slider-DAnmCvaA.js → Slider-AcrVg2rp.js} +1 -1
  127. package/storybook-static/assets/{Slider-hCCehc7L.js → Slider-vKAScaVQ.js} +1 -1
  128. package/storybook-static/assets/{Slider.stories-Ie9VJsKJ.js → Slider.stories-CRWStqSX.js} +1 -1
  129. package/storybook-static/assets/{SliderInput-BG3nnBnB.js → SliderInput-DnZrmRj6.js} +1 -1
  130. package/storybook-static/assets/{SliderInput-5gFjNMQf.js → SliderInput-oBVuNYK6.js} +1 -1
  131. package/storybook-static/assets/{SliderInput.stories-wAM92Skv.js → SliderInput.stories-CqnVP3yZ.js} +1 -1
  132. package/storybook-static/assets/{Sortable-cRu3uyWa.js → Sortable-DYWBp2xZ.js} +1 -1
  133. package/storybook-static/assets/{Sortable.stories-CvaT95qq.js → Sortable.stories-DA-_Dcnk.js} +1 -1
  134. package/storybook-static/assets/{Splitter-DzaIg_KL.js → Splitter-C9moHQup.js} +1 -1
  135. package/storybook-static/assets/{Splitter.stories-CL7ZIgjK.js → Splitter.stories-CP0XqROI.js} +1 -1
  136. package/storybook-static/assets/{StateSelect-CmmZhBaM.js → StateSelect-IpJpmfT4.js} +1 -1
  137. package/storybook-static/assets/{StateSelect-6MBjM27h.js → StateSelect-TOKnmRdx.js} +1 -1
  138. package/storybook-static/assets/{StateSelect.stories-Lo7JAdBF.js → StateSelect.stories-DNlnlLLq.js} +1 -1
  139. package/storybook-static/assets/{StringToggle.stories--3YAgqgR.js → StringToggle.stories-PmKwgmnT.js} +1 -1
  140. package/storybook-static/assets/{Switch-BPnWRPHy.js → Switch-BKqv5YDf.js} +1 -1
  141. package/storybook-static/assets/{Switch-DMFFRX-R.js → Switch-CLFmdEdw.js} +1 -1
  142. package/storybook-static/assets/{Switch.stories-Bc06hdRZ.js → Switch.stories-Be79M8OB.js} +1 -1
  143. package/storybook-static/assets/{Table-C_6fC6US.js → Table-CSYaGyiO.js} +1 -1
  144. package/storybook-static/assets/{Table.stories-C5QR6ft1.js → Table.stories-Cc2_OYrm.js} +1 -1
  145. package/storybook-static/assets/{Tabs-7X4Y9kTK.js → Tabs-BN8r9wAa.js} +1 -1
  146. package/storybook-static/assets/{Tabs.stories-BCTFmtg7.js → Tabs.stories-DUEs5hWy.js} +1 -1
  147. package/storybook-static/assets/{TabsBox-CTBF3xPI.js → TabsBox-BHbxfs1v.js} +1 -1
  148. package/storybook-static/assets/{TagInput-BdpIH4WR.js → TagInput-NG8xjxuX.js} +1 -1
  149. package/storybook-static/assets/{TagInput.stories-CLWX8nWs.js → TagInput.stories-pYzItE4r.js} +1 -1
  150. package/storybook-static/assets/{Text-Djs0jl9c.js → Text-DicbBFMq.js} +1 -1
  151. package/storybook-static/assets/{Textarea-RfejBA6h.js → Textarea-BgNHRYxb.js} +1 -1
  152. package/storybook-static/assets/{Textarea-F85tVMLg.js → Textarea-CzhF1ipQ.js} +1 -1
  153. package/storybook-static/assets/{Textarea.stories-B22a-ML8.js → Textarea.stories-BP1PpSYg.js} +1 -1
  154. package/storybook-static/assets/{TimePanel-BhBEO8Gh.js → TimePanel-5YiijsN3.js} +1 -1
  155. package/storybook-static/assets/{TimePanel.stories-BrtKze1X.js → TimePanel.stories-BerS0vHa.js} +1 -1
  156. package/storybook-static/assets/{Toggle-BxSo9RKz.js → Toggle-DvqwDNh9.js} +1 -1
  157. package/storybook-static/assets/{Toggle-C0U7Cd8G.js → Toggle-vfXvx9Jm.js} +1 -1
  158. package/storybook-static/assets/{Toggle.stories-BbaMi6fV.js → Toggle.stories-Dglg9G5J.js} +1 -1
  159. package/storybook-static/assets/{TreeMultiSelect-Bdt_aq6M.js → TreeMultiSelect-BDKka6ap.js} +1 -1
  160. package/storybook-static/assets/{TreeMultiSelect-B9j1Yicl.js → TreeMultiSelect-dJxEby5w.js} +1 -1
  161. package/storybook-static/assets/{TreeMultiSelect.stories-DQcrBRWC.js → TreeMultiSelect.stories-DB3caBxh.js} +1 -1
  162. package/storybook-static/assets/{TreePickerBase-BOR7E-0J.js → TreePickerBase-CcPengpU.js} +1 -1
  163. package/storybook-static/assets/{TreeSelect-9d6H8Xz4.js → TreeSelect-BUhkyJiN.js} +1 -1
  164. package/storybook-static/assets/{TreeSelect-DZMHm_gQ.js → TreeSelect-C8IsdRWF.js} +1 -1
  165. package/storybook-static/assets/{TreeSelect.stories-Cyh_Wbnh.js → TreeSelect.stories-CqLrdE9b.js} +1 -1
  166. package/storybook-static/assets/{TreeTable-goQcAHLl.js → TreeTable-CnlxMuHt.js} +1 -1
  167. package/storybook-static/assets/{TreeTable.stories-BKBYIlMn.js → TreeTable.stories-ZX9jM_BG.js} +1 -1
  168. package/storybook-static/assets/{async-DX3nXb0v.js → async-DmuZF4BE.js} +1 -1
  169. package/storybook-static/assets/{blocks-CJgZDWNs.js → blocks-ChBwnZQl.js} +3 -3
  170. package/storybook-static/assets/{browserAndReact-BgeToUmX.js → browserAndReact-Bvsns53c.js} +1 -1
  171. package/storybook-static/assets/{check-DDDH-1Ci.js → check-KgNcwDHG.js} +1 -1
  172. package/storybook-static/assets/{chevron-down-rEaA32Gs.js → chevron-down-CZ3426hc.js} +1 -1
  173. package/storybook-static/assets/{chevron-left-Dzvw3U4M.js → chevron-left-Byk_9pea.js} +1 -1
  174. package/storybook-static/assets/{chevron-right-Dz7qDgu8.js → chevron-right-BDGT7FmB.js} +1 -1
  175. package/storybook-static/assets/{chunk-W22LQPXL-BZv8k1rA.js → chunk-W22LQPXL-Djhg7rNO.js} +1 -1
  176. package/storybook-static/assets/{circle-alert-lCfqvzLl.js → circle-alert-Aw-nPUKg.js} +1 -1
  177. package/storybook-static/assets/{circle-check-Bdg_rD-h.js → circle-check-DzwL1UZg.js} +1 -1
  178. package/storybook-static/assets/{components-CzrtMvTV.js → components-DP3g2hsX.js} +3 -3
  179. package/storybook-static/assets/{contextMenu-BMBNvTeX.js → contextMenu-CXaNDHyn.js} +1 -1
  180. package/storybook-static/assets/{defaultRenderers-iE_97Bjk.js → defaultRenderers-BF_jhf2r.js} +1 -1
  181. package/storybook-static/assets/{download-B3_M2qbj.js → download-D6MOmqW_.js} +1 -1
  182. package/storybook-static/assets/{filesAndExcel-CnH4IOGD.js → filesAndExcel-ByJOGaz3.js} +1 -1
  183. package/storybook-static/assets/{floating-ui.react-Ciln9sCk.js → floating-ui.react-DhJnZYRz.js} +1 -1
  184. package/storybook-static/assets/{formatters-BRVJ7O8W.js → formatters-_B1Rt85r.js} +1 -1
  185. package/storybook-static/assets/{formatters-runtime-B9Cgykph.js → formatters-runtime-BjUB9a0n.js} +1 -1
  186. package/storybook-static/assets/{foundationLib-DKsYU6Xw.js → foundationLib-MujKOAYA.js} +1 -1
  187. package/storybook-static/assets/{hooks-Ce3f8uq2.js → hooks-T2i0_MK1.js} +1 -1
  188. package/storybook-static/assets/{iframe-BzOQALx6.js → iframe-CL2itEXQ.js} +3 -3
  189. package/storybook-static/assets/iframe-D4P43hEM.js +1 -0
  190. package/storybook-static/assets/{info-CW3cFYrW.js → info-Bc9FrARC.js} +1 -1
  191. package/storybook-static/assets/{odata-Cz7YGC86.js → odata-C7lZYQyo.js} +1 -1
  192. package/storybook-static/assets/{odataAndTables-D1AjlN_7.js → odataAndTables-DS7dyh3s.js} +1 -1
  193. package/storybook-static/assets/{odataFetchFn-C3g1DdFZ.js → odataFetchFn-C0IRRzfX.js} +1 -1
  194. package/storybook-static/assets/{odataStoryFixtures-DZAve7Vv.js → odataStoryFixtures-BFDZjrBo.js} +1 -1
  195. package/storybook-static/assets/{persisted-Dto8umNS.js → persisted-C6MxFcAF.js} +1 -1
  196. package/storybook-static/assets/{pureUtilities-DYqvAJDr.js → pureUtilities-DJyofRKl.js} +1 -1
  197. package/storybook-static/assets/{react-DB1WdvKi.js → react-D7kG_9p9.js} +1 -1
  198. package/storybook-static/assets/{refresh-cw-Dqp7CY3t.js → refresh-cw-B_ciLHHF.js} +1 -1
  199. package/storybook-static/assets/{runtimeAndState-jrdxtmBa.js → runtimeAndState-pTdGCh9U.js} +1 -1
  200. package/storybook-static/assets/{settings-2-rCup4Mi_.js → settings-2-B-IfrgcK.js} +1 -1
  201. package/storybook-static/assets/{sortable-BmMUW0sh.js → sortable-ide4mNqY.js} +1 -1
  202. package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-Tquvbel8.js → syntaxhighlighter-T5IQBZDB-51TPLrgm.js} +1 -1
  203. package/storybook-static/assets/{trash-2-DTb6OWxD.js → trash-2-CV5wVAq8.js} +1 -1
  204. package/storybook-static/assets/{triangle-alert-B8s11iT0.js → triangle-alert-CVAR7z-z.js} +1 -1
  205. package/storybook-static/assets/{useODataSelectBase-gUf1YQEc.js → useODataSelectBase-DPmBhTiy.js} +1 -1
  206. package/storybook-static/assets/useODataTreeData-4xTaUgw7.js +1 -0
  207. package/storybook-static/assets/{usePickerQuery-COqCau-1.js → usePickerQuery-DtLfo5fH.js} +1 -1
  208. package/storybook-static/assets/{usePickerTriggerController-DoduV3_w.js → usePickerTriggerController-BqNIUPII.js} +1 -1
  209. package/storybook-static/assets/{x-D6Ja8T8F.js → x-B7nOtyoJ.js} +1 -1
  210. package/storybook-static/iframe.html +2 -2
  211. package/storybook-static/project.json +1 -1
  212. package/storybook-static/assets/iframe-BOOGc5NQ.js +0 -1
  213. package/storybook-static/assets/useODataTreeData-Ci4bf8-z.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\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\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) {\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};\n\nexport function useODataTreeData({ odata, segments, model, segmentOrder }: 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 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\tsortByCode: odata.sortByCode\n\t\t\t}),\n\t\t[collection.data?.items, collection.data?.keyPairsMap, hiddenCodeKeys, odata.sortByCode, orderedCodeKeys, textValueCodeKeys]\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};\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\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\tnodeIdByCodeValue.set(makeCodeValueKey(node.codeKey, node.value), node.id);\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\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};\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\tconst nodeId = index.nodeIdByCodeValue.get(makeCodeValueKey(codeKey, itemValue));\n\t\t\tif (nodeId) {\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\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\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\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\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\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\tremoveDescendantSelections(nextSelectedIds, nodeId, index);\n\t\t\tnextSelectedIds.add(nodeId);\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\tselectedIds.delete(currentId);\n\n\t\t\t/*\n\t\t\t * Узел мог стать disabled уже после сохранения выбора его ancestor.\n\t\t\t * При частичном снятии разворачиваем ancestor только в актуально\n\t\t\t * доступное покрытие, чтобы запрещённое значение не попало в onChange.\n\t\t\t */\n\t\t\tfor (const childId of getSelectableTreeNodeIds(index, index.childrenById.get(currentId) ?? [])) {\n\t\t\t\tselectedIds.add(childId);\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\n\t\treturn containsDisabled\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(currentValue: TreeMultiSelectValue | undefined, targetNodeId: string, index: TreeNodeIndex) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\n\tconst toggle = (targetId: string) => {\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (selectedIds.has(targetId)) {\n\t\t\t\tselectedIds.delete(targetId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\ttoggle(targetId);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tremoveDescendantSelections(selectedIds, targetId, index);\n\t\tselectedIds.add(targetId);\n\t};\n\n\tconst selectableTargetIds = [...getSelectableTreeNodeIds(index, [targetNodeId])];\n\tconst allSelectableTargetsSelected =\n\t\tselectableTargetIds.length > 0 && selectableTargetIds.every((nodeId) => isTreeNodeSelected(nodeId, selectedIds, index));\n\n\tfor (const selectableTargetId of selectableTargetIds) {\n\t\tconst selected = isTreeNodeSelected(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// .uiOptionRow\n.treeRow {\n\tdisplay: flex;\n\talign-items: stretch;\n\tborder-radius: var(--radius-sm);\n\tcursor: pointer;\n\n\t&:focus {\n\t\t@include focusVisible;\n\n\t\tbackground-color: var(--surface-accent);\n\t\tborder-color: var(--border-1);\n\t\tcursor: pointer;\n\t}\n\n\t&:hover {\n\t\tbackground-color: var(--surface-accent);\n\t\tcursor: pointer;\n\t}\n}\n\n// .uiOptionRowSelected\n.treeRowSelected {\n\tbackground-color: var(--surface-2);\n\tcolor: var(--content-accent);\n\tcursor: default;\n}\n\n// .uiOptionRowActive\n.treeRowActive {\n\tbackground-color: var(--surface-1);\n}\n\n// Недоступность принадлежит option целиком; вложенный checkbox только визуализирует то же состояние.\n.treeRowDisabled {\n\tcursor: not-allowed;\n\topacity: var(--disabled-opacity);\n\n\t&:hover {\n\t\tbackground-color: transparent;\n\t\tcursor: not-allowed;\n\t}\n}\n\n.treeNodeButton {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\twidth: 100%;\n\tpadding: var(--space-xs) var(--space-xs) var(--space-xs) 0;\n\tbackground: transparent;\n\ttext-align: left;\n\tborder-radius: var(--radius-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// Label и code усиливаются отдельно: code имеет собственный variable-font weight.\n.treeColumnRootLabel {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.treeColumnRootCode {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.treeColumnCheckBox {\n\tdisplay: inline-flex;\n\tflex-shrink: 0;\n}\n\n// Даёт общему option-content реальную сжимаемую ширину внутри колонки и включает ellipsis вместо выхода за границы.\n.treeNodeOptionContent {\n\tflex: 1 1 0;\n\tmin-width: 0;\n\theight: 100%;\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: 1.5em;\n\theight: 1.5em;\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\n.treeSelection {\n\tflex-shrink: 0;\n\twidth: 1em;\n\theight: 1em;\n\tborder: var(--border);\n\tborder-radius: var(--radius-xs);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: var(--surface-0);\n\tcolor: transparent;\n}\n\n.treeSelectionChecked {\n\tbackground-color: var(--status-info-text);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--white);\n\n\t// outline: 1px dashed rgb(255, 100, 141);\n\t// outline-offset: -1px;\n}\n\n.treeSelectionPartial {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--status-info-text);\n}\n\n.treeSelectionIcon {\n\twidth: 0.75rem;\n\theight: 0.75rem;\n}\n\n.treeSummary {\n\tpadding-right: calc(var(--control-height) * 2);\n}\n\n.inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.treeActions {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.treeClearButton {\n\tcolor: var(--status-error-text);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, ChevronRightIcon, MinusIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../check-box\";\nimport { SelectOptionContent } from \"../select/SelectOptionContent\";\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};\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}: TreeNodeContentProps) {\n\tconst showExpansionControl = optionsLayout === \"tree\";\n\tconst emphasizeRootContent = optionsLayout === \"columns\" && level === 0;\n\n\treturn (\n\t\t<>\n\t\t\t<span 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<span className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t) : null}\n\n\t\t\t{selectionMode === \"multi\" && optionsLayout === \"columns\" ? (\n\t\t\t\t<span\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</span>\n\t\t\t) : selectionMode === \"multi\" ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(styles.treeSelection, selected && styles.treeSelectionChecked, partial && styles.treeSelectionPartial)}\n\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t<CheckIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : partial ? (\n\t\t\t\t\t\t<MinusIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t) : null}\n\n\t\t\t<div className={styles.treeNodeOptionContent}>\n\t\t\t\t<SelectOptionContent\n\t\t\t\t\tlabel={node.label}\n\t\t\t\t\tcode={node.code}\n\t\t\t\t\thighlight={highlight}\n\t\t\t\t\tlabelClassName={emphasizeRootContent ? styles.treeColumnRootLabel : undefined}\n\t\t\t\t\tcodeClassName={emphasizeRootContent ? styles.treeColumnRootCode : undefined}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { type CSSProperties, ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type FloatingListboxSizeResolver } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputText } from \"../input\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerSelectionToolbar,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\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\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\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\tonNodeActivate: (node: TreeSelectNode) => 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\topen: controlledOpen,\n\tonOpenChange,\n\tbulkActions,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst selectAllButtonRef = useRef<HTMLButtonElement | null>(null);\n\t/** Явный owner open-state позволяет сбрасывать query непосредственно в close-событии. */\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\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 placeholderText = useMemo(() => `${placeholder} <${treeIndex.nodeById.size}>`, [placeholder, treeIndex]);\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\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 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 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,\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),\n\t\tgetOptionDisabled: (entry) => entry.node.disabled === true,\n\t\tdisabled: disabled || isLoading,\n\t\tcloseOnSelect: selectionMode === \"single\",\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 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 showSummaryOverlay = triggerMode === \"display\" && Boolean(selectedSummary);\n\tconst showSummaryToken = resolvedTriggerMode === \"search-multi\" && Boolean(selectedSummary);\n\tconst showTriggerPlaceholder =\n\t\t(resolvedTriggerMode === \"search-multi\" && !hasSelection) ||\n\t\t(resolvedTriggerMode === \"search-single\" && (!selectedSummaryText || showTriggerQuery)) ||\n\t\t(resolvedTriggerMode === \"display\" && !hasSelection);\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\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<PickerTriggerInput\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\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerMode === \"display\" && showSummaryOverlay ? \"\" : triggerValue}\n\t\t\t\t\t\t\tplaceholder={showTriggerPlaceholder ? placeholderText : undefined}\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\tinputClassName={cn(hasSelection && styles.treeSummary, showSummaryOverlay && styles.inputWithOverlay)}\n\t\t\t\t\t\t\toverlay={\n\t\t\t\t\t\t\t\tshowSummaryOverlay ? (\n\t\t\t\t\t\t\t\t\t<div className={styles.valueOverlay}>{selectedSummary}</div>\n\t\t\t\t\t\t\t\t) : showSummaryToken ? (\n\t\t\t\t\t\t\t\t\tselectedSummary\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{/* {showSummaryToken ? selectedSummary : null} */}\n\n\t\t\t\t\t\t\t\t\t{hasSelection && onClearSelection ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={styles.treeClearButton}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClearSelection();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\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\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 = activeIndex >= 0 ? visibleEntries[activeIndex] : 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\tclassName={uiStyles.uiPopupOptions}\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\theader={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 === activeIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled = entry.node.disabled === 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<div\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) => setOptionRef(index, node)}\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\taria-disabled={optionDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.treeRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\" && styles.treeColumnRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionDisabled && styles.treeRowDisabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && styles.treeRowActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && styles.treeRowSelected\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\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\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\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\tonClick={() => selectOption(entry)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className={styles.treeNodeButton}>\n\t\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\t\tnode={entry.node}\n\t\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\t\thighlight={currentQuery}\n\t\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\t\tisExpanded={entry.isExpanded}\n\t\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\t\tpartial={partial}\n\t\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\t\toptionsLayout={optionsLayout}\n\t\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\t\tonToggleSelection={() => selectOption(entry)}\n\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</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\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 { MultiSelectToken } from \"../multi-select\";\nimport { formatOptionCount } from \"../multi-select/ui/defaultRenderers\";\nimport { usePickerSelectionLifecycle } from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tgetSelectableTreeNodeIds,\n\tgetTreeNodeSelectionState,\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\tif (selectedIds.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (selectedIds.size === 1) {\n\t\tconst selectedNode = treeIndex.nodeById.get([...selectedIds][0]);\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(selectedIds.size);\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 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\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 ? <MultiSelectToken value={selectedSummary} /> : undefined}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => {\n\t\t\t\tsetDraftValue((currentDraftValue) => toggleTreeMultiSelection(currentDraftValue, node.id, treeIndex));\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\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\ttransformNodes\n}: ODataTreeMultiSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel,\n\t\tsegmentOrder\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":";;;;;;;;;;;;;AAEA,SAAgB,EAAiC,GAA0D;CAK1G,OAJK,IAIE,GACL,EAAM,UAAU,CAAC,EAAM,KAAK,EAC9B,IALQ,CAAC;AAMV;;;ACeA,SAAS,EAAa,GAA8B,GAAiB,GAAe;CACnF,OAAO,IAAW,GAAG,EAAS,GAAG,EAAQ,GAAG,MAAU,GAAG,EAAQ,GAAG;AACrE;AAEA,SAAS,EAAiB,GAAsB,GAAiB,GAAqC;CACrG,IAAM,IAAU,EAAY;CAC5B,OAAQ,KAAW,EAAK,MAAa,EAAK;AAC3C;AAEA,SAAS,GAAiB,GAAkC;CAC3D,OAAO,CAAC,GAAG,IAAI,IAAI,EAAM,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AACpD;AAEA,SAAS,GAAkB,GAOP;CACnB,OAAO;EACN,IAAI,EAAa,EAAK,UAAU,EAAK,SAAS,EAAK,KAAK;EACxD,SAAS,EAAK;EACd,OAAO,EAAK;EACZ,OAAO,EAAK;EACZ,MAAM,EAAK;EACX,YAAY,GAAiB;GAAC,EAAK;GAAO,EAAK;GAAO,EAAK;EAAI,CAAC;EAChE,UAAU,EAAK;EACf,UAAU,CAAC;EACX,kCAAkB,IAAI,IAAI;CAC3B;AACD;AAMA,SAAS,GAAgB,GAA0B,GAAqB;CACvE,EAAM,MAAM,GAAM,MAAU;EAC3B,IAAM,IAAY,IAAa,EAAK,WAAW,EAAK,OAC9C,IAAa,IAAa,EAAM,WAAW,EAAM;EAGvD,OAFmB,EAAe,GAAW,CAEtC,KAAc,EAAe,EAAK,UAAU,EAAM,QAAQ;CAClE,CAAC;CAED,KAAK,IAAM,KAAQ,GAClB,GAAgB,EAAK,UAAU,CAAU;AAE3C;AAEA,SAAS,GAAa,GAAuC;CAC5D,OAAO;EACN,IAAI,EAAK;EACT,SAAS,EAAK;EACd,OAAO,EAAK;EACZ,OAAO,EAAK;EACZ,MAAM,EAAK;EACX,YAAY,EAAK;EACjB,UAAU,EAAK,SAAS,SAAS,IAAI,EAAK,SAAS,IAAI,EAAY,IAAI,KAAA;CACxE;AACD;AAEA,SAAgB,GAAoB,EACnC,UACA,oBACA,gBACA,mBACA,sBACA,gBAAa,MACgC;CAC7C,IAAI,EAAgB,WAAW,KAAK,EAAM,WAAW,GACpD,OAAO,CAAC;CAGT,IAAM,IAA2B,CAAC,GAC5B,oBAAkB,IAAI,IAA6B;CAEzD,KAAK,IAAM,KAAQ,GAAO;EACzB,IAAI;EAEJ,KAAK,IAAM,KAAW,GAAiB;GACtC,IAAM,IAAY,OAAO,EAAK,MAAY,EAAE;GAE5C,IAAI,CAAC,GACJ;GAGD,IAAM,IAAQ,OAAO,EAAiB,GAAM,GAAS,CAAW,KAAK,EAAE,GACjE,IAAQ,GAAmB,IAAI,CAAO,IAAI,IAAQ,GAClD,IAAY,GAAG,EAAQ,GAAG,KAC1B,IAAY,IAAa,EAAW,mBAAmB,GACzD,IAAc,EAAU,IAAI,CAAS;GAoBzC,AAlBK,MACJ,IAAc,GAAkB;IAC/B,UAAU,GAAY;IACtB;IACA;IACA;IACA,MAAM,EAAe,IAAI,CAAO,IAAI,KAAA,IAAY;IAChD,UAAU;GACX,CAAC,GACD,EAAU,IAAI,GAAW,CAAW,GAEhC,IACH,EAAW,SAAS,KAAK,CAAW,IAEpC,EAAM,KAAK,CAAW,IAIxB,IAAa;EACd;CACD;CAIA,OAFA,GAAgB,GAAO,CAAU,GAE1B,EAAM,IAAI,EAAY;AAC9B;;;AC9IA,SAAgB,EACf,GACA,GACA,GACC;CACD,OAAO,EAAuC,GAAO,GAAQ,CAAY;AAC1E;;;ACMA,SAAS,GACR,GACA,GACA,GACC;CACD,OAAO,EAA8B,CACpC;EACC;EACA;EACA;CACD,CACD,CAAC;AACF;AAEA,SAAS,GAAe,GAA2D;CAClF,OAAO,EAAoB,EAAE,EAAE;AAChC;AAOA,SAAgB,EAAiB,EAAE,UAAO,aAAU,UAAO,mBAAuC;CACjG,IAAM,IAAa,GAAG,EAAM,QAAQ,GAAG,EAAM,UACvC,IAAmB,QAAc,GAAyB,GAAO,GAAU,CAAK,GAAG;EAAC;EAAO;EAAU;CAAK,CAAC,GAC3G,IAAS,EAAyB,CAAC,CAAK,CAAC,GACzC,IAAsB,QACrB,EAA+B,GAAkB,GAAQ,CAAY,GAC3E;EAAC;EAAkB;EAAQ;CAAY,CACxC,GACM,IAAkB,QAAc,EAAoB,KAAK,MAAS,EAAK,EAAE,GAAG,CAAC,CAAmB,CAAC,GACjG,IAAc,GAAe,CAAmB,KAAK,OAAO,KAAK,CAAQ,CAAC,CAAC,IAC3E,IAAa,EAAwB;EAC1C,SAAS;EACT,GAAG;CACJ,CAAC,GACK,IAAa,EAAmB;EACrC;EACA,OAAO;CACR,CAAC,GACK,EAAE,mBAAgB,yBAAsB,QAAc;EAC3D,IAAM,oBAAqB,IAAI,IAAY,GACrC,oBAAwB,IAAI,IAAY;EAE9C,KAAK,IAAM,KAAQ,GAIlB,CAHI,EAAK,QAAQ,YAAY,EAAM,aAClC,EAAmB,IAAI,EAAK,EAAE,GAE3B,EAAK,QAAQ,cAChB,EAAsB,IAAI,EAAK,EAAE;EAInC,OAAO;GACN,gBAAgB;GAChB,mBAAmB;EACpB;CACD,GAAG,CAAC,EAAM,UAAU,CAAmB,CAAC,GAClC,IAAQ,QAEZ,GAAoB;EACnB,OAAO,EAAW,MAAM,SAAS,CAAC;EAClC;EACA,aAAa,EAAW,MAAM,eAAe,CAAC;EAC9C;EACA;EACA,YAAY,EAAM;CACnB,CAAC,GACF;EAAC,EAAW,MAAM;EAAO,EAAW,MAAM;EAAa;EAAgB,EAAM;EAAY;EAAiB;CAAiB,CAC5H,GACM,IAAc,EAAoB,EAAE,EAAE,QAAQ,eAAe,qBAC7D,IAAmB,EAAQ,EAAO,EAAW,EAAE;CAErD,OAAO;EACN;EACA;EACA;EACA,WAAW,EAAW;EACtB,SAAS,EAAW;EACpB;EACA;CACD;AACD;;;ACzEA,SAAS,GAAiB,GAAiB,GAAe;CACzD,OAAO,GAAG,EAAQ,IAAI;AACvB;AAEA,SAAgB,GAAoB,GAAiD;CACpF,IAAM,oBAAW,IAAI,IAA4B,GAC3C,oBAAa,IAAI,IAAgC,GACjD,oBAAe,IAAI,IAAsB,GACzC,oBAAoB,IAAI,IAAoB,GAC5C,oBAAoB,IAAI,IAAoB,GAC9C,IAAgB,GAEd,KAAQ,GAAsB,MAAsB;EAIzD,AAHA,EAAS,IAAI,EAAK,IAAI,CAAI,GAC1B,EAAW,IAAI,EAAK,IAAI,CAAQ,GAChC,EAAkB,IAAI,EAAK,IAAI,GAAe,GAC9C,EAAkB,IAAI,GAAiB,EAAK,SAAS,EAAK,KAAK,GAAG,EAAK,EAAE;EAEzE,IAAM,KAAY,EAAK,YAAY,CAAC,EAAA,CAAG,KAAK,MAAU,EAAM,EAAE;EAC9D,EAAa,IAAI,EAAK,IAAI,CAAQ;EAElC,KAAK,IAAM,KAAS,EAAK,YAAY,CAAC,GACrC,EAAK,GAAO,EAAK,EAAE;CAErB;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,CAAI;CAGV,OAAO;EACN,SAAS,EAAM,KAAK,MAAS,EAAK,EAAE;EACpC;EACA;EACA;EACA;EACA;CACD;AACD;AAEA,SAAgB,GAAoB,GAAoC,GAAsB;CACxF,OACL,OAAO,EAAM,kBAAkB,IAAI,GAAiB,EAAM,SAAS,EAAM,KAAK,CAAC;AAChF;AAEA,SAAgB,EAA4B,GAAyC,GAAsB;CAC1G,IAAM,oBAAc,IAAI,IAAY;CAEpC,IAAI,CAAC,GACJ,OAAO;CAGR,KAAK,IAAM,CAAC,GAAS,MAAW,OAAO,QAAQ,CAAK,GACnD,KAAK,IAAM,KAAa,GAAQ;EAC/B,IAAM,IAAS,EAAM,kBAAkB,IAAI,GAAiB,GAAS,CAAS,CAAC;EAC/E,AAAI,KACH,EAAY,IAAI,CAAM;CAExB;CAGD,OAAO,GAA0B,GAAa,CAAK;AACpD;AAEA,SAAgB,EAA4B,GAA0B,GAA4C;CACjH,IAAM,IAAa,CAAC,GAAG,CAAW,CAAC,CAAC,MAClC,GAAQ,OACP,EAAM,kBAAkB,IAAI,CAAM,qBAClC,EAAM,kBAAkB,IAAI,CAAO,iBACtC,GACM,IAA+B,CAAC;CAEtC,KAAK,IAAM,KAAU,GAAY;EAChC,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM;EACjC,MAEL,EAAO,EAAK,WAAW,EAAO,EAAK,YAAY,CAAC,GAChD,EAAO,EAAK,QAAQ,CAAC,KAAK,EAAK,KAAK;CACrC;CAEA,OAAO;AACR;AAYA,SAAS,EAAe,GAAgB,GAAsB;CAC7D,IAAM,IAAsB,CAAC,GACzB,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAU,KAAK,CAAS,GACxB,IAAY,EAAM,WAAW,IAAI,CAAS;CAG3C,OAAO;AACR;AAEA,SAAS,GAAe,GAAgB,GAAoB,GAAsB;CACjF,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,MAAc,GACjB,OAAO;EAGR,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAS,EAA2B,GAA0B,GAAgB,GAAsB;CACnG,KAAK,IAAM,KAAc,CAAC,GAAG,CAAW,GACvC,AAAI,GAAe,GAAY,GAAQ,CAAK,KAC3C,EAAY,OAAO,CAAU;AAGhC;AAEA,SAAS,EAAoB,GAAgB,GAA0B,GAA+B;CACrG,IAAI,EAAY,IAAI,CAAM,GACzB,OAAO;CAER,IAAI,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,UAC/B,OAAO;CAGR,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAKpD,OAJI,EAAS,WAAW,KAIjB,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAa,CAAK,CAAC;AACpF;AAEA,SAAgB,GAA0B,GAA0B,GAAsB;CACzF,IAAM,IAAkB,IAAI,IAAI,CAAW;CAO3C,KAAK,IAAM,KAAc,CAAC,GAAG,CAAe,GACvC,MAAM,SAAS,IAAI,CAAU,CAAC,EAAE,sBAAsB,eAE1D;IAAgB,OAAO,CAAU;EACjC,KAAK,IAAM,KAAgB,EAAyB,GAAO,EAAM,aAAa,IAAI,CAAU,KAAK,CAAC,CAAC,GAClG,EAAgB,IAAI,CAAY;CAFA;CAMlC,KAAK,IAAM,KAAc,CAAC,GAAG,CAAe,GAC3C,AAAI,EAAe,GAAY,CAAK,CAAC,CAAC,MAAM,MAAe,EAAgB,IAAI,CAAU,CAAC,KACzF,EAAgB,OAAO,CAAU;CAInC,IAAM,IAAiB,CAAC,GAAG,EAAM,SAAS,KAAK,CAAC,CAAC,CAAC,MAChD,GAAQ,OAAa,EAAM,kBAAkB,IAAI,CAAO,KAAK,MAAM,EAAM,kBAAkB,IAAI,CAAM,KAAK,EAC5G;CAEA,KAAK,IAAM,KAAU,GAAgB;EACpC,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;EAGnD,EAAS,WAAW,KACpB,EAAgB,IAAI,CAAM,KAC1B,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,YAC5B,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,sBAAsB,iBAK/C,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAiB,CAAK,CAAC,MACnF,EAA2B,GAAiB,GAAQ,CAAK,GACzD,EAAgB,IAAI,CAAM;CAE5B;CAEA,OAAO;AACR;AAEA,SAAS,EAA8B,GAA0B,GAAgB,GAAsB;CACtG,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,EAAY,IAAI,CAAS,GAAG;GAC/B,EAAY,OAAO,CAAS;GAO5B,KAAK,IAAM,KAAW,EAAyB,GAAO,EAAM,aAAa,IAAI,CAAS,KAAK,CAAC,CAAC,GAC5F,EAAY,IAAI,CAAO;GAGxB,OAAO;EACR;EAEA,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAgB,EAAmB,GAAgB,GAA0B,GAA+B;CAK3G,OAJI,EAAY,IAAI,CAAM,IAClB,KAGD,EAAe,GAAQ,CAAK,CAAC,CAAC,MAAM,MAAe,EAAY,IAAI,CAAU,CAAC;AACtF;AAEA,SAAS,EAA0B,GAAgB,GAA0B,GAAsB,GAA+B;CACjI,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAEpD,IAAI,EAAY,IAAI,CAAM,GAEzB,OADA,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM;CAGzC,IAAI,EAAS,WAAW,GACvB,OAAO;EAAE,UAAU;EAAO,SAAS;CAAM;CAG1C,IAAM,IAAc,EAAS,KAAK,MAAY,EAA0B,GAAS,GAAa,GAAO,CAAK,CAAC,GACrG,IAAc,EAAY,OAAO,MAAe,EAAW,YAAY,CAAC,EAAW,OAAO,GAC1F,IAAiB,EAAY,MAAM,MAAe,EAAW,YAAY,EAAW,OAAO;CAYjG,OAVI,KACH,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM,KAGrC,KACH,EAAM,WAAW,IAAI,CAAM,GACpB;EAAE,UAAU;EAAO,SAAS;CAAK,KAGlC;EAAE,UAAU;EAAO,SAAS;CAAM;AAC1C;AAEA,SAAgB,EAA0B,GAA0B,GAA8C;CACjH,IAAM,IAAgC;EACrC,6BAAa,IAAI,IAAI;EACrB,4BAAY,IAAI,IAAI;CACrB;CAEA,KAAK,IAAM,KAAU,EAAM,SAC1B,EAA0B,GAAQ,GAAa,GAAO,CAAK;CAG5D,OAAO;AACR;AAOA,SAAgB,EAAyB,GAAsB,IAA6B,EAAM,SAAsB;CACvH,IAAM,KAAkB,MAAyE;EAChG,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM,GAChC,KAAmB,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC,EAAA,CAAG,IAAI,CAAc,GAC3E,IAAmB,EAAgB,SAAS,MAAc,EAAU,WAAW,GAC/E,IAAmB,GAAM,aAAa,MAAQ,EAAgB,MAAM,MAAc,EAAU,gBAAgB;EASlH,OAPI,CAAC,KAAQ,EAAK,WACV;GAAE,kBAAkB;GAAM,aAAa;EAAiB,IAE5D,EAAK,sBAAsB,gBACvB;GAAE;GAAkB,aAAa;EAAiB,IAGnD,IACJ;GAAE,kBAAkB;GAAM,aAAa;EAAiB,IACxD;GAAE,kBAAkB;GAAO,aAAa,CAAC,CAAM;EAAE;CACrD;CAEA,OAAO,IAAI,IAAI,EAAQ,SAAS,MAAW,EAAe,CAAM,CAAC,CAAC,WAAW,CAAC;AAC/E;AAEA,SAAgB,GAAyB,GAAgD,GAAsB,GAAsB;CACpI,IAAM,IAAc,EAA4B,GAAc,CAAK,GAE7D,KAAU,MAAqB;EACpC,IAAI,EAAmB,GAAU,GAAa,CAAK,GAAG;GACrD,IAAI,EAAY,IAAI,CAAQ,GAAG;IAC9B,EAAY,OAAO,CAAQ;IAC3B;GACD;GAEA,AAAI,EAA8B,GAAa,GAAU,CAAK,KAC7D,EAAO,CAAQ;GAGhB;EACD;EAGA,AADA,EAA2B,GAAa,GAAU,CAAK,GACvD,EAAY,IAAI,CAAQ;CACzB,GAEM,IAAsB,CAAC,GAAG,EAAyB,GAAO,CAAC,CAAY,CAAC,CAAC,GACzE,IACL,EAAoB,SAAS,KAAK,EAAoB,OAAO,MAAW,EAAmB,GAAQ,GAAa,CAAK,CAAC;CAEvH,KAAK,IAAM,KAAsB,GAAqB;EACrD,IAAM,IAAW,EAAmB,GAAoB,GAAa,CAAK;EAC1E,CAAK,KAAgC,KAAc,CAAC,KAAgC,CAAC,MACpF,EAAO,CAAkB;CAE3B;CAEA,OAAO,EAA4B,GAA0B,GAAa,CAAK,GAAG,CAAK;AACxF;AAEA,SAAS,GAAmB,GAAgB,GAAsB,GAA0B;CAC3F,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAY,IAAI,CAAS,GACzB,IAAY,EAAM,WAAW,IAAI,CAAS;AAE5C;AAEA,SAAgB,GAAwB,GAA0B,GAAsB;CACvF,IAAM,oBAAc,IAAI,IAAY;CAEpC,KAAK,IAAM,KAAc,GACxB,GAAmB,GAAY,GAAO,CAAW;CAGlD,OAAO;AACR;AASA,SAAgB,GACf,GACA,GACA,GACC;CACD,IAAM,oBAAc,IAAI,IAAY;CAEpC,KAAK,IAAM,CAAC,GAAQ,MAAa,EAAM,cAAc;EACpD,IAAI,EAAS,WAAW,GACvB;EAGD,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM;EACjC,MAID,EAAoB,IAAI,CAAM,KAAK,EAAwB,IAAI,EAAK,OAAO,MAC9E,EAAY,IAAI,CAAM;CAExB;CAEA,OAAO;AACR;AAEA,SAAS,EAAe,GAAsB,GAAyB,GAAiD;CACvH,IAAM,KAAoB,EAAK,YAAY,CAAC,EAAA,CAC1C,KAAK,MAAc,EAAe,GAAW,GAAiB,CAAW,CAAC,CAAC,CAC3E,QAAQ,MAA2C,EAAQ,CAAU;CAevE,OAZI,CAFc,EAAK,WAAW,YAAY,CAAC,CAAC,SAAS,CAEpD,KAAa,EAAiB,WAAW,IACtC,QAGJ,EAAiB,SAAS,KAC7B,EAAY,IAAI,EAAK,EAAE,GAGpB,EAAiB,WAAW,IACxB,IAGD;EACN,GAAG;EACH,UAAU;CACX;AACD;AAEA,SAAgB,GAAgB,GAAkC,GAAe;CAChF,IAAM,IAAkB,EAAM,KAAK,CAAC,CAAC,YAAY;CAEjD,IAAI,CAAC,GACJ,OAAO;EACN,OAAO,CAAC,GAAG,CAAK;EAChB,6BAAa,IAAI,IAAY;CAC9B;CAGD,IAAM,oBAAc,IAAI,IAAY;CAKpC,OAAO;EACN,OALqB,EACpB,KAAK,MAAS,EAAe,GAAM,GAAiB,CAAW,CAAC,CAAC,CACjE,QAAQ,MAAiC,EAAQ,CAG3C;EACP;CACD;AACD;AAEA,SAAgB,GAAwB,GAAkC,GAA8C;CACvH,IAAM,IAA8B,CAAC,GAE/B,KAAQ,GAAsB,GAAe,MAAsB;EACxE,IAAM,KAAe,EAAK,UAAU,UAAU,KAAK,GAC7C,IAAa,KAAe,EAAY,IAAI,EAAK,EAAE;EAEzD,MAAQ,KAAK;GACZ;GACA;GACA;GACA;GACA;GACA,QAAQ,CAAC;EACV,CAAC,GAEI,GAIL,KAAK,IAAM,KAAa,EAAK,YAAY,CAAC,GACzC,EAAK,GAAW,IAAQ,GAAG,EAAK,EAAE;CAEpC;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,GAAM,CAAC;CAGb,OAAO;AACR;;;ACvcA,SAAgB,GAAiC,GAAmF;CACnI,IAAM,IAA2C,CAAC,GAC9C,IAAkB;CAEtB,OAAO,IAAkB,EAAQ,SAAQ;EACxC,IAAI,IAAyB,IAAkB;EAC/C,OAAO,IAAyB,EAAQ,UAAU,EAAQ,EAAuB,EAAE,UAAU,IAC5F,KAA0B;EAO3B,AAJA,EAAO,KAAK;GACX,YAAY;GACZ,mBAAmB;EACpB,CAAC,GACD,IAAkB;CACnB;CAEA,IAAM,IAAY,EAAO,KAAK,EAAE,eAAY,2BAAwB,GAAG,EAAW,GAAG,GAAmB,CAAC,CAAC,KAAK,GAAG;CAElH,OAAO;EACN,WAAW,EAAQ;EACnB;EACA,WAAW,GAAG,EAAQ,OAAO,GAAG;CACjC;AACD;;;ACrBA,IAAM,IAA2B,IAC3B,KAAsB,IACtB,KAAe,KACf,IAAa,IACb,IAAgB,IAChB,KAAmB,GACnB,KAAiC;AAEvC,SAAS,EAA2B,GAAe,GAAkB;CACpE,OAAO,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAI,IAAQ;AACtD;AAiBA,SAAS,EAAkC,GAAuC;CACjF,IAAM,IAAY,EAAM,oBAAoB,EAAM;CAClD,OAAO,KAAK,IAAI,IAAgC,CAAS;AAC1D;AASA,SAAgB,EAA6B,GAAyC,GAAiD;CACtI,IAAM,IAAqB,KAAK,IAAI,GAAG,CAAQ,GACzC,IAAoC,CAAC,GACvC,IAAS,GACT,IAAM,GACN,IAAsB;CAE1B,KAAK,IAAM,KAAS,EAAW,QAAQ;EACtC,IAAM,IAA6B,EAAkC,CAAK,GACpE,IAAgB,IAAqB,IAAM;EAEjD,AAAI,IAAM,KAAK,IAA6B,MAC3C,KAAuB,GACvB,KAAU,GACV,IAAM;EAGP,KAAK,IAAI,IAAQ,EAAM,YAAY,IAAQ,EAAM,mBAAmB,KAAS,GAI5E,AAHA,EAAW,KAAS;GAAE;GAAQ;EAAI,GAClC,KAAO,GAEH,IAAM,MACT,KAAU,GACV,IAAM;CAGT;CAEA,OAAO;EACN;EACA,iBAAiB,EAAW,SAAS,KAAK,IAAI,GAAG,EAAW,KAAK,MAAc,EAAU,MAAM,CAAC,IAAI;EACpG;CACD;AACD;AAQA,SAAgB,GAAiC,EAChD,eACA,mBACA,oBACA,kBACA,mBACA,qBAC6D;CAC7D,IAAM,IAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,EAAW,SAAS,IAAI,EAAW,YAAY,CAAC,CAAC,GAC9G,IAA2B,EAA2B,GAAgB,GAAuC,GAC7G,IAA4B,EAA2B,GAAiB,EAAmC,GAC3G,IAA0B,EAA2B,GAAe,IAA2B,EAAoB,GACnH,IAA2B,EAA2B,GAAgB,CAAyB,GAC/F,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAA0B,KAAK,IAAI,GAAG,IAA0B,EAAoB,CAAC,CAAC,GACxH,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAA2B,IAA2B,EAAoB,CAAC,GAC9G,IAA2B,KAAK,IAAI,GAAG,EAA2B,GAAgB,CAAC,CAAC,GACpF,IAAW,KAAK,IAAI,GAAY,CAAwB,GACxD,IAAoB,KAAK,IAAI,GAAG,KAAK,OAAO,IAAa,IAA2B,KAAe,GAA0B,CAAC,GAC9H,IAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAkB,GAAmB,KAAuB,CAAC,CAAC,GACpG,IAAwB,EAAW,OAAO,QAC9C,GAAS,MAAU,KAAK,IAAI,GAAS,EAAkC,CAAK,CAAC,GAC9E,CACD;CAEA,IAAI,MAAwB,GAC3B,OAAO;EACN,aAAa;EACb,UAAU;EACV,OAAO;EACP;EACA,WAAW;EACX,YAAY,CAAC;CACd;CAGD,IAAI,GACA,IAAY;CAEhB,KAAK,IAAI,IAAuB,GAAG,KAAwB,GAAgB,KAAwB,GAAG;EACrG,IAAI,IAAW,KAAK,IAAI,GAAuB,KAAK,KAAK,IAAsB,CAAoB,CAAC,GAChG,IAAS,EAA6B,GAAY,CAAQ;EAE9D,OAAO,EAAO,kBAAkB,KAAwB,IAAW,IAElE,AADA,KAAY,GACZ,IAAS,EAA6B,GAAY,CAAQ;EAG3D,IAAM,IAAc,EAAO,iBACrB,IAAe,KAAK,IAAI,GAAU,IAA2B,IAAc,MAAgB,IAAc,KAAK,CAAU,GACxH,IAAgB,KAAsB,IAAW,GACjD,IAAa,IAAe,GAC5B,IAAc,IAAgB,GAC9B,KAAoB,IAAc,IAAW,KAAuB,GACpE,IAAwB,EAAO,sBAAsB,GACrD,IACL,KAAK,IAAI,GAAY,CAAW,IAChC,MAAO,KAAK,IAAI,IAAa,CAAW,IACxC,MAAO,IACP,MAAO,IACP,OAAQ,IAAc;EAEvB,AAAI,IAAQ,MACX,IAAY,GACZ,IAAa;GACZ;GACA;GACA,OAAO,KAAK,IAAI,GAAY,CAAY;GACxC;GACA,WAAW;GACX,YAAY,EAAO;EACpB;CAEF;CAEA,OACC,KAAc;EACb,aAAa;EACb,UAAU;EACV,OAAO;EACP;EACA,WAAW;EACX,YAAY,EAA6B,GAAY,CAAmB,CAAC,CAAC;CAC3E;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEtKA,SAAgB,GAAgB,EAC/B,SACA,UACA,cACA,gBACA,eACA,aACA,YACA,kBACA,mBAAgB,QAChB,mBACA,wBACwB;CACxB,IAAM,IAAuB,MAAkB,QACzC,IAAuB,MAAkB,aAAa,MAAU;CAEtE,OACC,kBAAA,GAAA,EAAA,UAAA;EACC,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAY,OAAO,EAAE,gBAAgB,EAAM;GAAoB,eAAY;EAAQ,CAAA;EAC1G,KAAwB,IACxB,kBAAC,UAAD;GACC,MAAK;GACL,WAAW,EAAO;GAClB,UAAU,MAAU;IAEnB,AADA,EAAM,gBAAgB,GACtB,IAAiB;GAClB;GACA,cAAY,IAAa,mBAAmB;GAC5C,WAAQ;GACR,eAAa,IAAa,8BAA8B;GACxD,UAAA,kBAAC,IAAD,EAAkB,WAAW,EAAG,EAAO,kBAAkB,KAAc,EAAO,wBAAwB,EAAI,CAAA;EACnG,CAAA,IACL,IACH,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAyB,eAAY;EAAQ,CAAA,IAClE;EAEH,MAAkB,WAAW,MAAkB,YAC/C,kBAAC,QAAD;GACC,WAAW,EAAO;GAClB,cAAc,MAAU,EAAM,gBAAgB;GAC9C,UAAU,MAAU,EAAM,gBAAgB;GAC1C,UAAA,kBAAC,GAAD;IACC,OAAO;IACP,eAAe;IACf,UAAU,EAAK;IACf,cAAY,WAAW,EAAK;IAC5B,gBAAgB,IAAoB;GACpC,CAAA;EACI,CAAA,IACH,MAAkB,UACrB,kBAAC,QAAD;GACC,WAAW,EAAG,EAAO,eAAe,KAAY,EAAO,sBAAsB,KAAW,EAAO,oBAAoB;GACnH,eAAY;GACX,UAAA,IACA,kBAAC,IAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C,IACH,kBAAC,IAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C;EACC,CAAA,IACH;EAEJ,kBAAC,OAAD;GAAK,WAAW,EAAO;GACtB,UAAA,kBAAC,GAAD;IACC,OAAO,EAAK;IACZ,MAAM,EAAK;IACA;IACX,gBAAgB,IAAuB,EAAO,sBAAsB,KAAA;IACpE,eAAe,IAAuB,EAAO,qBAAqB,KAAA;GAClE,CAAA;EACG,CAAA;CACJ,EAAA,CAAA;AAEJ;;;AClCA,SAAgB,GAAe,EAC9B,UACA,gBACA,aACA,gBACA,SACA,UACA,gBACA,eACA,kBACA,mBAAgB,QAChB,6BACA,MAAM,IACN,kBACA,gBACA,iBAAc,WACd,oBACA,wBACA,WACA,kBACA,aACA,oBACA,sBACA,cACA,aACuB;CACvB,IAAM,KAAW,EAAgC,IAAI,GAC/C,IAAqB,EAAiC,IAAI,GAE1D,CAAC,IAAkB,MAAuB,GAAS,EAAK,GACxD,IAAmB,OAAmB,KAAA,GACtC,IAAO,IAAmB,KAAiB,IAC3C,CAAC,GAAqB,MAA0B,yBAA6C,IAAI,IAAI,CAAC,GACtG,IAAsB,MAAgB,WAAY,MAAkB,UAAU,iBAAiB,kBAAmB,WAClH,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,KAAkB,QAAc,GAAG,EAAY,IAAI,EAAU,SAAS,KAAK,IAAI,CAAC,GAAa,CAAS,CAAC,GACvG,IAA4B,QAAc,IAAI,IAAI,EAAuB,GAAG,CAAC,EAAuB,CAAC,GACrG,EACL,OAAO,GACP,aACA,yBACG,EAAe;EAClB;EACA;EACA;EACA,aAAa;CACd,CAAC,GACK,MAAoB,MAAsB;EAS/C,AARI,KAAQ,CAAC,KAAY,KACxB,EAAS,EAAE,GAGP,KACJ,GAAoB,CAAQ,GAG7B,KAAe,CAAQ;CACxB,GACM,EAAE,OAAO,IAAe,aAAa,MAAsB,QAC1D,GAAgB,GAAO,CAAY,GACzC,CAAC,GAAO,CAAY,CACrB,GACM,IAAsB,QAAc,GAAwB,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC,GAC7G,KAAwB,QACvB,GAA6B,GAAW,GAA2B,CAAmB,GAC5F;EAAC;EAA2B;EAAqB;CAAS,CAC3D,GACM,KAAiB,QAChB,IAAI,IAAI,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,QAAQ,GAAG,OAAc,EAAS,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAY,CAAM,CAAC,GACjH,CAAC,CAAS,CACX,GACM,IAAsB,QAE1B,MAAkB,YACf,qBACA,IAAI,IAAI;EAAC,GAAG;EAAuB,GAAG;EAAmB,GAAG;CAAmB,CAAC,GACpF;EAAC;EAAgB;EAAuB;EAAe;EAAmB;CAAmB,CAC9F,GACM,IAAiB,QAAc,GAAwB,IAAe,CAAmB,GAAG,CAAC,IAAe,CAAmB,CAAC,GAChI,KAAgB,QAAc,EAAe,WAAW,MAAU,EAAY,IAAI,EAAM,KAAK,EAAE,CAAC,GAAG,CAAC,GAAa,CAAc,CAAC,GAChI,KAA0B,QAAc,GAAiC,CAAc,GAAG,CAAC,CAAc,CAAC,GAC1G,IAA6B,GACjC,MAAY;EACZ,IAAM,IAAS,GAAiC;GAC/C,GAAG;GACH,YAAY;EACb,CAAC,GACK,IAA+E,CAAC;EAMtF,OALA,EAAO,WAAW,SAAS,GAAW,MAAU;GAE/C,AADA,EAAoB,iBAAiB,EAAM,YAAY,OAAO,EAAU,MAAM,GAC9E,EAAoB,iBAAiB,EAAM,SAAS,OAAO,EAAU,GAAG;EACzE,CAAC,GAEM;GACN,OAAO,GAAG,EAAO,MAAM;GACvB,UAAU,GAAG,EAAO,SAAS;GAC7B,UAAU,GAAG,EAAO,MAAM;GAC1B,WAAW,GAAG,EAAO,UAAU;GAC/B,uBAAuB,OAAO,EAAO,WAAW;GAChD,oBAAoB,OAAO,EAAO,QAAQ;GAC1C,GAAG;EACJ;CACD,GACA,CAAC,EAAuB,CACzB,GACM,EACL,gBACA,YACA,oBACA,sBACA,kBACA,iBACA,kBACA,WACA,cACA,gBACA,kBACA,4BACA,2BACA,iBACA,0BACG,EAAyB;EAC5B,SAAS;EACT;EACA;EACA,cAAc;EACd,WAAW,MAAU,GAAe,EAAM,IAAI;EAC9C,oBAAoB,MAAU,EAAM,KAAK,aAAa;EACtD,UAAU,KAAY;EACtB,eAAe,MAAkB;EACjC,yBAAyB;EACzB,aAAa;EACb,mBAAmB,MAAkB,YAAY,SAAS;EAC1D,qBAAqB,MAAkB,YAAY,IAA6B,KAAA;CACjF,CAAC,GACK,KAAuB,EAAQ,QAC/B,KAAe,EAAY,OAAO,GAClC,KAAmB,MAAgB,aAAa,KAAQ,EAAa,SAAS,IAC9E,KAAe,KAAmB,IAAgB,KAAuB,IACzE,KAAqB,MAAgB,aAAa,EAAQ,GAC1D,KAAmB,MAAwB,kBAAkB,EAAQ,GACrE,KACJ,MAAwB,kBAAkB,CAAC,MAC3C,MAAwB,oBAAoB,CAAC,KAAuB,OACpE,MAAwB,aAAa,CAAC,IAClC,IAAoB,EAA2B;EACpD,MAAM;EACN;EACA;EACA,iBAAiB,EAAQ;EACzB;EACA;EACA;EACA;EACA;CACD,CAAC,GACK,KAAkB,MAAkB,aAAa,MAAkB,WAAW,GAC9E,KAAkB,MAAgB,WAClC,KACL,MAAmB,KAClB,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAvB,UAAA,CACE,KACA,kBAAC,GAAD;GACC,aAAa,EAAY;GACzB,eAAe,EAAY;GACP;EACpB,CAAA,IACE,MACH,KACA,kBAAC,GAAD;GACC,OAAO;GACP,UAAU;GACV,eAAe,EAAS,EAAE;GAC1B,aAAY;GACZ,YAAY,MAAU;IACrB,AAAI,EAAM,QAAQ,YAAY,EAAM,QAAQ,SAC3C,EAAM,gBAAgB;GAExB;GACA,UAAU,MAAU;IACnB,EAAM,gBAAgB;GACvB;EACA,CAAA,IACE,IACA;CACF,CAAA,IAAA,KAAA;CAEL,QAAsB;EACrB,AAAI,KAAQ,MAAkB,aAC7B,GAAqB;CAEvB,GAAG;EAAC,GAAwB;EAAW;EAAM;EAAe;CAAoB,CAAC;CAEjF,IAAM,MAAgB,MAAkC;EACvD,GAAS,UAAU;CACpB,GACM,WAA6B;EAIlC,AAHA,KAAmB,GACnB,EAAS,EAAE,GAEP,MAAkB,YACrB,GAAM;CAER,GAEM,MAAgB,MAA4B;EAC5C,EAAM,eAIX,IAAwB,MAAyB;GAChD,IAAM,IAAoB,IAAI,IAAI,CAAoB,GAChD,IAAuB,EAAqB,IAAI,EAAM,KAAK,EAAE,KAAK,EAA0B,IAAI,EAAM,KAAK,OAAO;GAIxH,OAFA,EAAkB,IAAI,EAAM,KAAK,IAAI,CAAC,CAAoB,GAEnD;EACR,CAAC;CACF;CAEA,OACC,kBAAC,GAAD;EAAoB;EAAoB;EAAuB;EAAgB;EAC5E,WAAA,EAAE,cAAW,YAAS,qBAAkB;GACzC,IAAM,IAAS,GAAG,EAAU,WACtB,IAAiB,OAAO,KAAU,WAAW,IAAQ;GAE3D,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;IACC,KAAK;IACL,SAAS;IACT,IAAI;IACJ,MAAK;IACL,MAAK;IACL,cAAa;IACF;IACD;IACV,UAAU,MAAgB;IAC1B,OAAO,MAAgB,aAAa,KAAqB,KAAK;IAC9D,aAAa,KAAyB,KAAkB,KAAA;IACxD,mBAAiB;IACjB,cAAY,IAAU,KAAA,IAAY;IAClC,oBAAkB;IAClB,iBAAe,MAAkB,YAAY,WAAW;IACxD,iBAAe;IACf,iBAAe,IAAO,IAAS,KAAA;IAC/B,qBAAmB,MAAkB,aAAa,MAAgB,WAAW,SAAS;IACtF,yBACC,MAAkB,aAAa,KAAQ,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IAEhG,gBAAgB,EAAG,MAAgB,EAAO,aAAa,MAAsB,EAAO,gBAAgB;IACpG,SACC,KACC,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAe,UAAA;IAAqB,CAAA,IACxD,KACH,IACG,KAAA;IAEL,cACC,kBAAC,GAAD;KACO;KACN,UAAU,KAAY;KACtB,mBAAmB,EAAkB;KACrC,eAAe,EAAkB;KAGhC,UAAA,MAAgB,KAChB,kBAAC,UAAD;MACC,MAAK;MACL,WAAW,EAAO;MAClB,cAAc,MAAU;OAEvB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;MACvB;MACA,UAAU,MAAU;OAGnB,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,GAAqB;MACtB;MACA,cAAW;MACX,UAAA,kBAAC,IAAD,CAAQ,CAAA;KACD,CAAA,IACL;IACiB,CAAA;IAEvB,WAAW,MAAU;KAChB,MAAgB,YAIpB,EAAkB,yBAAyB,EAAM,OAAO,KAAK;IAC9D;IACA,SAAS,EAAkB;IAC3B,UAAU,MAAU;KACnB,EAAkB,mBAAmB,EAAM,aAAa;IACzD;IACA,YAAY,MAAU;KACrB,IACC,MAAkB,aAClB,KACA,EAAM,QAAQ,SACd,CAAC,EAAM,YACP,EAAmB,SAClB;MAED,AADA,EAAM,eAAe,GACrB,EAAmB,QAAQ,MAAM;MACjC;KACD;KAEA,GAAuB,CAAK,GAExB,GAAM,oBAIV,EAAkB,qBAAqB;MACtC;MACA,0BAA0B;OACzB,IAAM,IAAc,KAAe,IAAI,EAAe,KAAe,KAAA;OACrE,AAAI,KACH,GAAa,CAAW;MAE1B;MACA,uBAAuB,MAAgB;KACxC,CAAC;IACF;GACA,CAAA,GAED,kBAAC,GAAD;IACO;IACG;IACO;IACR;IACC;IACO;IAChB,eAAe;IACf,gBACC,MAAkB,aAAa,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IAExF,qBAAqB,MAAkB,aAAa,MAAkB;IACtE,WAAW,MAAkB,YAAY,WAAW;IACvC;IACK;IAClB,WAAW;IACX,WAAW,EAAS;IACpB,iBAAiB,MAAkB,YAAY,EAAO,yBAAyB,KAAA;IAC/E,eAAc;IACd,QAAQ;IACR,UAAA,kBAAC,OAAD;KAAK,WAAW,EAAG,MAAkB,aAAa,EAAO,WAAW;KAClE,UAAA,EAAe,WAAW,IAC1B,kBAAC,GAAD;MAAc,YAAY;MAAO,YAAY,CAAC,MAAS,CAAC,IAAY,eAAe,KAAA;KAAY,CAAA,IAE/F,EAAe,KAAK,GAAO,MAAU;MACpC,IAAM,IACL,MAAkB,UACf,EAAmB,EAAM,KAAK,IAAI,GAAa,CAAS,IACxD,EAAY,IAAI,EAAM,KAAK,EAAE,GAC3B,IAAU,MAAkB,WAAW,CAAC,KAAY,EAAW,IAAI,EAAM,KAAK,EAAE,GAChF,IAAS,MAAU,GACnB,IAAiB,EAAM,KAAK,aAAa;MAE/C,OACC,kBAAC,OAAD;OAEC,WAAQ;OACR,IAAI,GAAY,GAAQ,CAAK;OAC7B,MAAM,MAAS,GAAa,GAAO,CAAI;OACvC,MAAM,MAAkB,YAAY,KAAA,IAAY;OAChD,iBAAe,MAAkB,YAAY,KAAA,IAAY;OACzD,iBAAe,KAAkB,KAAA;OACjC,WAAW,EACV,EAAO,SACP,MAAkB,aAAa,EAAO,eACtC,KAAkB,EAAO,iBACzB,KAAU,EAAO,eACjB,KAAY,EAAO,eACpB;OACA,OACC,MAAkB,YACd;QACD,wBAAwB,qBAAqB,EAAM;QACnD,qBAAqB,qBAAqB,EAAM;OACjD,IACC,KAAA;OAEJ,cAAc,MAAU;QACvB,EAAM,eAAe;OACtB;OACA,eAAe,GAAa,CAAK;OACjC,UAAA,kBAAC,OAAD;QAAK,WAAW,EAAO;QACtB,UAAA,kBAAC,IAAD;SACC,MAAM,EAAM;SACZ,OAAO,EAAM;SACb,WAAW;SACX,aAAa,EAAM;SACnB,YAAY,EAAM;SACR;SACD;SACM;SACA;SACf,sBAAsB,GAAa,CAAK;SACxC,yBAAyB,GAAa,CAAK;QAC3C,CAAA;OACG,CAAA;MACD,GAzCC,EAAM,KAAK,EAyCZ;KAEP,CAAC;IAEE,CAAA;GACO,CAAA,CACZ,EAAA,CAAA;EAEJ;CACY,CAAA;AAEf;;;AC3bA,SAAS,GAAuB,GAA0B,GAAmD;CACxG,MAAY,SAAS,GAIzB;MAAI,EAAY,SAAS,GAAG;GAC3B,IAAM,IAAe,EAAU,SAAS,IAAI,CAAC,GAAG,CAAW,CAAC,CAAC,EAAE;GAM/D,OAJK,IAIE,EAAa,QAHnB;EAIF;EAEA,OAAO,EAAkB,EAAY,IAAI;CAFzC;AAGD;AAMA,SAAS,GACR,GACA,GACA,GACC;CACD,IAAM,IAAU,EAA4B,GAAM,CAAS,GACrD,IAAW,EAA4B,GAAO,CAAS;CAE7D,OAAO,EAAQ,SAAS,EAAS,QAAQ,CAAC,GAAG,CAAO,CAAC,CAAC,OAAO,MAAW,EAAS,IAAI,CAAM,CAAC;AAC7F;AAEA,SAAgB,GAAgB,EAC/B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,mBAAgB,QAChB,8BACwB;CACxB,IAAM,CAAC,GAAM,KAAW,GAAS,EAAK,GAChC,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,EAAE,eAAY,kBAAe,mBAAgB,EAA4B;EAC9E;EACA;EACA,UAAU;EACV,UAAU,GAAM,MAAU,GAA4B,GAAM,GAAO,CAAS;CAC7E,CAAC,GACK,IAAe,IAAO,IAAa,GACnC,IAAc,QAAc,EAA4B,GAAc,CAAS,GAAG,CAAC,GAAc,CAAS,CAAC,GAC3G,IAAiB,QAAc,EAA0B,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC,GAC1G,IAAkB,QAAc,GAAuB,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC;CAmB9G,OACC,kBAAC,IAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,EAAe;EAC5B,YAAY,EAAe;EAC3B,eAAc;EACC;EACU;EACnB;EACN,eAhCwB,MAAsB;GAK/C,AAJI,KAAY,CAAC,KAChB,EAAY,GAGb,EAAQ,CAAQ;EACjB;EA2BE,aAAa;GACZ,mBA3BqB;IACvB,EAAc,EAA4B,EAAyB,CAAS,GAAG,CAAS,CAAC;GAC1F;GA0BG,qBAAqB,EAAc,CAAC,CAAC;EACtC;EACA,aAAY;EACZ,iBAAiB,IAAkB,kBAAC,GAAD,EAAkB,OAAO,EAAkB,CAAA,IAAI,KAAA;EAC3E;EACO;EACL;EACT,iBAAiB,MAAS;GACzB,GAAe,MAAsB,GAAyB,GAAmB,EAAK,IAAI,CAAS,CAAC;EACrG;EACA,wBAnC2B;GAG5B,AAFA,EAAc,CAAC,CAAC,GAEX,KACJ,EAAS,CAAC,CAAC;EAEb;EA8Ba;EACJ;CACP,CAAA;AAEH;;;ACtGA,SAAgB,GAAqB,EACpC,UACA,gBACA,aACA,SACA,gBACA,UACA,iBACA,YACA,kBACA,UACA,aACA,UACA,aACA,UACA,4BACA,iBACA,qBAC6B;CAC7B,IAAM,IAAW,EAAiB;EACjC;EACA;EACA;EACA;CACD,CAAC,GACK,IAAQ,QACP,IAAiB,EAAS,OAAO,EAAE,iBAAiB,EAAS,gBAAgB,CAAC,KAAK,EAAS,OAClG;EAAC;EAAgB,EAAS;EAAO,EAAS;CAAe,CAC1D;CAEA,OACC,kBAAC,IAAD;EACQ;EACM;EACb,UAAU,KAAY,EAAS;EACzB;EACN,aAAa,KAAe,EAAS;EAC9B;EACA;EACG;EACH;EACO;EACL;EACM;EACU;EACzB,WAAW,EAAS;EACpB,OAAO,EAAS,UAAU,oBAAoB,KAAA;CAC9C,CAAA;AAEH;;;ACtEA,SAAS,GAAsB,GAAkC;CAC3D,OAQL,OAJI,EAAK,QAAQ,EAAK,SAAS,EAAK,QAC5B,GAAG,EAAK,MAAM,KAAK,EAAK,SAGzB,EAAK;AACb;AAEA,SAAgB,GAAW,EAC1B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,eAAY,IACZ,8BACmB;CACnB,IAAM,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,IAAa,GAAoB,GAAO,CAAS,GACjD,IAAe,IAAa,EAAU,SAAS,IAAI,CAAU,IAAI,KAAA;CAEvE,OACC,kBAAC,IAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,oBAAa,IAAI,IAAI,CAAC,CAAU,CAAC,oBAAI,IAAI,IAAI;EAC1D,4BAAY,IAAI,IAAI;EACpB,eAAc;EACW;EACzB,aAAY;EACZ,qBAAqB,GAAsB,CAAY;EAChD;EACO;EACL;EACT,iBAAiB,MAAS,EAAS;GAAE,SAAS,EAAK;GAAS,OAAO,EAAK;EAAM,CAAC;EAC/E,kBAAkB,UAAkB,EAAS,KAAA,CAAS,IAAI,KAAA;EAC/C;EACJ;CACP,CAAA;AAEH;;;ACvDA,SAAgB,GAAgB,EAC/B,UACA,gBACA,aACA,SACA,gBACA,UACA,iBACA,YACA,UACA,aACA,UACA,aACA,UACA,cACA,8BACwB;CACxB,IAAM,IAAW,EAAiB;EACjC;EACA;EACA;CACD,CAAC;CAED,OACC,kBAAC,IAAD;EACQ;EACM;EACb,UAAU,KAAY,EAAS;EACzB;EACN,aAAa,KAAe,EAAS;EACrC,OAAO,EAAS;EACT;EACG;EACH;EACO;EACL;EACgB;EACzB,WAAW,EAAS;EACpB,OAAO,EAAS,UAAU,oBAAoB,KAAA;EACnC;CACX,CAAA;AAEH"}
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};\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\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\tnodeIdByCodeValue.set(makeCodeValueKey(node.codeKey, node.value), node.id);\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\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};\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\tconst nodeId = index.nodeIdByCodeValue.get(makeCodeValueKey(codeKey, itemValue));\n\t\t\tif (nodeId) {\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\n\tfor (const nodeId of orderedIds) {\n\t\tconst node = index.nodeById.get(nodeId);\n\t\tif (!node) continue;\n\n\t\tresult[node.codeKey] = result[node.codeKey] ?? [];\n\t\tresult[node.codeKey].push(node.value);\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\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\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\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\tremoveDescendantSelections(nextSelectedIds, nodeId, index);\n\t\t\tnextSelectedIds.add(nodeId);\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\tselectedIds.delete(currentId);\n\n\t\t\t/*\n\t\t\t * Узел мог стать disabled уже после сохранения выбора его ancestor.\n\t\t\t * При частичном снятии разворачиваем ancestor только в актуально\n\t\t\t * доступное покрытие, чтобы запрещённое значение не попало в onChange.\n\t\t\t */\n\t\t\tfor (const childId of getSelectableTreeNodeIds(index, index.childrenById.get(currentId) ?? [])) {\n\t\t\t\tselectedIds.add(childId);\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\n\t\treturn containsDisabled\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(currentValue: TreeMultiSelectValue | undefined, targetNodeId: string, index: TreeNodeIndex) {\n\tconst selectedIds = treeMultiValueToSelectedIds(currentValue, index);\n\n\tconst toggle = (targetId: string) => {\n\t\tif (isTreeNodeSelected(targetId, selectedIds, index)) {\n\t\t\tif (selectedIds.has(targetId)) {\n\t\t\t\tselectedIds.delete(targetId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expandNearestSelectedAncestor(selectedIds, targetId, index)) {\n\t\t\t\ttoggle(targetId);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tremoveDescendantSelections(selectedIds, targetId, index);\n\t\tselectedIds.add(targetId);\n\t};\n\n\tconst selectableTargetIds = [...getSelectableTreeNodeIds(index, [targetNodeId])];\n\tconst allSelectableTargetsSelected =\n\t\tselectableTargetIds.length > 0 && selectableTargetIds.every((nodeId) => isTreeNodeSelected(nodeId, selectedIds, index));\n\n\tfor (const selectableTargetId of selectableTargetIds) {\n\t\tconst selected = isTreeNodeSelected(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// .uiOptionRow\n.treeRow {\n\tdisplay: flex;\n\talign-items: stretch;\n\tborder-radius: var(--radius-sm);\n\tcursor: pointer;\n\n\t&:focus {\n\t\t@include focusVisible;\n\n\t\tbackground-color: var(--surface-accent);\n\t\tborder-color: var(--border-1);\n\t\tcursor: pointer;\n\t}\n\n\t&:hover {\n\t\tbackground-color: var(--surface-accent);\n\t\tcursor: pointer;\n\t}\n}\n\n// .uiOptionRowSelected\n.treeRowSelected {\n\tbackground-color: var(--surface-2);\n\tcolor: var(--content-accent);\n\tcursor: default;\n}\n\n// .uiOptionRowActive\n.treeRowActive {\n\tbackground-color: var(--surface-1);\n}\n\n// Недоступность принадлежит option целиком; вложенный checkbox только визуализирует то же состояние.\n.treeRowDisabled {\n\tcursor: not-allowed;\n\topacity: var(--disabled-opacity);\n\n\t&:hover {\n\t\tbackground-color: transparent;\n\t\tcursor: not-allowed;\n\t}\n}\n\n.treeNodeButton {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\twidth: 100%;\n\tpadding: var(--space-xs) var(--space-xs) var(--space-xs) 0;\n\tbackground: transparent;\n\ttext-align: left;\n\tborder-radius: var(--radius-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// Label и code усиливаются отдельно: code имеет собственный variable-font weight.\n.treeColumnRootLabel {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.treeColumnRootCode {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.treeColumnCheckBox {\n\tdisplay: inline-flex;\n\tflex-shrink: 0;\n}\n\n// Даёт общему option-content реальную сжимаемую ширину внутри колонки и включает ellipsis вместо выхода за границы.\n.treeNodeOptionContent {\n\tflex: 1 1 0;\n\tmin-width: 0;\n\theight: 100%;\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: 1.5em;\n\theight: 1.5em;\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\n.treeSelection {\n\tflex-shrink: 0;\n\twidth: 1em;\n\theight: 1em;\n\tborder: var(--border);\n\tborder-radius: var(--radius-xs);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: var(--surface-0);\n\tcolor: transparent;\n}\n\n.treeSelectionChecked {\n\tbackground-color: var(--status-info-text);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--white);\n\n\t// outline: 1px dashed rgb(255, 100, 141);\n\t// outline-offset: -1px;\n}\n\n.treeSelectionPartial {\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--status-info-text);\n\tcolor: var(--status-info-text);\n}\n\n.treeSelectionIcon {\n\twidth: 0.75rem;\n\theight: 0.75rem;\n}\n\n.treeSummary {\n\tpadding-right: calc(var(--control-height) * 2);\n}\n\n.inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n\n.treeActions {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.treeClearButton {\n\tcolor: var(--status-error-text);\n}\n","import { CSSProperties } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, ChevronRightIcon, MinusIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../check-box\";\nimport { SelectOptionContent } from \"../select/SelectOptionContent\";\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};\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}: TreeNodeContentProps) {\n\tconst showExpansionControl = optionsLayout === \"tree\";\n\tconst emphasizeRootContent = optionsLayout === \"columns\" && level === 0;\n\n\treturn (\n\t\t<>\n\t\t\t<span 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<span className={styles.treeExpanderPlaceholder} aria-hidden=\"true\" />\n\t\t\t) : null}\n\n\t\t\t{selectionMode === \"multi\" && optionsLayout === \"columns\" ? (\n\t\t\t\t<span\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</span>\n\t\t\t) : selectionMode === \"multi\" ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(styles.treeSelection, selected && styles.treeSelectionChecked, partial && styles.treeSelectionPartial)}\n\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t<CheckIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : partial ? (\n\t\t\t\t\t\t<MinusIcon className={styles.treeSelectionIcon} />\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t) : null}\n\n\t\t\t<div className={styles.treeNodeOptionContent}>\n\t\t\t\t<SelectOptionContent\n\t\t\t\t\tlabel={node.label}\n\t\t\t\t\tcode={node.code}\n\t\t\t\t\thighlight={highlight}\n\t\t\t\t\tlabelClassName={emphasizeRootContent ? styles.treeColumnRootLabel : undefined}\n\t\t\t\t\tcodeClassName={emphasizeRootContent ? styles.treeColumnRootCode : undefined}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { type CSSProperties, ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type FloatingListboxSizeResolver } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputText } from \"../input\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerSelectionToolbar,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\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\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\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\tonNodeActivate: (node: TreeSelectNode) => 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\topen: controlledOpen,\n\tonOpenChange,\n\tbulkActions,\n\ttriggerMode = \"display\",\n\tselectedSummary,\n\tselectedSummaryText,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\tonNodeActivate,\n\tonClearSelection,\n\tisLoading,\n\terror\n}: TreePickerBaseProps) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst selectAllButtonRef = useRef<HTMLButtonElement | null>(null);\n\t/** Явный owner open-state позволяет сбрасывать query непосредственно в close-событии. */\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\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 placeholderText = useMemo(() => `${placeholder} <${treeIndex.nodeById.size}>`, [placeholder, treeIndex]);\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\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 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 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,\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),\n\t\tgetOptionDisabled: (entry) => entry.node.disabled === true,\n\t\tdisabled: disabled || isLoading,\n\t\tcloseOnSelect: selectionMode === \"single\",\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 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 showSummaryOverlay = triggerMode === \"display\" && Boolean(selectedSummary);\n\tconst showSummaryToken = resolvedTriggerMode === \"search-multi\" && Boolean(selectedSummary);\n\tconst showTriggerPlaceholder =\n\t\t(resolvedTriggerMode === \"search-multi\" && !hasSelection) ||\n\t\t(resolvedTriggerMode === \"search-single\" && (!selectedSummaryText || showTriggerQuery)) ||\n\t\t(resolvedTriggerMode === \"display\" && !hasSelection);\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\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<PickerTriggerInput\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\treadOnly={triggerMode !== \"search\"}\n\t\t\t\t\t\t\tvalue={triggerMode === \"display\" && showSummaryOverlay ? \"\" : triggerValue}\n\t\t\t\t\t\t\tplaceholder={showTriggerPlaceholder ? placeholderText : undefined}\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\tinputClassName={cn(hasSelection && styles.treeSummary, showSummaryOverlay && styles.inputWithOverlay)}\n\t\t\t\t\t\t\toverlay={\n\t\t\t\t\t\t\t\tshowSummaryOverlay ? (\n\t\t\t\t\t\t\t\t\t<div className={styles.valueOverlay}>{selectedSummary}</div>\n\t\t\t\t\t\t\t\t) : showSummaryToken ? (\n\t\t\t\t\t\t\t\t\tselectedSummary\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{/* {showSummaryToken ? selectedSummary : null} */}\n\n\t\t\t\t\t\t\t\t\t{hasSelection && onClearSelection ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={styles.treeClearButton}\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClearSelection();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\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\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 = activeIndex >= 0 ? visibleEntries[activeIndex] : 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\tclassName={uiStyles.uiPopupOptions}\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\theader={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 === activeIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled = entry.node.disabled === 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<div\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) => setOptionRef(index, node)}\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\taria-disabled={optionDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.treeRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionsLayout === \"columns\" && styles.treeColumnRow,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionDisabled && styles.treeRowDisabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && styles.treeRowActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && styles.treeRowSelected\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\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\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\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\tonClick={() => selectOption(entry)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className={styles.treeNodeButton}>\n\t\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\t\tnode={entry.node}\n\t\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\t\thighlight={currentQuery}\n\t\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\t\tisExpanded={entry.isExpanded}\n\t\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\t\tpartial={partial}\n\t\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\t\toptionsLayout={optionsLayout}\n\t\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\t\tonToggleSelection={() => selectOption(entry)}\n\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</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\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 { MultiSelectToken } from \"../multi-select\";\nimport { formatOptionCount } from \"../multi-select/ui/defaultRenderers\";\nimport { usePickerSelectionLifecycle } from \"../picker\";\nimport { UiBaseProps } from \"../types\";\n\nimport {\n\tcreateTreeNodeIndex,\n\tgetSelectableTreeNodeIds,\n\tgetTreeNodeSelectionState,\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\tif (selectedIds.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (selectedIds.size === 1) {\n\t\tconst selectedNode = treeIndex.nodeById.get([...selectedIds][0]);\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(selectedIds.size);\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 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\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 ? <MultiSelectToken value={selectedSummary} /> : undefined}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => {\n\t\t\t\tsetDraftValue((currentDraftValue) => toggleTreeMultiSelection(currentDraftValue, node.id, treeIndex));\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":";;;;;;;;;;;;;AAEA,SAAgB,EAAiC,GAA0D;CAK1G,OAJK,IAIE,GACL,EAAM,UAAU,CAAC,EAAM,KAAK,EAC9B,IALQ,CAAC;AAMV;;;ACiBA,SAAS,EAAa,GAA8B,GAAiB,GAAe;CACnF,OAAO,IAAW,GAAG,EAAS,GAAG,EAAQ,GAAG,MAAU,GAAG,EAAQ,GAAG;AACrE;AAEA,SAAS,EAAiB,GAAsB,GAAiB,GAAqC;CACrG,IAAM,IAAU,EAAY;CAC5B,OAAQ,KAAW,EAAK,MAAa,EAAK;AAC3C;AAEA,SAAS,GAAiB,GAAkC;CAC3D,OAAO,CAAC,GAAG,IAAI,IAAI,EAAM,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AACpD;AAEA,SAAS,GAAkB,GAOP;CACnB,OAAO;EACN,IAAI,EAAa,EAAK,UAAU,EAAK,SAAS,EAAK,KAAK;EACxD,SAAS,EAAK;EACd,OAAO,EAAK;EACZ,OAAO,EAAK;EACZ,MAAM,EAAK;EACX,YAAY,GAAiB;GAAC,EAAK;GAAO,EAAK;GAAO,EAAK;EAAI,CAAC;EAChE,UAAU,EAAK;EACf,UAAU,CAAC;EACX,kCAAkB,IAAI,IAAI;CAC3B;AACD;AAMA,SAAS,GAAgB,GAA0B,GAAqB;CACvE,EAAM,MAAM,GAAM,MAAU;EAC3B,IAAM,IAAY,IAAa,EAAK,WAAW,EAAK,OAC9C,IAAa,IAAa,EAAM,WAAW,EAAM;EAGvD,OAFmB,EAAe,GAAW,CAEtC,KAAc,EAAe,EAAK,UAAU,EAAM,QAAQ;CAClE,CAAC;CAED,KAAK,IAAM,KAAQ,GAClB,GAAgB,EAAK,UAAU,CAAU;AAE3C;AAEA,SAAS,GAAa,GAAuC;CAC5D,OAAO;EACN,IAAI,EAAK;EACT,SAAS,EAAK;EACd,OAAO,EAAK;EACZ,OAAO,EAAK;EACZ,MAAM,EAAK;EACX,YAAY,EAAK;EACjB,UAAU,EAAK,SAAS,SAAS,IAAI,EAAK,SAAS,IAAI,EAAY,IAAI,KAAA;CACxE;AACD;AAEA,SAAgB,GAAoB,EACnC,UACA,oBACA,gBACA,mBACA,sBACA,uBACA,gBAAa,MACgC;CAC7C,IAAI,EAAgB,WAAW,KAAK,EAAM,WAAW,GACpD,OAAO,CAAC;CAGT,IAAM,IAA2B,CAAC,GAC5B,oBAAkB,IAAI,IAA6B;CAEzD,KAAK,IAAM,KAAQ,GAAO;EACzB,IAAI;EAEJ,KAAK,IAAM,KAAW,GAAiB;GACtC,IAAM,IAAY,OAAO,EAAK,MAAY,EAAE;GAE5C,IAAI,CAAC,KAAa,CAAC,GAAoB,IAAI,CAAO,GACjD;GAGD,IAAM,IAAQ,OAAO,EAAiB,GAAM,GAAS,CAAW,KAAK,EAAE,GACjE,IAAQ,GAAmB,IAAI,CAAO,IAAI,IAAQ,GAClD,IAAY,GAAG,EAAQ,GAAG,KAC1B,IAAY,IAAa,EAAW,mBAAmB,GACzD,IAAc,EAAU,IAAI,CAAS;GAoBzC,AAlBK,MACJ,IAAc,GAAkB;IAC/B,UAAU,GAAY;IACtB;IACA;IACA;IACA,MAAM,EAAe,IAAI,CAAO,IAAI,KAAA,IAAY;IAChD,UAAU;GACX,CAAC,GACD,EAAU,IAAI,GAAW,CAAW,GAEhC,IACH,EAAW,SAAS,KAAK,CAAW,IAEpC,EAAM,KAAK,CAAW,IAIxB,IAAa;EACd;CACD;CAIA,OAFA,GAAgB,GAAO,CAAU,GAE1B,EAAM,IAAI,EAAY;AAC9B;;;ACjJA,SAAgB,EACf,GACA,GACA,GACC;CACD,OAAO,EAAuC,GAAO,GAAQ,CAAY;AAC1E;;;ACMA,SAAS,GACR,GACA,GACA,GACC;CACD,OAAO,EAA8B,CACpC;EACC;EACA;EACA;CACD,CACD,CAAC;AACF;AAEA,SAAS,GAAe,GAA2D;CAClF,OAAO,EAAoB,EAAE,EAAE;AAChC;AASA,SAAgB,EAAiB,EAAE,UAAO,aAAU,UAAO,iBAAc,yBAA6C;CACrH,IAAM,IAAa,GAAG,EAAM,QAAQ,GAAG,EAAM,UACvC,IAAmB,QAAc,GAAyB,GAAO,GAAU,CAAK,GAAG;EAAC;EAAO;EAAU;CAAK,CAAC,GAC3G,IAAS,EAAyB,CAAC,CAAK,CAAC,GACzC,IAAsB,QACrB,EAA+B,GAAkB,GAAQ,CAAY,GAC3E;EAAC;EAAkB;EAAQ;CAAY,CACxC,GACM,IAAkB,QAAc,EAAoB,KAAK,MAAS,EAAK,EAAE,GAAG,CAAC,CAAmB,CAAC,GACjG,IAAuB,QAAc,IAAI,IAAI,CAAkB,GAAG,CAAC,CAAkB,CAAC,GACtF,IAAc,GAAe,CAAmB,KAAK,OAAO,KAAK,CAAQ,CAAC,CAAC,IAC3E,IAAa,EAAwB;EAC1C,SAAS;EACT,GAAG;CACJ,CAAC,GACK,IAAa,EAAmB;EACrC;EACA,OAAO;CACR,CAAC,GACK,EAAE,mBAAgB,yBAAsB,QAAc;EAC3D,IAAM,oBAAqB,IAAI,IAAY,GACrC,oBAAwB,IAAI,IAAY;EAE9C,KAAK,IAAM,KAAQ,GAIlB,CAHI,EAAK,QAAQ,YAAY,EAAM,aAClC,EAAmB,IAAI,EAAK,EAAE,GAE3B,EAAK,QAAQ,cAChB,EAAsB,IAAI,EAAK,EAAE;EAInC,OAAO;GACN,gBAAgB;GAChB,mBAAmB;EACpB;CACD,GAAG,CAAC,EAAM,UAAU,CAAmB,CAAC,GAClC,IAAQ,QAEZ,GAAoB;EACnB,OAAO,EAAW,MAAM,SAAS,CAAC;EAClC;EACA,aAAa,EAAW,MAAM,eAAe,CAAC;EAC9C;EACA;EACA,oBAAoB;EACpB,YAAY,EAAM;CACnB,CAAC,GACF;EACC;EACA,EAAW,MAAM;EACjB,EAAW,MAAM;EACjB;EACA,EAAM;EACN;EACA;CACD,CACD,GACM,IAAc,EAAoB,EAAE,EAAE,QAAQ,eAAe,qBAC7D,IAAmB,EAAQ,EAAO,EAAW,EAAE;CAErD,OAAO;EACN;EACA;EACA;EACA,WAAW,EAAW;EACtB,SAAS,EAAW;EACpB;EACA;CACD;AACD;;;ACrFA,SAAS,GAAiB,GAAiB,GAAe;CACzD,OAAO,GAAG,EAAQ,IAAI;AACvB;AAEA,SAAgB,GAAoB,GAAiD;CACpF,IAAM,oBAAW,IAAI,IAA4B,GAC3C,oBAAa,IAAI,IAAgC,GACjD,oBAAe,IAAI,IAAsB,GACzC,oBAAoB,IAAI,IAAoB,GAC5C,oBAAoB,IAAI,IAAoB,GAC9C,IAAgB,GAEd,KAAQ,GAAsB,MAAsB;EAIzD,AAHA,EAAS,IAAI,EAAK,IAAI,CAAI,GAC1B,EAAW,IAAI,EAAK,IAAI,CAAQ,GAChC,EAAkB,IAAI,EAAK,IAAI,GAAe,GAC9C,EAAkB,IAAI,GAAiB,EAAK,SAAS,EAAK,KAAK,GAAG,EAAK,EAAE;EAEzE,IAAM,KAAY,EAAK,YAAY,CAAC,EAAA,CAAG,KAAK,MAAU,EAAM,EAAE;EAC9D,EAAa,IAAI,EAAK,IAAI,CAAQ;EAElC,KAAK,IAAM,KAAS,EAAK,YAAY,CAAC,GACrC,EAAK,GAAO,EAAK,EAAE;CAErB;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,CAAI;CAGV,OAAO;EACN,SAAS,EAAM,KAAK,MAAS,EAAK,EAAE;EACpC;EACA;EACA;EACA;EACA;CACD;AACD;AAEA,SAAgB,GAAoB,GAAoC,GAAsB;CACxF,OACL,OAAO,EAAM,kBAAkB,IAAI,GAAiB,EAAM,SAAS,EAAM,KAAK,CAAC;AAChF;AAEA,SAAgB,EAA4B,GAAyC,GAAsB;CAC1G,IAAM,oBAAc,IAAI,IAAY;CAEpC,IAAI,CAAC,GACJ,OAAO;CAGR,KAAK,IAAM,CAAC,GAAS,MAAW,OAAO,QAAQ,CAAK,GACnD,KAAK,IAAM,KAAa,GAAQ;EAC/B,IAAM,IAAS,EAAM,kBAAkB,IAAI,GAAiB,GAAS,CAAS,CAAC;EAC/E,AAAI,KACH,EAAY,IAAI,CAAM;CAExB;CAGD,OAAO,GAA0B,GAAa,CAAK;AACpD;AAEA,SAAgB,EAA4B,GAA0B,GAA4C;CACjH,IAAM,IAAa,CAAC,GAAG,CAAW,CAAC,CAAC,MAClC,GAAQ,OACP,EAAM,kBAAkB,IAAI,CAAM,qBAClC,EAAM,kBAAkB,IAAI,CAAO,iBACtC,GACM,IAA+B,CAAC;CAEtC,KAAK,IAAM,KAAU,GAAY;EAChC,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM;EACjC,MAEL,EAAO,EAAK,WAAW,EAAO,EAAK,YAAY,CAAC,GAChD,EAAO,EAAK,QAAQ,CAAC,KAAK,EAAK,KAAK;CACrC;CAEA,OAAO;AACR;AAYA,SAAS,EAAe,GAAgB,GAAsB;CAC7D,IAAM,IAAsB,CAAC,GACzB,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAU,KAAK,CAAS,GACxB,IAAY,EAAM,WAAW,IAAI,CAAS;CAG3C,OAAO;AACR;AAEA,SAAS,GAAe,GAAgB,GAAoB,GAAsB;CACjF,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,MAAc,GACjB,OAAO;EAGR,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAS,EAA2B,GAA0B,GAAgB,GAAsB;CACnG,KAAK,IAAM,KAAc,CAAC,GAAG,CAAW,GACvC,AAAI,GAAe,GAAY,GAAQ,CAAK,KAC3C,EAAY,OAAO,CAAU;AAGhC;AAEA,SAAS,EAAoB,GAAgB,GAA0B,GAA+B;CACrG,IAAI,EAAY,IAAI,CAAM,GACzB,OAAO;CAER,IAAI,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,UAC/B,OAAO;CAGR,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAKpD,OAJI,EAAS,WAAW,KAIjB,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAa,CAAK,CAAC;AACpF;AAEA,SAAgB,GAA0B,GAA0B,GAAsB;CACzF,IAAM,IAAkB,IAAI,IAAI,CAAW;CAO3C,KAAK,IAAM,KAAc,CAAC,GAAG,CAAe,GACvC,MAAM,SAAS,IAAI,CAAU,CAAC,EAAE,sBAAsB,eAE1D;IAAgB,OAAO,CAAU;EACjC,KAAK,IAAM,KAAgB,EAAyB,GAAO,EAAM,aAAa,IAAI,CAAU,KAAK,CAAC,CAAC,GAClG,EAAgB,IAAI,CAAY;CAFA;CAMlC,KAAK,IAAM,KAAc,CAAC,GAAG,CAAe,GAC3C,AAAI,EAAe,GAAY,CAAK,CAAC,CAAC,MAAM,MAAe,EAAgB,IAAI,CAAU,CAAC,KACzF,EAAgB,OAAO,CAAU;CAInC,IAAM,IAAiB,CAAC,GAAG,EAAM,SAAS,KAAK,CAAC,CAAC,CAAC,MAChD,GAAQ,OAAa,EAAM,kBAAkB,IAAI,CAAO,KAAK,MAAM,EAAM,kBAAkB,IAAI,CAAM,KAAK,EAC5G;CAEA,KAAK,IAAM,KAAU,GAAgB;EACpC,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;EAGnD,EAAS,WAAW,KACpB,EAAgB,IAAI,CAAM,KAC1B,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,YAC5B,EAAM,SAAS,IAAI,CAAM,CAAC,EAAE,sBAAsB,iBAK/C,EAAS,OAAO,MAAY,EAAoB,GAAS,GAAiB,CAAK,CAAC,MACnF,EAA2B,GAAiB,GAAQ,CAAK,GACzD,EAAgB,IAAI,CAAM;CAE5B;CAEA,OAAO;AACR;AAEA,SAAS,EAA8B,GAA0B,GAAgB,GAAsB;CACtG,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAAW;EACjB,IAAI,EAAY,IAAI,CAAS,GAAG;GAC/B,EAAY,OAAO,CAAS;GAO5B,KAAK,IAAM,KAAW,EAAyB,GAAO,EAAM,aAAa,IAAI,CAAS,KAAK,CAAC,CAAC,GAC5F,EAAY,IAAI,CAAO;GAGxB,OAAO;EACR;EAEA,IAAY,EAAM,WAAW,IAAI,CAAS;CAC3C;CAEA,OAAO;AACR;AAEA,SAAgB,EAAmB,GAAgB,GAA0B,GAA+B;CAK3G,OAJI,EAAY,IAAI,CAAM,IAClB,KAGD,EAAe,GAAQ,CAAK,CAAC,CAAC,MAAM,MAAe,EAAY,IAAI,CAAU,CAAC;AACtF;AAEA,SAAS,EAA0B,GAAgB,GAA0B,GAAsB,GAA+B;CACjI,IAAM,IAAW,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC;CAEpD,IAAI,EAAY,IAAI,CAAM,GAEzB,OADA,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM;CAGzC,IAAI,EAAS,WAAW,GACvB,OAAO;EAAE,UAAU;EAAO,SAAS;CAAM;CAG1C,IAAM,IAAc,EAAS,KAAK,MAAY,EAA0B,GAAS,GAAa,GAAO,CAAK,CAAC,GACrG,IAAc,EAAY,OAAO,MAAe,EAAW,YAAY,CAAC,EAAW,OAAO,GAC1F,IAAiB,EAAY,MAAM,MAAe,EAAW,YAAY,EAAW,OAAO;CAYjG,OAVI,KACH,EAAM,YAAY,IAAI,CAAM,GACrB;EAAE,UAAU;EAAM,SAAS;CAAM,KAGrC,KACH,EAAM,WAAW,IAAI,CAAM,GACpB;EAAE,UAAU;EAAO,SAAS;CAAK,KAGlC;EAAE,UAAU;EAAO,SAAS;CAAM;AAC1C;AAEA,SAAgB,EAA0B,GAA0B,GAA8C;CACjH,IAAM,IAAgC;EACrC,6BAAa,IAAI,IAAI;EACrB,4BAAY,IAAI,IAAI;CACrB;CAEA,KAAK,IAAM,KAAU,EAAM,SAC1B,EAA0B,GAAQ,GAAa,GAAO,CAAK;CAG5D,OAAO;AACR;AAOA,SAAgB,EAAyB,GAAsB,IAA6B,EAAM,SAAsB;CACvH,IAAM,KAAkB,MAAyE;EAChG,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM,GAChC,KAAmB,EAAM,aAAa,IAAI,CAAM,KAAK,CAAC,EAAA,CAAG,IAAI,CAAc,GAC3E,IAAmB,EAAgB,SAAS,MAAc,EAAU,WAAW,GAC/E,IAAmB,GAAM,aAAa,MAAQ,EAAgB,MAAM,MAAc,EAAU,gBAAgB;EASlH,OAPI,CAAC,KAAQ,EAAK,WACV;GAAE,kBAAkB;GAAM,aAAa;EAAiB,IAE5D,EAAK,sBAAsB,gBACvB;GAAE;GAAkB,aAAa;EAAiB,IAGnD,IACJ;GAAE,kBAAkB;GAAM,aAAa;EAAiB,IACxD;GAAE,kBAAkB;GAAO,aAAa,CAAC,CAAM;EAAE;CACrD;CAEA,OAAO,IAAI,IAAI,EAAQ,SAAS,MAAW,EAAe,CAAM,CAAC,CAAC,WAAW,CAAC;AAC/E;AAEA,SAAgB,GAAyB,GAAgD,GAAsB,GAAsB;CACpI,IAAM,IAAc,EAA4B,GAAc,CAAK,GAE7D,KAAU,MAAqB;EACpC,IAAI,EAAmB,GAAU,GAAa,CAAK,GAAG;GACrD,IAAI,EAAY,IAAI,CAAQ,GAAG;IAC9B,EAAY,OAAO,CAAQ;IAC3B;GACD;GAEA,AAAI,EAA8B,GAAa,GAAU,CAAK,KAC7D,EAAO,CAAQ;GAGhB;EACD;EAGA,AADA,EAA2B,GAAa,GAAU,CAAK,GACvD,EAAY,IAAI,CAAQ;CACzB,GAEM,IAAsB,CAAC,GAAG,EAAyB,GAAO,CAAC,CAAY,CAAC,CAAC,GACzE,IACL,EAAoB,SAAS,KAAK,EAAoB,OAAO,MAAW,EAAmB,GAAQ,GAAa,CAAK,CAAC;CAEvH,KAAK,IAAM,KAAsB,GAAqB;EACrD,IAAM,IAAW,EAAmB,GAAoB,GAAa,CAAK;EAC1E,CAAK,KAAgC,KAAc,CAAC,KAAgC,CAAC,MACpF,EAAO,CAAkB;CAE3B;CAEA,OAAO,EAA4B,GAA0B,GAAa,CAAK,GAAG,CAAK;AACxF;AAEA,SAAS,GAAmB,GAAgB,GAAsB,GAA0B;CAC3F,IAAI,IAAY,EAAM,WAAW,IAAI,CAAM;CAE3C,OAAO,IAEN,AADA,EAAY,IAAI,CAAS,GACzB,IAAY,EAAM,WAAW,IAAI,CAAS;AAE5C;AAEA,SAAgB,GAAwB,GAA0B,GAAsB;CACvF,IAAM,oBAAc,IAAI,IAAY;CAEpC,KAAK,IAAM,KAAc,GACxB,GAAmB,GAAY,GAAO,CAAW;CAGlD,OAAO;AACR;AASA,SAAgB,GACf,GACA,GACA,GACC;CACD,IAAM,oBAAc,IAAI,IAAY;CAEpC,KAAK,IAAM,CAAC,GAAQ,MAAa,EAAM,cAAc;EACpD,IAAI,EAAS,WAAW,GACvB;EAGD,IAAM,IAAO,EAAM,SAAS,IAAI,CAAM;EACjC,MAID,EAAoB,IAAI,CAAM,KAAK,EAAwB,IAAI,EAAK,OAAO,MAC9E,EAAY,IAAI,CAAM;CAExB;CAEA,OAAO;AACR;AAEA,SAAS,EAAe,GAAsB,GAAyB,GAAiD;CACvH,IAAM,KAAoB,EAAK,YAAY,CAAC,EAAA,CAC1C,KAAK,MAAc,EAAe,GAAW,GAAiB,CAAW,CAAC,CAAC,CAC3E,QAAQ,MAA2C,EAAQ,CAAU;CAevE,OAZI,CAFc,EAAK,WAAW,YAAY,CAAC,CAAC,SAAS,CAEpD,KAAa,EAAiB,WAAW,IACtC,QAGJ,EAAiB,SAAS,KAC7B,EAAY,IAAI,EAAK,EAAE,GAGpB,EAAiB,WAAW,IACxB,IAGD;EACN,GAAG;EACH,UAAU;CACX;AACD;AAEA,SAAgB,GAAgB,GAAkC,GAAe;CAChF,IAAM,IAAkB,EAAM,KAAK,CAAC,CAAC,YAAY;CAEjD,IAAI,CAAC,GACJ,OAAO;EACN,OAAO,CAAC,GAAG,CAAK;EAChB,6BAAa,IAAI,IAAY;CAC9B;CAGD,IAAM,oBAAc,IAAI,IAAY;CAKpC,OAAO;EACN,OALqB,EACpB,KAAK,MAAS,EAAe,GAAM,GAAiB,CAAW,CAAC,CAAC,CACjE,QAAQ,MAAiC,EAAQ,CAG3C;EACP;CACD;AACD;AAEA,SAAgB,GAAwB,GAAkC,GAA8C;CACvH,IAAM,IAA8B,CAAC,GAE/B,KAAQ,GAAsB,GAAe,MAAsB;EACxE,IAAM,KAAe,EAAK,UAAU,UAAU,KAAK,GAC7C,IAAa,KAAe,EAAY,IAAI,EAAK,EAAE;EAEzD,MAAQ,KAAK;GACZ;GACA;GACA;GACA;GACA;GACA,QAAQ,CAAC;EACV,CAAC,GAEI,GAIL,KAAK,IAAM,KAAa,EAAK,YAAY,CAAC,GACzC,EAAK,GAAW,IAAQ,GAAG,EAAK,EAAE;CAEpC;CAEA,KAAK,IAAM,KAAQ,GAClB,EAAK,GAAM,CAAC;CAGb,OAAO;AACR;;;ACvcA,SAAgB,GAAiC,GAAmF;CACnI,IAAM,IAA2C,CAAC,GAC9C,IAAkB;CAEtB,OAAO,IAAkB,EAAQ,SAAQ;EACxC,IAAI,IAAyB,IAAkB;EAC/C,OAAO,IAAyB,EAAQ,UAAU,EAAQ,EAAuB,EAAE,UAAU,IAC5F,KAA0B;EAO3B,AAJA,EAAO,KAAK;GACX,YAAY;GACZ,mBAAmB;EACpB,CAAC,GACD,IAAkB;CACnB;CAEA,IAAM,IAAY,EAAO,KAAK,EAAE,eAAY,2BAAwB,GAAG,EAAW,GAAG,GAAmB,CAAC,CAAC,KAAK,GAAG;CAElH,OAAO;EACN,WAAW,EAAQ;EACnB;EACA,WAAW,GAAG,EAAQ,OAAO,GAAG;CACjC;AACD;;;ACrBA,IAAM,IAA2B,IAC3B,KAAsB,IACtB,KAAe,KACf,KAAa,IACb,IAAgB,IAChB,KAAmB,GACnB,KAAiC;AAEvC,SAAS,EAA2B,GAAe,GAAkB;CACpE,OAAO,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAI,IAAQ;AACtD;AAiBA,SAAS,EAAkC,GAAuC;CACjF,IAAM,IAAY,EAAM,oBAAoB,EAAM;CAClD,OAAO,KAAK,IAAI,IAAgC,CAAS;AAC1D;AASA,SAAgB,EAA6B,GAAyC,GAAiD;CACtI,IAAM,IAAqB,KAAK,IAAI,GAAG,CAAQ,GACzC,IAAoC,CAAC,GACvC,IAAS,GACT,IAAM,GACN,IAAsB;CAE1B,KAAK,IAAM,KAAS,EAAW,QAAQ;EACtC,IAAM,IAA6B,EAAkC,CAAK,GACpE,IAAgB,IAAqB,IAAM;EAEjD,AAAI,IAAM,KAAK,IAA6B,MAC3C,KAAuB,GACvB,KAAU,GACV,IAAM;EAGP,KAAK,IAAI,IAAQ,EAAM,YAAY,IAAQ,EAAM,mBAAmB,KAAS,GAI5E,AAHA,EAAW,KAAS;GAAE;GAAQ;EAAI,GAClC,KAAO,GAEH,IAAM,MACT,KAAU,GACV,IAAM;CAGT;CAEA,OAAO;EACN;EACA,iBAAiB,EAAW,SAAS,KAAK,IAAI,GAAG,EAAW,KAAK,MAAc,EAAU,MAAM,CAAC,IAAI;EACpG;CACD;AACD;AAQA,SAAgB,GAAiC,EAChD,eACA,mBACA,oBACA,kBACA,mBACA,qBAC6D;CAC7D,IAAM,IAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,EAAW,SAAS,IAAI,EAAW,YAAY,CAAC,CAAC,GAC9G,IAA2B,EAA2B,GAAgB,GAAuC,GAC7G,IAA4B,EAA2B,GAAiB,EAAmC,GAC3G,IAA0B,EAA2B,GAAe,IAA2B,EAAoB,GACnH,IAA2B,EAA2B,GAAgB,CAAyB,GAC/F,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAA0B,KAAK,IAAI,GAAG,IAA0B,EAAoB,CAAC,CAAC,GACxH,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAA2B,IAA2B,EAAoB,CAAC,GAC9G,IAA2B,KAAK,IAAI,GAAG,EAA2B,GAAgB,CAAC,CAAC,GACpF,IAAW,KAAK,IAAI,GAAY,CAAwB,GACxD,IAAoB,KAAK,IAAI,GAAG,KAAK,OAAO,IAAa,IAA2B,MAAe,GAA0B,CAAC,GAC9H,IAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAkB,GAAmB,KAAuB,CAAC,CAAC,GACpG,IAAwB,EAAW,OAAO,QAC9C,GAAS,MAAU,KAAK,IAAI,GAAS,EAAkC,CAAK,CAAC,GAC9E,CACD;CAEA,IAAI,MAAwB,GAC3B,OAAO;EACN,aAAa;EACb,UAAU;EACV,OAAO;EACP;EACA,WAAW;EACX,YAAY,CAAC;CACd;CAGD,IAAI,GACA,IAAY;CAEhB,KAAK,IAAI,IAAuB,GAAG,KAAwB,GAAgB,KAAwB,GAAG;EACrG,IAAI,IAAW,KAAK,IAAI,GAAuB,KAAK,KAAK,IAAsB,CAAoB,CAAC,GAChG,IAAS,EAA6B,GAAY,CAAQ;EAE9D,OAAO,EAAO,kBAAkB,KAAwB,IAAW,IAElE,AADA,KAAY,GACZ,IAAS,EAA6B,GAAY,CAAQ;EAG3D,IAAM,IAAc,EAAO,iBACrB,IAAe,KAAK,IAAI,GAAU,IAA2B,IAAc,MAAgB,IAAc,KAAK,EAAU,GACxH,IAAgB,KAAsB,IAAW,GACjD,IAAa,IAAe,GAC5B,IAAc,IAAgB,GAC9B,KAAoB,IAAc,IAAW,KAAuB,GACpE,IAAwB,EAAO,sBAAsB,GACrD,IACL,KAAK,IAAI,GAAY,CAAW,IAChC,MAAO,KAAK,IAAI,IAAa,CAAW,IACxC,MAAO,IACP,MAAO,IACP,OAAQ,IAAc;EAEvB,AAAI,IAAQ,MACX,IAAY,GACZ,IAAa;GACZ;GACA;GACA,OAAO,KAAK,IAAI,GAAY,CAAY;GACxC;GACA,WAAW;GACX,YAAY,EAAO;EACpB;CAEF;CAEA,OACC,KAAc;EACb,aAAa;EACb,UAAU;EACV,OAAO;EACP;EACA,WAAW;EACX,YAAY,EAA6B,GAAY,CAAmB,CAAC,CAAC;CAC3E;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEtKA,SAAgB,GAAgB,EAC/B,SACA,UACA,cACA,gBACA,eACA,aACA,YACA,kBACA,mBAAgB,QAChB,mBACA,wBACwB;CACxB,IAAM,IAAuB,MAAkB,QACzC,IAAuB,MAAkB,aAAa,MAAU;CAEtE,OACC,kBAAA,GAAA,EAAA,UAAA;EACC,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAY,OAAO,EAAE,gBAAgB,EAAM;GAAoB,eAAY;EAAQ,CAAA;EAC1G,KAAwB,IACxB,kBAAC,UAAD;GACC,MAAK;GACL,WAAW,EAAO;GAClB,UAAU,MAAU;IAEnB,AADA,EAAM,gBAAgB,GACtB,IAAiB;GAClB;GACA,cAAY,IAAa,mBAAmB;GAC5C,WAAQ;GACR,eAAa,IAAa,8BAA8B;GACxD,UAAA,kBAAC,IAAD,EAAkB,WAAW,EAAG,EAAO,kBAAkB,KAAc,EAAO,wBAAwB,EAAI,CAAA;EACnG,CAAA,IACL,IACH,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAyB,eAAY;EAAQ,CAAA,IAClE;EAEH,MAAkB,WAAW,MAAkB,YAC/C,kBAAC,QAAD;GACC,WAAW,EAAO;GAClB,cAAc,MAAU,EAAM,gBAAgB;GAC9C,UAAU,MAAU,EAAM,gBAAgB;GAC1C,UAAA,kBAAC,GAAD;IACC,OAAO;IACP,eAAe;IACf,UAAU,EAAK;IACf,cAAY,WAAW,EAAK;IAC5B,gBAAgB,IAAoB;GACpC,CAAA;EACI,CAAA,IACH,MAAkB,UACrB,kBAAC,QAAD;GACC,WAAW,EAAG,EAAO,eAAe,KAAY,EAAO,sBAAsB,KAAW,EAAO,oBAAoB;GACnH,eAAY;GACX,UAAA,IACA,kBAAC,IAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C,IACH,kBAAC,IAAD,EAAW,WAAW,EAAO,kBAAoB,CAAA,IAC9C;EACC,CAAA,IACH;EAEJ,kBAAC,OAAD;GAAK,WAAW,EAAO;GACtB,UAAA,kBAAC,GAAD;IACC,OAAO,EAAK;IACZ,MAAM,EAAK;IACA;IACX,gBAAgB,IAAuB,EAAO,sBAAsB,KAAA;IACpE,eAAe,IAAuB,EAAO,qBAAqB,KAAA;GAClE,CAAA;EACG,CAAA;CACJ,EAAA,CAAA;AAEJ;;;AClCA,SAAgB,GAAe,EAC9B,UACA,gBACA,aACA,gBACA,SACA,UACA,gBACA,eACA,kBACA,mBAAgB,QAChB,6BACA,MAAM,IACN,kBACA,gBACA,iBAAc,WACd,oBACA,wBACA,WACA,kBACA,aACA,oBACA,sBACA,cACA,aACuB;CACvB,IAAM,KAAW,EAAgC,IAAI,GAC/C,IAAqB,EAAiC,IAAI,GAE1D,CAAC,IAAkB,MAAuB,EAAS,EAAK,GACxD,IAAmB,OAAmB,KAAA,GACtC,IAAO,IAAmB,KAAiB,IAC3C,CAAC,GAAqB,MAA0B,wBAA6C,IAAI,IAAI,CAAC,GACtG,IAAsB,MAAgB,WAAY,MAAkB,UAAU,iBAAiB,kBAAmB,WAClH,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,KAAkB,QAAc,GAAG,EAAY,IAAI,EAAU,SAAS,KAAK,IAAI,CAAC,GAAa,CAAS,CAAC,GACvG,IAA4B,QAAc,IAAI,IAAI,EAAuB,GAAG,CAAC,EAAuB,CAAC,GACrG,EACL,OAAO,GACP,aACA,yBACG,EAAe;EAClB;EACA;EACA;EACA,aAAa;CACd,CAAC,GACK,MAAoB,MAAsB;EAS/C,AARI,KAAQ,CAAC,KAAY,KACxB,EAAS,EAAE,GAGP,KACJ,GAAoB,CAAQ,GAG7B,KAAe,CAAQ;CACxB,GACM,EAAE,OAAO,IAAe,aAAa,MAAsB,QAC1D,GAAgB,GAAO,CAAY,GACzC,CAAC,GAAO,CAAY,CACrB,GACM,IAAsB,QAAc,GAAwB,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC,GAC7G,KAAwB,QACvB,GAA6B,GAAW,GAA2B,CAAmB,GAC5F;EAAC;EAA2B;EAAqB;CAAS,CAC3D,GACM,KAAiB,QAChB,IAAI,IAAI,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,QAAQ,GAAG,OAAc,EAAS,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAY,CAAM,CAAC,GACjH,CAAC,CAAS,CACX,GACM,KAAsB,QAE1B,MAAkB,YACf,qBACA,IAAI,IAAI;EAAC,GAAG;EAAuB,GAAG;EAAmB,GAAG;CAAmB,CAAC,GACpF;EAAC;EAAgB;EAAuB;EAAe;EAAmB;CAAmB,CAC9F,GACM,IAAiB,QAAc,GAAwB,IAAe,EAAmB,GAAG,CAAC,IAAe,EAAmB,CAAC,GAChI,KAAgB,QAAc,EAAe,WAAW,MAAU,EAAY,IAAI,EAAM,KAAK,EAAE,CAAC,GAAG,CAAC,GAAa,CAAc,CAAC,GAChI,KAA0B,QAAc,GAAiC,CAAc,GAAG,CAAC,CAAc,CAAC,GAC1G,IAA6B,GACjC,MAAY;EACZ,IAAM,IAAS,GAAiC;GAC/C,GAAG;GACH,YAAY;EACb,CAAC,GACK,IAA+E,CAAC;EAMtF,OALA,EAAO,WAAW,SAAS,GAAW,MAAU;GAE/C,AADA,EAAoB,iBAAiB,EAAM,YAAY,OAAO,EAAU,MAAM,GAC9E,EAAoB,iBAAiB,EAAM,SAAS,OAAO,EAAU,GAAG;EACzE,CAAC,GAEM;GACN,OAAO,GAAG,EAAO,MAAM;GACvB,UAAU,GAAG,EAAO,SAAS;GAC7B,UAAU,GAAG,EAAO,MAAM;GAC1B,WAAW,GAAG,EAAO,UAAU;GAC/B,uBAAuB,OAAO,EAAO,WAAW;GAChD,oBAAoB,OAAO,EAAO,QAAQ;GAC1C,GAAG;EACJ;CACD,GACA,CAAC,EAAuB,CACzB,GACM,EACL,gBACA,YACA,oBACA,sBACA,kBACA,iBACA,kBACA,WACA,cACA,gBACA,kBACA,4BACA,2BACA,iBACA,0BACG,EAAyB;EAC5B,SAAS;EACT;EACA;EACA,cAAc;EACd,WAAW,MAAU,GAAe,EAAM,IAAI;EAC9C,oBAAoB,MAAU,EAAM,KAAK,aAAa;EACtD,UAAU,KAAY;EACtB,eAAe,MAAkB;EACjC,yBAAyB;EACzB,aAAa;EACb,mBAAmB,MAAkB,YAAY,SAAS;EAC1D,qBAAqB,MAAkB,YAAY,IAA6B,KAAA;CACjF,CAAC,GACK,KAAuB,EAAQ,QAC/B,KAAe,EAAY,OAAO,GAClC,KAAmB,MAAgB,aAAa,KAAQ,EAAa,SAAS,IAC9E,KAAe,KAAmB,IAAgB,KAAuB,IACzE,KAAqB,MAAgB,aAAa,EAAQ,GAC1D,KAAmB,MAAwB,kBAAkB,EAAQ,GACrE,KACJ,MAAwB,kBAAkB,CAAC,MAC3C,MAAwB,oBAAoB,CAAC,KAAuB,OACpE,MAAwB,aAAa,CAAC,IAClC,IAAoB,EAA2B;EACpD,MAAM;EACN;EACA;EACA,iBAAiB,EAAQ;EACzB;EACA;EACA;EACA;EACA;CACD,CAAC,GACK,KAAkB,MAAkB,aAAa,MAAkB,WAAW,GAC9E,KAAkB,MAAgB,WAClC,KACL,MAAmB,KAClB,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAvB,UAAA,CACE,KACA,kBAAC,GAAD;GACC,aAAa,EAAY;GACzB,eAAe,EAAY;GACP;EACpB,CAAA,IACE,MACH,KACA,kBAAC,GAAD;GACC,OAAO;GACP,UAAU;GACV,eAAe,EAAS,EAAE;GAC1B,aAAY;GACZ,YAAY,MAAU;IACrB,AAAI,EAAM,QAAQ,YAAY,EAAM,QAAQ,SAC3C,EAAM,gBAAgB;GAExB;GACA,UAAU,MAAU;IACnB,EAAM,gBAAgB;GACvB;EACA,CAAA,IACE,IACA;CACF,CAAA,IAAA,KAAA;CAEL,QAAsB;EACrB,AAAI,KAAQ,MAAkB,aAC7B,GAAqB;CAEvB,GAAG;EAAC,GAAwB;EAAW;EAAM;EAAe;CAAoB,CAAC;CAEjF,IAAM,MAAgB,MAAkC;EACvD,GAAS,UAAU;CACpB,GACM,WAA6B;EAIlC,AAHA,KAAmB,GACnB,EAAS,EAAE,GAEP,MAAkB,YACrB,GAAM;CAER,GAEM,MAAgB,MAA4B;EAC5C,EAAM,eAIX,IAAwB,MAAyB;GAChD,IAAM,IAAoB,IAAI,IAAI,CAAoB,GAChD,IAAuB,EAAqB,IAAI,EAAM,KAAK,EAAE,KAAK,EAA0B,IAAI,EAAM,KAAK,OAAO;GAIxH,OAFA,EAAkB,IAAI,EAAM,KAAK,IAAI,CAAC,CAAoB,GAEnD;EACR,CAAC;CACF;CAEA,OACC,kBAAC,GAAD;EAAoB;EAAoB;EAAuB;EAAgB;EAC5E,WAAA,EAAE,cAAW,YAAS,qBAAkB;GACzC,IAAM,IAAS,GAAG,EAAU,WACtB,IAAiB,OAAO,KAAU,WAAW,IAAQ;GAE3D,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;IACC,KAAK;IACL,SAAS;IACT,IAAI;IACJ,MAAK;IACL,MAAK;IACL,cAAa;IACF;IACD;IACV,UAAU,MAAgB;IAC1B,OAAO,MAAgB,aAAa,KAAqB,KAAK;IAC9D,aAAa,KAAyB,KAAkB,KAAA;IACxD,mBAAiB;IACjB,cAAY,IAAU,KAAA,IAAY;IAClC,oBAAkB;IAClB,iBAAe,MAAkB,YAAY,WAAW;IACxD,iBAAe;IACf,iBAAe,IAAO,IAAS,KAAA;IAC/B,qBAAmB,MAAkB,aAAa,MAAgB,WAAW,SAAS;IACtF,yBACC,MAAkB,aAAa,KAAQ,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IAEhG,gBAAgB,EAAG,MAAgB,EAAO,aAAa,MAAsB,EAAO,gBAAgB;IACpG,SACC,KACC,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAe,UAAA;IAAqB,CAAA,IACxD,KACH,IACG,KAAA;IAEL,cACC,kBAAC,GAAD;KACO;KACN,UAAU,KAAY;KACtB,mBAAmB,EAAkB;KACrC,eAAe,EAAkB;KAGhC,UAAA,MAAgB,KAChB,kBAAC,UAAD;MACC,MAAK;MACL,WAAW,EAAO;MAClB,cAAc,MAAU;OAEvB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;MACvB;MACA,UAAU,MAAU;OAGnB,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,GAAqB;MACtB;MACA,cAAW;MACX,UAAA,kBAAC,IAAD,CAAQ,CAAA;KACD,CAAA,IACL;IACiB,CAAA;IAEvB,WAAW,MAAU;KAChB,MAAgB,YAIpB,EAAkB,yBAAyB,EAAM,OAAO,KAAK;IAC9D;IACA,SAAS,EAAkB;IAC3B,UAAU,MAAU;KACnB,EAAkB,mBAAmB,EAAM,aAAa;IACzD;IACA,YAAY,MAAU;KACrB,IACC,MAAkB,aAClB,KACA,EAAM,QAAQ,SACd,CAAC,EAAM,YACP,EAAmB,SAClB;MAED,AADA,EAAM,eAAe,GACrB,EAAmB,QAAQ,MAAM;MACjC;KACD;KAEA,GAAuB,CAAK,GAExB,GAAM,oBAIV,EAAkB,qBAAqB;MACtC;MACA,0BAA0B;OACzB,IAAM,IAAc,KAAe,IAAI,EAAe,KAAe,KAAA;OACrE,AAAI,KACH,GAAa,CAAW;MAE1B;MACA,uBAAuB,MAAgB;KACxC,CAAC;IACF;GACA,CAAA,GAED,kBAAC,GAAD;IACO;IACG;IACO;IACR;IACC;IACO;IAChB,eAAe;IACf,gBACC,MAAkB,aAAa,EAAe,SAAS,IAAI,GAAkB,CAAM,IAAI,KAAA;IAExF,qBAAqB,MAAkB,aAAa,MAAkB;IACtE,WAAW,MAAkB,YAAY,WAAW;IACvC;IACK;IAClB,WAAW;IACX,WAAW,EAAS;IACpB,iBAAiB,MAAkB,YAAY,EAAO,yBAAyB,KAAA;IAC/E,eAAc;IACd,QAAQ;IACR,UAAA,kBAAC,OAAD;KAAK,WAAW,EAAG,MAAkB,aAAa,EAAO,WAAW;KAClE,UAAA,EAAe,WAAW,IAC1B,kBAAC,GAAD;MAAc,YAAY;MAAO,YAAY,CAAC,MAAS,CAAC,IAAY,eAAe,KAAA;KAAY,CAAA,IAE/F,EAAe,KAAK,GAAO,MAAU;MACpC,IAAM,IACL,MAAkB,UACf,EAAmB,EAAM,KAAK,IAAI,GAAa,CAAS,IACxD,EAAY,IAAI,EAAM,KAAK,EAAE,GAC3B,IAAU,MAAkB,WAAW,CAAC,KAAY,EAAW,IAAI,EAAM,KAAK,EAAE,GAChF,IAAS,MAAU,GACnB,IAAiB,EAAM,KAAK,aAAa;MAE/C,OACC,kBAAC,OAAD;OAEC,WAAQ;OACR,IAAI,GAAY,GAAQ,CAAK;OAC7B,MAAM,MAAS,GAAa,GAAO,CAAI;OACvC,MAAM,MAAkB,YAAY,KAAA,IAAY;OAChD,iBAAe,MAAkB,YAAY,KAAA,IAAY;OACzD,iBAAe,KAAkB,KAAA;OACjC,WAAW,EACV,EAAO,SACP,MAAkB,aAAa,EAAO,eACtC,KAAkB,EAAO,iBACzB,KAAU,EAAO,eACjB,KAAY,EAAO,eACpB;OACA,OACC,MAAkB,YACd;QACD,wBAAwB,qBAAqB,EAAM;QACnD,qBAAqB,qBAAqB,EAAM;OACjD,IACC,KAAA;OAEJ,cAAc,MAAU;QACvB,EAAM,eAAe;OACtB;OACA,eAAe,GAAa,CAAK;OACjC,UAAA,kBAAC,OAAD;QAAK,WAAW,EAAO;QACtB,UAAA,kBAAC,IAAD;SACC,MAAM,EAAM;SACZ,OAAO,EAAM;SACb,WAAW;SACX,aAAa,EAAM;SACnB,YAAY,EAAM;SACR;SACD;SACM;SACA;SACf,sBAAsB,GAAa,CAAK;SACxC,yBAAyB,GAAa,CAAK;QAC3C,CAAA;OACG,CAAA;MACD,GAzCC,EAAM,KAAK,EAyCZ;KAEP,CAAC;IAEE,CAAA;GACO,CAAA,CACZ,EAAA,CAAA;EAEJ;CACY,CAAA;AAEf;;;AC3bA,SAAS,GAAuB,GAA0B,GAAmD;CACxG,MAAY,SAAS,GAIzB;MAAI,EAAY,SAAS,GAAG;GAC3B,IAAM,IAAe,EAAU,SAAS,IAAI,CAAC,GAAG,CAAW,CAAC,CAAC,EAAE;GAM/D,OAJK,IAIE,EAAa,QAHnB;EAIF;EAEA,OAAO,EAAkB,EAAY,IAAI;CAFzC;AAGD;AAMA,SAAS,GACR,GACA,GACA,GACC;CACD,IAAM,IAAU,EAA4B,GAAM,CAAS,GACrD,IAAW,EAA4B,GAAO,CAAS;CAE7D,OAAO,EAAQ,SAAS,EAAS,QAAQ,CAAC,GAAG,CAAO,CAAC,CAAC,OAAO,MAAW,EAAS,IAAI,CAAM,CAAC;AAC7F;AAEA,SAAgB,GAAgB,EAC/B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,mBAAgB,QAChB,8BACwB;CACxB,IAAM,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,EAAE,eAAY,kBAAe,mBAAgB,EAA4B;EAC9E;EACA;EACA,UAAU;EACV,UAAU,GAAM,MAAU,GAA4B,GAAM,GAAO,CAAS;CAC7E,CAAC,GACK,IAAe,IAAO,IAAa,GACnC,IAAc,QAAc,EAA4B,GAAc,CAAS,GAAG,CAAC,GAAc,CAAS,CAAC,GAC3G,IAAiB,QAAc,EAA0B,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC,GAC1G,IAAkB,QAAc,GAAuB,GAAa,CAAS,GAAG,CAAC,GAAa,CAAS,CAAC;CAmB9G,OACC,kBAAC,IAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,EAAe;EAC5B,YAAY,EAAe;EAC3B,eAAc;EACC;EACU;EACnB;EACN,eAhCwB,MAAsB;GAK/C,AAJI,KAAY,CAAC,KAChB,EAAY,GAGb,EAAQ,CAAQ;EACjB;EA2BE,aAAa;GACZ,mBA3BqB;IACvB,EAAc,EAA4B,EAAyB,CAAS,GAAG,CAAS,CAAC;GAC1F;GA0BG,qBAAqB,EAAc,CAAC,CAAC;EACtC;EACA,aAAY;EACZ,iBAAiB,IAAkB,kBAAC,GAAD,EAAkB,OAAO,EAAkB,CAAA,IAAI,KAAA;EAC3E;EACO;EACL;EACT,iBAAiB,MAAS;GACzB,GAAe,MAAsB,GAAyB,GAAmB,EAAK,IAAI,CAAS,CAAC;EACrG;EACA,wBAnC2B;GAG5B,AAFA,EAAc,CAAC,CAAC,GAEX,KACJ,EAAS,CAAC,CAAC;EAEb;EA8Ba;EACJ;CACP,CAAA;AAEH;;;ACpGA,SAAgB,GAAqB,EACpC,UACA,gBACA,aACA,SACA,gBACA,UACA,iBACA,YACA,kBACA,UACA,aACA,UACA,aACA,UACA,4BACA,iBACA,uBACA,qBAC6B;CAC7B,IAAM,IAAW,EAAiB;EACjC;EACA;EACA;EACA;EACA;CACD,CAAC,GACK,IAAQ,QACP,IAAiB,EAAS,OAAO,EAAE,iBAAiB,EAAS,gBAAgB,CAAC,KAAK,EAAS,OAClG;EAAC;EAAgB,EAAS;EAAO,EAAS;CAAe,CAC1D;CAEA,OACC,kBAAC,IAAD;EACQ;EACM;EACb,UAAU,KAAY,EAAS;EACzB;EACN,aAAa,KAAe,EAAS;EAC9B;EACA;EACG;EACH;EACO;EACL;EACM;EACU;EACzB,WAAW,EAAS;EACpB,OAAO,EAAS,UAAU,oBAAoB,KAAA;CAC9C,CAAA;AAEH;;;AC1EA,SAAS,GAAsB,GAAkC;CAC3D,OAQL,OAJI,EAAK,QAAQ,EAAK,SAAS,EAAK,QAC5B,GAAG,EAAK,MAAM,KAAK,EAAK,SAGzB,EAAK;AACb;AAEA,SAAgB,GAAW,EAC1B,UACA,gBACA,aACA,iBAAc,qBACd,SACA,UACA,UACA,aACA,UACA,iBACA,YACA,cACA,UACA,eAAY,IACZ,8BACmB;CACnB,IAAM,IAAY,QAAc,GAAoB,CAAK,GAAG,CAAC,CAAK,CAAC,GAC7D,IAAa,GAAoB,GAAO,CAAS,GACjD,IAAe,IAAa,EAAU,SAAS,IAAI,CAAU,IAAI,KAAA;CAEvE,OACC,kBAAC,IAAD;EACQ;EACM;EACH;EACG;EACP;EACC;EACP,aAAa,oBAAa,IAAI,IAAI,CAAC,CAAU,CAAC,oBAAI,IAAI,IAAI;EAC1D,4BAAY,IAAI,IAAI;EACpB,eAAc;EACW;EACzB,aAAY;EACZ,qBAAqB,GAAsB,CAAY;EAChD;EACO;EACL;EACT,iBAAiB,MAAS,EAAS;GAAE,SAAS,EAAK;GAAS,OAAO,EAAK;EAAM,CAAC;EAC/E,kBAAkB,UAAkB,EAAS,KAAA,CAAS,IAAI,KAAA;EAC/C;EACJ;CACP,CAAA;AAEH;;;ACvDA,SAAgB,GAAgB,EAC/B,UACA,gBACA,aACA,SACA,gBACA,UACA,iBACA,YACA,UACA,aACA,UACA,aACA,UACA,cACA,8BACwB;CACxB,IAAM,IAAW,EAAiB;EACjC;EACA;EACA;CACD,CAAC;CAED,OACC,kBAAC,IAAD;EACQ;EACM;EACb,UAAU,KAAY,EAAS;EACzB;EACN,aAAa,KAAe,EAAS;EACrC,OAAO,EAAS;EACT;EACG;EACH;EACO;EACL;EACgB;EACzB,WAAW,EAAS;EACpB,OAAO,EAAS,UAAU,oBAAoB,KAAA;EACnC;CACX,CAAA;AAEH"}
@@ -6,9 +6,11 @@ type BuildODataTreeNodesArgs = {
6
6
  keyPairsMap: Record<string, string>;
7
7
  hiddenCodeKeys: Set<string>;
8
8
  textValueCodeKeys?: Set<string>;
9
+ /** Уровни, для которых пустой код остаётся структурным узлом вместо остановки ветки. */
10
+ allowEmptyCodeKeys?: ReadonlySet<string>;
9
11
  /** Выбирает локальный порядок узлов: по исходному коду или отображаемому тексту. */
10
12
  sortByCode?: boolean;
11
13
  };
12
- export declare function buildODataTreeNodes({ items, orderedCodeKeys, keyPairsMap, hiddenCodeKeys, textValueCodeKeys, sortByCode }: BuildODataTreeNodesArgs): TreeSelectNode[];
14
+ export declare function buildODataTreeNodes({ items, orderedCodeKeys, keyPairsMap, hiddenCodeKeys, textValueCodeKeys, allowEmptyCodeKeys, sortByCode }: BuildODataTreeNodesArgs): TreeSelectNode[];
13
15
  export {};
14
16
  //# sourceMappingURL=buildODataTreeNodes.d.ts.map
@@ -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,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA4EF,wBAAgB,mBAAmB,CAAC,EACnC,KAAK,EACL,eAAe,EACf,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,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,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"}
@@ -2,8 +2,10 @@ import { ODataDependentBaseProps, ODataDependentSegmentItem } from "@ryuzaki13/r
2
2
  type UseODataTreeDataProps = Pick<ODataDependentBaseProps, "odata" | "segments" | "model"> & {
3
3
  /** Явный порядок уровней поверх автоматически разрешённой metadata-chain. */
4
4
  segmentOrder?: readonly string[];
5
+ /** Уровни, на которых пустой код не должен обрывать последующие уровни дерева. */
6
+ allowEmptyCodeKeys?: readonly string[];
5
7
  };
6
- export declare function useODataTreeData({ odata, segments, model, segmentOrder }: UseODataTreeDataProps): {
8
+ export declare function useODataTreeData({ odata, segments, model, segmentOrder, allowEmptyCodeKeys }: UseODataTreeDataProps): {
7
9
  nodes: import("..").TreeSelectNode[];
8
10
  orderedSegmentItems: ODataDependentSegmentItem[];
9
11
  orderedCodeKeys: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"useODataTreeData.d.ts","sourceRoot":"","sources":["../../../src/tree-select/model/useODataTreeData.ts"],"names":[],"mappings":"AAEA,OAAO,EAGN,uBAAuB,EACvB,yBAAyB,EAIzB,MAAM,uCAAuC,CAAC;AAuB/C,KAAK,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG;IAC5F,6EAA6E;IAC7E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,qBAAqB;;;;;;;;EA4D/F"}
1
+ {"version":3,"file":"useODataTreeData.d.ts","sourceRoot":"","sources":["../../../src/tree-select/model/useODataTreeData.ts"],"names":[],"mappings":"AAEA,OAAO,EAGN,uBAAuB,EACvB,yBAAyB,EAIzB,MAAM,uCAAuC,CAAC;AAuB/C,KAAK,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG;IAC5F,6EAA6E;IAC7E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,qBAAqB;;;;;;;;EAsEnH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-ui",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "Reusable React foundation UI primitives and Storybook stories.",
5
5
  "license": "MIT",
6
6
  "author": "Ryuzaki13",
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-BzOQALx6.js";import{i as n,r}from"./react-qN2cStNd.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-CJgZDWNs.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-CAiQwpc2.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-C0FnF6B9.js";import{n as t}from"./iframe-CL2itEXQ.js";import{i as n,r}from"./react-qN2cStNd.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-ChBwnZQl.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-DphBeFms.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 подходит для коротких подписей, которые должны быстро читаться и не перегружать интерфейс:`}),`
@@ -1,4 +1,4 @@
1
- import{n as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{t as n}from"./react-C21x__mS.js";import{n as r}from"./iframe-BzOQALx6.js";import{i,n as a,r as o,t as s}from"./BadgeList-CR6uQVoG.js";var c=t({Appearances:()=>h,Basic:()=>p,RemovableList:()=>_,Sizes:()=>g,Tones:()=>m,__namedExportsOrder:()=>v,default:()=>f}),l,u,d,f,p,m,h,g,_,v;function y(){return(y=e((()=>{l=n(),i(),a(),u=r(),{useArgs:d}=__STORYBOOK_MODULE_PREVIEW_API__,f={title:`Shared/UI/Badge`,component:o,args:{children:`Новый`,size:`md`,tone:`info`,appearance:`solid`},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{children:{description:`Текст внутри бейджа.`,control:`text`},size:{description:`Размер бейджа.`,control:`inline-radio`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Цветовой тон бейджа.`,control:`inline-radio`,options:[`neutral`,`brand`,`success`,`warning`,`error`,`info`]},appearance:{description:`Форма бейджа.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},onRemove:{description:`Показывает кнопку удаления и вызывает обработчик по клику.`,control:!1}}},p={render:function(){let[e]=d();return(0,u.jsx)(o,{...e})}},m={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Neutral`}),(0,u.jsx)(o,{tone:`success`,appearance:`solid`,children:`Успешно`}),(0,u.jsx)(o,{tone:`warning`,appearance:`solid`,children:`Внимание`}),(0,u.jsx)(o,{tone:`error`,appearance:`solid`,children:`Ошибка`}),(0,u.jsx)(o,{tone:`info`,appearance:`solid`,children:`Информация`})]})},h={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`solid`,children:`Solid`}),(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Outline`}),(0,u.jsx)(o,{tone:`info`,appearance:`ghost`,children:`Ghost`}),(0,u.jsx)(o,{tone:`warning`,appearance:`transparent`,children:`Transparent`})]})},g={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{size:`xs`,children:`Extra Small`}),(0,u.jsx)(o,{size:`sm`,children:`Small`}),(0,u.jsx)(o,{size:`md`,children:`Medium`}),(0,u.jsx)(o,{size:`lg`,children:`Large`}),(0,u.jsx)(o,{size:`xl`,children:`Extra Large`})]})},_={render:()=>{let[e,t]=(0,l.useState)([`Фильтр A`,`Фильтр B`,`Фильтр C`]);return(0,u.jsx)(s,{children:e.map(e=>(0,u.jsx)(o,{tone:`info`,appearance:`outline`,onRemove:()=>t(t=>t.filter(t=>t!==e)),children:e},e))})}},p.parameters={...p.parameters,docs:{...p.parameters?.docs,source:{originalSource:`{
1
+ import{n as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{t as n}from"./react-C21x__mS.js";import{n as r}from"./iframe-CL2itEXQ.js";import{i,n as a,r as o,t as s}from"./BadgeList-DLOBwonr.js";var c=t({Appearances:()=>h,Basic:()=>p,RemovableList:()=>_,Sizes:()=>g,Tones:()=>m,__namedExportsOrder:()=>v,default:()=>f}),l,u,d,f,p,m,h,g,_,v;function y(){return(y=e((()=>{l=n(),i(),a(),u=r(),{useArgs:d}=__STORYBOOK_MODULE_PREVIEW_API__,f={title:`Shared/UI/Badge`,component:o,args:{children:`Новый`,size:`md`,tone:`info`,appearance:`solid`},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{children:{description:`Текст внутри бейджа.`,control:`text`},size:{description:`Размер бейджа.`,control:`inline-radio`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Цветовой тон бейджа.`,control:`inline-radio`,options:[`neutral`,`brand`,`success`,`warning`,`error`,`info`]},appearance:{description:`Форма бейджа.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},onRemove:{description:`Показывает кнопку удаления и вызывает обработчик по клику.`,control:!1}}},p={render:function(){let[e]=d();return(0,u.jsx)(o,{...e})}},m={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Neutral`}),(0,u.jsx)(o,{tone:`success`,appearance:`solid`,children:`Успешно`}),(0,u.jsx)(o,{tone:`warning`,appearance:`solid`,children:`Внимание`}),(0,u.jsx)(o,{tone:`error`,appearance:`solid`,children:`Ошибка`}),(0,u.jsx)(o,{tone:`info`,appearance:`solid`,children:`Информация`})]})},h={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`solid`,children:`Solid`}),(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Outline`}),(0,u.jsx)(o,{tone:`info`,appearance:`ghost`,children:`Ghost`}),(0,u.jsx)(o,{tone:`warning`,appearance:`transparent`,children:`Transparent`})]})},g={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{size:`xs`,children:`Extra Small`}),(0,u.jsx)(o,{size:`sm`,children:`Small`}),(0,u.jsx)(o,{size:`md`,children:`Medium`}),(0,u.jsx)(o,{size:`lg`,children:`Large`}),(0,u.jsx)(o,{size:`xl`,children:`Extra Large`})]})},_={render:()=>{let[e,t]=(0,l.useState)([`Фильтр A`,`Фильтр B`,`Фильтр C`]);return(0,u.jsx)(s,{children:e.map(e=>(0,u.jsx)(o,{tone:`info`,appearance:`outline`,onRemove:()=>t(t=>t.filter(t=>t!==e)),children:e},e))})}},p.parameters={...p.parameters,docs:{...p.parameters?.docs,source:{originalSource:`{
2
2
  render: function Render() {
3
3
  const [args] = useArgs<BadgeStoryArgs>();
4
4
  return <Badge {...args} />;
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-C21x__mS.js";import{n,t as r}from"./x-D6Ja8T8F.js";import{n as i}from"./iframe-BzOQALx6.js";import{a,i as o}from"./utils-DUM89eIj.js";import{a as s,l as c}from"./array-D-_yMMUK-CIRmlF93.js";import{n as l,t as u}from"./FloatingPopover-CI_Jz1zd.js";import{a as d,i as f,r as p,t as m}from"./uiClasses-DiXn3Hc-.js";import{n as h,t as g}from"./FlexContainer-LmZIdhq2.js";function _({maxChar:e,placement:t=`left`,closeDelay:n=0,maxWidth:r,children:i,block:a,state:o,textWrap:s,textWrapProps:l}){let d=c(i);if(!d.length||e&&d.length<e)return(0,v.jsx)(`span`,{children:d});let f=s??`div`,p={style:{display:a?`block`:`inline-block`,width:e?`${e-3}ch`:`auto`},className:`textOverflow`},m={...l,...p,style:{...l?.style,...p.style},className:[l?.className,p.className].filter(Boolean).join(` `)};return(0,v.jsx)(u,{state:o,placement:t,openOnHover:!0,content:d,closeDelay:n,maxWidth:r,children:(0,v.jsx)(f,{...m,children:d})})}var v;function y(){return(y=e((()=>{s(),l(),v=i(),_.__docgenInfo={description:``,methods:[],displayName:`TextOverflow`,props:{children:{required:!0,tsType:{name:`string`},description:``},maxChar:{required:!1,tsType:{name:`number`},description:``},maxWidth:{required:!1,tsType:{name:`number`},description:`Максимальная ширина тултипа в em.`},placement:{required:!1,tsType:{name:`Placement`},description:``,defaultValue:{value:`"left"`,computed:!1}},closeDelay:{required:!1,tsType:{name:`number`},description:``,defaultValue:{value:`0`,computed:!1}},block:{required:!1,tsType:{name:`literal`,value:`true`},description:`Для работы text-overflow элемент обязан быть блочным или inline-block.
1
+ import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-C21x__mS.js";import{n,t as r}from"./x-B7nOtyoJ.js";import{n as i}from"./iframe-CL2itEXQ.js";import{a,i as o}from"./utils-DUM89eIj.js";import{a as s,l as c}from"./array-D-_yMMUK-CIRmlF93.js";import{n as l,t as u}from"./FloatingPopover-DqhpAE-b.js";import{a as d,i as f,r as p,t as m}from"./uiClasses-DiXn3Hc-.js";import{n as h,t as g}from"./FlexContainer-LmZIdhq2.js";function _({maxChar:e,placement:t=`left`,closeDelay:n=0,maxWidth:r,children:i,block:a,state:o,textWrap:s,textWrapProps:l}){let d=c(i);if(!d.length||e&&d.length<e)return(0,v.jsx)(`span`,{children:d});let f=s??`div`,p={style:{display:a?`block`:`inline-block`,width:e?`${e-3}ch`:`auto`},className:`textOverflow`},m={...l,...p,style:{...l?.style,...p.style},className:[l?.className,p.className].filter(Boolean).join(` `)};return(0,v.jsx)(u,{state:o,placement:t,openOnHover:!0,content:d,closeDelay:n,maxWidth:r,children:(0,v.jsx)(f,{...m,children:d})})}var v;function y(){return(y=e((()=>{s(),l(),v=i(),_.__docgenInfo={description:``,methods:[],displayName:`TextOverflow`,props:{children:{required:!0,tsType:{name:`string`},description:``},maxChar:{required:!1,tsType:{name:`number`},description:``},maxWidth:{required:!1,tsType:{name:`number`},description:`Максимальная ширина тултипа в em.`},placement:{required:!1,tsType:{name:`Placement`},description:``,defaultValue:{value:`"left"`,computed:!1}},closeDelay:{required:!1,tsType:{name:`number`},description:``,defaultValue:{value:`0`,computed:!1}},block:{required:!1,tsType:{name:`literal`,value:`true`},description:`Для работы text-overflow элемент обязан быть блочным или inline-block.
2
2
  Если в качестве обёртки передается инлайновый компонент, то он будет
3
3
  перезаписан через стили на display: block или inline-block в зависимости
4
4
  от установки данного пропса.`},state:{required:!1,tsType:{name:`union`,raw:`"information" | "error" | "warning" | "success" | "negative"`,elements:[{name:`literal`,value:`"information"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"negative"`}]},description:``},textWrap:{required:!1,tsType:{name:`T`},description:``},textWrapProps:{required:!1,tsType:{name:`Omit`,elements:[{name:`ComponentProps`,elements:[{name:`T`}],raw:`ComponentProps<T>`},{name:`literal`,value:`"children"`}],raw:`Omit<ComponentProps<T>, "children">`},description:``}}}})))()}var b,x,S,C,w,T,E,D,O,k;function A(){return(A=e((()=>{b=`qBtmnH`,x=`p-HsHY`,S=`u9tQAE`,C=`FRScRz`,w=`W13uQO`,T=`_3IRcM9`,E=`R3ybI7`,D=`DdWAaC`,O=`_5cXBQF`,k={badge:b,passive:x,sizeXs:S,sizeSm:C,sizeMd:w,sizeLg:T,sizeXl:E,content:D,removeButton:O}})))()}function j({children:e,size:t=`sm`,tone:n,appearance:i,className:o,onRemove:s}){let c=n??`neutral`,l=d({tone:n,appearance:i,fallbackTone:c,fallbackAppearance:c===`neutral`?`outline`:`solid`});return(0,M.jsxs)(`div`,{className:a(k.badge,N[t],p(l.tone),m(l.appearance),!s&&k.passive,o),children:[(0,M.jsx)(_,{maxChar:25,placement:`top`,block:!0,textWrapProps:{className:k.content},children:String(e)}),s&&(0,M.jsx)(`button`,{type:`button`,onClick:s,className:k.removeButton,"aria-label":`Удалить бейдж`,"data-ui":`badge-remove-button`,"data-action":`remove-badge`,children:(0,M.jsx)(r,{})})]})}var M,N;function P(){return(P=e((()=>{o(),n(),y(),f(),A(),M=i(),N={xs:k.sizeXs,sm:k.sizeSm,md:k.sizeMd,lg:k.sizeLg,xl:k.sizeXl},j.__docgenInfo={description:`Компактный индикатор для статусов, категорий и коротких служебных меток.`,methods:[],displayName:`Badge`,props:{children:{required:!0,tsType:{name:`union`,raw:`string | number`,elements:[{name:`string`},{name:`number`}]},description:``},size:{required:!1,tsType:{name:`union`,raw:`"xs" | "sm" | "md" | "lg" | "xl"`,elements:[{name:`literal`,value:`"xs"`},{name:`literal`,value:`"sm"`},{name:`literal`,value:`"md"`},{name:`literal`,value:`"lg"`},{name:`literal`,value:`"xl"`}]},description:``,defaultValue:{value:`"sm"`,computed:!1}},tone:{required:!1,tsType:{name:`union`,raw:`"neutral" | "brand" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"neutral"`},{name:`literal`,value:`"brand"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"info"`}]},description:``},appearance:{required:!1,tsType:{name:`union`,raw:`"solid" | "outline" | "ghost" | "transparent"`,elements:[{name:`literal`,value:`"solid"`},{name:`literal`,value:`"outline"`},{name:`literal`,value:`"ghost"`},{name:`literal`,value:`"transparent"`}]},description:``},className:{required:!1,tsType:{name:`string`},description:``},onRemove:{required:!1,tsType:{name:`signature`,type:`function`,raw:`() => void`,signature:{arguments:[],return:{name:`void`}}},description:``}}}})))()}function F({children:e}){return(0,L.jsx)(g,{inline:!0,wrap:!0,gap:`sm`,align:`baseline`,children:I.Children.map(e,(e,t)=>(0,L.jsx)(I.Fragment,{children:e},t))})}var I,L;function R(){return(R=e((()=>{I=t(),h(),L=i(),F.__docgenInfo={description:"Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.",methods:[],displayName:`BadgeList`,props:{children:{required:!0,tsType:{name:`Array`,elements:[{name:`ReactElement`,elements:[{name:`union`,raw:`typeof Badge | null | undefined | false`,elements:[{name:`Badge`},{name:`null`},{name:`undefined`},{name:`literal`,value:`false`}]}],raw:`ReactElement<typeof Badge | null | undefined | false>`}],raw:`ReactElement<typeof Badge | null | undefined | false>[]`},description:``}}}})))()}export{P as i,R as n,j as r,F as t};