@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -1
  2. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
  3. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  4. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  5. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  6. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  7. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  8. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  9. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  10. package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
  11. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  12. package/dist/select/model/useODataSelect.d.ts +1 -1
  13. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  14. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  15. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  16. package/dist/tree-select/index.js.map +1 -1
  17. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  18. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  19. package/package.json +3 -3
  20. package/storybook-static/assets/{Badge-BojMuOws.js → Badge-CveIo2LZ.js} +1 -1
  21. package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-Bd8M64xJ.js} +1 -1
  22. package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-xT41a0VL.js} +1 -1
  23. package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-C5bBSb3k.js} +1 -1
  24. package/storybook-static/assets/{Button-CrTHXWYk.js → Button-DkDgfpHL.js} +1 -1
  25. package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-CeKPeGK5.js} +1 -1
  26. package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-CEqcrblx.js} +1 -1
  27. package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-DKeFkdOt.js} +1 -1
  28. package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-OVvAarW-.js} +1 -1
  29. package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-CfZ0p1yo.js} +1 -1
  30. package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-BWW7zrfs.js} +1 -1
  31. package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-kia7is1N.js} +1 -1
  32. package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-xn2GtiLR.js} +1 -1
  33. package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-CYuy9uXF.js} +1 -1
  34. package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-C4w-APws.js} +1 -1
  35. package/storybook-static/assets/DateInput-BiUFIihm.js +1 -0
  36. package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DAzE5mCE.js} +1 -1
  37. package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-BcowGCRD.js} +1 -1
  38. package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-CQm4dNLR.js} +1 -1
  39. package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-RIyqNBk9.js} +1 -1
  40. package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ypGyuGfy.js} +1 -1
  41. package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CEypL2Nh.js} +1 -1
  42. package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-DNkT7B-u.js} +1 -1
  43. package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-BVFFQJDH.js} +1 -1
  44. package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DD0grLG3.js} +1 -1
  45. package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-DSCypHqR.js} +1 -1
  46. package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-DauUgrev.js} +1 -1
  47. package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-B1qB8vQZ.js} +1 -1
  48. package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-D9oCCeHf.js} +1 -1
  49. package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-CmSf6tXp.js} +1 -1
  50. package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-D42ueN1w.js} +1 -1
  51. package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-D8hbPCAv.js} +1 -1
  52. package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-DO-T_Bh4.js} +1 -1
  53. package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-CknJDoji.js} +1 -1
  54. package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-Dqi_bo3c.js} +1 -1
  55. package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-BD9QZGZN.js} +1 -1
  56. package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CaVn1IOP.js} +1 -1
  57. package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-Bp9Y6q6b.js} +1 -1
  58. package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-U7tx-Jlw.js} +1 -1
  59. package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-pmmhsAbN.js} +1 -1
  60. package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-CEpMNurH.js} +1 -1
  61. package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-BM-gO5DN.js} +1 -1
  62. package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-BWz5XU6U.js} +1 -1
  63. package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-BTYZEX5t.js} +1 -1
  64. package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-Dz2STM95.js} +1 -1
  65. package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DBVe0an3.js} +1 -1
  66. package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories-C4Px97lD.js} +2 -2
  67. package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-TJtlJVfa.js} +1 -1
  68. package/storybook-static/assets/{Input-op4j7Beh.js → Input-CIPgijvW.js} +1 -1
  69. package/storybook-static/assets/{Input-BUDNR96c.js → Input-D8io9jVS.js} +1 -1
  70. package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-SUk3aYaC.js} +1 -1
  71. package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-DA5pIDuE.js} +1 -1
  72. package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-DeudzDSU.js} +1 -1
  73. package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-C5mp5Y5I.js} +1 -1
  74. package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-CGAC7ruP.js} +1 -1
  75. package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-Cx1xQ6PE.js} +1 -1
  76. package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-B7OBcPJN.js} +1 -1
  77. package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-Hzl89Ghf.js} +1 -1
  78. package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-CG6QjDZH.js} +1 -1
  79. package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-B6htWHF1.js} +1 -1
  80. package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-BTa4S4Wp.js} +1 -1
  81. package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-CQnoblAE.js} +1 -1
  82. package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-CEI44Eyz.js} +1 -1
  83. package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-B0ypWz1x.js} +1 -1
  84. package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-BadApta9.js} +1 -1
  85. package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-COB9GlV_.js} +1 -1
  86. package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-C_Uz7Tnj.js} +1 -1
  87. package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories-Btp0IcaL.js} +1 -1
  88. package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-AAaZGSAl.js} +1 -1
  89. package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-CyfuZw7w.js} +1 -1
  90. package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-NDKQmjyQ.js} +1 -1
  91. package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-BJDnJ4zv.js} +1 -1
  92. package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-D_X5lTLO.js} +1 -1
  93. package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-ShDjozpW.js} +1 -1
  94. package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-B5CElQ3-.js} +1 -1
  95. package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-DqXfrjcH.js} +1 -1
  96. package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-fB3mcFmx.js} +1 -1
  97. package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-DDb0G7T8.js} +1 -1
  98. package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-CIGL-pKX.js} +1 -1
  99. package/storybook-static/assets/NotificationsHost.stories-B_MRb3fs.js +29 -0
  100. package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-DQAitH4N.js} +1 -1
  101. package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-DwW221S9.js} +2 -2
  102. package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-tiZhOIhE.js} +1 -1
  103. package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-BhaatPjK.js} +2 -2
  104. package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-B9WqJ-Un.js} +1 -1
  105. package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-CAfKuhfU.js} +1 -1
  106. package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-Cel1phxZ.js} +1 -1
  107. package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-BpBCpBA9.js} +1 -1
  108. package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-BSeGbz02.js} +1 -1
  109. package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-BBtQ3GdK.js} +1 -1
  110. package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-B9nZuqqW.js} +1 -1
  111. package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-BGvhR3to.js} +1 -1
  112. package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DA_zjcdA.js} +1 -1
  113. package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-DDP1eXyM.js} +1 -1
  114. package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-BgvzqRBd.js} +1 -1
  115. package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-BQql18MF.js} +1 -1
  116. package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-C0NebUMz.js} +1 -1
  117. package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-CIyDUtlz.js} +1 -1
  118. package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-BsgzPwCV.js} +1 -1
  119. package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-htbxc3ni.js} +1 -1
  120. package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-ClHM5Kah.js} +1 -1
  121. package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-Dcx0BOTx.js} +1 -1
  122. package/storybook-static/assets/README--LCKbep-.js +110 -0
  123. package/storybook-static/assets/{README-DRnlD7y8.js → README-5M8ajrJp.js} +1 -1
  124. package/storybook-static/assets/README-5NhzH8VL.js +95 -0
  125. package/storybook-static/assets/README-Am6Fa6-b.js +69 -0
  126. package/storybook-static/assets/README-B3bFglqG.js +82 -0
  127. package/storybook-static/assets/README-B45Cwj2a.js +95 -0
  128. package/storybook-static/assets/README-B6Nq7NCU.js +416 -0
  129. package/storybook-static/assets/{README-B4zYJg6u.js → README-B6ltJiw3.js} +1 -1
  130. package/storybook-static/assets/{README-BdPlV5nA.js → README-BB_JPejH.js} +1 -1
  131. package/storybook-static/assets/README-BIq-FXcN.js +2124 -0
  132. package/storybook-static/assets/README-BSh5XUR9.js +110 -0
  133. package/storybook-static/assets/README-BXJneZAJ.js +147 -0
  134. package/storybook-static/assets/README-BYSgTTZt.js +296 -0
  135. package/storybook-static/assets/{README-BzVni2ve.js → README-BmhhWWEk.js} +1 -1
  136. package/storybook-static/assets/README-Bqnqu1bC.js +118 -0
  137. package/storybook-static/assets/README-BuMMG4_N.js +192 -0
  138. package/storybook-static/assets/README-BxjYCoYA.js +186 -0
  139. package/storybook-static/assets/{README-MzcO5Z_P.js → README-ByALXSEH.js} +1 -1
  140. package/storybook-static/assets/README-Byo6DxIF.js +101 -0
  141. package/storybook-static/assets/README-C3UcjOGB.js +208 -0
  142. package/storybook-static/assets/README-C6BOdXNV.js +322 -0
  143. package/storybook-static/assets/README-C8E1O7DQ.js +230 -0
  144. package/storybook-static/assets/README-C9eh0JLs.js +64 -0
  145. package/storybook-static/assets/README-CAGQnLsv.js +90 -0
  146. package/storybook-static/assets/README-CC00hlZK.js +527 -0
  147. package/storybook-static/assets/README-CH_6ZIO2.js +64 -0
  148. package/storybook-static/assets/README-CHbo4O3Z.js +75 -0
  149. package/storybook-static/assets/{README-CTIBG4zH.js → README-CIGfHKKE.js} +1 -1
  150. package/storybook-static/assets/{README-BHw6MVjD.js → README-CM-7E-Jf.js} +1 -1
  151. package/storybook-static/assets/{README-C0BwTe5N.js → README-CNHemCS2.js} +1 -1
  152. package/storybook-static/assets/{README-DzTc6XmY.js → README-CWfPiPIB.js} +1 -1
  153. package/storybook-static/assets/{README-Dx3cpFMr.js → README-CeK4kfFO.js} +1 -1
  154. package/storybook-static/assets/README-Cj2e6HrF.js +178 -0
  155. package/storybook-static/assets/README-CsoHGRve.js +1844 -0
  156. package/storybook-static/assets/README-D9OypaFB.js +208 -0
  157. package/storybook-static/assets/{README-CkWglKbS.js → README-DDBqoI-T.js} +1 -1
  158. package/storybook-static/assets/README-DE2wk9-v.js +1282 -0
  159. package/storybook-static/assets/README-DEj2wSK0.js +264 -0
  160. package/storybook-static/assets/{README-D-XjRtAE.js → README-DIbfpC-2.js} +1 -1
  161. package/storybook-static/assets/{README-Dki94Nf2.js → README-DJHVgrpj.js} +1 -1
  162. package/storybook-static/assets/README-DN9HKtp_.js +124 -0
  163. package/storybook-static/assets/README-DNricOkt.js +136 -0
  164. package/storybook-static/assets/README-DV4fCpqN.js +1146 -0
  165. package/storybook-static/assets/{README-BzVHwvgo.js → README-DjCArsA5.js} +1 -1
  166. package/storybook-static/assets/README-Dl92E69Z.js +1704 -0
  167. package/storybook-static/assets/README-DnA-4W65.js +226 -0
  168. package/storybook-static/assets/README-DoCA4JXf.js +273 -0
  169. package/storybook-static/assets/{README-DqQDgJN-.js → README-DvAlDsh9.js} +1 -1
  170. package/storybook-static/assets/README-Ss-3t1nX.js +158 -0
  171. package/storybook-static/assets/README-eHCINzP3.js +154 -0
  172. package/storybook-static/assets/README-qHKxXU95.js +98 -0
  173. package/storybook-static/assets/README-tm9QH9cF.js +103 -0
  174. package/storybook-static/assets/README-ui-uanyg.js +672 -0
  175. package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-CWtjclwT.js} +1 -1
  176. package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-YIQXt0wx.js} +1 -1
  177. package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-Ah-CBpeC.js} +1 -1
  178. package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BnO-GL7A.js} +1 -1
  179. package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-CUS0etBD.js} +1 -1
  180. package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-DGwCawtU.js} +1 -1
  181. package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-D85fA6pO.js} +1 -1
  182. package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-CGCxJjL9.js} +1 -1
  183. package/storybook-static/assets/{Select-DQMoVjn4.js → Select-gRnfvfGh.js} +1 -1
  184. package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-CMwt4F9i.js} +1 -1
  185. package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-BLXfKJ38.js} +1 -1
  186. package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-Bca1a9ZU.js} +1 -1
  187. package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-CyeQN0Rd.js} +1 -1
  188. package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-xrmZckzw.js} +1 -1
  189. package/storybook-static/assets/SingleDateTimeInput.stories-BYFTQM9z.js +48 -0
  190. package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-1yJ3uVeR.js} +1 -1
  191. package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-D8GtXVGI.js} +1 -1
  192. package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-CyQ3ns_C.js} +1 -1
  193. package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BOzHhEUA.js} +1 -1
  194. package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-ISSx9vH_.js} +1 -1
  195. package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-7ooTghrS.js} +1 -1
  196. package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CCLiMmfZ.js} +1 -1
  197. package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-B36szI6t.js} +1 -1
  198. package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-DQGhgRwx.js} +1 -1
  199. package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-Hsq1wYaq.js} +1 -1
  200. package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-C6hldFgO.js} +1 -1
  201. package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-DieNn4VC.js} +1 -1
  202. package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-CvAhDMix.js} +1 -1
  203. package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-CUT1tvt-.js} +1 -1
  204. package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch-CX9p_uYU.js} +1 -1
  205. package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-nEMRtcWe.js} +1 -1
  206. package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-CPsHa2_m.js} +1 -1
  207. package/storybook-static/assets/{Table-BFAEcUde.js → Table-BhtITVtj.js} +1 -1
  208. package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-nWNhSydG.js} +2 -2
  209. package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-DMQFh2BJ.js} +1 -1
  210. package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-D23_xvom.js} +1 -1
  211. package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-B5BsD_j_.js} +1 -1
  212. package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-DO17z100.js} +1 -1
  213. package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-CMMFnIzb.js} +1 -1
  214. package/storybook-static/assets/{Text-DK4jN26J.js → Text-ClnbDqRk.js} +1 -1
  215. package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-C2IO_zsP.js} +1 -1
  216. package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-DkhohiNc.js} +1 -1
  217. package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-NL6Aq8Vc.js} +1 -1
  218. package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-DNEPDlSW.js} +1 -1
  219. package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-DlfdPsz1.js} +1 -1
  220. package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-3U5CceQN.js} +1 -1
  221. package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-Cc6Ca-HI.js} +1 -1
  222. package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-BR-hVLDp.js} +1 -1
  223. package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-B0oBc-4y.js} +1 -1
  224. package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-D9hMQN2O.js} +1 -1
  225. package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CslpbvPR.js} +1 -1
  226. package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-B_dMCe45.js} +1 -1
  227. package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-2lj0Q8gm.js} +1 -1
  228. package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-DEKNYF2b.js} +1 -1
  229. package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-CVDxn8Vm.js} +1 -1
  230. package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-CBIpzYRL.js} +1 -1
  231. package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-BMzrr2Kc.js} +2 -2
  232. package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-B5YBxaaS.js} +3 -3
  233. package/storybook-static/assets/{check-CLkTJVXe.js → check-BjtdCRaW.js} +1 -1
  234. package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-B4u-y8Z1.js} +1 -1
  235. package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-BQfWs7Ah.js} +1 -1
  236. package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-ChokKd-f.js} +1 -1
  237. package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-meOkhzk4.js} +1 -1
  238. package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B1AnDRf_.js} +1 -1
  239. package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-JYnlcC1F.js} +1 -1
  240. package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-C_wl1sL5.js} +3 -3
  241. package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B-TUGs_1.js} +1 -1
  242. package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
  243. package/storybook-static/assets/{download-eAKjms6q.js → download-eR3X8I-h.js} +1 -1
  244. package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-D95VPQ0b.js} +1 -1
  245. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  246. package/storybook-static/assets/foundationApi-QhHXpYLB.js +59 -0
  247. package/storybook-static/assets/foundationLib-CEAjnstw.js +30 -0
  248. package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-awde7r2r.js} +1 -1
  249. package/storybook-static/assets/iframe-DzQq_POR.js +1 -0
  250. package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-FSp_AjJa.js} +4 -4
  251. package/storybook-static/assets/{info-DhJTzwcL.js → info-12vmb1sT.js} +1 -1
  252. package/storybook-static/assets/odata-C0Kpvttz.js +1 -0
  253. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  254. package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-BXZnk_C7.js} +1 -1
  255. package/storybook-static/assets/{react-YFbUKK0m.js → react-BlCqWuXr.js} +1 -1
  256. package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-Bf5ufPte.js} +1 -1
  257. package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-DR-dTXIC.js} +1 -1
  258. package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-B5e5yb_-.js} +1 -1
  259. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-EVJARTec.js} +1 -1
  260. package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-QP7TS18H.js} +1 -1
  261. package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-qw19mxHr.js} +1 -1
  262. package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-Csu_Cct9.js} +1 -1
  263. package/storybook-static/assets/useODataTreeData-BAv-Twqf.js +1 -0
  264. package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-Da-XM_Y0.js} +1 -1
  265. package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-C0TdC2Pz.js} +1 -1
  266. package/storybook-static/assets/{x-CqPSvWfo.js → x-aCjYTirW.js} +1 -1
  267. package/storybook-static/iframe.html +2 -2
  268. package/storybook-static/index.json +1 -1
  269. package/storybook-static/project.json +1 -1
  270. package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
  271. package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
  272. package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
  273. package/storybook-static/assets/async-SjiCjIjO.js +0 -625
  274. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  275. package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
  276. package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
  277. package/storybook-static/assets/odata-DhISMZkE.js +0 -1
  278. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  279. package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
  280. package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
  281. package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
@@ -0,0 +1,672 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Hooks`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`react-и-browser-hooks`,children:`React и browser hooks`}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/hooks`}),` содержит общие React hooks для задач, которые повторяются в разных приложениях:`]}),`
4
+ `,(0,c.jsxs)(t.ul,{children:[`
5
+ `,(0,c.jsx)(t.li,{children:`задержка часто меняющегося значения;`}),`
6
+ `,(0,c.jsx)(t.li,{children:`debounce и throttle callback-функций;`}),`
7
+ `,(0,c.jsx)(t.li,{children:`настройка сенсоров sortable drag-and-drop;`}),`
8
+ `,(0,c.jsx)(t.li,{children:`управление floating listbox и клавиатурной навигацией;`}),`
9
+ `,(0,c.jsx)(t.li,{children:`чтение и изменение search-параметров TanStack Router;`}),`
10
+ `,(0,c.jsx)(t.li,{children:`построение ссылки на текущий route с другими search-параметрами;`}),`
11
+ `,(0,c.jsx)(t.li,{children:`создание лениво загружаемого React-компонента;`}),`
12
+ `,(0,c.jsx)(t.li,{children:`диагностика изменения ссылок между render;`}),`
13
+ `,(0,c.jsxs)(t.li,{children:[`блокировка browser zoom через `,(0,c.jsx)(t.code,{children:`Ctrl + wheel`}),`.`]}),`
14
+ `]}),`
15
+ `,(0,c.jsx)(t.p,{children:`Документ рассчитан на разработчиков с небольшой базой JavaScript, TypeScript и React. Здесь объясняются не только сигнатуры, но и lifecycle, ограничения и типичные ошибки.`}),`
16
+ `,(0,c.jsxs)(t.blockquote,{children:[`
17
+ `,(0,c.jsx)(t.p,{children:`Все функции этого entrypoint являются React hooks. Их нельзя вызывать как обычные utilities, внутри условий, циклов, event handlers или вложенных функций.`}),`
18
+ `]}),`
19
+ `,(0,c.jsx)(t.h2,{id:`граница-ответственности`,children:`Граница ответственности`}),`
20
+ `,(0,c.jsx)(t.p,{children:`Модуль предоставляет низкоуровневое поведение. Он не создаёт готовые кнопки, select, popup, router или drag-and-drop интерфейс.`}),`
21
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Задача`}),(0,c.jsx)(t.th,{children:`Ответственность`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Таймер, debounce или throttle`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/hooks`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Готовый Select, Picker или Sortable UI`}),(0,c.jsxs)(t.td,{children:[`соответствующий subpath `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-ui`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Search schema, route и navigation policy`}),(0,c.jsx)(t.td,{children:`host-приложение и TanStack Router`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Получение backend-данных`}),(0,c.jsx)(t.td,{children:`TanStack Query и API-слой host-приложения`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Бизнес-правила выбора и сохранения`}),(0,c.jsx)(t.td,{children:`entity или feature host-приложения`})]})]})]}),`
22
+ `,(0,c.jsxs)(t.p,{children:[`Если в UI-пакете уже есть готовый `,(0,c.jsx)(t.code,{children:`Select`}),`, `,(0,c.jsx)(t.code,{children:`Picker`}),` или `,(0,c.jsx)(t.code,{children:`Sortable`}),`, используйте его. `,(0,c.jsx)(t.code,{children:`useFloatingListbox`}),` и `,(0,c.jsx)(t.code,{children:`useDndSortableSensors`}),` нужны при создании нового предметно-независимого primitive.`]}),`
23
+ `,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
24
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib
25
+ `})}),`
26
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`react`}),` является peer dependency пакета. Отдельным hooks также нужны:`]}),`
27
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Peer dependencies`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDndSortableSensors`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`@dnd-kit/core`}),`, `,(0,c.jsx)(t.code,{children:`@dnd-kit/sortable`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useFloatingListbox`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@floating-ui/react`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`useSearchParams`}),`, `,(0,c.jsx)(t.code,{children:`useSearchLink`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@tanstack/react-router`})})]})]})]}),`
28
+ `,(0,c.jsx)(t.p,{children:`Используйте только опубликованный subpath:`}),`
29
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Правильно.
30
+ import { useDebounce } from "@ryuzaki13/react-foundation-lib/hooks";
31
+
32
+ // Неправильно: корневой entrypoint не опубликован.
33
+ // import { useDebounce } from "@ryuzaki13/react-foundation-lib";
34
+
35
+ // Неправильно: private import зависит от структуры исходников.
36
+ // import { useDebounce } from "@ryuzaki13/react-foundation-lib/src/hooks/useDebounce";
37
+ `})}),`
38
+ `,(0,c.jsx)(t.h2,{id:`публичный-api`,children:`Публичный API`}),`
39
+ `,(0,c.jsx)(t.p,{children:`Runtime hooks:`}),`
40
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
41
+ useBlockBrowserZoom,
42
+ useDebounce,
43
+ useDebouncedCallback,
44
+ useDndSortableSensors,
45
+ useFloatingListbox,
46
+ useLazyComponent,
47
+ useReferenceTrace,
48
+ useSearchLink,
49
+ useSearchParams,
50
+ useThrottledCallback
51
+ } from "@ryuzaki13/react-foundation-lib/hooks";
52
+ `})}),`
53
+ `,(0,c.jsx)(t.p,{children:`Публичные типы:`}),`
54
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import type {
55
+ FloatingListboxPlacementStrategy,
56
+ FloatingListboxSizeContext,
57
+ FloatingListboxSizeResolver,
58
+ FloatingListboxSizeStyle,
59
+ ThrottledCallback,
60
+ UseDndSortableSensorsOptions
61
+ } from "@ryuzaki13/react-foundation-lib/hooks";
62
+ `})}),`
63
+ `,(0,c.jsx)(t.p,{children:`Всего entrypoint экспортирует 16 публичных имён: 10 hooks и 6 типов.`}),`
64
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ParamValue`}),`, `,(0,c.jsx)(t.code,{children:`SearchParams`}),`, `,(0,c.jsx)(t.code,{children:`SearchParamsUpdater`}),` и `,(0,c.jsx)(t.code,{children:`UseFloatingListboxParams`}),` используются внутри деклараций, но не экспортируются из package subpath. Не импортируйте их через private paths.`]}),`
65
+ `,(0,c.jsx)(t.h2,{id:`правила-react-hooks`,children:`Правила React hooks`}),`
66
+ `,(0,c.jsx)(t.p,{children:`Вызывайте hook только на верхнем уровне React component или собственного hook:`}),`
67
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function SearchPanel() {
68
+ const query = useDebounce("text", 300);
69
+ return <div>{query}</div>;
70
+ }
71
+ `})}),`
72
+ `,(0,c.jsx)(t.p,{children:`Условный вызов запрещён:`}),`
73
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function SearchPanel({ enabled }: { enabled: boolean }) {
74
+ if (enabled) {
75
+ // Неправильно: hook вызывается условно.
76
+ const query = useDebounce("text", 300);
77
+ return <div>{query}</div>;
78
+ }
79
+
80
+ return null;
81
+ }
82
+ `})}),`
83
+ `,(0,c.jsx)(t.p,{children:`В event handler вызывайте функцию, которую вернул hook:`}),`
84
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function Toolbar() {
85
+ const { call } = useDebouncedCallback((value: string) => {
86
+ console.log(value);
87
+ }, 300);
88
+
89
+ return (
90
+ <button type="button" onClick={() => call("save")}>
91
+ Сохранить
92
+ </button>
93
+ );
94
+ }
95
+ `})}),`
96
+ `,(0,c.jsxs)(t.p,{children:[`В development Strict Mode может выполнить дополнительный setup/cleanup cycle. Timers и listeners очищаются, но callback с `,(0,c.jsx)(t.code,{children:`flushOnUnmount: true`}),` является side effect cleanup и должен быть идемпотентным.`]}),`
97
+ `,(0,c.jsx)(t.h2,{id:`быстрый-выбор`,children:`Быстрый выбор`}),`
98
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Сценарий`}),(0,c.jsx)(t.th,{children:`API`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Значение после паузы во вводе`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebounce`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Callback после паузы от последнего события`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebouncedCallback`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ограничение частоты с leading и trailing вызовами`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useThrottledCallback`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Pointer и Keyboard sensors DnD Kit`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDndSortableSensors`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Собственный доступный floating listbox`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useFloatingListbox`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Чтение и replace-navigation search state`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useSearchParams`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`Построение `,(0,c.jsx)(t.code,{children:`href`}),` без navigation`]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useSearchLink`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Lazy component внутри component/custom hook`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useLazyComponent`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Диагностика reference identity`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useReferenceTrace`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`Блокировка `,(0,c.jsx)(t.code,{children:`Ctrl + wheel`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useBlockBrowserZoom`})})]})]})]}),`
99
+ `,(0,c.jsx)(t.h2,{id:`debounce-и-throttle-простыми-словами`,children:`Debounce и throttle простыми словами`}),`
100
+ `,(0,c.jsx)(t.p,{children:`Debounce ждёт тишины:`}),`
101
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`события: A -- B -- C ----------------
102
+ таймер: x x |--- delay ---|
103
+ callback: C
104
+ `})}),`
105
+ `,(0,c.jsx)(t.p,{children:`Throttle ограничивает частоту:`}),`
106
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`события: A - B - C - D - E ----------
107
+ callback: A ------- D ------- E
108
+ leading trailing
109
+ `})}),`
110
+ `,(0,c.jsx)(t.h2,{id:`usedebounce`,children:(0,c.jsx)(t.code,{children:`useDebounce`})}),`
111
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useDebounce`}),` возвращает задержанную копию React-значения:`]}),`
112
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function useDebounce<T>(value: T, delay: number): T;
113
+ `})}),`
114
+ `,(0,c.jsx)(t.h3,{id:`пример`,children:`Пример`}),`
115
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useMemo, useState } from "react";
116
+
117
+ import { useDebounce } from "@ryuzaki13/react-foundation-lib/hooks";
118
+
119
+ type User = {
120
+ id: string;
121
+ name: string;
122
+ };
123
+
124
+ function UserList({ users }: { users: readonly User[] }) {
125
+ const [draftQuery, setDraftQuery] = useState("");
126
+ const query = useDebounce(draftQuery, 300);
127
+
128
+ const visibleUsers = useMemo(() => {
129
+ const normalized = query.trim().toLowerCase();
130
+ if (!normalized) return users;
131
+ return users.filter((user) => user.name.toLowerCase().includes(normalized));
132
+ }, [query, users]);
133
+
134
+ return (
135
+ <>
136
+ <input value={draftQuery} onChange={(event) => setDraftQuery(event.target.value)} />
137
+ <ul>
138
+ {visibleUsers.map((user) => (
139
+ <li key={user.id}>{user.name}</li>
140
+ ))}
141
+ </ul>
142
+ </>
143
+ );
144
+ }
145
+ `})}),`
146
+ `,(0,c.jsx)(t.h3,{id:`точное-поведение`,children:`Точное поведение`}),`
147
+ `,(0,c.jsxs)(t.ol,{children:[`
148
+ `,(0,c.jsxs)(t.li,{children:[`На первом render возвращается исходный `,(0,c.jsx)(t.code,{children:`value`}),`.`]}),`
149
+ `,(0,c.jsxs)(t.li,{children:[`После изменения `,(0,c.jsx)(t.code,{children:`value`}),` или `,(0,c.jsx)(t.code,{children:`delay`}),` создаётся timeout.`]}),`
150
+ `,(0,c.jsx)(t.li,{children:`Новое изменение удаляет предыдущий timeout.`}),`
151
+ `,(0,c.jsx)(t.li,{children:`После delay значение записывается во внутренний state.`}),`
152
+ `,(0,c.jsx)(t.li,{children:`При unmount timeout очищается.`}),`
153
+ `]}),`
154
+ `,(0,c.jsx)(t.h3,{id:`ограничения`,children:`Ограничения`}),`
155
+ `,(0,c.jsxs)(t.ul,{children:[`
156
+ `,(0,c.jsx)(t.li,{children:`Новый object/array reference на каждом render перезапускает timeout.`}),`
157
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`delay`}),` не валидируется. Нулевое или отрицательное значение практически убирает задержку.`]}),`
158
+ `,(0,c.jsx)(t.li,{children:`Hook не отменяет network request, а только задерживает значение.`}),`
159
+ `,(0,c.jsx)(t.li,{children:`Не копируйте debounced Query data в ещё один state.`}),`
160
+ `]}),`
161
+ `,(0,c.jsx)(t.p,{children:`Нестабильный object:`}),`
162
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`// Новый объект на каждом render.
163
+ const delayedFilters = useDebounce({ status, query }, 300);
164
+ `})}),`
165
+ `,(0,c.jsx)(t.p,{children:`При реальной необходимости стабилизируйте input:`}),`
166
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const filters = useMemo(() => ({ status, query }), [query, status]);
167
+ const delayedFilters = useDebounce(filters, 300);
168
+ `})}),`
169
+ `,(0,c.jsx)(t.h2,{id:`usedebouncedcallback`,children:(0,c.jsx)(t.code,{children:`useDebouncedCallback`})}),`
170
+ `,(0,c.jsx)(t.p,{children:`Hook откладывает callback до окончания периода тишины:`}),`
171
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function useDebouncedCallback<T>(
172
+ cb: (arg: T) => void,
173
+ delayMs: number,
174
+ options?: { flushOnUnmount?: boolean }
175
+ ): {
176
+ call: (arg: T) => void;
177
+ flush: () => void;
178
+ cancel: () => void;
179
+ };
180
+ `})}),`
181
+ `,(0,c.jsx)(t.h3,{id:`пример-1`,children:`Пример`}),`
182
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function DraftEditor({ onSave }: { onSave: (value: string) => void }) {
183
+ const [value, setValue] = useState("");
184
+ const { call, flush, cancel } = useDebouncedCallback(onSave, 500);
185
+
186
+ return (
187
+ <div>
188
+ <input
189
+ value={value}
190
+ onChange={(event) => {
191
+ const next = event.target.value;
192
+ setValue(next);
193
+ call(next);
194
+ }}
195
+ onBlur={flush}
196
+ />
197
+ <button type="button" onClick={cancel}>
198
+ Отменить pending save
199
+ </button>
200
+ </div>
201
+ );
202
+ }
203
+ `})}),`
204
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Функция`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`call(value)`})}),(0,c.jsx)(t.td,{children:`Сохраняет последнее значение и перезапускает timeout.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`flush()`})}),(0,c.jsx)(t.td,{children:`Немедленно вызывает callback с pending-значением.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`cancel()`})}),(0,c.jsx)(t.td,{children:`Удаляет timeout и забывает значение без callback.`})]})]})]}),`
205
+ `,(0,c.jsxs)(t.p,{children:[`Это last-write-wins: после `,(0,c.jsx)(t.code,{children:`call("A")`}),`, `,(0,c.jsx)(t.code,{children:`call("B")`}),` и `,(0,c.jsx)(t.code,{children:`call("C")`}),` callback получит только `,(0,c.jsx)(t.code,{children:`"C"`}),`.`]}),`
206
+ `,(0,c.jsxs)(t.p,{children:[`Актуальная `,(0,c.jsx)(t.code,{children:`cb`}),` хранится в ref после commit, поэтому pending timer не использует старое замыкание. `,(0,c.jsx)(t.code,{children:`flush`}),` и `,(0,c.jsx)(t.code,{children:`cancel`}),` стабильны; `,(0,c.jsx)(t.code,{children:`call`}),` меняется при изменении `,(0,c.jsx)(t.code,{children:`delayMs`}),`.`]}),`
207
+ `,(0,c.jsx)(t.h3,{id:`flushonunmount`,children:(0,c.jsx)(t.code,{children:`flushOnUnmount`})}),`
208
+ `,(0,c.jsxs)(t.p,{children:[`Default cleanup выполняет `,(0,c.jsx)(t.code,{children:`cancel()`}),`. Для попытки применить последнее значение:`]}),`
209
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const deferred = useDebouncedCallback(onSave, 500, {
210
+ flushOnUnmount: true
211
+ });
212
+ `})}),`
213
+ `,(0,c.jsxs)(t.p,{children:[`Callback должен быть безопасен во время cleanup и не обновлять state размонтированного component. Изменение самого `,(0,c.jsx)(t.code,{children:`flushOnUnmount`}),` запускает cleanup предыдущего effect, поэтому держите option стабильной.`]}),`
214
+ `,(0,c.jsxs)(t.h3,{id:`критическое-ограничение-null`,children:[`Критическое ограничение `,(0,c.jsx)(t.code,{children:`null`})]}),`
215
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`null`}),` используется как внутренний признак «pending-значения нет». Поэтому `,(0,c.jsx)(t.code,{children:`call(null)`}),` не вызывает callback, хотя generic формально разрешает nullable type.`]}),`
216
+ `,(0,c.jsx)(t.p,{children:`Заверните nullable value:`}),`
217
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`type SavePayload = {
218
+ value: string | null;
219
+ };
220
+
221
+ const { call } = useDebouncedCallback<SavePayload>((payload) => {
222
+ saveValue(payload.value);
223
+ }, 300);
224
+
225
+ call({ value: null });
226
+ `})}),`
227
+ `,(0,c.jsxs)(t.p,{children:[`Изменение `,(0,c.jsx)(t.code,{children:`delayMs`}),` не пересчитывает уже запланированный timeout. Новый delay используется следующим `,(0,c.jsx)(t.code,{children:`call`}),`.`]}),`
228
+ `,(0,c.jsx)(t.h2,{id:`usethrottledcallback`,children:(0,c.jsx)(t.code,{children:`useThrottledCallback`})}),`
229
+ `,(0,c.jsx)(t.p,{children:`Hook вызывает callback не чаще одного раза за interval и сохраняет последнее значение:`}),`
230
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function useThrottledCallback<T>(cb: (arg: T) => void, intervalMs: number, options?: { flushOnUnmount?: boolean }): ThrottledCallback<T>;
231
+
232
+ type ThrottledCallback<T> = {
233
+ call: (arg: T) => void;
234
+ flush: () => void;
235
+ cancel: () => void;
236
+ };
237
+ `})}),`
238
+ `,(0,c.jsx)(t.h3,{id:`пример-2`,children:`Пример`}),`
239
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`type Point = {
240
+ x: number;
241
+ y: number;
242
+ };
243
+
244
+ function PointerTracker({ onChange }: { onChange: (point: Point) => void }) {
245
+ const { call, flush, cancel } = useThrottledCallback(onChange, 100);
246
+
247
+ return (
248
+ <div onPointerMove={(event) => call({ x: event.clientX, y: event.clientY })} onPointerUp={flush} onPointerCancel={cancel}>
249
+ Перемещайте указатель
250
+ </div>
251
+ );
252
+ }
253
+ `})}),`
254
+ `,(0,c.jsx)(t.h3,{id:`точное-поведение-1`,children:`Точное поведение`}),`
255
+ `,(0,c.jsxs)(t.ol,{children:[`
256
+ `,(0,c.jsxs)(t.li,{children:[`Первый обычный `,(0,c.jsx)(t.code,{children:`call`}),` выполняет callback сразу — leading edge.`]}),`
257
+ `,(0,c.jsxs)(t.li,{children:[`Вызовы внутри `,(0,c.jsx)(t.code,{children:`intervalMs`}),` сохраняют только последнее значение.`]}),`
258
+ `,(0,c.jsx)(t.li,{children:`В конце окна выполняется trailing callback.`}),`
259
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`flush`}),` немедленно применяет pending value и начинает новое окно.`]}),`
260
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`cancel`}),` забывает pending value, но не сбрасывает timestamp последнего callback.`]}),`
261
+ `]}),`
262
+ `,(0,c.jsxs)(t.p,{children:[`Если после `,(0,c.jsx)(t.code,{children:`cancel`}),` вызвать `,(0,c.jsx)(t.code,{children:`call`}),` до окончания текущего окна, значение всё равно будет отложено.`]}),`
263
+ `,(0,c.jsx)(t.p,{children:`Ограничения:`}),`
264
+ `,(0,c.jsxs)(t.ul,{children:[`
265
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),` нельзя использовать как payload; применяйте object-wrapper;`]}),`
266
+ `,(0,c.jsx)(t.li,{children:`interval не валидируется;`}),`
267
+ `,(0,c.jsx)(t.li,{children:`изменение interval не пересчитывает pending timeout;`}),`
268
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`flushOnUnmount`}),` имеет те же cleanup-риски;`]}),`
269
+ `,(0,c.jsx)(t.li,{children:`throttle не переносит тяжёлую работу в Worker.`}),`
270
+ `]}),`
271
+ `,(0,c.jsx)(t.h2,{id:`сравнение-timer-hooks`,children:`Сравнение timer hooks`}),`
272
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Свойство`}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`useDebounce`})}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`useDebouncedCallback`})}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`useThrottledCallback`})})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Результат`}),(0,c.jsx)(t.td,{children:`задержанное value`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`call/flush/cancel`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`call/flush/cancel`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Первый callback сразу`}),(0,c.jsx)(t.td,{children:`не применимо`}),(0,c.jsx)(t.td,{children:`нет`}),(0,c.jsx)(t.td,{children:`да`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Частые события`}),(0,c.jsx)(t.td,{children:`value после тишины`}),(0,c.jsx)(t.td,{children:`callback после тишины`}),(0,c.jsx)(t.td,{children:`leading + последнее trailing`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ручной flush/cancel`}),(0,c.jsx)(t.td,{children:`нет`}),(0,c.jsx)(t.td,{children:`да`}),(0,c.jsx)(t.td,{children:`да`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})}),(0,c.jsx)(t.td,{children:`допустим`}),(0,c.jsx)(t.td,{children:`недопустим`}),(0,c.jsx)(t.td,{children:`недопустим`})]})]})]}),`
273
+ `,(0,c.jsx)(t.h2,{id:`usedndsortablesensors`,children:(0,c.jsx)(t.code,{children:`useDndSortableSensors`})}),`
274
+ `,(0,c.jsx)(t.p,{children:`Hook создаёт стандартный набор DnD Kit sensors:`}),`
275
+ `,(0,c.jsxs)(t.ul,{children:[`
276
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`PointerSensor`}),` с activation distance;`]}),`
277
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`KeyboardSensor`}),` с `,(0,c.jsx)(t.code,{children:`sortableKeyboardCoordinates`}),`.`]}),`
278
+ `]}),`
279
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface UseDndSortableSensorsOptions {
280
+ activationDistance?: number;
281
+ }
282
+
283
+ function useDndSortableSensors(distanceOrOptions?: number | UseDndSortableSensorsOptions): SensorDescriptor<SensorOptions>[];
284
+ `})}),`
285
+ `,(0,c.jsx)(t.h3,{id:`использование`,children:`Использование`}),`
286
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { DndContext } from "@dnd-kit/core";
287
+
288
+ import { useDndSortableSensors } from "@ryuzaki13/react-foundation-lib/hooks";
289
+
290
+ function SortableArea({ children }: { children: React.ReactNode }) {
291
+ const sensors = useDndSortableSensors({
292
+ activationDistance: 8
293
+ });
294
+
295
+ return <DndContext sensors={sensors}>{children}</DndContext>;
296
+ }
297
+ `})}),`
298
+ `,(0,c.jsx)(t.p,{children:`Числовой shorthand также поддерживается:`}),`
299
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const sensors = useDndSortableSensors(8);
300
+ `})}),`
301
+ `,(0,c.jsxs)(t.p,{children:[`Default distance равен `,(0,c.jsx)(t.code,{children:`6`}),` pixels. Значение `,(0,c.jsx)(t.code,{children:`0`}),` активирует pointer drag без минимального движения. Значение не валидируется.`]}),`
302
+ `,(0,c.jsxs)(t.p,{children:[`Hook не создаёт `,(0,c.jsx)(t.code,{children:`DndContext`}),`, `,(0,c.jsx)(t.code,{children:`SortableContext`}),`, collision detection, modifiers, items или drag overlay. Keyboard sensor не заменяет доступный drag handle: trigger должен иметь понятное имя и keyboard focus.`]}),`
303
+ `,(0,c.jsx)(t.h2,{id:`usesearchparams`,children:(0,c.jsx)(t.code,{children:`useSearchParams`})}),`
304
+ `,(0,c.jsx)(t.p,{children:`Hook читает search state текущего TanStack Router route и возвращает replace-navigation.`}),`
305
+ `,(0,c.jsxs)(t.p,{children:[`Он должен находиться внутри `,(0,c.jsx)(t.code,{children:`RouterProvider`}),`. Вне Router context TanStack Router выбросит ошибку.`]}),`
306
+ `,(0,c.jsx)(t.h3,{id:`типизированный-пример`,children:`Типизированный пример`}),`
307
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useSearchParams } from "@ryuzaki13/react-foundation-lib/hooks";
308
+
309
+ type PageSearchKey = "page" | "filter" | "showAll";
310
+
311
+ function PageToolbar() {
312
+ const { params, setParams } = useSearchParams<PageSearchKey>();
313
+ const page = Number(params.page ?? "1");
314
+ const showAll = params.showAll === "X";
315
+
316
+ return (
317
+ <>
318
+ <button type="button" onClick={() => void setParams({ page: page + 1 })}>
319
+ Следующая страница
320
+ </button>
321
+ <button type="button" onClick={() => void setParams({ showAll: showAll ? "" : "X" })}>
322
+ Показать все
323
+ </button>
324
+ </>
325
+ );
326
+ }
327
+ `})}),`
328
+ `,(0,c.jsx)(t.h3,{id:`возвращаемые-поля`,children:`Возвращаемые поля`}),`
329
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Поле`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`params`})}),(0,c.jsx)(t.td,{children:`Полный search result текущего route в non-strict режиме.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`setParams(next)`})}),(0,c.jsxs)(t.td,{children:[`Relative navigation на `,(0,c.jsx)(t.code,{children:`"."`}),`, merge `,(0,c.jsx)(t.code,{children:`prev`}),` и `,(0,c.jsx)(t.code,{children:`next`}),`, `,(0,c.jsx)(t.code,{children:`replace: true`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`filteredParams`})}),(0,c.jsxs)(t.td,{children:[`View по `,(0,c.jsx)(t.code,{children:`allowedKeys`}),`; без списка совпадает с `,(0,c.jsx)(t.code,{children:`params`}),`.`]})]})]})]}),`
330
+ `,(0,c.jsx)(t.p,{children:`Merge выглядит так:`}),`
331
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`search: (prev) => ({
332
+ ...prev,
333
+ ...next
334
+ });
335
+ `})}),`
336
+ `,(0,c.jsxs)(t.p,{children:[`Ключи, которых нет в `,(0,c.jsx)(t.code,{children:`next`}),`, сохраняются. `,(0,c.jsx)(t.code,{children:`string`}),`, `,(0,c.jsx)(t.code,{children:`number`}),` и `,(0,c.jsx)(t.code,{children:`boolean`}),` передаются Router-у; окончательная сериализация зависит от search schema host-приложения.`]}),`
337
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`replace: true`}),` заменяет текущую history entry. Browser Back не получает отдельный шаг для каждого вызова.`]}),`
338
+ `,(0,c.jsxs)(t.h3,{id:`ограничение-allowedkeys`,children:[`Ограничение `,(0,c.jsx)(t.code,{children:`allowedKeys`})]}),`
339
+ `,(0,c.jsxs)(t.p,{children:[`Runtime фильтрации существует, но текущая public signature объявляет argument как `,(0,c.jsx)(t.code,{children:`(keyof K)[]`}),` вместо ожидаемого `,(0,c.jsx)(t.code,{children:`K[]`}),`. Обычный intended вызов не компилируется:`]}),`
340
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`type SearchKey = "page" | "filter";
341
+
342
+ // Текущий public type отвергает "page".
343
+ // useSearchParams<SearchKey>(["page"]);
344
+ `})}),`
345
+ `,(0,c.jsx)(t.p,{children:`Не обходите это broad cast. Пока API не исправлен, вызывайте hook без списка и создавайте нужный view явно:`}),`
346
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const { params } = useSearchParams<SearchKey>();
347
+
348
+ const filteredParams = {
349
+ page: params.page
350
+ };
351
+ `})}),`
352
+ `,(0,c.jsx)(t.p,{children:`Это ограничение типов текущей версии, а не TanStack Router.`}),`
353
+ `,(0,c.jsx)(t.p,{children:`Дополнительно:`}),`
354
+ `,(0,c.jsxs)(t.ul,{children:[`
355
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`allowedKeys`}),` влияет только на `,(0,c.jsx)(t.code,{children:`filteredParams`}),`;`]}),`
356
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`setParams`}),` по-прежнему меняет полный search object;`]}),`
357
+ `,(0,c.jsxs)(t.li,{children:[`inline `,(0,c.jsx)(t.code,{children:`allowedKeys`}),` создаёт новую array reference для `,(0,c.jsx)(t.code,{children:`useMemo`}),`;`]}),`
358
+ `,(0,c.jsxs)(t.li,{children:[`используйте string keys, несмотря на формальный constraint `,(0,c.jsx)(t.code,{children:`PropertyKey`}),`.`]}),`
359
+ `]}),`
360
+ `,(0,c.jsx)(t.h2,{id:`usesearchlink`,children:(0,c.jsx)(t.code,{children:`useSearchLink`})}),`
361
+ `,(0,c.jsx)(t.p,{children:`Hook строит URL текущего route, не выполняя navigation:`}),`
362
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useSearchLink } from "@ryuzaki13/react-foundation-lib/hooks";
363
+
364
+ type SearchKey = "page" | "filter";
365
+
366
+ function PaginationLink() {
367
+ const { buildLink } = useSearchLink<SearchKey>();
368
+
369
+ return <a href={buildLink({ page: "2" })}>Страница 2</a>;
370
+ }
371
+ `})}),`
372
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildLink(params)`}),`:`]}),`
373
+ `,(0,c.jsxs)(t.ol,{children:[`
374
+ `,(0,c.jsxs)(t.li,{children:[`копирует `,(0,c.jsx)(t.code,{children:`location.searchStr`}),` в `,(0,c.jsx)(t.code,{children:`URLSearchParams`}),`;`]}),`
375
+ `,(0,c.jsxs)(t.li,{children:[`устанавливает переданные truthy values через `,(0,c.jsx)(t.code,{children:`String(value)`}),`;`]}),`
376
+ `,(0,c.jsx)(t.li,{children:`удаляет keys с falsy values;`}),`
377
+ `,(0,c.jsx)(t.li,{children:`сохраняет pathname и hash;`}),`
378
+ `,(0,c.jsx)(t.li,{children:`возвращает string, но не меняет browser URL.`}),`
379
+ `]}),`
380
+ `,(0,c.jsx)(t.p,{children:`Удаление:`}),`
381
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const hrefWithoutFilter = buildLink({
382
+ filter: ""
383
+ });
384
+ `})}),`
385
+ `,(0,c.jsx)(t.p,{children:`Неуказанные параметры сохраняются.`}),`
386
+ `,(0,c.jsx)(t.p,{children:`Ограничения:`}),`
387
+ `,(0,c.jsxs)(t.ul,{children:[`
388
+ `,(0,c.jsx)(t.li,{children:`требуется Router context;`}),`
389
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`buildLink`}),` создаётся заново на каждом render;`]}),`
390
+ `,(0,c.jsx)(t.li,{children:`runtime удаляет любое falsy value;`}),`
391
+ `,(0,c.jsxs)(t.li,{children:[`используется raw `,(0,c.jsx)(t.code,{children:`URLSearchParams`}),` без route validation;`]}),`
392
+ `,(0,c.jsxs)(t.li,{children:[`для programmatic navigation используйте Router API или `,(0,c.jsx)(t.code,{children:`useSearchParams`}),`.`]}),`
393
+ `]}),`
394
+ `,(0,c.jsx)(t.h2,{id:`uselazycomponent`,children:(0,c.jsx)(t.code,{children:`useLazyComponent`})}),`
395
+ `,(0,c.jsxs)(t.p,{children:[`Hook создаёт `,(0,c.jsx)(t.code,{children:`LazyExoticComponent`}),` через общий `,(0,c.jsx)(t.code,{children:`createLazyComponent`}),` и memoizes результат по `,(0,c.jsx)(t.code,{children:`importFn`}),`, `,(0,c.jsx)(t.code,{children:`componentName`}),` и `,(0,c.jsx)(t.code,{children:`cacheKey`}),`.`]}),`
396
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function useLazyComponent<TProps extends object>(
397
+ importFn: () => Promise<Record<string, ComponentType<TProps>> | null>,
398
+ componentName: string,
399
+ cacheKey?: string
400
+ ): LazyExoticComponent<ComponentType<TProps>>;
401
+ `})}),`
402
+ `,(0,c.jsx)(t.h3,{id:`пример-3`,children:`Пример`}),`
403
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { Suspense } from "react";
404
+
405
+ import { useLazyComponent } from "@ryuzaki13/react-foundation-lib/hooks";
406
+
407
+ type ReportProps = {
408
+ reportId: string;
409
+ };
410
+
411
+ const importReportModule = () =>
412
+ import("./Report").then((module) => ({
413
+ Report: module.Report
414
+ }));
415
+
416
+ function ReportHost({ reportId }: ReportProps) {
417
+ const LazyReport = useLazyComponent<ReportProps>(importReportModule, "Report", "report");
418
+
419
+ return (
420
+ <Suspense fallback={<div>Загрузка отчёта...</div>}>
421
+ <LazyReport reportId={reportId} />
422
+ </Suspense>
423
+ );
424
+ }
425
+ `})}),`
426
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`Suspense`}),` показывает loading fallback. Ошибку import/render должен обрабатывать Error Boundary.`]}),`
427
+ `,(0,c.jsx)(t.h3,{id:`кеширование`,children:`Кеширование`}),`
428
+ `,(0,c.jsxs)(t.p,{children:[`Без `,(0,c.jsx)(t.code,{children:`cacheKey`}),` кеш определяется reference `,(0,c.jsx)(t.code,{children:`importFn`}),` и `,(0,c.jsx)(t.code,{children:`componentName`}),`. Inline loader создаёт новую function reference:`]}),`
429
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`// Нежелательно без cacheKey.
430
+ const LazyReport = useLazyComponent(() => import("./Report"), "Report");
431
+ `})}),`
432
+ `,(0,c.jsxs)(t.p,{children:[`Вынесите loader на уровень модуля либо задайте уникальный стабильный `,(0,c.jsx)(t.code,{children:`cacheKey`}),`.`]}),`
433
+ `,(0,c.jsxs)(t.p,{children:[`С `,(0,c.jsx)(t.code,{children:`cacheKey`}),` используется общий ключ из cache key и component name. Одинаковая пара для разных loaders возвращает первый кешированный component. Ключ должен однозначно обозначать реальный модуль.`]}),`
434
+ `,(0,c.jsx)(t.h3,{id:`выбор-export`,children:`Выбор export`}),`
435
+ `,(0,c.jsx)(t.p,{children:`После import helper ищет:`}),`
436
+ `,(0,c.jsxs)(t.ol,{children:[`
437
+ `,(0,c.jsxs)(t.li,{children:[`export `,(0,c.jsx)(t.code,{children:`componentName`}),`;`]}),`
438
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`default`}),` export;`]}),`
439
+ `,(0,c.jsx)(t.li,{children:`первый export модуля.`}),`
440
+ `]}),`
441
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`null`}),` или отсутствие подходящего component приводит к lazy error.`]}),`
442
+ `,(0,c.jsx)(t.p,{children:`Если component можно объявить один раз на уровне модуля, предпочитайте utility:`}),`
443
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { createLazyComponent } from "@ryuzaki13/react-foundation-lib/utils";
444
+
445
+ const LazyReport = createLazyComponent(importReportModule, "Report", "report");
446
+ `})}),`
447
+ `,(0,c.jsx)(t.p,{children:`Hook нужен, когда loader, name или cache key действительно зависят от component/custom hook contract.`}),`
448
+ `,(0,c.jsx)(t.h2,{id:`usereferencetrace`,children:(0,c.jsx)(t.code,{children:`useReferenceTrace`})}),`
449
+ `,(0,c.jsxs)(t.p,{children:[`Diagnostic hook пишет в `,(0,c.jsx)(t.code,{children:`console.debug`}),` изменение object reference:`]}),`
450
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function Table({ columns }: { columns: readonly object[] }) {
451
+ useReferenceTrace("table columns", columns);
452
+ return <div>Колонок: {columns.length}</div>;
453
+ }
454
+ `})}),`
455
+ `,(0,c.jsx)(t.p,{children:`После каждого committed render выводится:`}),`
456
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`[render trace] table columns
457
+ {
458
+ referenceChanged: true,
459
+ previous: ...,
460
+ current: ...
461
+ }
462
+ `})}),`
463
+ `,(0,c.jsxs)(t.p,{children:[`Сравнение выполняется через `,(0,c.jsx)(t.code,{children:`Object.is`}),`. На первом effect previous и current совпадают. Hook не вызывает rerender; в Strict Mode development logs могут повторяться.`]}),`
464
+ `,(0,c.jsxs)(t.h3,{id:`обязательный-__dev__`,children:[`Обязательный `,(0,c.jsx)(t.code,{children:`__DEV__`})]}),`
465
+ `,(0,c.jsxs)(t.p,{children:[`Опубликованный runtime обращается к compile-time global `,(0,c.jsx)(t.code,{children:`__DEV__`}),` без fallback. Host bundler должен определить его, например:`]}),`
466
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`export default defineConfig(({ mode }) => ({
467
+ define: {
468
+ __DEV__: JSON.stringify(mode !== "production")
469
+ }
470
+ }));
471
+ `})}),`
472
+ `,(0,c.jsxs)(t.p,{children:[`Без replacement effect выбросит `,(0,c.jsx)(t.code,{children:`ReferenceError`}),`. При `,(0,c.jsx)(t.code,{children:`false`}),` hook ничего не логирует.`]}),`
473
+ `,(0,c.jsx)(t.p,{children:`Не передавайте secrets, tokens и персональные данные: previous/current попадают в console. Hook предназначен для временной диагностики, не для бизнес-логики.`}),`
474
+ `,(0,c.jsx)(t.h2,{id:`useblockbrowserzoom`,children:(0,c.jsx)(t.code,{children:`useBlockBrowserZoom`})}),`
475
+ `,(0,c.jsxs)(t.p,{children:[`Hook подписывается на `,(0,c.jsx)(t.code,{children:`window`}),` и вызывает `,(0,c.jsx)(t.code,{children:`preventDefault()`}),` для `,(0,c.jsx)(t.code,{children:`wheel`}),` с `,(0,c.jsx)(t.code,{children:`ctrlKey === true`}),`:`]}),`
476
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function DiagramViewport({ active }: { active: boolean }) {
477
+ useBlockBrowserZoom(active);
478
+ return <div>Рабочая область диаграммы</div>;
479
+ }
480
+ `})}),`
481
+ `,(0,c.jsx)(t.p,{children:`Lifecycle:`}),`
482
+ `,(0,c.jsxs)(t.ul,{children:[`
483
+ `,(0,c.jsxs)(t.li,{children:[`при `,(0,c.jsx)(t.code,{children:`false`}),` listener отсутствует;`]}),`
484
+ `,(0,c.jsxs)(t.li,{children:[`при `,(0,c.jsx)(t.code,{children:`true`}),` добавляется non-passive `,(0,c.jsx)(t.code,{children:`wheel`}),` listener;`]}),`
485
+ `,(0,c.jsx)(t.li,{children:`при смене enabled и unmount listener удаляется;`}),`
486
+ `,(0,c.jsxs)(t.li,{children:[`блокируется только `,(0,c.jsx)(t.code,{children:`Ctrl + wheel`}),`, но не keyboard zoom shortcuts.`]}),`
487
+ `]}),`
488
+ `,(0,c.jsx)(t.p,{children:`Browser zoom важен для accessibility. Не блокируйте его на обычных страницах, формах и текстовом UI. Допустимый сценарий — специальный diagram/canvas viewport с альтернативным управлением масштабом.`}),`
489
+ `,(0,c.jsx)(t.h2,{id:`usefloatinglistbox`,children:(0,c.jsx)(t.code,{children:`useFloatingListbox`})}),`
490
+ `,(0,c.jsx)(t.p,{children:`Этот headless hook объединяет open state, Floating UI positioning/dismiss, active index, disabled options, keyboard navigation, focus, DOM refs, ARIA ids и size resolver. Он не рендерит JSX. Для обычного интерфейса предпочитайте готовые Select/Picker primitives foundation UI.`}),`
491
+ `,(0,c.jsx)(t.h3,{id:`параметры`,children:`Параметры`}),`
492
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Параметр`}),(0,c.jsx)(t.th,{children:`Default`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`options`})}),(0,c.jsx)(t.td,{children:`обязателен`}),(0,c.jsx)(t.td,{children:`Ordered options.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`selectedIndex`})}),(0,c.jsx)(t.td,{children:`обязателен`}),(0,c.jsxs)(t.td,{children:[`Выбранный index или `,(0,c.jsx)(t.code,{children:`-1`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`open`}),` / `,(0,c.jsx)(t.code,{children:`onOpenChange`})]}),(0,c.jsx)(t.td,{children:`internal state`}),(0,c.jsx)(t.td,{children:`Controlled open contract.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getOptionDisabled`})}),(0,c.jsx)(t.td,{children:`все доступны`}),(0,c.jsx)(t.td,{children:`Disabled predicate.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`onSelect`})}),(0,c.jsx)(t.td,{children:`отсутствует`}),(0,c.jsx)(t.td,{children:`Callback выбранной option.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`disabled`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`false`})}),(0,c.jsx)(t.td,{children:`Запрещает открытие через open helpers.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`placement`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`"bottom-start"`})}),(0,c.jsx)(t.td,{children:`Initial Floating UI placement.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`placementStrategy`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`"flip"`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`"flip"`}),` или `,(0,c.jsx)(t.code,{children:`"auto"`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`closeOnSelect`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`Закрыть после select.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`focusFloatingOnOpen`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`Фокусировать popup после открытия.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`allowOpenWithoutOptions`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`false`})}),(0,c.jsx)(t.td,{children:`Разрешить пустой popup.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`restoreFocusOnClose`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsxs)(t.td,{children:[`Фокусировать reference внутри `,(0,c.jsx)(t.code,{children:`close()`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveFloatingSize`})}),(0,c.jsx)(t.td,{children:`отсутствует`}),(0,c.jsx)(t.td,{children:`Вычислить CSS sizes/custom properties.`})]})]})]}),`
493
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`placement`}),` использует `,(0,c.jsx)(t.code,{children:`Placement`}),` из `,(0,c.jsx)(t.code,{children:`@floating-ui/react`}),` и не реэкспортируется из `,(0,c.jsx)(t.code,{children:`/hooks`}),`.`]}),`
494
+ `,(0,c.jsx)(t.h3,{id:`controlled-режим`,children:`Controlled режим`}),`
495
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const [open, setOpen] = useState(false);
496
+
497
+ const listbox = useFloatingListbox({
498
+ options,
499
+ selectedIndex,
500
+ open,
501
+ onOpenChange: setOpen
502
+ });
503
+ `})}),`
504
+ `,(0,c.jsxs)(t.p,{children:[`Передавайте `,(0,c.jsx)(t.code,{children:`open`}),` и `,(0,c.jsx)(t.code,{children:`onOpenChange`}),` вместе. Только `,(0,c.jsx)(t.code,{children:`open`}),` оставляет actions без рабочего setter. Только callback не меняет internal state, пока parent не вернёт controlled value.`]}),`
505
+ `,(0,c.jsx)(t.h3,{id:`минимальный-пример`,children:`Минимальный пример`}),`
506
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useId, useState } from "react";
507
+
508
+ import { useFloatingListbox } from "@ryuzaki13/react-foundation-lib/hooks";
509
+
510
+ type City = {
511
+ id: string;
512
+ label: string;
513
+ disabled?: boolean;
514
+ };
515
+
516
+ const cities: readonly City[] = [
517
+ { id: "ekb", label: "Екатеринбург" },
518
+ { id: "msk", label: "Москва" },
519
+ { id: "spb", label: "Санкт-Петербург", disabled: true }
520
+ ];
521
+
522
+ function CityListbox() {
523
+ const listId = useId();
524
+ const [selected, setSelected] = useState<City | undefined>();
525
+ const selectedIndex = selected ? cities.findIndex((city) => city.id === selected.id) : -1;
526
+ const {
527
+ open,
528
+ activeIndex,
529
+ floatingStyles,
530
+ setReference,
531
+ setFloating,
532
+ setOptionRef,
533
+ toggleOpen,
534
+ selectOption,
535
+ handleReferenceKeyDown,
536
+ handleFloatingKeyDown,
537
+ getFloatingProps,
538
+ getOptionId,
539
+ getActiveOptionId
540
+ } = useFloatingListbox({
541
+ options: cities,
542
+ selectedIndex,
543
+ getOptionDisabled: (city) => city.disabled === true,
544
+ onSelect: setSelected
545
+ });
546
+
547
+ return (
548
+ <div>
549
+ <button
550
+ ref={setReference}
551
+ type="button"
552
+ aria-haspopup="listbox"
553
+ aria-expanded={open}
554
+ aria-controls={open ? listId : undefined}
555
+ aria-activedescendant={open ? getActiveOptionId(listId) : undefined}
556
+ onClick={toggleOpen}
557
+ onKeyDown={handleReferenceKeyDown}>
558
+ {selected?.label ?? "Выберите город"}
559
+ </button>
560
+
561
+ {open ? (
562
+ <div
563
+ ref={setFloating}
564
+ style={floatingStyles}
565
+ {...getFloatingProps({
566
+ id: listId,
567
+ tabIndex: 0,
568
+ "aria-activedescendant": getActiveOptionId(listId),
569
+ onKeyDown: handleFloatingKeyDown
570
+ })}>
571
+ {cities.map((city, index) => {
572
+ const optionDisabled = city.disabled === true;
573
+
574
+ return (
575
+ <div
576
+ key={city.id}
577
+ id={getOptionId(listId, index)}
578
+ ref={(node) => setOptionRef(index, node)}
579
+ role="option"
580
+ aria-selected={selectedIndex === index}
581
+ aria-disabled={optionDisabled || undefined}
582
+ data-active={activeIndex === index || undefined}>
583
+ <button
584
+ type="button"
585
+ tabIndex={-1}
586
+ disabled={optionDisabled}
587
+ onMouseDown={(event) => event.preventDefault()}
588
+ onClick={() => selectOption(city)}>
589
+ {city.label}
590
+ </button>
591
+ </div>
592
+ );
593
+ })}
594
+ </div>
595
+ ) : null}
596
+ </div>
597
+ );
598
+ }
599
+ `})}),`
600
+ `,(0,c.jsx)(t.p,{children:`Production primitive дополнительно отвечает за styles, labels, validation и visible focus.`}),`
601
+ `,(0,c.jsx)(t.h3,{id:`возвращаемые-поля-1`,children:`Возвращаемые поля`}),`
602
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Поле`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`open`}),` / `,(0,c.jsx)(t.code,{children:`activeIndex`})]}),(0,c.jsx)(t.td,{children:`Resolved open и enabled active index.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`setOpen`})}),(0,c.jsx)(t.td,{children:`Raw setter; обходит disabled/options checks.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`refs`}),` / `,(0,c.jsx)(t.code,{children:`context`})]}),(0,c.jsx)(t.td,{children:`Floating UI integration.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`floatingStyles`})}),(0,c.jsx)(t.td,{children:`Position styles popup.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getFloatingProps`})}),(0,c.jsx)(t.td,{children:`Dismiss и listbox role props.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setReference`}),` / `,(0,c.jsx)(t.code,{children:`setFloating`})]}),(0,c.jsx)(t.td,{children:`Ref callbacks trigger и popup.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`setOptionRef`})}),(0,c.jsxs)(t.td,{children:[`Option node для `,(0,c.jsx)(t.code,{children:`scrollIntoView`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`close`})}),(0,c.jsx)(t.td,{children:`Close и optional focus restore.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`openList`}),` / `,(0,c.jsx)(t.code,{children:`openWithIndex`}),` / `,(0,c.jsx)(t.code,{children:`toggleOpen`})]}),(0,c.jsx)(t.td,{children:`Проверяемое открытие/переключение.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`selectOption`}),` / `,(0,c.jsx)(t.code,{children:`selectActiveOption`})]}),(0,c.jsx)(t.td,{children:`Select с disabled check.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`keyboard handlers`}),(0,c.jsx)(t.td,{children:`Обработчики reference и popup root.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getOptionId`}),` / `,(0,c.jsx)(t.code,{children:`getActiveOptionId`})]}),(0,c.jsx)(t.td,{children:`ARIA ids.`})]})]})]}),`
603
+ `,(0,c.jsxs)(t.p,{children:[`Используйте open helpers вместо raw `,(0,c.jsx)(t.code,{children:`setOpen(true)`}),`, который не проверяет `,(0,c.jsx)(t.code,{children:`disabled`}),` и отсутствие options.`]}),`
604
+ `,(0,c.jsx)(t.h3,{id:`keyboard`,children:`Keyboard`}),`
605
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Контекст`}),(0,c.jsx)(t.th,{children:`Клавиши`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Reference`}),(0,c.jsx)(t.td,{children:`ArrowDown/Up открывают или двигают; Home/End; Escape; Tab.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Floating root`}),(0,c.jsx)(t.td,{children:`ArrowDown/Up без wrap; Home/End; Enter/Space select; Escape; Tab.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Вложенный target`}),(0,c.jsx)(t.td,{children:`Hook обрабатывает только Escape.`})]})]})]}),`
606
+ `,(0,c.jsxs)(t.p,{children:[`Disabled options пропускаются. Если options пусты или все disabled, active index равен `,(0,c.jsx)(t.code,{children:`-1`}),`. Typeahead по буквам отсутствует.`]}),`
607
+ `,(0,c.jsx)(t.h3,{id:`positioning-и-размеры`,children:`Positioning и размеры`}),`
608
+ `,(0,c.jsxs)(t.p,{children:[`Defaults: fixed strategy, `,(0,c.jsx)(t.code,{children:`transform: false`}),`, offset `,(0,c.jsx)(t.code,{children:`4`}),`, padding `,(0,c.jsx)(t.code,{children:`8`}),`, `,(0,c.jsx)(t.code,{children:`autoUpdate`}),`. `,(0,c.jsx)(t.code,{children:`"auto"`}),` сравнивает start/end варианты снизу, сверху, слева и справа.`]}),`
609
+ `,(0,c.jsx)(t.p,{children:`Без resolver:`}),`
610
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`minWidth = referenceWidth + "px"
611
+ maxHeight = max(availableHeight, 120) + "px"
612
+ `})}),`
613
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`FloatingListboxSizeContext`}),` содержит available, viewport и reference width/height. `,(0,c.jsx)(t.code,{children:`FloatingListboxSizeStyle`}),`:`]}),`
614
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type FloatingListboxSizeStyle = {
615
+ width?: string;
616
+ minWidth?: string;
617
+ maxWidth?: string;
618
+ maxHeight?: string;
619
+ [customProperty: \`--\${string}\`]: string | undefined;
620
+ };
621
+ `})}),`
622
+ `,(0,c.jsx)(t.p,{children:`Пример resolver:`}),`
623
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const resolveSize: FloatingListboxSizeResolver = ({ availableWidth, referenceWidth }) => ({
624
+ width: String(Math.min(Math.max(referenceWidth, 280), availableWidth)) + "px",
625
+ "--listbox-available-width": String(availableWidth) + "px"
626
+ });
627
+ `})}),`
628
+ `,(0,c.jsxs)(t.p,{children:[`Resolver применяется после defaults. Старые custom properties очищаются. При открытом popup изменение `,(0,c.jsx)(t.code,{children:`options.length`}),` запускает дополнительный `,(0,c.jsx)(t.code,{children:`update()`}),`; изменение содержимого при той же длине — нет.`]}),`
629
+ `,(0,c.jsx)(t.h3,{id:`focus-и-accessibility`,children:`Focus и accessibility`}),`
630
+ `,(0,c.jsxs)(t.ul,{children:[`
631
+ `,(0,c.jsxs)(t.li,{children:[`Popup должен быть focusable, например `,(0,c.jsx)(t.code,{children:`tabIndex={0}`}),`.`]}),`
632
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`getFloatingProps`}),` обязательно spread на popup.`]}),`
633
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`close()`}),` может восстановить focus reference.`]}),`
634
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`context`}),` подходит для `,(0,c.jsx)(t.code,{children:`FloatingFocusManager`}),`.`]}),`
635
+ `,(0,c.jsxs)(t.li,{children:[`Внешний `,(0,c.jsx)(t.code,{children:`setOpen(false)`}),` не проходит через focus restore `,(0,c.jsx)(t.code,{children:`close()`}),`.`]}),`
636
+ `]}),`
637
+ `,(0,c.jsxs)(t.p,{children:[`Consumer обязан настроить trigger semantics, `,(0,c.jsx)(t.code,{children:`aria-expanded`}),`, `,(0,c.jsx)(t.code,{children:`aria-controls`}),`, `,(0,c.jsx)(t.code,{children:`aria-activedescendant`}),`, option ids/refs, `,(0,c.jsx)(t.code,{children:`role="option"`}),`, selected/disabled ARIA, label и visible focus.`]}),`
638
+ `,(0,c.jsx)(t.h2,{id:`runtime-boundaries-и-identity`,children:`Runtime boundaries и identity`}),`
639
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Hook`}),(0,c.jsx)(t.th,{children:`Requirement`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Timer hooks`}),(0,c.jsx)(t.td,{children:`React и timers.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`DnD`}),(0,c.jsx)(t.td,{children:`DnD Kit.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Floating listbox`}),(0,c.jsx)(t.td,{children:`DOM и Floating UI.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Search hooks`}),(0,c.jsxs)(t.td,{children:[`TanStack `,(0,c.jsx)(t.code,{children:`RouterProvider`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Lazy component`}),(0,c.jsx)(t.td,{children:`Suspense/Error Boundary.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Reference trace`}),(0,c.jsxs)(t.td,{children:[`host-defined `,(0,c.jsx)(t.code,{children:`__DEV__`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Browser zoom`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`window`}),` и `,(0,c.jsx)(t.code,{children:`WheelEvent`}),`.`]})]})]})]}),`
640
+ `,(0,c.jsx)(t.p,{children:`Не переносите hooks в Worker или Node tooling.`}),`
641
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`flush/cancel`}),` timer hooks стабильны; `,(0,c.jsx)(t.code,{children:`call`}),` меняется вместе с delay/interval. `,(0,c.jsx)(t.code,{children:`buildLink`}),` и большинство методов floating listbox создаются заново на render. Не рассчитывайте на identity без contract.`]}),`
642
+ `,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
643
+ `,(0,c.jsxs)(t.p,{children:[`Timer hooks тестируйте fake timers внутри React `,(0,c.jsx)(t.code,{children:`act`}),`:`]}),`
644
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`vi.useFakeTimers();
645
+
646
+ await act(async () => {
647
+ vi.advanceTimersByTime(300);
648
+ });
649
+ `})}),`
650
+ `,(0,c.jsx)(t.p,{children:`Проверяйте leading/trailing, last-write-wins, flush, cancel, unmount, новую callback и nullable wrapper.`}),`
651
+ `,(0,c.jsx)(t.p,{children:`Search hooks требуют test Router. Floating listbox требует DOM и проверок ARIA, keyboard, disabled options, dismiss, focus, dynamic options и size resolver.`}),`
652
+ `,(0,c.jsx)(t.p,{children:`Repository test покрывает auto placement, update после изменения количества options и актуальный resolver после rerender.`}),`
653
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
654
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Симптом`}),(0,c.jsx)(t.th,{children:`Причина / решение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Invalid hook call`}),(0,c.jsx)(t.td,{children:`Вызов вне component/custom hook или условно.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`Callback не получил `,(0,c.jsx)(t.code,{children:`null`})]}),(0,c.jsxs)(t.td,{children:[`Передайте `,(0,c.jsx)(t.code,{children:`{ value: null }`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Throttle ждёт после cancel`}),(0,c.jsx)(t.td,{children:`Cancel не сбрасывает timestamp.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Search allowedKeys не компилируется`}),(0,c.jsx)(t.td,{children:`Фильтруйте result явно до исправления generic.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Escape/outside click не работают`}),(0,c.jsxs)(t.td,{children:[`Не применён `,(0,c.jsx)(t.code,{children:`getFloatingProps`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Active option не scroll-ится`}),(0,c.jsxs)(t.td,{children:[`Нет `,(0,c.jsx)(t.code,{children:`setOptionRef`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Popup не фокусируется`}),(0,c.jsxs)(t.td,{children:[`Нет `,(0,c.jsx)(t.code,{children:`setFloating`}),` или `,(0,c.jsx)(t.code,{children:`tabIndex`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Controlled popup не закрывается`}),(0,c.jsxs)(t.td,{children:[`Нужны и `,(0,c.jsx)(t.code,{children:`open`}),`, и `,(0,c.jsx)(t.code,{children:`onOpenChange`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Lazy component remount-ится`}),(0,c.jsx)(t.td,{children:`Стабилизируйте loader/cacheKey.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`__DEV__ is not defined`})}),(0,c.jsx)(t.td,{children:`Настройте host bundler.`})]})]})]}),`
655
+ `,(0,c.jsx)(t.h2,{id:`api-справочник`,children:`API-справочник`}),`
656
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Экспорт`}),(0,c.jsx)(t.th,{children:`Contract`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useBlockBrowserZoom`})}),(0,c.jsxs)(t.td,{children:[`Global `,(0,c.jsx)(t.code,{children:`Ctrl + wheel`}),` prevention.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebounce`})}),(0,c.jsx)(t.td,{children:`Debounced value.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebouncedCallback`})}),(0,c.jsx)(t.td,{children:`Trailing debounce.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDndSortableSensors`})}),(0,c.jsx)(t.td,{children:`Pointer/Keyboard sensors.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useFloatingListbox`})}),(0,c.jsx)(t.td,{children:`Headless listbox.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useLazyComponent`})}),(0,c.jsx)(t.td,{children:`Memoized lazy factory.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useReferenceTrace`})}),(0,c.jsx)(t.td,{children:`Reference diagnostics.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useSearchLink`})}),(0,c.jsx)(t.td,{children:`Link builder.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useSearchParams`})}),(0,c.jsx)(t.td,{children:`Search read/replace navigation.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useThrottledCallback`})}),(0,c.jsx)(t.td,{children:`Leading/trailing throttle.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FloatingListboxPlacementStrategy`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`"flip" | "auto"`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FloatingListboxSizeContext`})}),(0,c.jsx)(t.td,{children:`Геометрия popup/reference/viewport.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FloatingListboxSizeResolver`})}),(0,c.jsx)(t.td,{children:`Context → style.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FloatingListboxSizeStyle`})}),(0,c.jsx)(t.td,{children:`Size fields и CSS properties.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ThrottledCallback`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`call/flush/cancel`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`UseDndSortableSensorsOptions`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`activationDistance`}),`.`]})]})]})]}),`
657
+ `,(0,c.jsx)(t.h2,{id:`что-модуль-не-делает`,children:`Что модуль не делает`}),`
658
+ `,(0,c.jsxs)(t.ul,{children:[`
659
+ `,(0,c.jsx)(t.li,{children:`не выполняет requests и не хранит backend state;`}),`
660
+ `,(0,c.jsx)(t.li,{children:`не создаёт route search schema;`}),`
661
+ `,(0,c.jsx)(t.li,{children:`не рендерит готовый select или DnD UI;`}),`
662
+ `,(0,c.jsx)(t.li,{children:`не валидирует intervals/distance;`}),`
663
+ `,(0,c.jsx)(t.li,{children:`не гарантирует accessibility без JSX consumer-а;`}),`
664
+ `,(0,c.jsx)(t.li,{children:`не экспортирует внутренние search types.`}),`
665
+ `]}),`
666
+ `,(0,c.jsx)(t.h2,{id:`связанные-документы`,children:`Связанные документы`}),`
667
+ `,(0,c.jsxs)(t.ul,{children:[`
668
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`../../README.md`,children:`Обзор пакета`})}),`
669
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`../dom/README.mdx`,children:`DOM, focus и overlay helpers`})}),`
670
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`../copy/README.mdx`,children:`Clipboard hooks`})}),`
671
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`../utils/index.ts`,children:`Public utilities`})}),`
672
+ `]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};