@ryuzaki13/react-foundation-ui 1.2.1 → 1.2.2

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 (199) hide show
  1. package/dist/advanced-search/index.js +1 -1
  2. package/dist/chunks/{multi-select-Bg7Psslp.js → multi-select-DgSwr3Pf.js} +5 -6
  3. package/dist/chunks/multi-select-DgSwr3Pf.js.map +1 -0
  4. package/dist/chunks/{select-DKbSVCp4.js → select-kZQRRj2e.js} +23 -24
  5. package/dist/chunks/{select-DKbSVCp4.js.map → select-kZQRRj2e.js.map} +1 -1
  6. package/dist/chunks/useODataSelectBase-CWBR3WCn.js +149 -0
  7. package/dist/chunks/useODataSelectBase-CWBR3WCn.js.map +1 -0
  8. package/dist/multi-select/index.js +1 -1
  9. package/dist/preset-select/index.js +1 -1
  10. package/dist/select/index.js +1 -1
  11. package/dist/state-select/index.js +1 -1
  12. package/dist/tree-select/TreeMultiSelect.d.ts.map +1 -1
  13. package/dist/tree-select/TreePickerBase.d.ts +3 -1
  14. package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
  15. package/dist/tree-select/index.js +235 -215
  16. package/dist/tree-select/index.js.map +1 -1
  17. package/package.json +1 -1
  18. package/storybook-static/assets/{Badge-DGkAgQtD.js → Badge-uO9G8XfM.js} +1 -1
  19. package/storybook-static/assets/{Badge.stories-BNnfMijp.js → Badge.stories-D7xAm88f.js} +1 -1
  20. package/storybook-static/assets/{Button-2V7cFs7U.js → Button-CMIn9ZGH.js} +1 -1
  21. package/storybook-static/assets/{Button-vNsY1Xgh.js → Button-CTNNWxuu.js} +1 -1
  22. package/storybook-static/assets/{Button.stories-qrLBulWZ.js → Button.stories-CPe9cLIw.js} +1 -1
  23. package/storybook-static/assets/{CheckBox-DeEGRsNS.js → CheckBox-Dpg_g4z4.js} +1 -1
  24. package/storybook-static/assets/{CheckBox-Dnxk4w_M.js → CheckBox-rvChOzA-.js} +1 -1
  25. package/storybook-static/assets/{CheckBox.stories-CuPBzuQf.js → CheckBox.stories-CWShbXBJ.js} +1 -1
  26. package/storybook-static/assets/{Color-KMSTOMOX-3kWYdPbk.js → Color-KMSTOMOX-BgqTHLvP.js} +1 -1
  27. package/storybook-static/assets/{ContextMenu-C1EU4pnG.js → ContextMenu-CBYiY6J5.js} +1 -1
  28. package/storybook-static/assets/{ContextMenu.stories-BWOdu8nd.js → ContextMenu.stories-BOrSBzx5.js} +1 -1
  29. package/storybook-static/assets/{DateInput-Qi0iElov.js → DateInput-B3Cp2uKV.js} +1 -1
  30. package/storybook-static/assets/{DateInput-D1rE9ZF6.js → DateInput-wHMtFgc6.js} +1 -1
  31. package/storybook-static/assets/{DateInput.stories-DfNzJVzP.js → DateInput.stories-5BIU86fY.js} +1 -1
  32. package/storybook-static/assets/{DateRangePresetSelect-DASkcMx3.js → DateRangePresetSelect-BTSfPFyp.js} +1 -1
  33. package/storybook-static/assets/{DateRangePresetSelect-B5FJLqSK.js → DateRangePresetSelect-bGJ_gs_o.js} +1 -1
  34. package/storybook-static/assets/{DateRangePresetSelect.stories-3ZcfGTpo.js → DateRangePresetSelect.stories-genQPd5W.js} +1 -1
  35. package/storybook-static/assets/{Detail-B02ATDwL.js → Detail-BbHfbHUY.js} +1 -1
  36. package/storybook-static/assets/{Detail.stories-ehMtdhKV.js → Detail.stories-CAIhSO0X.js} +1 -1
  37. package/storybook-static/assets/{Dialog-CB0KyNOp.js → Dialog-CddTt7Id.js} +1 -1
  38. package/storybook-static/assets/{Dialog.stories-CO5-c6KC.js → Dialog.stories-BY3XK6XL.js} +1 -1
  39. package/storybook-static/assets/{Disclosure-CWvegL_8.js → Disclosure-pgogTO3b.js} +1 -1
  40. package/storybook-static/assets/{Disclosure.stories-_0z-uGCF.js → Disclosure.stories-D9Yx_pbQ.js} +1 -1
  41. package/storybook-static/assets/{DocsRenderer-JROSPFPF-e6fFOpcs.js → DocsRenderer-JROSPFPF-CR6HdP5C.js} +2 -2
  42. package/storybook-static/assets/{DropZone-BQryB_S-.js → DropZone-DIeiHmxz.js} +1 -1
  43. package/storybook-static/assets/{DropZone.stories-viPFVTfL.js → DropZone.stories-CvBElfN-.js} +1 -1
  44. package/storybook-static/assets/{DropdownMenu-CJiWiCWO.js → DropdownMenu-t-M3UcjA.js} +1 -1
  45. package/storybook-static/assets/{ExpandableActionPanel.stories-DwL1eUl0.js → ExpandableActionPanel.stories-C7IyyWpx.js} +1 -1
  46. package/storybook-static/assets/{Flex-c2FgZKph.js → Flex-Dd06EmPB.js} +1 -1
  47. package/storybook-static/assets/{Flex-HhZPENBj.js → Flex-DvTI3mYk.js} +1 -1
  48. package/storybook-static/assets/{Flex.stories-BdEfqTKQ.js → Flex.stories-BFNOV6Yf.js} +1 -1
  49. package/storybook-static/assets/{Grid-CMUBLPOI.js → Grid-CU4J2C3q.js} +1 -1
  50. package/storybook-static/assets/{Grid-CXYJrcNO.js → Grid-az6IQBfE.js} +1 -1
  51. package/storybook-static/assets/{Grid.stories-CSo_R9bk.js → Grid.stories-gEUMJb43.js} +1 -1
  52. package/storybook-static/assets/{ImageCropper.stories-DPUCdwDr.js → ImageCropper.stories-CWOuKzKT.js} +1 -1
  53. package/storybook-static/assets/{ImageRenderer-DIEFIwlO.js → ImageRenderer-K4ZiFsAK.js} +1 -1
  54. package/storybook-static/assets/{ImageRenderer.stories-BAzbbd54.js → ImageRenderer.stories-H1Del4xw.js} +1 -1
  55. package/storybook-static/assets/{ImageView.stories-d6p9XR7R.js → ImageView.stories-CTZRQdhK.js} +1 -1
  56. package/storybook-static/assets/{ImageViewer.stories-DqBkvrje.js → ImageViewer.stories-CAFs20Fk.js} +2 -2
  57. package/storybook-static/assets/{ImageViewerRuntime-DVM6ctfF.js → ImageViewerRuntime-J4OqSpb2.js} +1 -1
  58. package/storybook-static/assets/{Input-KjqYLUEq.js → Input-BebTP7pM.js} +1 -1
  59. package/storybook-static/assets/{Input-v-SWe_uB.js → Input-Dm61M6JG.js} +1 -1
  60. package/storybook-static/assets/{Input.stories-0dcZXgca.js → Input.stories-CugwOaMa.js} +1 -1
  61. package/storybook-static/assets/{InputDateTime-BMM480ZM.js → InputDateTime-KGBCYDBq.js} +1 -1
  62. package/storybook-static/assets/{InputDateTime.stories-B8BnTwZN.js → InputDateTime.stories-Ve4U_dxf.js} +1 -1
  63. package/storybook-static/assets/{InputFile-vetf3pm3.js → InputFile-BL-SlWWt.js} +1 -1
  64. package/storybook-static/assets/{InputFile.stories-DCg1YCRD.js → InputFile.stories-DHjIUOdi.js} +1 -1
  65. package/storybook-static/assets/{InputFiles-DsMZLICv.js → InputFiles-6t2WNyW4.js} +1 -1
  66. package/storybook-static/assets/{InputFiles-B3lJfRWZ.js → InputFiles-C0QhzCqm.js} +1 -1
  67. package/storybook-static/assets/{InputFiles.stories-DwLeAv35.js → InputFiles.stories-DhgEcFoL.js} +1 -1
  68. package/storybook-static/assets/{InputImage-DMMraEzR.js → InputImage-CUvVGb6y.js} +1 -1
  69. package/storybook-static/assets/{InputImage.stories-CMOZu1f6.js → InputImage.stories-DtVAtN9k.js} +1 -1
  70. package/storybook-static/assets/{LayoutPicker-CoTbJOK9.js → LayoutPicker-B5vBtZOU.js} +1 -1
  71. package/storybook-static/assets/{LayoutPicker.stories-BXk3mwYX.js → LayoutPicker.stories-B7N2aKhS.js} +1 -1
  72. package/storybook-static/assets/{Listbox-BQHunK7L.js → Listbox-BXqKPCyK.js} +1 -1
  73. package/storybook-static/assets/{Listbox.stories-DxGIgwKd.js → Listbox.stories-yxAzaCHS.js} +1 -1
  74. package/storybook-static/assets/{Modal-wvQf3E-t.js → Modal-lMu-Z41j.js} +1 -1
  75. package/storybook-static/assets/{Modal.stories-CV9fGbCP.js → Modal.stories-DunQZY1C.js} +1 -1
  76. package/storybook-static/assets/MultiSelect-BHQNi1ra.js +2 -0
  77. package/storybook-static/assets/{MultiSelect-BwIbw9ss.js → MultiSelect-D5i_efpS.js} +1 -1
  78. package/storybook-static/assets/{MultiSelect.stories-CKbPYanW.js → MultiSelect.stories-C8qVOJbu.js} +1 -1
  79. package/storybook-static/assets/{NotificationsHost-v6O42GH9.js → NotificationsHost-B7YexVDB.js} +1 -1
  80. package/storybook-static/assets/{NotificationsHost.stories-DWtIwIMT.js → NotificationsHost.stories-BB-TDarJ.js} +1 -1
  81. package/storybook-static/assets/{ODataMultiSelect-B7VmCCyD.js → ODataMultiSelect-Baf1Q6oc.js} +1 -1
  82. package/storybook-static/assets/ODataMultiSelect-Dyag5di5.js +1 -0
  83. package/storybook-static/assets/ODataMultiSelect.stories-Cni0hLpA.js +73 -0
  84. package/storybook-static/assets/{ODataSelect-CHD3MCHd.js → ODataSelect-CJZpxHUc.js} +1 -1
  85. package/storybook-static/assets/{ODataSelect-BCq3J8js.js → ODataSelect-CThq4RD_.js} +1 -1
  86. package/storybook-static/assets/{ODataSelect.stories-C3G6df2Y.js → ODataSelect.stories-CCynRdsv.js} +1 -1
  87. package/storybook-static/assets/{ODataTreeMultiSelect-CFEzZtem.js → ODataTreeMultiSelect-Cgqr94ee.js} +1 -1
  88. package/storybook-static/assets/{ODataTreeMultiSelect.stories-BJpkyABJ.js → ODataTreeMultiSelect.stories-DHeLSYNw.js} +1 -1
  89. package/storybook-static/assets/{ODataTreeSelect-Dmk59MWR.js → ODataTreeSelect-DNtzXjdL.js} +1 -1
  90. package/storybook-static/assets/{ODataTreeSelect.stories-KV2ngm1a.js → ODataTreeSelect.stories-D0wWXU41.js} +1 -1
  91. package/storybook-static/assets/{PeriodSelect-xv0hygbe.js → PeriodSelect-C4VMCSCl.js} +1 -1
  92. package/storybook-static/assets/{PeriodSelect.stories-D9VNWc-J.js → PeriodSelect.stories-CBZvUzro.js} +1 -1
  93. package/storybook-static/assets/{Popover-DI7zaH4O.js → Popover-DpH4jngV.js} +1 -1
  94. package/storybook-static/assets/{Popover.stories-CA57v2N3.js → Popover.stories-BMBdC6up.js} +1 -1
  95. package/storybook-static/assets/{PresetRangeDateInput-3AIccdEE.js → PresetRangeDateInput-BugqgtBW.js} +1 -1
  96. package/storybook-static/assets/{PresetRangeDateInput.stories-7pPiYINM.js → PresetRangeDateInput.stories-CHsw3Uot.js} +1 -1
  97. package/storybook-static/assets/{RadioButton-BGfGiK2D.js → RadioButton-BaYRkkiD.js} +1 -1
  98. package/storybook-static/assets/{RadioButton.stories-BOeSQ7Qy.js → RadioButton.stories-7TpBVUeK.js} +1 -1
  99. package/storybook-static/assets/{RadioGroup-BXdWvE2x.js → RadioGroup-B2clcIVT.js} +1 -1
  100. package/storybook-static/assets/{RadioGroup-BteZ8Zfh.js → RadioGroup-TQRh002x.js} +1 -1
  101. package/storybook-static/assets/{RadioGroup.stories-DdCAD6fi.js → RadioGroup.stories-mMWKARDz.js} +1 -1
  102. package/storybook-static/assets/{Select-S1Kq352p.js → Select-B1V1uJm6.js} +1 -1
  103. package/storybook-static/assets/{Select-BA_oiGy1.js → Select-CeoaBOrP.js} +1 -1
  104. package/storybook-static/assets/{Select.stories-0y2Tbi0E.js → Select.stories-D58HyK6S.js} +1 -1
  105. package/storybook-static/assets/{SelectOptionContent-DNO6pn8i.js → SelectOptionContent-C_GVYwC7.js} +1 -1
  106. package/storybook-static/assets/{SerializableSelect-d1Emzd9y.js → SerializableSelect-CdUlpqes.js} +1 -1
  107. package/storybook-static/assets/{SerializableSelect-DLLMZfeg.js → SerializableSelect-Dl2LIcSi.js} +1 -1
  108. package/storybook-static/assets/{SerializableSelect.stories-DlrUNt98.js → SerializableSelect.stories-Dc9Wwt_K.js} +1 -1
  109. package/storybook-static/assets/{SingleDateTimeInput-PZjf5coN.js → SingleDateTimeInput-D_o7462N.js} +1 -1
  110. package/storybook-static/assets/{SingleDateTimeInput.stories-D-LF20Xf.js → SingleDateTimeInput.stories-CvmMQFZk.js} +1 -1
  111. package/storybook-static/assets/{Slider-Cnt-h4QU.js → Slider-Br9_ipzv.js} +1 -1
  112. package/storybook-static/assets/{Slider.stories-CspORXQq.js → Slider.stories-BPjEuRXu.js} +1 -1
  113. package/storybook-static/assets/{SliderInput-DKEzvdee.js → SliderInput-BPkVwjYL.js} +1 -1
  114. package/storybook-static/assets/{SliderInput.stories-Ds7ENz3W.js → SliderInput.stories-C5uY1dhk.js} +1 -1
  115. package/storybook-static/assets/{Sortable-Boktuyds.js → Sortable-M_vdCQU5.js} +1 -1
  116. package/storybook-static/assets/{Sortable.stories-DVP9I-8-.js → Sortable.stories-VpUmXgvh.js} +1 -1
  117. package/storybook-static/assets/{Splitter-DjjitTJC.js → Splitter-Be08Mits.js} +1 -1
  118. package/storybook-static/assets/{Splitter.stories-TONEtB2o.js → Splitter.stories-DxYEjtWa.js} +1 -1
  119. package/storybook-static/assets/{StateSelect-CKS5OKFD.js → StateSelect-CnSbzOjn.js} +1 -1
  120. package/storybook-static/assets/{StateSelect.stories-1PpI7sB7.js → StateSelect.stories-CgtvGuTO.js} +1 -1
  121. package/storybook-static/assets/{Switch-DJpASzdE.js → Switch-CozWfBLr.js} +1 -1
  122. package/storybook-static/assets/{Switch.stories-DFrplfI2.js → Switch.stories-CFG6xtBC.js} +1 -1
  123. package/storybook-static/assets/{Table-BhHNM7kb.js → Table-Dn5fa1JF.js} +1 -1
  124. package/storybook-static/assets/{Table.stories-BifwgPO8.js → Table.stories-DrRmsG8U.js} +1 -1
  125. package/storybook-static/assets/{Tabs-p9UXYlyD.js → Tabs-BwbnjvR4.js} +1 -1
  126. package/storybook-static/assets/{Tabs.stories-Fiib2sS7.js → Tabs.stories-Ci_Bsbho.js} +1 -1
  127. package/storybook-static/assets/{TagInput.stories-Gg038VKV.js → TagInput.stories-DrWnStc3.js} +1 -1
  128. package/storybook-static/assets/{Textarea-SlgV7esV.js → Textarea-CIIbQQ_z.js} +1 -1
  129. package/storybook-static/assets/{Textarea.stories-DBFORAfY.js → Textarea.stories-DKJcRQlv.js} +1 -1
  130. package/storybook-static/assets/{TimePanel-C0P98Tt-.js → TimePanel-tBn2tSnW.js} +1 -1
  131. package/storybook-static/assets/{TimePanel.stories-Dp993HaV.js → TimePanel.stories-0_jPdrac.js} +1 -1
  132. package/storybook-static/assets/{Toggle-CWy__Mll.js → Toggle-BIO2ZZJG.js} +1 -1
  133. package/storybook-static/assets/{Toggle.stories-BvLgd3ea.js → Toggle.stories-s-U1_EB4.js} +1 -1
  134. package/storybook-static/assets/TreeMultiSelect-CsdHv5Tu.js +1 -0
  135. package/storybook-static/assets/{TreeMultiSelect-CrDJlnbX.js → TreeMultiSelect-iAC8iMnQ.js} +1 -1
  136. package/storybook-static/assets/{TreeMultiSelect.stories-C3zkS-ak.js → TreeMultiSelect.stories-A7ZQ-TMo.js} +1 -1
  137. package/storybook-static/assets/TreePickerBase-CSAkX1MC.js +22 -0
  138. package/storybook-static/assets/{TreeSelect-BrFxwiBP.js → TreeSelect-Dmeig8En.js} +1 -1
  139. package/storybook-static/assets/{TreeSelect-CuaoMlYe.js → TreeSelect-_hNx7YjM.js} +1 -1
  140. package/storybook-static/assets/{TreeSelect.stories-rzd0vNoK.js → TreeSelect.stories-P5i7N6xQ.js} +1 -1
  141. package/storybook-static/assets/{TreeTable-uvfUlKoJ.js → TreeTable-zRLk7HO_.js} +1 -1
  142. package/storybook-static/assets/{TreeTable.stories-FUOaBB9J.js → TreeTable.stories-BGi_qb4u.js} +1 -1
  143. package/storybook-static/assets/{WithTooltip-7X4HQR7L-LW5ygQJA.js → WithTooltip-7X4HQR7L-CykoJOA-.js} +1 -1
  144. package/storybook-static/assets/{base-table-DPs5qte-.js → base-table-CsVLWY6L.js} +1 -1
  145. package/storybook-static/assets/{blocks-C6uFFMmb.js → blocks-DiO1TOQU.js} +6 -6
  146. package/storybook-static/assets/{button-DyEbX-UX.js → button-BAB4sYiW.js} +1 -1
  147. package/storybook-static/assets/{check-box-ByXAYB_w.js → check-box-C3pS0wBv.js} +1 -1
  148. package/storybook-static/assets/{chunk-3LY4VQVK-D0GJRVS7.js → chunk-3LY4VQVK-CmKQo29b.js} +1 -1
  149. package/storybook-static/assets/{chunk-LITCR56V-CElM9plZ.js → chunk-LITCR56V-CoWoJN9V.js} +1 -1
  150. package/storybook-static/assets/{contextMenu-BQKOQzU1.js → contextMenu-BxQYRww8.js} +1 -1
  151. package/storybook-static/assets/{error-SC0Oqs6M.js → error-DNwlq4Bv.js} +1 -1
  152. package/storybook-static/assets/{flex-BOqV4dzk.js → flex-CmPU5ose.js} +1 -1
  153. package/storybook-static/assets/{floating-ui.react-CiEPwtuP.js → floating-ui.react-1sEL-Z2u.js} +1 -1
  154. package/storybook-static/assets/formatter-L2YTDE3Q-BzqK_csI.js +1 -0
  155. package/storybook-static/assets/{formatters-C29y1vJ_.js → formatters-BGVkMgP2.js} +1 -1
  156. package/storybook-static/assets/grid-Bu6-JJy1.js +1 -0
  157. package/storybook-static/assets/{hooks-4Gvtb540.js → hooks-CsuvbALP.js} +1 -1
  158. package/storybook-static/assets/{iframe-Cqdlb8-A.js → iframe-DDcUIbTW.js} +4 -4
  159. package/storybook-static/assets/{input-BcaISJRy.js → input-BPKHI_to.js} +1 -1
  160. package/storybook-static/assets/{lucide-react-BdqrDz6_.js → lucide-react-BEuqhHrO.js} +1 -1
  161. package/storybook-static/assets/{mdx-react-shim-Rn_bm6Wj.js → mdx-react-shim-BpvM7HGu.js} +1 -1
  162. package/storybook-static/assets/{media-dmdQkM5d.js → media-bYcXqMjJ.js} +1 -1
  163. package/storybook-static/assets/{misc-C1Uf9TI0.js → misc-PrqyCNih.js} +1 -1
  164. package/storybook-static/assets/{notifications-Br3lffDl.js → notifications-CC8LMVn6.js} +1 -1
  165. package/storybook-static/assets/{odata-BT-Vuah1.js → odata-DwZEPsVI.js} +1 -1
  166. package/storybook-static/assets/odata-service-uS1knlu6.js +1 -0
  167. package/storybook-static/assets/{odataStoryFixtures-CEQgZ8Ju.js → odataStoryFixtures-BfoOVWQb.js} +1 -1
  168. package/storybook-static/assets/{picker-eODRzsH5.js → picker-DwZCEgUh.js} +1 -1
  169. package/storybook-static/assets/{popover-Cf-d9CBe.js → popover-tLJ1tHHS.js} +1 -1
  170. package/storybook-static/assets/{preset-select-Divqvyhr.js → preset-select-BPYh-4UT.js} +1 -1
  171. package/storybook-static/assets/{react-18-C8ZBY1Ky.js → react-18-BPLMQEZO.js} +1 -1
  172. package/storybook-static/assets/{react-oW-8yUPs.js → react-DCnbEl9z.js} +1 -1
  173. package/storybook-static/assets/{react-dom-DEo6Vc1z.js → react-dom-DcLyojGx.js} +1 -1
  174. package/storybook-static/assets/select-NwNpdJAq.js +1 -0
  175. package/storybook-static/assets/{slider-BgZTddiR.js → slider-eMLEHL3w.js} +1 -1
  176. package/storybook-static/assets/{sortable-BZttsbB-.js → sortable-CJbYu2UV.js} +1 -1
  177. package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-DHMad3_O.js → syntaxhighlighter-RTCFPKCB-DLt2Dk6Q.js} +1 -1
  178. package/storybook-static/assets/{text-DX5yXvyz.js → text-Dhy3PQNL.js} +1 -1
  179. package/storybook-static/assets/{theming-x5D2-3Wh.js → theming-YknuSZ_c.js} +1 -1
  180. package/storybook-static/assets/ui-CyVakBja.js +1 -0
  181. package/storybook-static/assets/{useODataSelectBase-ByD_yhA4.js → useODataSelectBase-BMQ4Co0B.js} +1 -1
  182. package/storybook-static/assets/{useODataTreeData-C-pt6PNC.js → useODataTreeData-DSYnj0iM.js} +1 -1
  183. package/storybook-static/assets/{utils-238J8rpj.js → utils-3wvLOPp1.js} +1 -1
  184. package/storybook-static/iframe.html +1 -1
  185. package/storybook-static/project.json +1 -1
  186. package/dist/chunks/SelectOptionContent-CI7wq9Oi.js +0 -27
  187. package/dist/chunks/SelectOptionContent-CI7wq9Oi.js.map +0 -1
  188. package/dist/chunks/multi-select-Bg7Psslp.js.map +0 -1
  189. package/dist/chunks/useODataSelectBase-wZ07hQFv.js +0 -125
  190. package/dist/chunks/useODataSelectBase-wZ07hQFv.js.map +0 -1
  191. package/storybook-static/assets/MultiSelect-DMbWfmcw.js +0 -2
  192. package/storybook-static/assets/ODataMultiSelect.stories-B_GztBj9.js +0 -73
  193. package/storybook-static/assets/TreeMultiSelect-CDFFjZnT.js +0 -1
  194. package/storybook-static/assets/TreePickerBase-Bn8pSo-u.js +0 -22
  195. package/storybook-static/assets/formatter-L2YTDE3Q-DfQ24eKP.js +0 -1
  196. package/storybook-static/assets/grid-DNJaN2X3.js +0 -1
  197. package/storybook-static/assets/odata-service-QOs47Qvv.js +0 -1
  198. package/storybook-static/assets/select-B2Yo9S2f.js +0 -1
  199. package/storybook-static/assets/ui-CuulZK-0.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/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\";\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};\n\ntype MutableTreeNode = TreeSelectNode & {\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: { parentId?: string; codeKey: string; value: string; label: string; code?: string }): 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\tchildren: [],\n\t\tchildByBranchKey: new Map()\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}: 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});\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\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(items: readonly ODataDependentSegmentItem[], chains: ODataChainsMap) {\n\treturn sortODataDependentSegmentItemsByChains(items, chains);\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\nexport function useODataTreeData({ odata, segments, model }: Pick<ODataDependentBaseProps, \"odata\" | \"segments\" | \"model\">) {\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(() => resolveOrderedTreeSegmentItems(baseSegmentItems, chains), [baseSegmentItems, chains]);\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}),\n\t\t[collection.data?.items, collection.data?.keyPairsMap, hiddenCodeKeys, 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\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 (children.length === 0 || nextSelectedIds.has(nodeId) || index.nodeById.get(nodeId)?.disabled) {\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\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\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 BalancedTreeColumnsLayoutInput = {\n\titemCount: number;\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};\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;\n\nfunction normalizePositiveDimension(value: number, fallback: number) {\n\treturn Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\n/**\n * Выбирает количество колонок по фактически доступной Floating UI геометрии.\n * Оценка одновременно штрафует переполнение, вытянутую форму и пустые ячейки,\n * поэтому popup стремится к компактной средней пропорции, но не выходит за viewport.\n */\nexport function resolveBalancedTreeColumnsLayout({\n\titemCount,\n\tavailableWidth,\n\tavailableHeight,\n\tviewportWidth,\n\tviewportHeight,\n\treferenceWidth\n}: BalancedTreeColumnsLayoutInput): BalancedTreeColumnsLayout {\n\tconst normalizedItemCount = Math.max(0, Math.floor(Number.isFinite(itemCount) ? 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 * 0.75));\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\n\tlet bestColumnCount = 1;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\n\tfor (let columnCount = 1; columnCount <= maxColumnCount; columnCount += 1) {\n\t\tconst rowCount = Math.ceil(normalizedItemCount / columnCount);\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 = normalizedItemCount ? (columnCount * rowCount - normalizedItemCount) / normalizedItemCount : 0;\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.04 * (columnCount - 1);\n\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestColumnCount = columnCount;\n\t\t}\n\t}\n\n\tconst rowCount = Math.ceil(normalizedItemCount / bestColumnCount);\n\tconst naturalWidth = Math.max(minWidth, POPUP_HORIZONTAL_PADDING + bestColumnCount * COLUMN_WIDTH + (bestColumnCount - 1) * COLUMN_GAP);\n\n\treturn {\n\t\tcolumnCount: bestColumnCount,\n\t\trowCount,\n\t\twidth: Math.min(widthLimit, naturalWidth),\n\t\tminWidth,\n\t\tmaxHeight: heightLimit\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-auto-flow: column;\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\tbreak-inside: avoid;\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-0);\n\t\tbackground-color: var(--surface-0);\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\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 label={node.label} code={node.code} highlight={highlight} />\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { ReactNode, useCallback, useEffect, 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 { resolveBalancedTreeColumnsLayout } from \"./model/resolveBalancedTreeColumnsLayout\";\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\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\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\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\tconst previousOpenRef = useRef(false);\n\tconst [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? \"search-single\" : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen: true,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: \"display\"\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 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() => (optionsLayout === \"columns\" ? allExpandedIds : new Set([...expandedIds, ...searchExpandedIds, ...selectedExpandedIds])),\n\t\t[allExpandedIds, expandedIds, 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 resolveColumnsFloatingSize = useCallback<FloatingListboxSizeResolver>(\n\t\t(context) => {\n\t\t\tconst layout = resolveBalancedTreeColumnsLayout({\n\t\t\t\t...context,\n\t\t\t\titemCount: visibleEntries.length\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(Math.max(layout.rowCount, 1))\n\t\t\t};\n\t\t},\n\t\t[visibleEntries.length]\n\t);\n\tconst {\n\t\topen,\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\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 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 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\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && triggerController.policy.resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [open, setQuery, triggerController.policy.resetQueryOnClose]);\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClearSelection = () => {\n\t\tonClearSelection?.();\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\tconst toggleExpand = (entry: TreeVisibleEntry) => {\n\t\tif (!entry.hasChildren) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetExpandedIds((currentExpandedIds) => {\n\t\t\tconst nextExpandedIds = new Set(currentExpandedIds);\n\n\t\t\tif (nextExpandedIds.has(entry.node.id)) {\n\t\t\t\tnextExpandedIds.delete(entry.node.id);\n\t\t\t} else {\n\t\t\t\tnextExpandedIds.add(entry.node.id);\n\t\t\t}\n\n\t\t\treturn nextExpandedIds;\n\t\t});\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} placeholder={placeholder} 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\tdisabled={disabled || isLoading}\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={\n\t\t\t\t\t\t\t\ttriggerMode === \"search\"\n\t\t\t\t\t\t\t\t\t? !selectedSummaryText || showTriggerQuery\n\t\t\t\t\t\t\t\t\t\t? placeholder\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t: hasSelection\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: placeholder\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taria-labelledby={labelId}\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={showSummaryOverlay ? <div className={styles.valueOverlay}>{selectedSummary}</div> : undefined}\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{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\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\n\t\t\t\t\t\t\t\t\t\terrorState={error}\n\t\t\t\t\t\t\t\t\t\tloadingState={isLoading ? \"Загрузка...\" : undefined}\n\t\t\t\t\t\t\t\t\t\temptyState={!error && !isLoading ? \"Нет данных\" : undefined}\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\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\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 } from \"react\";\n\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}\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\tif (selectedNode.code && selectedNode.code !== selectedNode.label) {\n\t\t\treturn `${selectedNode.label} · ${selectedNode.code}`;\n\t\t}\n\n\t\treturn selectedNode.label;\n\t}\n\n\treturn `Выбрано ${selectedIds.size} узл.`;\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}: TreeMultiSelectProps) {\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst selectedIds = useMemo(() => treeMultiValueToSelectedIds(value, treeIndex), [treeIndex, value]);\n\tconst selectionState = useMemo(() => getTreeNodeSelectionState(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst selectedSummary = useMemo(() => formatTreeMultiSummary(selectedIds, treeIndex), [selectedIds, treeIndex]);\n\tconst selectAll = () => {\n\t\tonChange(treeSelectedIdsToMultiValue(getSelectableTreeNodeIds(treeIndex), treeIndex));\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\tbulkActions={{\n\t\t\t\tonSelectAll: selectAll,\n\t\t\t\tonDeselectAll: () => onChange({})\n\t\t\t}}\n\t\t\ttriggerMode=\"search\"\n\t\t\tselectedSummary={selectedSummary}\n\t\t\tquery={query}\n\t\t\tdefaultQuery={defaultQuery}\n\t\t\tonQuery={onQuery}\n\t\t\tonNodeActivate={(node) => onChange(toggleTreeMultiSelection(value, node.id, treeIndex))}\n\t\t\tonClearSelection={() => onChange({})}\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 { TreeMultiSelect } from \"./TreeMultiSelect\";\nimport { TreeMultiSelectOptionsLayout, TreeMultiSelectValue } from \"./types\";\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}\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}: ODataTreeMultiSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel\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={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\toptionsLayout={optionsLayout}\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}\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}: 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\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}\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}: 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\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t\tclearable={clearable}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/tree-select/helpers.ts","../../src/tree-select/model/buildODataTreeNodes.ts","../../src/tree-select/model/resolveOrderedTreeSegmentItems.ts","../../src/tree-select/model/useODataTreeData.ts","../../src/tree-select/model/treeUtils.ts","../../src/tree-select/model/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\";\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};\n\ntype MutableTreeNode = TreeSelectNode & {\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: { parentId?: string; codeKey: string; value: string; label: string; code?: string }): 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\tchildren: [],\n\t\tchildByBranchKey: new Map()\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}: 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});\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\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(items: readonly ODataDependentSegmentItem[], chains: ODataChainsMap) {\n\treturn sortODataDependentSegmentItemsByChains(items, chains);\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\nexport function useODataTreeData({ odata, segments, model }: Pick<ODataDependentBaseProps, \"odata\" | \"segments\" | \"model\">) {\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(() => resolveOrderedTreeSegmentItems(baseSegmentItems, chains), [baseSegmentItems, chains]);\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}),\n\t\t[collection.data?.items, collection.data?.keyPairsMap, hiddenCodeKeys, 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\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 (children.length === 0 || nextSelectedIds.has(nodeId) || index.nodeById.get(nodeId)?.disabled) {\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\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\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 BalancedTreeColumnsLayoutInput = {\n\titemCount: number;\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};\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;\n\nfunction normalizePositiveDimension(value: number, fallback: number) {\n\treturn Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\n/**\n * Выбирает количество колонок по фактически доступной Floating UI геометрии.\n * Оценка одновременно штрафует переполнение, вытянутую форму и пустые ячейки,\n * поэтому popup стремится к компактной средней пропорции, но не выходит за viewport.\n */\nexport function resolveBalancedTreeColumnsLayout({\n\titemCount,\n\tavailableWidth,\n\tavailableHeight,\n\tviewportWidth,\n\tviewportHeight,\n\treferenceWidth\n}: BalancedTreeColumnsLayoutInput): BalancedTreeColumnsLayout {\n\tconst normalizedItemCount = Math.max(0, Math.floor(Number.isFinite(itemCount) ? 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 * 0.75));\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\n\tlet bestColumnCount = 1;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\n\tfor (let columnCount = 1; columnCount <= maxColumnCount; columnCount += 1) {\n\t\tconst rowCount = Math.ceil(normalizedItemCount / columnCount);\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 = normalizedItemCount ? (columnCount * rowCount - normalizedItemCount) / normalizedItemCount : 0;\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.04 * (columnCount - 1);\n\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbestColumnCount = columnCount;\n\t\t}\n\t}\n\n\tconst rowCount = Math.ceil(normalizedItemCount / bestColumnCount);\n\tconst naturalWidth = Math.max(minWidth, POPUP_HORIZONTAL_PADDING + bestColumnCount * COLUMN_WIDTH + (bestColumnCount - 1) * COLUMN_GAP);\n\n\treturn {\n\t\tcolumnCount: bestColumnCount,\n\t\trowCount,\n\t\twidth: Math.min(widthLimit, naturalWidth),\n\t\tminWidth,\n\t\tmaxHeight: heightLimit\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-auto-flow: column;\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\tbreak-inside: avoid;\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-0);\n\t\tbackground-color: var(--surface-0);\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\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 label={node.label} code={node.code} highlight={highlight} />\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { ReactNode, useCallback, useEffect, 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 { resolveBalancedTreeColumnsLayout } from \"./model/resolveBalancedTreeColumnsLayout\";\nimport {\n\tcreateTreeNodeIndex,\n\tfilterTreeNodes,\n\tflattenVisibleTreeNodes,\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\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\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\tconst previousOpenRef = useRef(false);\n\tconst [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set());\n\tconst resolvedTriggerMode = triggerMode === \"search\" ? (selectionMode === \"multi\" ? \"search-multi\" : \"search-single\") : \"display\";\n\tconst treeIndex = useMemo(() => createTreeNodeIndex(nodes), [nodes]);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen: true,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode: \"display\"\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 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() => (optionsLayout === \"columns\" ? allExpandedIds : new Set([...expandedIds, ...searchExpandedIds, ...selectedExpandedIds])),\n\t\t[allExpandedIds, expandedIds, 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 resolveColumnsFloatingSize = useCallback<FloatingListboxSizeResolver>(\n\t\t(context) => {\n\t\t\tconst layout = resolveBalancedTreeColumnsLayout({\n\t\t\t\t...context,\n\t\t\t\titemCount: visibleEntries.length\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(Math.max(layout.rowCount, 1))\n\t\t\t};\n\t\t},\n\t\t[visibleEntries.length]\n\t);\n\tconst {\n\t\topen,\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: controlledOpen,\n\t\tonOpenChange,\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 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 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\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && triggerController.policy.resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [open, setQuery, triggerController.policy.resetQueryOnClose]);\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\tsetExpandedIds((currentExpandedIds) => {\n\t\t\tconst nextExpandedIds = new Set(currentExpandedIds);\n\n\t\t\tif (nextExpandedIds.has(entry.node.id)) {\n\t\t\t\tnextExpandedIds.delete(entry.node.id);\n\t\t\t} else {\n\t\t\t\tnextExpandedIds.add(entry.node.id);\n\t\t\t}\n\n\t\t\treturn nextExpandedIds;\n\t\t});\n\t};\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} placeholder={placeholder} 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\tdisabled={disabled || isLoading}\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={hasSelection ? undefined : placeholder}\n\t\t\t\t\t\t\taria-labelledby={labelId}\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={showSummaryOverlay ? <div className={styles.valueOverlay}>{selectedSummary}</div> : undefined}\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\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\n\t\t\t\t\t\t\t\t\t\terrorState={error}\n\t\t\t\t\t\t\t\t\t\tloadingState={isLoading ? \"Загрузка...\" : undefined}\n\t\t\t\t\t\t\t\t\t\temptyState={!error && !isLoading ? \"Нет данных\" : undefined}\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\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\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 { 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}\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 `${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}: 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\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 { 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 } from \"./types\";\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}\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}: ODataTreeMultiSelectProps) {\n\tconst treeData = useODataTreeData({\n\t\todata,\n\t\tsegments,\n\t\tmodel\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={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\toptionsLayout={optionsLayout}\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}\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}: 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\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}\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}: 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\tisLoading={treeData.isLoading}\n\t\t\terror={treeData.isError ? \"Ошибка загрузки\" : undefined}\n\t\t\tclearable={clearable}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-ui",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
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{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-C6uFFMmb.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-Rn_bm6Wj.js";import{Appearances as p,Basic as m,RemovableList as h,Sizes as g,Tones as _,n as v,t as y}from"./Badge.stories-BNnfMijp.js";function b(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(a,{of:y,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
1
+ import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-DiO1TOQU.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-BpvM7HGu.js";import{Appearances as p,Basic as m,RemovableList as h,Sizes as g,Tones as _,n as v,t as y}from"./Badge.stories-D7xAm88f.js";function b(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(a,{of:y,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
2
2
  `,(0,S.jsx)(c,{children:`Badge`}),`
3
3
  `,(0,S.jsx)(i,{children:`Компактная текстовая метка для статусов, категорий, фильтров и коротких служебных пометок`}),`
4
4
  `,(0,S.jsx)(o.p,{children:`Badge подходит для коротких подписей, которые должны быстро читаться и не перегружать интерфейс:`}),`
@@ -1,4 +1,4 @@
1
- import{a as e,c as t,i as n}from"./preload-helper-B45gAKPr.js";import{C as r}from"./iframe-Cqdlb8-A.js";import{t as i}from"./jsx-runtime-BBQGix-2.js";import{a,i as o}from"./utils-238J8rpj.js";import{o as s,t as c}from"./lucide-react-BdqrDz6_.js";import{n as l,t as u}from"./text-DX5yXvyz.js";import{i as d,n as f,r as p,t as m}from"./uiClasses-CaHp0EWd.js";import{o as h}from"./Flex-HhZPENBj.js";import{t as g}from"./flex-BOqV4dzk.js";var _,v,y,b,x,S,C,w,T,E,D=n((()=>{_=`qBtmnH`,v=`p-HsHY`,y=`u9tQAE`,b=`FRScRz`,x=`W13uQO`,S=`_3IRcM9`,C=`R3ybI7`,w=`DdWAaC`,T=`_5cXBQF`,E={badge:_,passive:v,sizeXs:y,sizeSm:b,sizeMd:x,sizeLg:S,sizeXl:C,content:w,removeButton:T}}));function O({children:e,size:t=`sm`,tone:n,appearance:r,className:i,onRemove:o}){let c=n??`neutral`,u=d({tone:n,appearance:r,fallbackTone:c,fallbackAppearance:c===`neutral`?`outline`:`solid`});return(0,k.jsxs)(`div`,{className:a(E.badge,A[t],f(u.tone),m(u.appearance),!o&&E.passive,i),children:[(0,k.jsx)(l,{maxChar:25,placement:`top`,block:!0,textWrapProps:{className:E.content},children:String(e)}),o&&(0,k.jsx)(`button`,{type:`button`,onClick:o,className:E.removeButton,"aria-label":`Удалить бейдж`,"data-ui":`badge-remove-button`,"data-action":`remove-badge`,children:(0,k.jsx)(s,{})})]})}var k,A,j=n((()=>{o(),c(),u(),p(),D(),k=i(),A={xs:E.sizeXs,sm:E.sizeSm,md:E.sizeMd,lg:E.sizeLg,xl:E.sizeXl},O.__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" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"neutral"`},{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 M({children:e}){return(0,P.jsx)(h,{inline:!0,wrap:!0,gap:`sm`,align:`baseline`,children:N.Children.map(e,(e,t)=>(0,P.jsx)(N.Fragment,{children:e},t))})}var N,P,F=n((()=>{N=t(r(),1),g(),P=i(),M.__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:``}}}})),I=e({Appearances:()=>H,Basic:()=>B,RemovableList:()=>W,Sizes:()=>U,Tones:()=>V,__namedExportsOrder:()=>G,default:()=>z}),L,R,z,B,V,H,U,W,G,K=n((()=>{L=t(r(),1),j(),F(),R=i(),z={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:[`sm`,`md`,`lg`]},tone:{description:`Семантический тон бейджа.`,control:`inline-radio`,options:[`neutral`,`success`,`warning`,`error`,`info`]},appearance:{description:`Форма бейджа.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},onRemove:{description:`Показывает кнопку удаления и вызывает обработчик по клику.`,control:!1},className:{description:`Дополнительный CSS-класс контейнера.`,control:`text`}}},B={},V={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{tone:`neutral`,appearance:`outline`,children:`Neutral`}),(0,R.jsx)(O,{tone:`success`,appearance:`solid`,children:`Успешно`}),(0,R.jsx)(O,{tone:`warning`,appearance:`solid`,children:`Внимание`}),(0,R.jsx)(O,{tone:`error`,appearance:`solid`,children:`Ошибка`}),(0,R.jsx)(O,{tone:`info`,appearance:`solid`,children:`Информация`})]})},H={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{tone:`neutral`,appearance:`solid`,children:`Solid`}),(0,R.jsx)(O,{tone:`neutral`,appearance:`outline`,children:`Outline`}),(0,R.jsx)(O,{tone:`info`,appearance:`ghost`,children:`Ghost`}),(0,R.jsx)(O,{tone:`warning`,appearance:`transparent`,children:`Transparent`})]})},U={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{size:`xs`,children:`Extra Small`}),(0,R.jsx)(O,{size:`sm`,children:`Small`}),(0,R.jsx)(O,{size:`md`,children:`Medium`}),(0,R.jsx)(O,{size:`lg`,children:`Large`}),(0,R.jsx)(O,{size:`xl`,children:`Extra Large`})]})},W={render:()=>{let[e,t]=(0,L.useState)([`Фильтр A`,`Фильтр B`,`Фильтр C`]);return(0,R.jsx)(M,{children:e.map(e=>(0,R.jsx)(O,{tone:`info`,appearance:`outline`,onRemove:()=>t(t=>t.filter(t=>t!==e)),children:e},e))})}},B.parameters={...B.parameters,docs:{...B.parameters?.docs,source:{originalSource:`{}`,...B.parameters?.docs?.source}}},V.parameters={...V.parameters,docs:{...V.parameters?.docs,source:{originalSource:`{
1
+ import{a as e,c as t,i as n}from"./preload-helper-B45gAKPr.js";import{C as r}from"./iframe-DDcUIbTW.js";import{t as i}from"./jsx-runtime-BBQGix-2.js";import{a,i as o}from"./utils-3wvLOPp1.js";import{o as s,t as c}from"./lucide-react-BEuqhHrO.js";import{n as l,t as u}from"./text-Dhy3PQNL.js";import{i as d,n as f,r as p,t as m}from"./uiClasses-CaHp0EWd.js";import{o as h}from"./Flex-DvTI3mYk.js";import{t as g}from"./flex-CmPU5ose.js";var _,v,y,b,x,S,C,w,T,E,D=n((()=>{_=`qBtmnH`,v=`p-HsHY`,y=`u9tQAE`,b=`FRScRz`,x=`W13uQO`,S=`_3IRcM9`,C=`R3ybI7`,w=`DdWAaC`,T=`_5cXBQF`,E={badge:_,passive:v,sizeXs:y,sizeSm:b,sizeMd:x,sizeLg:S,sizeXl:C,content:w,removeButton:T}}));function O({children:e,size:t=`sm`,tone:n,appearance:r,className:i,onRemove:o}){let c=n??`neutral`,u=d({tone:n,appearance:r,fallbackTone:c,fallbackAppearance:c===`neutral`?`outline`:`solid`});return(0,k.jsxs)(`div`,{className:a(E.badge,A[t],f(u.tone),m(u.appearance),!o&&E.passive,i),children:[(0,k.jsx)(l,{maxChar:25,placement:`top`,block:!0,textWrapProps:{className:E.content},children:String(e)}),o&&(0,k.jsx)(`button`,{type:`button`,onClick:o,className:E.removeButton,"aria-label":`Удалить бейдж`,"data-ui":`badge-remove-button`,"data-action":`remove-badge`,children:(0,k.jsx)(s,{})})]})}var k,A,j=n((()=>{o(),c(),u(),p(),D(),k=i(),A={xs:E.sizeXs,sm:E.sizeSm,md:E.sizeMd,lg:E.sizeLg,xl:E.sizeXl},O.__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" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"neutral"`},{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 M({children:e}){return(0,P.jsx)(h,{inline:!0,wrap:!0,gap:`sm`,align:`baseline`,children:N.Children.map(e,(e,t)=>(0,P.jsx)(N.Fragment,{children:e},t))})}var N,P,F=n((()=>{N=t(r(),1),g(),P=i(),M.__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:``}}}})),I=e({Appearances:()=>H,Basic:()=>B,RemovableList:()=>W,Sizes:()=>U,Tones:()=>V,__namedExportsOrder:()=>G,default:()=>z}),L,R,z,B,V,H,U,W,G,K=n((()=>{L=t(r(),1),j(),F(),R=i(),z={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:[`sm`,`md`,`lg`]},tone:{description:`Семантический тон бейджа.`,control:`inline-radio`,options:[`neutral`,`success`,`warning`,`error`,`info`]},appearance:{description:`Форма бейджа.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},onRemove:{description:`Показывает кнопку удаления и вызывает обработчик по клику.`,control:!1},className:{description:`Дополнительный CSS-класс контейнера.`,control:`text`}}},B={},V={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{tone:`neutral`,appearance:`outline`,children:`Neutral`}),(0,R.jsx)(O,{tone:`success`,appearance:`solid`,children:`Успешно`}),(0,R.jsx)(O,{tone:`warning`,appearance:`solid`,children:`Внимание`}),(0,R.jsx)(O,{tone:`error`,appearance:`solid`,children:`Ошибка`}),(0,R.jsx)(O,{tone:`info`,appearance:`solid`,children:`Информация`})]})},H={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{tone:`neutral`,appearance:`solid`,children:`Solid`}),(0,R.jsx)(O,{tone:`neutral`,appearance:`outline`,children:`Outline`}),(0,R.jsx)(O,{tone:`info`,appearance:`ghost`,children:`Ghost`}),(0,R.jsx)(O,{tone:`warning`,appearance:`transparent`,children:`Transparent`})]})},U={render:()=>(0,R.jsxs)(M,{children:[(0,R.jsx)(O,{size:`xs`,children:`Extra Small`}),(0,R.jsx)(O,{size:`sm`,children:`Small`}),(0,R.jsx)(O,{size:`md`,children:`Medium`}),(0,R.jsx)(O,{size:`lg`,children:`Large`}),(0,R.jsx)(O,{size:`xl`,children:`Extra Large`})]})},W={render:()=>{let[e,t]=(0,L.useState)([`Фильтр A`,`Фильтр B`,`Фильтр C`]);return(0,R.jsx)(M,{children:e.map(e=>(0,R.jsx)(O,{tone:`info`,appearance:`outline`,onRemove:()=>t(t=>t.filter(t=>t!==e)),children:e},e))})}},B.parameters={...B.parameters,docs:{...B.parameters?.docs,source:{originalSource:`{}`,...B.parameters?.docs?.source}}},V.parameters={...V.parameters,docs:{...V.parameters?.docs,source:{originalSource:`{
2
2
  render: () => <BadgeList>
3
3
  <Badge tone="neutral" appearance="outline">
4
4
  Neutral
@@ -1,4 +1,4 @@
1
- import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-C6uFFMmb.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-Rn_bm6Wj.js";import{Basic as p,ComposableScheme as m,Variants as h,WithIcons as g,n as _,t as v}from"./Button.stories-qrLBulWZ.js";function y(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(a,{of:v,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
1
+ import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-DiO1TOQU.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-BpvM7HGu.js";import{Basic as p,ComposableScheme as m,Variants as h,WithIcons as g,n as _,t as v}from"./Button.stories-CPe9cLIw.js";function y(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(a,{of:v,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
2
2
  `,(0,x.jsx)(c,{children:`Button`}),`
3
3
  `,(0,x.jsx)(i,{children:`Базовая action-кнопка дизайн-системы для пользовательских действий, подтверждений и быстрых операций`}),`
4
4
  `,(0,x.jsxs)(o.p,{children:[(0,x.jsx)(o.code,{children:`Button`}),` используется как универсальная кнопка интерфейса: в формах, тулбарах, модальных окнах, карточках, таблицах и компактных icon-only сценариях.`]}),`
@@ -1,4 +1,4 @@
1
- import{c as e,i as t}from"./preload-helper-B45gAKPr.js";import{C as n}from"./iframe-Cqdlb8-A.js";import{t as r}from"./jsx-runtime-BBQGix-2.js";import{a as i,i as a}from"./utils-238J8rpj.js";import{n as o,t as s}from"./popover-Cf-d9CBe.js";import{n as c,t as l}from"./ui.module-wFHXkJzp.js";import{i as u,n as d,r as f,t as p}from"./uiClasses-CaHp0EWd.js";var m,h,g,_,v,y=t((()=>{m=`wLOHwj`,h=`lFsM-Y`,g=`LPob63`,_=`tsaGtv`,v={button:m,iconOnly:h,buttonInner:g,buttonIcon:_}})),b,x,S,C=t((()=>{b=e(n(),1),a(),s(),l(),f(),y(),x=r(),S=(0,b.forwardRef)(function({children:e,disabled:t,className:n,icon:r,iconEnd:a,title:s,variant:l,tone:f,appearance:m,type:h=`button`,"aria-label":g,..._},y){let S=b.Children.count(e)>0,C=!!r&&!S,w=u({variant:l,tone:f,appearance:m,fallbackAppearance:f&&f!==`neutral`?`solid`:`outline`}),T=C?g??s:g,E=(0,x.jsx)(`button`,{..._,ref:y,type:h,disabled:t,"aria-label":T,className:i(c.uiElement,c.uiInputControl,v.button,d(w.tone),p(w.appearance),C?v.iconOnly:``,`textNoWrap`,n??``),children:(0,x.jsxs)(`span`,{className:v.buttonInner,children:[r&&!a&&(0,x.jsx)(`span`,{"aria-hidden":`true`,className:v.buttonIcon,children:r}),S&&(0,x.jsx)(`span`,{className:`flexEllipsis`,children:e}),r&&a&&(0,x.jsx)(`span`,{"aria-hidden":`true`,className:v.buttonIcon,children:r})]})});return s?(0,x.jsx)(o,{placement:`bottom`,tooltip:!0,content:(0,x.jsx)(x.Fragment,{children:s}),children:E}):E}),S.__docgenInfo={description:'Базовая кнопка дизайн-системы для пользовательских действий.\nПоддерживает состояния, tone + appearance, иконки и безопасный `type="button"` по умолчанию.',methods:[],displayName:`Button`,props:{variant:{required:!1,tsType:{name:`union`,raw:`| "transparent"
1
+ import{c as e,i as t}from"./preload-helper-B45gAKPr.js";import{C as n}from"./iframe-DDcUIbTW.js";import{t as r}from"./jsx-runtime-BBQGix-2.js";import{a as i,i as a}from"./utils-3wvLOPp1.js";import{n as o,t as s}from"./popover-tLJ1tHHS.js";import{n as c,t as l}from"./ui.module-wFHXkJzp.js";import{i as u,n as d,r as f,t as p}from"./uiClasses-CaHp0EWd.js";var m,h,g,_,v,y=t((()=>{m=`wLOHwj`,h=`lFsM-Y`,g=`LPob63`,_=`tsaGtv`,v={button:m,iconOnly:h,buttonInner:g,buttonIcon:_}})),b,x,S,C=t((()=>{b=e(n(),1),a(),s(),l(),f(),y(),x=r(),S=(0,b.forwardRef)(function({children:e,disabled:t,className:n,icon:r,iconEnd:a,title:s,variant:l,tone:f,appearance:m,type:h=`button`,"aria-label":g,..._},y){let S=b.Children.count(e)>0,C=!!r&&!S,w=u({variant:l,tone:f,appearance:m,fallbackAppearance:f&&f!==`neutral`?`solid`:`outline`}),T=C?g??s:g,E=(0,x.jsx)(`button`,{..._,ref:y,type:h,disabled:t,"aria-label":T,className:i(c.uiElement,c.uiInputControl,v.button,d(w.tone),p(w.appearance),C?v.iconOnly:``,`textNoWrap`,n??``),children:(0,x.jsxs)(`span`,{className:v.buttonInner,children:[r&&!a&&(0,x.jsx)(`span`,{"aria-hidden":`true`,className:v.buttonIcon,children:r}),S&&(0,x.jsx)(`span`,{className:`flexEllipsis`,children:e}),r&&a&&(0,x.jsx)(`span`,{"aria-hidden":`true`,className:v.buttonIcon,children:r})]})});return s?(0,x.jsx)(o,{placement:`bottom`,tooltip:!0,content:(0,x.jsx)(x.Fragment,{children:s}),children:E}):E}),S.__docgenInfo={description:'Базовая кнопка дизайн-системы для пользовательских действий.\nПоддерживает состояния, tone + appearance, иконки и безопасный `type="button"` по умолчанию.',methods:[],displayName:`Button`,props:{variant:{required:!1,tsType:{name:`union`,raw:`| "transparent"
2
2
  | "ghost"
3
3
  | "neutral"
4
4
  | "error"
@@ -1,4 +1,4 @@
1
- import{a as e,i as t}from"./preload-helper-B45gAKPr.js";import{t as n}from"./jsx-runtime-BBQGix-2.js";import{J as r,Mt as i,t as a,w as o,wt as s}from"./lucide-react-BdqrDz6_.js";import{n as c,t as l}from"./Button-vNsY1Xgh.js";var u=e({Basic:()=>m,ComposableScheme:()=>g,Variants:()=>h,WithIcons:()=>_,__namedExportsOrder:()=>v,default:()=>p}),d,f,p,m,h,g,_,v,y=t((()=>{a(),c(),d=n(),{fn:f}=__STORYBOOK_MODULE_TEST__,p={title:`Shared/UI/Button`,component:l,args:{children:`Действие`,variant:`neutralOutline`,disabled:!1,iconEnd:!1,onClick:f()},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{children:{description:`Текстовое содержимое кнопки.`,control:`text`},variant:{description:"Готовая схема для обратной совместимости. Если заданы `tone` или `appearance`, они имеют приоритет.",control:`select`,options:[`neutral`,`neutralOutline`,`ghost`,`error`,`warning`,`success`,`info`,`errorOutline`,`warningOutline`,`successOutline`,`infoOutline`,`transparent`]},tone:{description:`Семантический тон кнопки.`,control:`inline-radio`,options:[`neutral`,`error`,`warning`,`success`,`info`]},appearance:{description:`Визуальная форма кнопки.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},icon:{description:`Иконка слева или справа от текста.`,control:!1},iconEnd:{description:`Перемещает иконку в конец кнопки.`,control:`boolean`},title:{description:"Текст тултипа и `aria-label` для кнопки.",control:`text`},disabled:{description:`Блокирует нажатие.`,control:`boolean`},onClick:{description:`Вызывается при нажатии на кнопку.`,control:!1},className:{description:`Дополнительный CSS-класс.`,control:`text`}}},m={},h={render:()=>(0,d.jsxs)(`div`,{style:{display:`grid`,gap:12,gridTemplateColumns:`repeat(auto-fit, minmax(180px, 1fr))`},children:[(0,d.jsx)(l,{variant:`neutral`,children:`Neutral Solid`}),(0,d.jsx)(l,{variant:`neutralOutline`,children:`Neutral Outline`}),(0,d.jsx)(l,{variant:`ghost`,children:`Ghost`}),(0,d.jsx)(l,{variant:`info`,children:`Info Solid`}),(0,d.jsx)(l,{variant:`success`,children:`Success Solid`}),(0,d.jsx)(l,{variant:`warning`,children:`Warning Solid`}),(0,d.jsx)(l,{variant:`error`,children:`Error Solid`}),(0,d.jsx)(l,{variant:`infoOutline`,children:`Info Outline`}),(0,d.jsx)(l,{variant:`successOutline`,children:`Success Outline`}),(0,d.jsx)(l,{variant:`warningOutline`,children:`Warning Outline`}),(0,d.jsx)(l,{variant:`errorOutline`,children:`Error Outline`}),(0,d.jsx)(l,{variant:`transparent`,children:`Transparent`})]}),args:{children:`Действие`}},g={render:()=>(0,d.jsxs)(`div`,{style:{display:`grid`,gap:12,gridTemplateColumns:`repeat(auto-fit, minmax(180px, 1fr))`},children:[(0,d.jsx)(l,{tone:`neutral`,appearance:`solid`,children:`Neutral Solid`}),(0,d.jsx)(l,{tone:`neutral`,appearance:`outline`,children:`Neutral Outline`}),(0,d.jsx)(l,{tone:`neutral`,appearance:`ghost`,children:`Neutral Ghost`}),(0,d.jsx)(l,{tone:`info`,appearance:`outline`,children:`Info Outline`}),(0,d.jsx)(l,{tone:`success`,appearance:`solid`,children:`Success Solid`}),(0,d.jsx)(l,{tone:`error`,appearance:`transparent`,children:`Error Transparent`})]})},_={render:()=>(0,d.jsxs)(`div`,{style:{display:`flex`,gap:12,flexWrap:`wrap`},children:[(0,d.jsx)(l,{icon:(0,d.jsx)(r,{}),children:`Скачать`}),(0,d.jsx)(l,{icon:(0,d.jsx)(o,{}),tone:`info`,appearance:`solid`,children:`Создать`}),(0,d.jsx)(l,{icon:(0,d.jsx)(s,{}),iconEnd:!0,tone:`success`,appearance:`solid`,children:`Подтвердить`}),(0,d.jsx)(l,{icon:(0,d.jsx)(i,{}),title:`Уведомления`})]}),args:{children:`Действие`}},m.parameters={...m.parameters,docs:{...m.parameters?.docs,source:{originalSource:`{
1
+ import{a as e,i as t}from"./preload-helper-B45gAKPr.js";import{t as n}from"./jsx-runtime-BBQGix-2.js";import{J as r,Mt as i,t as a,w as o,wt as s}from"./lucide-react-BEuqhHrO.js";import{n as c,t as l}from"./Button-CTNNWxuu.js";var u=e({Basic:()=>m,ComposableScheme:()=>g,Variants:()=>h,WithIcons:()=>_,__namedExportsOrder:()=>v,default:()=>p}),d,f,p,m,h,g,_,v,y=t((()=>{a(),c(),d=n(),{fn:f}=__STORYBOOK_MODULE_TEST__,p={title:`Shared/UI/Button`,component:l,args:{children:`Действие`,variant:`neutralOutline`,disabled:!1,iconEnd:!1,onClick:f()},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{children:{description:`Текстовое содержимое кнопки.`,control:`text`},variant:{description:"Готовая схема для обратной совместимости. Если заданы `tone` или `appearance`, они имеют приоритет.",control:`select`,options:[`neutral`,`neutralOutline`,`ghost`,`error`,`warning`,`success`,`info`,`errorOutline`,`warningOutline`,`successOutline`,`infoOutline`,`transparent`]},tone:{description:`Семантический тон кнопки.`,control:`inline-radio`,options:[`neutral`,`error`,`warning`,`success`,`info`]},appearance:{description:`Визуальная форма кнопки.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},icon:{description:`Иконка слева или справа от текста.`,control:!1},iconEnd:{description:`Перемещает иконку в конец кнопки.`,control:`boolean`},title:{description:"Текст тултипа и `aria-label` для кнопки.",control:`text`},disabled:{description:`Блокирует нажатие.`,control:`boolean`},onClick:{description:`Вызывается при нажатии на кнопку.`,control:!1},className:{description:`Дополнительный CSS-класс.`,control:`text`}}},m={},h={render:()=>(0,d.jsxs)(`div`,{style:{display:`grid`,gap:12,gridTemplateColumns:`repeat(auto-fit, minmax(180px, 1fr))`},children:[(0,d.jsx)(l,{variant:`neutral`,children:`Neutral Solid`}),(0,d.jsx)(l,{variant:`neutralOutline`,children:`Neutral Outline`}),(0,d.jsx)(l,{variant:`ghost`,children:`Ghost`}),(0,d.jsx)(l,{variant:`info`,children:`Info Solid`}),(0,d.jsx)(l,{variant:`success`,children:`Success Solid`}),(0,d.jsx)(l,{variant:`warning`,children:`Warning Solid`}),(0,d.jsx)(l,{variant:`error`,children:`Error Solid`}),(0,d.jsx)(l,{variant:`infoOutline`,children:`Info Outline`}),(0,d.jsx)(l,{variant:`successOutline`,children:`Success Outline`}),(0,d.jsx)(l,{variant:`warningOutline`,children:`Warning Outline`}),(0,d.jsx)(l,{variant:`errorOutline`,children:`Error Outline`}),(0,d.jsx)(l,{variant:`transparent`,children:`Transparent`})]}),args:{children:`Действие`}},g={render:()=>(0,d.jsxs)(`div`,{style:{display:`grid`,gap:12,gridTemplateColumns:`repeat(auto-fit, minmax(180px, 1fr))`},children:[(0,d.jsx)(l,{tone:`neutral`,appearance:`solid`,children:`Neutral Solid`}),(0,d.jsx)(l,{tone:`neutral`,appearance:`outline`,children:`Neutral Outline`}),(0,d.jsx)(l,{tone:`neutral`,appearance:`ghost`,children:`Neutral Ghost`}),(0,d.jsx)(l,{tone:`info`,appearance:`outline`,children:`Info Outline`}),(0,d.jsx)(l,{tone:`success`,appearance:`solid`,children:`Success Solid`}),(0,d.jsx)(l,{tone:`error`,appearance:`transparent`,children:`Error Transparent`})]})},_={render:()=>(0,d.jsxs)(`div`,{style:{display:`flex`,gap:12,flexWrap:`wrap`},children:[(0,d.jsx)(l,{icon:(0,d.jsx)(r,{}),children:`Скачать`}),(0,d.jsx)(l,{icon:(0,d.jsx)(o,{}),tone:`info`,appearance:`solid`,children:`Создать`}),(0,d.jsx)(l,{icon:(0,d.jsx)(s,{}),iconEnd:!0,tone:`success`,appearance:`solid`,children:`Подтвердить`}),(0,d.jsx)(l,{icon:(0,d.jsx)(i,{}),title:`Уведомления`})]}),args:{children:`Действие`}},m.parameters={...m.parameters,docs:{...m.parameters?.docs,source:{originalSource:`{
2
2
  // play: async function ({ args, canvas, userEvent }) {
3
3
  // const button = canvas.getByRole("button", { name: /button/i });
4
4
  // // 👇 Simulate behavior
@@ -1,4 +1,4 @@
1
- import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-C6uFFMmb.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-Rn_bm6Wj.js";import{Controlled as p,Disabled as m,Sizes as h,Tones as g,n as _,t as v}from"./CheckBox.stories-CuPBzuQf.js";function y(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(a,{of:v,parameters:{docs:{toc:!0}}}),`
1
+ import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-DiO1TOQU.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-BpvM7HGu.js";import{Controlled as p,Disabled as m,Sizes as h,Tones as g,n as _,t as v}from"./CheckBox.stories-CWShbXBJ.js";function y(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(a,{of:v,parameters:{docs:{toc:!0}}}),`
2
2
  `,(0,x.jsx)(c,{children:`CheckBox`}),`
3
3
  `,(0,x.jsx)(i,{children:`Флажок для булевых полей с общими UI-схемами tone и appearance`}),`
4
4
  `,(0,x.jsx)(o.p,{children:`CheckBox уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
@@ -1,2 +1,2 @@
1
- import{c as e,i as t}from"./preload-helper-B45gAKPr.js";import{C as n}from"./iframe-Cqdlb8-A.js";import{t as r}from"./jsx-runtime-BBQGix-2.js";import{a as i,i as a}from"./utils-238J8rpj.js";import{A as o,g as s,t as c}from"./lucide-react-BdqrDz6_.js";import{n as l,t as u}from"./ui.module-wFHXkJzp.js";import{n as d,r as f}from"./uiClasses-CaHp0EWd.js";import{n as p,t as m}from"./CheckBox.module-ezWPE2pa.js";function h({label:e,description:t,placeholder:n,disabled:r,size:a,className:c,onChange:u,value:f,noWrap:p,id:h,tone:v=`neutral`,indeterminate:y=!1,...b}){let x=(0,g.useId)(),S=h??x,C=t?`${S}-description`:void 0,w=e??n,T=f??!1,E=e=>{e&&(e.indeterminate=y)};return(0,_.jsxs)(`div`,{className:i(l.uiElement,a&&l.uiSizable,a&&l[a],r&&l.disabled,c),"aria-disabled":r||void 0,children:[(0,_.jsxs)(`div`,{className:m.row,children:[(0,_.jsxs)(`div`,{className:i(m.wrapper,d(v)),children:[(0,_.jsx)(`input`,{...b,ref:E,id:S,type:`checkbox`,checked:T,disabled:r,"aria-checked":y?`mixed`:T,"aria-describedby":C,className:i(l.uiSelectionControl,m.input,y&&m.inputIndeterminate),onChange:()=>u?.(!T)}),(0,_.jsx)(`div`,{className:i(l.uiSelectionIcon,m.icon),"aria-hidden":`true`,children:y?(0,_.jsx)(o,{}):(0,_.jsx)(s,{})})]}),w&&(0,_.jsx)(`label`,{htmlFor:S,className:i(l.uiLabelBase,p&&`textNoWrap`),children:w})]}),t&&(0,_.jsx)(`p`,{id:C,className:l.uiDescription,children:t})]})}var g,_,v=t((()=>{g=e(n(),1),a(),c(),u(),f(),p(),_=r(),h.__docgenInfo={description:`Компонент флажка для выбора булевого значения в формах и списках.
1
+ import{c as e,i as t}from"./preload-helper-B45gAKPr.js";import{C as n}from"./iframe-DDcUIbTW.js";import{t as r}from"./jsx-runtime-BBQGix-2.js";import{a as i,i as a}from"./utils-3wvLOPp1.js";import{A as o,g as s,t as c}from"./lucide-react-BEuqhHrO.js";import{n as l,t as u}from"./ui.module-wFHXkJzp.js";import{n as d,r as f}from"./uiClasses-CaHp0EWd.js";import{n as p,t as m}from"./CheckBox.module-ezWPE2pa.js";function h({label:e,description:t,placeholder:n,disabled:r,size:a,className:c,onChange:u,value:f,noWrap:p,id:h,tone:v=`neutral`,indeterminate:y=!1,...b}){let x=(0,g.useId)(),S=h??x,C=t?`${S}-description`:void 0,w=e??n,T=f??!1,E=e=>{e&&(e.indeterminate=y)};return(0,_.jsxs)(`div`,{className:i(l.uiElement,a&&l.uiSizable,a&&l[a],r&&l.disabled,c),"aria-disabled":r||void 0,children:[(0,_.jsxs)(`div`,{className:m.row,children:[(0,_.jsxs)(`div`,{className:i(m.wrapper,d(v)),children:[(0,_.jsx)(`input`,{...b,ref:E,id:S,type:`checkbox`,checked:T,disabled:r,"aria-checked":y?`mixed`:T,"aria-describedby":C,className:i(l.uiSelectionControl,m.input,y&&m.inputIndeterminate),onChange:()=>u?.(!T)}),(0,_.jsx)(`div`,{className:i(l.uiSelectionIcon,m.icon),"aria-hidden":`true`,children:y?(0,_.jsx)(o,{}):(0,_.jsx)(s,{})})]}),w&&(0,_.jsx)(`label`,{htmlFor:S,className:i(l.uiLabelBase,p&&`textNoWrap`),children:w})]}),t&&(0,_.jsx)(`p`,{id:C,className:l.uiDescription,children:t})]})}var g,_,v=t((()=>{g=e(n(),1),a(),c(),u(),f(),p(),_=r(),h.__docgenInfo={description:`Компонент флажка для выбора булевого значения в формах и списках.
2
2
  Поддерживает tone + appearance и использует общие selection utility-классы из ui.module.scss.`,methods:[],displayName:`CheckBox`,props:{label:{required:!1,tsType:{name:`ReactNode`},description:``},description:{required:!1,tsType:{name:`string`},description:``},placeholder:{required:!1,tsType:{name:`string`},description:``},disabled:{required:!1,tsType:{name:`boolean`},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:``},value:{required:!0,tsType:{name:`V`},description:"Если начальное состояние может быть `null | undefined`\nзначит `onChange` тоже должен ументь сбрасывать.\nПоэтому такой контрол явно должен передавать `UiBaseProps<AnyType | undefined>`"},onChange:{required:!0,tsType:{name:`signature`,type:`function`,raw:`(value: T) => void`,signature:{arguments:[{type:{name:`C`},name:`value`}],return:{name:`void`}}},description:``},tone:{required:!1,tsType:{name:`union`,raw:`"neutral" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"neutral"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"info"`}]},description:``,defaultValue:{value:`"neutral"`,computed:!1}},noWrap:{required:!1,tsType:{name:`boolean`},description:``},indeterminate:{required:!1,tsType:{name:`boolean`},description:'Показывает частично выбранную группу и публикует `aria-checked="mixed"`.',defaultValue:{value:`false`,computed:!1}}},composes:[`Omit`]}}));export{v as n,h as t};
@@ -1,4 +1,4 @@
1
- import{a as e,c as t,i as n}from"./preload-helper-B45gAKPr.js";import{C as r}from"./iframe-Cqdlb8-A.js";import{t as i}from"./jsx-runtime-BBQGix-2.js";import{n as a,t as o}from"./CheckBox-Dnxk4w_M.js";var s=e({Controlled:()=>d,Disabled:()=>m,Sizes:()=>p,Tones:()=>f,__namedExportsOrder:()=>h,default:()=>u}),c,l,u,d,f,p,m,h,g=n((()=>{c=t(r(),1),a(),l=i(),u={title:`Shared/UI/CheckBox`,component:o,args:{value:!1,onChange:()=>{}},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{label:{description:`Текст основной подписи чекбокса.`,control:`text`},description:{description:`Дополнительное описание под элементом.`,control:`text`},placeholder:{description:"Текст подписи, если `label` не задан.",control:`text`},value:{description:`Текущее состояние чекбокса.`,control:`boolean`},onChange:{description:`Вызывается при изменении состояния.`,control:!1},disabled:{description:`Блокирует взаимодействие с элементом.`,control:`boolean`},size:{description:`Размер визуального контрола и текста.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Семантический тон чекбокса.`,control:`inline-radio`,options:[`neutral`,`error`,`warning`,`success`,`info`]}}},d={render:e=>{let[t,n]=(0,c.useState)(e.value??!1);return(0,l.jsx)(o,{...e,value:t,onChange:n})},args:{label:`Принимать условия`,description:`Подтверждение условий использования сервиса.`,value:!1,size:`md`,disabled:!1,tone:`neutral`}},f={render:()=>{let[e,t]=(0,c.useState)({neutral:!0,info:!0,success:!0,warning:!0,error:!0});return(0,l.jsx)(`div`,{style:{display:`grid`,gap:12},children:[`neutral`,`info`,`success`,`warning`,`error`].map(n=>(0,l.jsx)(o,{tone:n,label:`Тон ${n}`,value:e[n],onChange:e=>t(t=>({...t,[n]:e}))},n))})}},p={render:()=>{let[e,t]=(0,c.useState)({xs:!1,sm:!0,md:!1,lg:!0,xl:!1});return(0,l.jsx)(`div`,{style:{display:`grid`,gap:12},children:[`xs`,`sm`,`md`,`lg`,`xl`].map(n=>(0,l.jsx)(o,{size:n,label:`Размер ${n}`,value:e[n],onChange:e=>t(t=>({...t,[n]:e}))},n))})}},m={args:{label:`Недоступный чекбокс`,description:`Изменение недоступно из-за прав доступа.`,value:!0,disabled:!0,tone:`neutral`}},d.parameters={...d.parameters,docs:{...d.parameters?.docs,source:{originalSource:`{
1
+ import{a as e,c as t,i as n}from"./preload-helper-B45gAKPr.js";import{C as r}from"./iframe-DDcUIbTW.js";import{t as i}from"./jsx-runtime-BBQGix-2.js";import{n as a,t as o}from"./CheckBox-rvChOzA-.js";var s=e({Controlled:()=>d,Disabled:()=>m,Sizes:()=>p,Tones:()=>f,__namedExportsOrder:()=>h,default:()=>u}),c,l,u,d,f,p,m,h,g=n((()=>{c=t(r(),1),a(),l=i(),u={title:`Shared/UI/CheckBox`,component:o,args:{value:!1,onChange:()=>{}},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{label:{description:`Текст основной подписи чекбокса.`,control:`text`},description:{description:`Дополнительное описание под элементом.`,control:`text`},placeholder:{description:"Текст подписи, если `label` не задан.",control:`text`},value:{description:`Текущее состояние чекбокса.`,control:`boolean`},onChange:{description:`Вызывается при изменении состояния.`,control:!1},disabled:{description:`Блокирует взаимодействие с элементом.`,control:`boolean`},size:{description:`Размер визуального контрола и текста.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Семантический тон чекбокса.`,control:`inline-radio`,options:[`neutral`,`error`,`warning`,`success`,`info`]}}},d={render:e=>{let[t,n]=(0,c.useState)(e.value??!1);return(0,l.jsx)(o,{...e,value:t,onChange:n})},args:{label:`Принимать условия`,description:`Подтверждение условий использования сервиса.`,value:!1,size:`md`,disabled:!1,tone:`neutral`}},f={render:()=>{let[e,t]=(0,c.useState)({neutral:!0,info:!0,success:!0,warning:!0,error:!0});return(0,l.jsx)(`div`,{style:{display:`grid`,gap:12},children:[`neutral`,`info`,`success`,`warning`,`error`].map(n=>(0,l.jsx)(o,{tone:n,label:`Тон ${n}`,value:e[n],onChange:e=>t(t=>({...t,[n]:e}))},n))})}},p={render:()=>{let[e,t]=(0,c.useState)({xs:!1,sm:!0,md:!1,lg:!0,xl:!1});return(0,l.jsx)(`div`,{style:{display:`grid`,gap:12},children:[`xs`,`sm`,`md`,`lg`,`xl`].map(n=>(0,l.jsx)(o,{size:n,label:`Размер ${n}`,value:e[n],onChange:e=>t(t=>({...t,[n]:e}))},n))})}},m={args:{label:`Недоступный чекбокс`,description:`Изменение недоступно из-за прав доступа.`,value:!0,disabled:!0,tone:`neutral`}},d.parameters={...d.parameters,docs:{...d.parameters?.docs,source:{originalSource:`{
2
2
  render: args => {
3
3
  const [value, setValue] = useState(args.value ?? false);
4
4
  return <CheckBox {...args} value={value} onChange={setValue} />;