@ryuzaki13/react-foundation-ui 1.8.10 → 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 (288) hide show
  1. package/dist/advanced-search/index.js +1 -1
  2. package/dist/chunks/{defaultRenderers-Dbhg2hHc.js → defaultRenderers-u_Vep6Pj.js} +2 -2
  3. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -0
  4. package/dist/chunks/{multi-select-CHZhWoq6.js → multi-select-DtmRtX6v.js} +2 -2
  5. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -0
  6. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  7. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  8. package/dist/multi-select/index.js +1 -1
  9. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  10. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  11. package/dist/multi-select/ui/MultiSelect.d.ts +2 -2
  12. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  13. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  14. package/dist/multi-select/ui/defaultRenderers.d.ts +2 -2
  15. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  16. package/dist/select/model/useODataSelect.d.ts +1 -1
  17. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  18. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  19. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  20. package/dist/tree-select/index.js +1 -1
  21. package/dist/tree-select/index.js.map +1 -1
  22. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  23. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  24. package/package.json +3 -3
  25. package/storybook-static/assets/{Badge-BqQpQw_L.js → Badge-CveIo2LZ.js} +1 -1
  26. package/storybook-static/assets/{Badge.stories-BLEc3pho.js → Badge.stories-Bd8M64xJ.js} +1 -1
  27. package/storybook-static/assets/{BadgeList-DfMo6yit.js → BadgeList-xT41a0VL.js} +1 -1
  28. package/storybook-static/assets/{Button-D1w_se49.js → Button-C5bBSb3k.js} +1 -1
  29. package/storybook-static/assets/{Button-D6MwkfU8.js → Button-DkDgfpHL.js} +1 -1
  30. package/storybook-static/assets/{Button.stories-DsEGxbz-.js → Button.stories-CeKPeGK5.js} +1 -1
  31. package/storybook-static/assets/{CalendarView-FWwbhHMn.js → CalendarView-CEqcrblx.js} +1 -1
  32. package/storybook-static/assets/{CheckBox-BIeKlLsQ.js → CheckBox-DKeFkdOt.js} +1 -1
  33. package/storybook-static/assets/{CheckBox-krtKLFK6.js → CheckBox-OVvAarW-.js} +1 -1
  34. package/storybook-static/assets/{CheckBox.stories-gV23d8F9.js → CheckBox.stories-CfZ0p1yo.js} +1 -1
  35. package/storybook-static/assets/{Color-6AOWCN3U-DF3lA8Cg.js → Color-6AOWCN3U-BWW7zrfs.js} +1 -1
  36. package/storybook-static/assets/{ContextMenu-Jid_pp7z.js → ContextMenu-kia7is1N.js} +1 -1
  37. package/storybook-static/assets/{ContextMenu-CvOaSUdS.js → ContextMenu-xn2GtiLR.js} +1 -1
  38. package/storybook-static/assets/{ContextMenu.stories-BMRQo225.js → ContextMenu.stories-CYuy9uXF.js} +1 -1
  39. package/storybook-static/assets/{CustomOptionButton-B_3l2oEp.js → CustomOptionButton-C4w-APws.js} +1 -1
  40. package/storybook-static/assets/DateInput-BiUFIihm.js +1 -0
  41. package/storybook-static/assets/{DateInput-Dmfu-QPI.js → DateInput-DAzE5mCE.js} +1 -1
  42. package/storybook-static/assets/{DateInput.stories-BcZKAAUH.js → DateInput.stories-BcowGCRD.js} +1 -1
  43. package/storybook-static/assets/{DateRangePresetSelect-Dpjei_qk.js → DateRangePresetSelect-CQm4dNLR.js} +1 -1
  44. package/storybook-static/assets/{DateRangePresetSelect-C4QK2uI5.js → DateRangePresetSelect-RIyqNBk9.js} +1 -1
  45. package/storybook-static/assets/{DateRangePresetSelect.stories-HuFMQCzg.js → DateRangePresetSelect.stories-ypGyuGfy.js} +1 -1
  46. package/storybook-static/assets/{Detail-mSGrPHPd.js → Detail-CEypL2Nh.js} +1 -1
  47. package/storybook-static/assets/{Detail.stories-CNmeyajk.js → Detail.stories-DNkT7B-u.js} +1 -1
  48. package/storybook-static/assets/{Dialog-CNPtztC5.js → Dialog-BVFFQJDH.js} +1 -1
  49. package/storybook-static/assets/{Dialog-C4lB95kT.js → Dialog-DD0grLG3.js} +1 -1
  50. package/storybook-static/assets/{Dialog.stories-DGC2CdmD.js → Dialog.stories-DSCypHqR.js} +1 -1
  51. package/storybook-static/assets/{Disclosure-Bg9Uurzq.js → Disclosure-DauUgrev.js} +1 -1
  52. package/storybook-static/assets/{Disclosure.stories-52zq3d3b.js → Disclosure.stories-B1qB8vQZ.js} +1 -1
  53. package/storybook-static/assets/{DisclosureGroup-htBmjuHs.js → DisclosureGroup-D9oCCeHf.js} +1 -1
  54. package/storybook-static/assets/{DocsRenderer-JROSPFPF-CfCr8YB1.js → DocsRenderer-JROSPFPF-CmSf6tXp.js} +1 -1
  55. package/storybook-static/assets/{DropZone-DHl97f8Y.js → DropZone-D42ueN1w.js} +1 -1
  56. package/storybook-static/assets/{DropZone-BsjXindv.js → DropZone-D8hbPCAv.js} +1 -1
  57. package/storybook-static/assets/{DropZone.stories-UxmcssH9.js → DropZone.stories-DO-T_Bh4.js} +1 -1
  58. package/storybook-static/assets/{DropdownMenu-Bq4Z7eyk.js → DropdownMenu-CknJDoji.js} +1 -1
  59. package/storybook-static/assets/{ExpandableActionPanel-Buvm-uo_.js → ExpandableActionPanel-Dqi_bo3c.js} +1 -1
  60. package/storybook-static/assets/{ExpandableActionPanel.stories-DHjq73og.js → ExpandableActionPanel.stories-BD9QZGZN.js} +1 -1
  61. package/storybook-static/assets/{Flex-B9W01d7p.js → Flex-CaVn1IOP.js} +1 -1
  62. package/storybook-static/assets/{Flex.stories-Y8vGrgl5.js → Flex.stories-Bp9Y6q6b.js} +1 -1
  63. package/storybook-static/assets/{FloatingPopover-C06XhNb8.js → FloatingPopover-U7tx-Jlw.js} +1 -1
  64. package/storybook-static/assets/{FormattedTableCell-DnBQJjql.js → FormattedTableCell-pmmhsAbN.js} +1 -1
  65. package/storybook-static/assets/{Grid-BNsdOQE3.js → Grid-CEpMNurH.js} +1 -1
  66. package/storybook-static/assets/{Grid.stories-hwxpk_k9.js → Grid.stories-BM-gO5DN.js} +1 -1
  67. package/storybook-static/assets/{ImageCropper.stories-L6AaNzcC.js → ImageCropper.stories-BWz5XU6U.js} +1 -1
  68. package/storybook-static/assets/{ImageRenderer-DA4vCb7C.js → ImageRenderer-BTYZEX5t.js} +1 -1
  69. package/storybook-static/assets/{ImageRenderer.stories-eWJHpmcc.js → ImageRenderer.stories-Dz2STM95.js} +1 -1
  70. package/storybook-static/assets/{ImageView.stories-CDZmePLC.js → ImageView.stories-DBVe0an3.js} +1 -1
  71. package/storybook-static/assets/{ImageViewer.stories-c1s8XOKG.js → ImageViewer.stories-C4Px97lD.js} +2 -2
  72. package/storybook-static/assets/{ImageViewerRuntime-CB58FU7X.js → ImageViewerRuntime-TJtlJVfa.js} +1 -1
  73. package/storybook-static/assets/{Input-k78uABnO.js → Input-CIPgijvW.js} +1 -1
  74. package/storybook-static/assets/{Input-CPh1-5MN.js → Input-D8io9jVS.js} +1 -1
  75. package/storybook-static/assets/{Input.stories-Bjo-quWE.js → Input.stories-SUk3aYaC.js} +1 -1
  76. package/storybook-static/assets/{InputDateTime-D6wx8NHg.js → InputDateTime-DA5pIDuE.js} +1 -1
  77. package/storybook-static/assets/{InputDateTime.stories-DKYu3IHZ.js → InputDateTime.stories-DeudzDSU.js} +1 -1
  78. package/storybook-static/assets/{InputFile-B_d9cuuZ.js → InputFile-C5mp5Y5I.js} +1 -1
  79. package/storybook-static/assets/{InputFile-jyLYajsV.js → InputFile-CGAC7ruP.js} +1 -1
  80. package/storybook-static/assets/{InputFile.stories-BdefvDig.js → InputFile.stories-Cx1xQ6PE.js} +1 -1
  81. package/storybook-static/assets/{InputFiles-Bk5cxV_q.js → InputFiles-B7OBcPJN.js} +1 -1
  82. package/storybook-static/assets/{InputFiles-8NO4ybbw.js → InputFiles-Hzl89Ghf.js} +1 -1
  83. package/storybook-static/assets/{InputFiles.stories-ByWo1zY4.js → InputFiles.stories-CG6QjDZH.js} +1 -1
  84. package/storybook-static/assets/{InputFilesList-D4SB2px7.js → InputFilesList-B6htWHF1.js} +1 -1
  85. package/storybook-static/assets/{InputImage-Zoi-dxR0.js → InputImage-BTa4S4Wp.js} +1 -1
  86. package/storybook-static/assets/{InputImage-DehD0dUv.js → InputImage-CQnoblAE.js} +1 -1
  87. package/storybook-static/assets/{InputImage.stories-Bm6vjE22.js → InputImage.stories-CEI44Eyz.js} +1 -1
  88. package/storybook-static/assets/{InteractiveComponents-B1kglKoK.js → InteractiveComponents-B0ypWz1x.js} +1 -1
  89. package/storybook-static/assets/{InteractiveComponents.stories-HmO6jYBZ.js → InteractiveComponents.stories-BadApta9.js} +1 -1
  90. package/storybook-static/assets/{LayoutPicker-BdaZMF1N.js → LayoutPicker-COB9GlV_.js} +1 -1
  91. package/storybook-static/assets/{LayoutPicker-C__JzlAL.js → LayoutPicker-C_Uz7Tnj.js} +1 -1
  92. package/storybook-static/assets/{LayoutPicker.stories-Q1MsCb_7.js → LayoutPicker.stories-Btp0IcaL.js} +1 -1
  93. package/storybook-static/assets/{Listbox-_2Lhh6GE.js → Listbox-AAaZGSAl.js} +1 -1
  94. package/storybook-static/assets/{Listbox-HDTB2yAv.js → Listbox-CyfuZw7w.js} +1 -1
  95. package/storybook-static/assets/{Listbox.stories-C5uX1wxr.js → Listbox.stories-NDKQmjyQ.js} +1 -1
  96. package/storybook-static/assets/{Modal-Blv9Namu.js → Modal-BJDnJ4zv.js} +1 -1
  97. package/storybook-static/assets/{Modal.stories-Bh5G9FLw.js → Modal.stories-D_X5lTLO.js} +1 -1
  98. package/storybook-static/assets/{ModalManagerProvider-DedM4XGI.js → ModalManagerProvider-ShDjozpW.js} +1 -1
  99. package/storybook-static/assets/{MultiSelect-B_2TcTLI.js → MultiSelect-B5CElQ3-.js} +1 -1
  100. package/storybook-static/assets/{MultiSelect-C9a9z0VK.js → MultiSelect-DqXfrjcH.js} +1 -1
  101. package/storybook-static/assets/{MultiSelect.stories-D5Ly4DPj.js → MultiSelect.stories-fB3mcFmx.js} +1 -1
  102. package/storybook-static/assets/{NoData-CD8_tH4f.js → NoData-DDb0G7T8.js} +1 -1
  103. package/storybook-static/assets/{NotificationsHost-MW4gDQQK.js → NotificationsHost-CIGL-pKX.js} +1 -1
  104. package/storybook-static/assets/NotificationsHost.stories-B_MRb3fs.js +29 -0
  105. package/storybook-static/assets/{ODataMultiSelect-DjVOp5BB.js → ODataMultiSelect-DQAitH4N.js} +1 -1
  106. package/storybook-static/assets/{ODataMultiSelect.stories-Cpxe83Z0.js → ODataMultiSelect.stories-DwW221S9.js} +2 -2
  107. package/storybook-static/assets/{ODataSelect-C_2GMQva.js → ODataSelect-tiZhOIhE.js} +1 -1
  108. package/storybook-static/assets/{ODataSelect.stories-C6Wo7X-M.js → ODataSelect.stories-BhaatPjK.js} +2 -2
  109. package/storybook-static/assets/{ODataTreeMultiSelect-1PxW1yEH.js → ODataTreeMultiSelect-B9WqJ-Un.js} +1 -1
  110. package/storybook-static/assets/{ODataTreeMultiSelect.stories-AetogHrA.js → ODataTreeMultiSelect.stories-CAfKuhfU.js} +1 -1
  111. package/storybook-static/assets/{ODataTreeSelect-vPvVKIRZ.js → ODataTreeSelect-Cel1phxZ.js} +1 -1
  112. package/storybook-static/assets/{ODataTreeSelect.stories-Cvyu6C2q.js → ODataTreeSelect.stories-BpBCpBA9.js} +1 -1
  113. package/storybook-static/assets/{OneStepScroller-BtSUY6R7.js → OneStepScroller-BSeGbz02.js} +1 -1
  114. package/storybook-static/assets/{Option-D5HVST0Y.js → Option-BBtQ3GdK.js} +1 -1
  115. package/storybook-static/assets/{OptionButton-DMZn3qex.js → OptionButton-B9nZuqqW.js} +1 -1
  116. package/storybook-static/assets/{PeriodSelect-ccgbEHCS.js → PeriodSelect-BGvhR3to.js} +1 -1
  117. package/storybook-static/assets/{PeriodSelect-BirdSdPT.js → PeriodSelect-DA_zjcdA.js} +1 -1
  118. package/storybook-static/assets/{PeriodSelect.stories-LnR8MJQQ.js → PeriodSelect.stories-DDP1eXyM.js} +1 -1
  119. package/storybook-static/assets/{PickerTriggerActions-DEXowtVB.js → PickerTriggerActions-BgvzqRBd.js} +1 -1
  120. package/storybook-static/assets/{Popover-CfT-5TUj.js → Popover-BQql18MF.js} +1 -1
  121. package/storybook-static/assets/{Popover-B9Pbbd8S.js → Popover-C0NebUMz.js} +1 -1
  122. package/storybook-static/assets/{Popover.stories-DkIh7SkO.js → Popover.stories-CIyDUtlz.js} +1 -1
  123. package/storybook-static/assets/{PresetRangeDateInput-BshHlO-z.js → PresetRangeDateInput-BsgzPwCV.js} +1 -1
  124. package/storybook-static/assets/{PresetRangeDateInput-rHxPNjnG.js → PresetRangeDateInput-htbxc3ni.js} +1 -1
  125. package/storybook-static/assets/{PresetRangeDateInput.stories-BToClw-C.js → PresetRangeDateInput.stories-ClHM5Kah.js} +1 -1
  126. package/storybook-static/assets/{PresetSelect-BND50bCx.js → PresetSelect-Dcx0BOTx.js} +1 -1
  127. package/storybook-static/assets/README--LCKbep-.js +110 -0
  128. package/storybook-static/assets/{README-Du53oOl4.js → README-5M8ajrJp.js} +1 -1
  129. package/storybook-static/assets/README-5NhzH8VL.js +95 -0
  130. package/storybook-static/assets/README-Am6Fa6-b.js +69 -0
  131. package/storybook-static/assets/README-B3bFglqG.js +82 -0
  132. package/storybook-static/assets/README-B45Cwj2a.js +95 -0
  133. package/storybook-static/assets/README-B6Nq7NCU.js +416 -0
  134. package/storybook-static/assets/{README-s-T48I9S.js → README-B6ltJiw3.js} +1 -1
  135. package/storybook-static/assets/{README-DUA1kfLE.js → README-BB_JPejH.js} +1 -1
  136. package/storybook-static/assets/README-BIq-FXcN.js +2124 -0
  137. package/storybook-static/assets/README-BSh5XUR9.js +110 -0
  138. package/storybook-static/assets/README-BXJneZAJ.js +147 -0
  139. package/storybook-static/assets/README-BYSgTTZt.js +296 -0
  140. package/storybook-static/assets/{README-BRNFl9WV.js → README-BmhhWWEk.js} +1 -1
  141. package/storybook-static/assets/README-Bqnqu1bC.js +118 -0
  142. package/storybook-static/assets/README-BuMMG4_N.js +192 -0
  143. package/storybook-static/assets/README-BxjYCoYA.js +186 -0
  144. package/storybook-static/assets/{README-BsxKAG_a.js → README-ByALXSEH.js} +1 -1
  145. package/storybook-static/assets/README-Byo6DxIF.js +101 -0
  146. package/storybook-static/assets/README-C3UcjOGB.js +208 -0
  147. package/storybook-static/assets/README-C6BOdXNV.js +322 -0
  148. package/storybook-static/assets/README-C8E1O7DQ.js +230 -0
  149. package/storybook-static/assets/README-C9eh0JLs.js +64 -0
  150. package/storybook-static/assets/README-CAGQnLsv.js +90 -0
  151. package/storybook-static/assets/README-CC00hlZK.js +527 -0
  152. package/storybook-static/assets/README-CH_6ZIO2.js +64 -0
  153. package/storybook-static/assets/README-CHbo4O3Z.js +75 -0
  154. package/storybook-static/assets/{README-Y0nGf_0E.js → README-CIGfHKKE.js} +1 -1
  155. package/storybook-static/assets/{README-B7XIrdXq.js → README-CM-7E-Jf.js} +1 -1
  156. package/storybook-static/assets/{README-8Lm1JpdJ.js → README-CNHemCS2.js} +1 -1
  157. package/storybook-static/assets/{README-fxPT-NzI.js → README-CWfPiPIB.js} +1 -1
  158. package/storybook-static/assets/{README-Dw1C16bT.js → README-CeK4kfFO.js} +1 -1
  159. package/storybook-static/assets/README-Cj2e6HrF.js +178 -0
  160. package/storybook-static/assets/README-CsoHGRve.js +1844 -0
  161. package/storybook-static/assets/README-D9OypaFB.js +208 -0
  162. package/storybook-static/assets/{README-zAGDQqES.js → README-DDBqoI-T.js} +1 -1
  163. package/storybook-static/assets/README-DE2wk9-v.js +1282 -0
  164. package/storybook-static/assets/README-DEj2wSK0.js +264 -0
  165. package/storybook-static/assets/{README-DJlxGqOL.js → README-DIbfpC-2.js} +1 -1
  166. package/storybook-static/assets/{README-D5VR4x0m.js → README-DJHVgrpj.js} +1 -1
  167. package/storybook-static/assets/README-DN9HKtp_.js +124 -0
  168. package/storybook-static/assets/README-DNricOkt.js +136 -0
  169. package/storybook-static/assets/README-DV4fCpqN.js +1146 -0
  170. package/storybook-static/assets/{README-BMmR1B7a.js → README-DjCArsA5.js} +1 -1
  171. package/storybook-static/assets/README-Dl92E69Z.js +1704 -0
  172. package/storybook-static/assets/README-DnA-4W65.js +226 -0
  173. package/storybook-static/assets/README-DoCA4JXf.js +273 -0
  174. package/storybook-static/assets/{README-DUxV9GhP.js → README-DvAlDsh9.js} +1 -1
  175. package/storybook-static/assets/README-Ss-3t1nX.js +158 -0
  176. package/storybook-static/assets/README-eHCINzP3.js +154 -0
  177. package/storybook-static/assets/README-qHKxXU95.js +98 -0
  178. package/storybook-static/assets/README-tm9QH9cF.js +103 -0
  179. package/storybook-static/assets/README-ui-uanyg.js +672 -0
  180. package/storybook-static/assets/{RadioButton-BKvo6LIi.js → RadioButton-CWtjclwT.js} +1 -1
  181. package/storybook-static/assets/{RadioButton-D8KuponB.js → RadioButton-YIQXt0wx.js} +1 -1
  182. package/storybook-static/assets/{RadioButton.stories-BabeLrwX.js → RadioButton.stories-Ah-CBpeC.js} +1 -1
  183. package/storybook-static/assets/{RadioGroup-CsWjbEp2.js → RadioGroup-BnO-GL7A.js} +1 -1
  184. package/storybook-static/assets/{RadioGroup-jl5PxZpJ.js → RadioGroup-CUS0etBD.js} +1 -1
  185. package/storybook-static/assets/{RadioGroup.stories-BGoWy9-B.js → RadioGroup.stories-DGwCawtU.js} +1 -1
  186. package/storybook-static/assets/{Scrollable-CmPEHdW8.js → Scrollable-D85fA6pO.js} +1 -1
  187. package/storybook-static/assets/{Select-DiN4WVRM.js → Select-CGCxJjL9.js} +1 -1
  188. package/storybook-static/assets/{Select-BGM16rM6.js → Select-gRnfvfGh.js} +1 -1
  189. package/storybook-static/assets/{Select.stories-BEO6vXD_.js → Select.stories-CMwt4F9i.js} +1 -1
  190. package/storybook-static/assets/{SerializableSelect-B0DuNSqT.js → SerializableSelect-BLXfKJ38.js} +1 -1
  191. package/storybook-static/assets/{SerializableSelect.stories-DcI6UQCk.js → SerializableSelect.stories-Bca1a9ZU.js} +1 -1
  192. package/storybook-static/assets/{SingleDateTimeInput-C_Itd_An.js → SingleDateTimeInput-CyeQN0Rd.js} +1 -1
  193. package/storybook-static/assets/{SingleDateTimeInput-CwYhFl03.js → SingleDateTimeInput-xrmZckzw.js} +1 -1
  194. package/storybook-static/assets/SingleDateTimeInput.stories-BYFTQM9z.js +48 -0
  195. package/storybook-static/assets/{Slider-DCEQ39ar.js → Slider-1yJ3uVeR.js} +1 -1
  196. package/storybook-static/assets/{Slider-r4NefX-L.js → Slider-D8GtXVGI.js} +1 -1
  197. package/storybook-static/assets/{Slider.stories-B3M87sif.js → Slider.stories-CyQ3ns_C.js} +1 -1
  198. package/storybook-static/assets/{SliderInput-BmLucI1O.js → SliderInput-BOzHhEUA.js} +1 -1
  199. package/storybook-static/assets/{SliderInput-2ThnJzQ4.js → SliderInput-ISSx9vH_.js} +1 -1
  200. package/storybook-static/assets/{SliderInput.stories-B64rkErN.js → SliderInput.stories-7ooTghrS.js} +1 -1
  201. package/storybook-static/assets/{Sortable-Bx0rDd7W.js → Sortable-CCLiMmfZ.js} +1 -1
  202. package/storybook-static/assets/{Sortable.stories-BizbKIHw.js → Sortable.stories-B36szI6t.js} +1 -1
  203. package/storybook-static/assets/{Splitter-DGCB2owx.js → Splitter-DQGhgRwx.js} +1 -1
  204. package/storybook-static/assets/{Splitter.stories-8Oh14fbm.js → Splitter.stories-Hsq1wYaq.js} +1 -1
  205. package/storybook-static/assets/{StateSelect-Dw0Qm14-.js → StateSelect-C6hldFgO.js} +1 -1
  206. package/storybook-static/assets/{StateSelect-BSQUSTgI.js → StateSelect-DieNn4VC.js} +1 -1
  207. package/storybook-static/assets/{StateSelect.stories-C8WPRJNx.js → StateSelect.stories-CvAhDMix.js} +1 -1
  208. package/storybook-static/assets/{StringToggle.stories-K9u9rdE8.js → StringToggle.stories-CUT1tvt-.js} +1 -1
  209. package/storybook-static/assets/{Switch-BBuNsdNx.js → Switch-CX9p_uYU.js} +1 -1
  210. package/storybook-static/assets/{Switch-CtpvrECR.js → Switch-nEMRtcWe.js} +1 -1
  211. package/storybook-static/assets/{Switch.stories-Bcr4zA7L.js → Switch.stories-CPsHa2_m.js} +1 -1
  212. package/storybook-static/assets/{Table-iYeIie6s.js → Table-BhtITVtj.js} +1 -1
  213. package/storybook-static/assets/{Table.stories-BESdXqZx.js → Table.stories-nWNhSydG.js} +2 -2
  214. package/storybook-static/assets/{Tabs-aqWeCgs4.js → Tabs-DMQFh2BJ.js} +1 -1
  215. package/storybook-static/assets/{Tabs.stories-BSnrKg5G.js → Tabs.stories-D23_xvom.js} +1 -1
  216. package/storybook-static/assets/{TabsBox-CvRq3QA7.js → TabsBox-B5BsD_j_.js} +1 -1
  217. package/storybook-static/assets/{TagInput-CfKrOpJJ.js → TagInput-DO17z100.js} +1 -1
  218. package/storybook-static/assets/{TagInput.stories-CvXZl_qX.js → TagInput.stories-CMMFnIzb.js} +1 -1
  219. package/storybook-static/assets/{Text-_hP7L82D.js → Text-ClnbDqRk.js} +1 -1
  220. package/storybook-static/assets/{Textarea-Ujw8jml9.js → Textarea-C2IO_zsP.js} +1 -1
  221. package/storybook-static/assets/{Textarea-C6X20K4X.js → Textarea-DkhohiNc.js} +1 -1
  222. package/storybook-static/assets/{Textarea.stories-Bi4BQMxQ.js → Textarea.stories-NL6Aq8Vc.js} +1 -1
  223. package/storybook-static/assets/{TimePanel-B3eqkZj8.js → TimePanel-DNEPDlSW.js} +1 -1
  224. package/storybook-static/assets/{TimePanel.stories-BHXkDSMy.js → TimePanel.stories-DlfdPsz1.js} +1 -1
  225. package/storybook-static/assets/{Toggle-DS-Q4jwI.js → Toggle-3U5CceQN.js} +1 -1
  226. package/storybook-static/assets/{Toggle-6sjykxYk.js → Toggle-Cc6Ca-HI.js} +1 -1
  227. package/storybook-static/assets/{Toggle.stories-BhM1so-Z.js → Toggle.stories-BR-hVLDp.js} +1 -1
  228. package/storybook-static/assets/{TreeMultiSelect-D2lWYAa2.js → TreeMultiSelect-B0oBc-4y.js} +1 -1
  229. package/storybook-static/assets/{TreeMultiSelect-BudM77CT.js → TreeMultiSelect-D9hMQN2O.js} +1 -1
  230. package/storybook-static/assets/{TreeMultiSelect.stories-Bhh1zaAQ.js → TreeMultiSelect.stories-CslpbvPR.js} +1 -1
  231. package/storybook-static/assets/{TreePickerBase-CJfbJ6Ap.js → TreePickerBase-B_dMCe45.js} +1 -1
  232. package/storybook-static/assets/{TreeSelect-BFD6AKMu.js → TreeSelect-2lj0Q8gm.js} +1 -1
  233. package/storybook-static/assets/{TreeSelect-B7SG9PV7.js → TreeSelect-DEKNYF2b.js} +1 -1
  234. package/storybook-static/assets/{TreeSelect.stories-C-bHnrPH.js → TreeSelect.stories-CVDxn8Vm.js} +1 -1
  235. package/storybook-static/assets/{TreeTable-D-z37qlF.js → TreeTable-CBIpzYRL.js} +1 -1
  236. package/storybook-static/assets/{TreeTable.stories-CF_mH9Zz.js → TreeTable.stories-BMzrr2Kc.js} +2 -2
  237. package/storybook-static/assets/{blocks-Ddv0ZNIG.js → blocks-B5YBxaaS.js} +3 -3
  238. package/storybook-static/assets/{check-CgNbDbzr.js → check-BjtdCRaW.js} +1 -1
  239. package/storybook-static/assets/{chevron-down-0EnY_Ds_.js → chevron-down-B4u-y8Z1.js} +1 -1
  240. package/storybook-static/assets/{chevron-left-D5M5fFYk.js → chevron-left-BQfWs7Ah.js} +1 -1
  241. package/storybook-static/assets/{chevron-right-Uz5Iy_m-.js → chevron-right-ChokKd-f.js} +1 -1
  242. package/storybook-static/assets/{chunk-W22LQPXL-THpLoWLV.js → chunk-W22LQPXL-meOkhzk4.js} +1 -1
  243. package/storybook-static/assets/{circle-alert-B6Z--uoZ.js → circle-alert-B1AnDRf_.js} +1 -1
  244. package/storybook-static/assets/{circle-check-DMzkBUqN.js → circle-check-JYnlcC1F.js} +1 -1
  245. package/storybook-static/assets/{components-BmKs7c49.js → components-C_wl1sL5.js} +3 -3
  246. package/storybook-static/assets/{contextMenu-Dct-XhfD.js → contextMenu-B-TUGs_1.js} +1 -1
  247. package/storybook-static/assets/{defaultRenderers-BHXboKuy.js → defaultRenderers-DfmnIuod.js} +1 -1
  248. package/storybook-static/assets/{download-wey0TOZ0.js → download-eR3X8I-h.js} +1 -1
  249. package/storybook-static/assets/{floating-ui.react-COVT_I6r.js → floating-ui.react-D95VPQ0b.js} +1 -1
  250. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  251. package/storybook-static/assets/foundationApi-QhHXpYLB.js +59 -0
  252. package/storybook-static/assets/foundationLib-CEAjnstw.js +30 -0
  253. package/storybook-static/assets/{hooks-Baxp-XYz.js → hooks-awde7r2r.js} +1 -1
  254. package/storybook-static/assets/iframe-DzQq_POR.js +1 -0
  255. package/storybook-static/assets/{iframe-BOu-P2xF.js → iframe-FSp_AjJa.js} +4 -4
  256. package/storybook-static/assets/{info-gF0pk8a1.js → info-12vmb1sT.js} +1 -1
  257. package/storybook-static/assets/odata-C0Kpvttz.js +1 -0
  258. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  259. package/storybook-static/assets/{odataStoryFixtures-BUio-7WG.js → odataStoryFixtures-BXZnk_C7.js} +1 -1
  260. package/storybook-static/assets/{react-CN73PS7L.js → react-BlCqWuXr.js} +1 -1
  261. package/storybook-static/assets/{refresh-cw-BZ2qxodL.js → refresh-cw-Bf5ufPte.js} +1 -1
  262. package/storybook-static/assets/{settings-2-B33BG8wi.js → settings-2-DR-dTXIC.js} +1 -1
  263. package/storybook-static/assets/{sortable-CmC4atFR.js → sortable-B5e5yb_-.js} +1 -1
  264. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-Di0K55k7.js → syntaxhighlighter-QEQV7K2Y-EVJARTec.js} +1 -1
  265. package/storybook-static/assets/{trash-2-TnhWnKGO.js → trash-2-QP7TS18H.js} +1 -1
  266. package/storybook-static/assets/{triangle-alert-hZRwHRWu.js → triangle-alert-qw19mxHr.js} +1 -1
  267. package/storybook-static/assets/{useODataSelectBase-bTXYj3rC.js → useODataSelectBase-Csu_Cct9.js} +1 -1
  268. package/storybook-static/assets/useODataTreeData-BAv-Twqf.js +1 -0
  269. package/storybook-static/assets/{usePickerQuery-BMGBq6pi.js → usePickerQuery-Da-XM_Y0.js} +1 -1
  270. package/storybook-static/assets/{usePickerTriggerController-CB_TIrYx.js → usePickerTriggerController-C0TdC2Pz.js} +1 -1
  271. package/storybook-static/assets/{x-D86ykZGt.js → x-aCjYTirW.js} +1 -1
  272. package/storybook-static/iframe.html +2 -2
  273. package/storybook-static/index.json +1 -1
  274. package/storybook-static/project.json +1 -1
  275. package/dist/chunks/defaultRenderers-Dbhg2hHc.js.map +0 -1
  276. package/dist/chunks/multi-select-CHZhWoq6.js.map +0 -1
  277. package/storybook-static/assets/DateInput-DSwx7eI6.js +0 -1
  278. package/storybook-static/assets/NotificationsHost.stories-BZJG9Nvq.js +0 -29
  279. package/storybook-static/assets/SingleDateTimeInput.stories-kdKdW6al.js +0 -48
  280. package/storybook-static/assets/async-D1NpMm55.js +0 -625
  281. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  282. package/storybook-static/assets/foundationLib-CRTVZVS8.js +0 -25
  283. package/storybook-static/assets/iframe-CDj936Ul.js +0 -1
  284. package/storybook-static/assets/odata-D9Wmxqmj.js +0 -1
  285. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  286. package/storybook-static/assets/odataFetchFn-DfJwHTw8.js +0 -763
  287. package/storybook-static/assets/persisted-4qmfJLE0.js +0 -600
  288. package/storybook-static/assets/useODataTreeData-ZcX73Wdh.js +0 -1
@@ -0,0 +1,226 @@
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={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,strong:`strong`,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/Infrastructure/Notifications`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`notifications`,children:`Notifications`}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/notifications`}),` хранит очередь коротких уведомлений и предоставляет два способа управления ею:`]}),`
4
+ `,(0,c.jsxs)(t.ul,{children:[`
5
+ `,(0,c.jsx)(t.li,{children:`Zustand-store — для React-интерфейса, который отображает уведомления;`}),`
6
+ `,(0,c.jsxs)(t.li,{children:[`объект `,(0,c.jsx)(t.code,{children:`notify`}),` — для императивных вызовов из обработчиков, сервисов и `,(0,c.jsx)(t.code,{children:`try/catch`}),`.`]}),`
7
+ `]}),`
8
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.strong,{children:`не рисует интерфейс`}),`. Компонент toast/snackbar создаёт приложение: он подписывается на `,(0,c.jsx)(t.code,{children:`store`}),`, отображает `,(0,c.jsx)(t.code,{children:`items`}),` и вызывает действия уведомления.`]}),`
9
+ `,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
10
+ `,(0,c.jsx)(t.p,{children:`Подходит для сообщений вроде:`}),`
11
+ `,(0,c.jsxs)(t.ul,{children:[`
12
+ `,(0,c.jsx)(t.li,{children:`«Изменения сохранены»;`}),`
13
+ `,(0,c.jsx)(t.li,{children:`«Не удалось загрузить данные»;`}),`
14
+ `,(0,c.jsx)(t.li,{children:`«Файл формируется…» с последующей заменой на результат;`}),`
15
+ `,(0,c.jsx)(t.li,{children:`предупреждения с одной или несколькими кнопками-действиями.`}),`
16
+ `]}),`
17
+ `,(0,c.jsx)(t.p,{children:`Для ошибок внутри формы лучше показывать сообщение рядом с полем. Уведомление — дополнительный, а не единственный канал обратной связи.`}),`
18
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
19
+ `,(0,c.jsxs)(t.p,{children:[`Модулю нужен peer dependency `,(0,c.jsx)(t.code,{children:`zustand`}),`.`]}),`
20
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib zustand
21
+ `})}),`
22
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { bindNotifications, createNotificationsStore, notify, type Notification } from "@ryuzaki13/react-foundation-lib/notifications";
23
+ `})}),`
24
+ `,(0,c.jsxs)(t.p,{children:[`Используйте только публичный subpath `,(0,c.jsx)(t.code,{children:`/notifications`}),`. Импорт внутренних файлов пакета не является публичным контрактом.`]}),`
25
+ `,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
26
+ `,(0,c.jsx)(t.h3,{id:`1-создайте-один-store-приложения`,children:`1. Создайте один store приложения`}),`
27
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// notificationsStore.ts
28
+ import { bindNotifications, createNotificationsStore } from "@ryuzaki13/react-foundation-lib/notifications";
29
+
30
+ export const notificationsStore = createNotificationsStore();
31
+ export const unbindNotifications = bindNotifications(notificationsStore);
32
+ `})}),`
33
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createNotificationsStore()`}),` возвращает vanilla Zustand-store. Его следует создать вне React-компонента, иначе каждый рендер может создать новую независимую очередь.`]}),`
34
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`bindNotifications(store)`}),` связывает глобальный фасад `,(0,c.jsx)(t.code,{children:`notify`}),` с этим store. Без привязки вызов `,(0,c.jsx)(t.code,{children:`notify.success(...)`}),` выбросит ошибку.`]}),`
35
+ `,(0,c.jsx)(t.h3,{id:`2-подпишите-ui-на-store`,children:`2. Подпишите UI на store`}),`
36
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useStore } from "zustand";
37
+
38
+ import { notificationsStore } from "./notificationsStore";
39
+
40
+ export function NotificationsViewport() {
41
+ const items = useStore(notificationsStore, (state) => state.items);
42
+ const dismiss = useStore(notificationsStore, (state) => state.actions.dismiss);
43
+
44
+ return (
45
+ <section aria-label="Уведомления" aria-live="polite">
46
+ {items.map((item) => (
47
+ <article key={item.id} role={item.type === "error" ? "alert" : "status"}>
48
+ {item.title && <strong>{item.title}</strong>}
49
+ <p>{item.message}</p>
50
+
51
+ {item.actions?.map((action) => (
52
+ <button key={action.label} type="button" onClick={action.onClick}>
53
+ {action.label}
54
+ </button>
55
+ ))}
56
+
57
+ {item.dismissible !== false && (
58
+ <button type="button" onClick={() => dismiss(item.id)}>
59
+ Закрыть
60
+ </button>
61
+ )}
62
+ </article>
63
+ ))}
64
+ </section>
65
+ );
66
+ }
67
+ `})}),`
68
+ `,(0,c.jsx)(t.h3,{id:`3-показывайте-уведомления`,children:`3. Показывайте уведомления`}),`
69
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`notify.success("Данные сохранены");
70
+ notify.info("Началась синхронизация", { title: "Синхронизация" });
71
+ notify.warning("Соединение нестабильно", { ttlMs: 0 });
72
+ notify.error("Не удалось сохранить запись", { ttlMs: 15_000 });
73
+ `})}),`
74
+ `,(0,c.jsxs)(t.p,{children:[`Значение `,(0,c.jsx)(t.code,{children:`ttlMs: 0`}),` или отрицательное число отключает автоматическое закрытие.`]}),`
75
+ `,(0,c.jsx)(t.h2,{id:`модель-уведомления`,children:`Модель уведомления`}),`
76
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type NotificationType = "error" | "warning" | "info" | "success";
77
+ type NotificationTone = "neutral" | NotificationType;
78
+ type NotificationId = string;
79
+
80
+ type NotificationAction = {
81
+ label: string;
82
+ onClick: () => void | Promise<void>;
83
+ tone?: NotificationTone;
84
+ };
85
+
86
+ type Notification = {
87
+ id: NotificationId;
88
+ type: NotificationType;
89
+ title?: string;
90
+ message: string;
91
+ createdAt: number;
92
+ ttlMs?: number;
93
+ dismissible?: boolean;
94
+ actions?: NotificationAction[];
95
+ };
96
+ `})}),`
97
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createdAt`}),` — Unix-время в миллисекундах. `,(0,c.jsx)(t.code,{children:`dismissible: false`}),` означает, что UI не должен показывать обычную кнопку закрытия. Это только договор с UI: store не запрещает программный `,(0,c.jsx)(t.code,{children:`dismiss(id)`}),`.`]}),`
98
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`actions`}),` содержат функции и потому не сериализуются. Не сохраняйте очередь уведомлений в JSON, localStorage или серверной базе.`]}),`
99
+ `,(0,c.jsx)(t.h2,{id:`api-store`,children:`API store`}),`
100
+ `,(0,c.jsx)(t.h3,{id:`createnotificationsstore`,children:(0,c.jsx)(t.code,{children:`createNotificationsStore()`})}),`
101
+ `,(0,c.jsx)(t.p,{children:`Создаёт независимый store со структурой:`}),`
102
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type NotificationsStore = {
103
+ items: Notification[];
104
+ actions: {
105
+ push(input): NotificationId;
106
+ update(id, patch): boolean;
107
+ upsert(inputWithId): NotificationId;
108
+ dismiss(id): void;
109
+ clear(): void;
110
+ };
111
+ };
112
+ `})}),`
113
+ `,(0,c.jsxs)(t.p,{children:[`Очередь ограничена шестью элементами. Новое уведомление помещается в начало. При добавлении с уже существующим `,(0,c.jsx)(t.code,{children:`id`}),` старый элемент удаляется, а новый получает новое `,(0,c.jsx)(t.code,{children:`createdAt`}),`.`]}),`
114
+ `,(0,c.jsx)(t.h3,{id:`pushinput`,children:(0,c.jsx)(t.code,{children:`push(input)`})}),`
115
+ `,(0,c.jsxs)(t.p,{children:[`Добавляет уведомление и возвращает его `,(0,c.jsx)(t.code,{children:`id`}),`.`]}),`
116
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const id = notificationsStore.getState().actions.push({
117
+ type: "warning",
118
+ title: "Проверка",
119
+ message: "Некоторые поля не заполнены",
120
+ ttlMs: 8_000,
121
+ dismissible: true
122
+ });
123
+ `})}),`
124
+ `,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`id`}),` не передан, он генерируется из текущего времени и случайной части. Это идентификатор UI, а не криптографический или бизнес-идентификатор.`]}),`
125
+ `,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`ttlMs`}),` отсутствует, внутренний таймер всё равно запускается на 10 секунд. При этом в объекте уведомления поле остаётся `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
126
+ `,(0,c.jsx)(t.h3,{id:`updateid-patch`,children:(0,c.jsx)(t.code,{children:`update(id, patch)`})}),`
127
+ `,(0,c.jsxs)(t.p,{children:[`Частично меняет существующий элемент. Возвращает `,(0,c.jsx)(t.code,{children:`true`}),`, если элемент найден, иначе `,(0,c.jsx)(t.code,{children:`false`}),`.`]}),`
128
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const updated = notificationsStore.getState().actions.update(id, {
129
+ type: "success",
130
+ message: "Проверка завершена",
131
+ ttlMs: 2_500
132
+ });
133
+ `})}),`
134
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`id`}),` и `,(0,c.jsx)(t.code,{children:`createdAt`}),` изменить нельзя. Таймер перестраивается только тогда, когда в patch явно присутствует ключ `,(0,c.jsx)(t.code,{children:`ttlMs`}),`. Изменение одного `,(0,c.jsx)(t.code,{children:`message`}),` не продлевает исходный срок жизни.`]}),`
135
+ `,(0,c.jsx)(t.h3,{id:`upsertinput`,children:(0,c.jsx)(t.code,{children:`upsert(input)`})}),`
136
+ `,(0,c.jsxs)(t.p,{children:[`Обновляет элемент с заданным `,(0,c.jsx)(t.code,{children:`id`}),`, а если его нет — добавляет новый.`]}),`
137
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`notificationsStore.getState().actions.upsert({
138
+ id: "import-users",
139
+ type: "info",
140
+ message: "Импортировано 40 из 100 строк",
141
+ dismissible: false
142
+ });
143
+ `})}),`
144
+ `,(0,c.jsxs)(t.p,{children:[`Важная деталь: при обновлении существующего элемента `,(0,c.jsx)(t.code,{children:`upsert`}),` меняет `,(0,c.jsx)(t.code,{children:`type`}),`, `,(0,c.jsx)(t.code,{children:`title`}),`, `,(0,c.jsx)(t.code,{children:`message`}),`, `,(0,c.jsx)(t.code,{children:`ttlMs`}),` и `,(0,c.jsx)(t.code,{children:`dismissible`}),`, но не заменяет `,(0,c.jsx)(t.code,{children:`actions`}),`. Для явной смены действий используйте `,(0,c.jsx)(t.code,{children:`update(id, { actions })`}),`.`]}),`
145
+ `,(0,c.jsxs)(t.h3,{id:`dismissid-и-clear`,children:[(0,c.jsx)(t.code,{children:`dismiss(id)`}),` и `,(0,c.jsx)(t.code,{children:`clear()`})]}),`
146
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`dismiss(id)`}),` удаляет один элемент и очищает его таймер. `,(0,c.jsx)(t.code,{children:`clear()`}),` удаляет всю очередь и все таймеры.`]}),`
147
+ `,(0,c.jsxs)(t.h2,{id:`императивный-api-notify`,children:[`Императивный API `,(0,c.jsx)(t.code,{children:`notify`})]}),`
148
+ `,(0,c.jsx)(t.h3,{id:`привязка-и-жизненный-цикл`,children:`Привязка и жизненный цикл`}),`
149
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const unbind = bindNotifications(notificationsStore);
150
+
151
+ // При полном демонтаже приложения:
152
+ unbind();
153
+ `})}),`
154
+ `,(0,c.jsxs)(t.p,{children:[`Одновременно фасад хранит только одну привязку. Повторный `,(0,c.jsx)(t.code,{children:`bindNotifications(otherStore)`}),` переключит вызовы на другой store. Старый cleanup не отвяжет новый store.`]}),`
155
+ `,(0,c.jsxs)(t.p,{children:[`Пакет не экспортирует `,(0,c.jsx)(t.code,{children:`NotificationsProvider`}),`, несмотря на текст ошибки при отсутствии привязки. Provider или другой lifecycle-компонент является ответственностью приложения.`]}),`
156
+ `,(0,c.jsx)(t.h3,{id:`основные-методы`,children:`Основные методы`}),`
157
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`notify.push(input);
158
+ notify.upsert(inputWithId);
159
+ notify.update(id, patch);
160
+ notify.dismiss(id);
161
+ notify.clear();
162
+
163
+ notify.success(message, options);
164
+ notify.info(message, options);
165
+ notify.warning(message, options);
166
+ notify.error(message, options);
167
+ `})}),`
168
+ `,(0,c.jsxs)(t.p,{children:[`Сокращённые методы автоматически подставляют `,(0,c.jsx)(t.code,{children:`type`}),`, но принимают остальные параметры `,(0,c.jsx)(t.code,{children:`push`}),`, включая `,(0,c.jsx)(t.code,{children:`id`}),`, `,(0,c.jsx)(t.code,{children:`title`}),`, `,(0,c.jsx)(t.code,{children:`ttlMs`}),`, `,(0,c.jsx)(t.code,{children:`dismissible`}),` и `,(0,c.jsx)(t.code,{children:`actions`}),`.`]}),`
169
+ `,(0,c.jsxs)(t.h3,{id:`долгая-операция-notifyprogress`,children:[`Долгая операция: `,(0,c.jsx)(t.code,{children:`notify.progress()`})]}),`
170
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function importFile(file: File) {
171
+ const progress = notify.progress("Читаем файл…", {
172
+ id: "users-import",
173
+ title: "Импорт пользователей"
174
+ });
175
+
176
+ try {
177
+ progress.update("Отправляем данные…");
178
+ await upload(file);
179
+ progress.success("Импорт завершён");
180
+ } catch (error) {
181
+ progress.error("Импорт завершился с ошибкой");
182
+ throw error;
183
+ }
184
+ }
185
+ `})}),`
186
+ `,(0,c.jsxs)(t.p,{children:[`Начальное уведомление имеет `,(0,c.jsx)(t.code,{children:`type: "info"`}),` и `,(0,c.jsx)(t.code,{children:`dismissible: false`}),`. Возвращаемый объект содержит:`]}),`
187
+ `,(0,c.jsxs)(t.ul,{children:[`
188
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`id`}),` — идентификатор уведомления;`]}),`
189
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`update(message)`}),` — меняет текст, не перезапуская таймер;`]}),`
190
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`success(message, ttlMs = 2500)`}),` — делает уведомление успешным и закрываемым;`]}),`
191
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`error(message, ttlMs = 5000)`}),` — делает уведомление ошибкой и закрываемым;`]}),`
192
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`dismiss()`}),` — удаляет уведомление.`]}),`
193
+ `]}),`
194
+ `,(0,c.jsxs)(t.p,{children:[`При переданном стабильном `,(0,c.jsx)(t.code,{children:`id`}),` повторный `,(0,c.jsx)(t.code,{children:`progress`}),` продолжит существующий элемент. Это удобно для операции, которая может стартовать из нескольких мест.`]}),`
195
+ `,(0,c.jsx)(t.h2,{id:`browser-и-ssr`,children:`Browser и SSR`}),`
196
+ `,(0,c.jsxs)(t.p,{children:[`Store использует `,(0,c.jsx)(t.code,{children:`window.setTimeout`}),` и `,(0,c.jsx)(t.code,{children:`window.clearTimeout`}),`. Создать store можно заранее, но методы, которые запускают или очищают таймеры, предназначены для браузера. Не вызывайте `,(0,c.jsx)(t.code,{children:`push`}),`, `,(0,c.jsx)(t.code,{children:`update`}),` с `,(0,c.jsx)(t.code,{children:`ttlMs`}),`, `,(0,c.jsx)(t.code,{children:`dismiss`}),` или `,(0,c.jsx)(t.code,{children:`clear`}),` во время серверного рендера.`]}),`
197
+ `,(0,c.jsx)(t.p,{children:`Практически безопасная схема: создавать и привязывать store в client entrypoint либо в модуле, который импортируется только браузерным приложением.`}),`
198
+ `,(0,c.jsx)(t.h2,{id:`доступность-интерфейса`,children:`Доступность интерфейса`}),`
199
+ `,(0,c.jsx)(t.p,{children:`Store не задаёт ARIA-разметку. В UI рекомендуется:`}),`
200
+ `,(0,c.jsxs)(t.ul,{children:[`
201
+ `,(0,c.jsxs)(t.li,{children:[`использовать `,(0,c.jsx)(t.code,{children:`aria-live="polite"`}),` для обычных сообщений;`]}),`
202
+ `,(0,c.jsxs)(t.li,{children:[`использовать `,(0,c.jsx)(t.code,{children:`role="alert"`}),` только для действительно срочных ошибок;`]}),`
203
+ `,(0,c.jsx)(t.li,{children:`давать кнопке закрытия понятное доступное имя;`}),`
204
+ `,(0,c.jsx)(t.li,{children:`не делать TTL слишком коротким, если уведомление содержит много текста или действия;`}),`
205
+ `,(0,c.jsx)(t.li,{children:`обеспечить управление действиями с клавиатуры.`}),`
206
+ `]}),`
207
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
208
+ `,(0,c.jsxs)(t.h3,{id:`вызов-notify-до-bindnotifications`,children:[`Вызов `,(0,c.jsx)(t.code,{children:`notify`}),` до `,(0,c.jsx)(t.code,{children:`bindNotifications`})]}),`
209
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Ошибка времени выполнения: store ещё не привязан.
210
+ notify.success("Готово");
211
+ `})}),`
212
+ `,(0,c.jsxs)(t.p,{children:[`Сначала создайте store и выполните `,(0,c.jsx)(t.code,{children:`bindNotifications`}),` в точке запуска приложения.`]}),`
213
+ `,(0,c.jsx)(t.h3,{id:`создание-store-внутри-тела-компонента`,children:`Создание store внутри тела компонента`}),`
214
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function App() {
215
+ // Плохо: при повторном рендере можно потерять очередь и таймеры.
216
+ const store = createNotificationsStore();
217
+ return null;
218
+ }
219
+ `})}),`
220
+ `,(0,c.jsx)(t.p,{children:`Создайте singleton на уровне модуля или один раз через подходящий lifecycle-контейнер.`}),`
221
+ `,(0,c.jsxs)(t.h3,{id:`ожидание-что-dismissible-false-блокирует-удаление`,children:[`Ожидание, что `,(0,c.jsx)(t.code,{children:`dismissible: false`}),` блокирует удаление`]}),`
222
+ `,(0,c.jsxs)(t.p,{children:[`Это только поле модели для UI. `,(0,c.jsx)(t.code,{children:`notify.dismiss(id)`}),` всё равно удалит элемент.`]}),`
223
+ `,(0,c.jsx)(t.h3,{id:`использование-уведомления-вместо-состояния-операции`,children:`Использование уведомления вместо состояния операции`}),`
224
+ `,(0,c.jsx)(t.p,{children:`Очередь ограничена шестью элементами и живёт в памяти страницы. Не используйте её как журнал аудита, источник истины о фоновой задаче или долговременное хранилище ошибок.`}),`
225
+ `,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
226
+ `,(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:`createNotificationsStore()`})}),(0,c.jsx)(t.td,{children:`Создать независимый Zustand-store уведомлений`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`bindNotifications(store)`})}),(0,c.jsxs)(t.td,{children:[`Привязать store к глобальному фасаду `,(0,c.jsx)(t.code,{children:`notify`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`notify`})}),(0,c.jsx)(t.td,{children:`Императивно добавлять, обновлять и закрывать уведомления`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`Notification`})}),(0,c.jsx)(t.td,{children:`Полная модель сохранённого элемента`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`NotificationPushInput`})}),(0,c.jsx)(t.td,{children:`Параметры добавления элемента`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`NotificationUpdatePatch`})}),(0,c.jsx)(t.td,{children:`Допустимые поля частичного обновления`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`NotificationsStoreApi`})}),(0,c.jsx)(t.td,{children:`Тип vanilla Zustand-store`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`NotificationAction`})}),(0,c.jsx)(t.td,{children:`Кнопка-действие уведомления`})]})]})]})]})}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};
@@ -0,0 +1,273 @@
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`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,strong:`strong`,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 API/Query/Generic Resource`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`generic-resources-через-ryuzaki13react-foundation-apiresource`,children:[`Generic resources через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/resource`})]}),`
3
+ `,(0,c.jsx)(t.p,{children:`Модуль описывает transport-agnostic ресурс поверх TanStack Query: стабильные query keys, проверку scope, произвольные read/write operations и cache strategies после mutation.`}),`
4
+ `,(0,c.jsx)(t.h2,{id:`для-кого-этот-документ`,children:`Для кого этот документ`}),`
5
+ `,(0,c.jsx)(t.p,{children:`Здесь термины используются так:`}),`
6
+ `,(0,c.jsxs)(t.ul,{children:[`
7
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`resource`}),` — технически связанная группа данных, например `,(0,c.jsx)(t.code,{children:`orders`}),`;`]}),`
8
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`scope`}),` — контекст, внутри которого данные уникальны, например `,(0,c.jsx)(t.code,{children:`{ companyId }`}),`;`]}),`
9
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`query/read operation`}),` — чтение без изменения server state;`]}),`
10
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`mutation/write operation`}),` — создание/изменение/удаление;`]}),`
11
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`descriptor`}),` — объект, объединяющий identity, operations и правила доступности;`]}),`
12
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`query key`}),` — сериализуемый identity записи в TanStack Query cache.`]}),`
13
+ `]}),`
14
+ `,(0,c.jsxs)(t.p,{children:[`Модуль не выполняет HTTP/OData сам. Transport находится внутри `,(0,c.jsx)(t.code,{children:`operation.execute`}),` или создаётся adapter-ом `,(0,c.jsx)(t.code,{children:`/server-fn`}),`.`]}),`
15
+ `,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
16
+ `,(0,c.jsxs)(t.p,{children:[`Используйте `,(0,c.jsx)(t.code,{children:`/resource`}),`, когда названия операций произвольны: `,(0,c.jsx)(t.code,{children:`search`}),`, `,(0,c.jsx)(t.code,{children:`detail`}),`, `,(0,c.jsx)(t.code,{children:`archive`}),`, `,(0,c.jsx)(t.code,{children:`recalculate`}),`.`]}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Для стандартной модели сохранённых записей `,(0,c.jsx)(t.code,{children:`list/latest/history/save/create/delete`}),` удобнее `,(0,c.jsx)(t.a,{href:`../persisted/README.mdx`,children:(0,c.jsx)(t.code,{children:`/persisted`})}),`.`]}),`
18
+ `,(0,c.jsx)(t.h2,{id:`установка-и-provider`,children:`Установка и provider`}),`
19
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-api @ryuzaki13/react-foundation-lib @tanstack/react-query react
20
+ `})}),`
21
+ `,(0,c.jsxs)(t.p,{children:[`React hooks работают только внутри `,(0,c.jsx)(t.code,{children:`QueryClientProvider`}),`:`]}),`
22
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
23
+
24
+ const queryClient = new QueryClient();
25
+
26
+ export function App() {
27
+ return <QueryClientProvider client={queryClient}>{/* routes */}</QueryClientProvider>;
28
+ }
29
+ `})}),`
30
+ `,(0,c.jsx)(t.p,{children:`Создайте client один раз, а не внутри render.`}),`
31
+ `,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
32
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
33
+ applyResourceCacheStrategy,
34
+ buildResourceQueryOptions,
35
+ composeResourceCacheStrategies,
36
+ createInvalidateResourceScopeCacheStrategy,
37
+ createResourceDescriptor,
38
+ createResourceKeys,
39
+ createResourceMutationOperation,
40
+ createResourceQueryOperation,
41
+ createSetResourceQueryDataCacheStrategy,
42
+ getResourceQueryData,
43
+ normalizeResourceKeyValue,
44
+ useResourceMutation,
45
+ useResourceQuery
46
+ } from "@ryuzaki13/react-foundation-api/resource";
47
+ `})}),`
48
+ `,(0,c.jsx)(t.p,{children:`Типы экспортируются из того же subpath.`}),`
49
+ `,(0,c.jsx)(t.h2,{id:`пошаговый-пример`,children:`Пошаговый пример`}),`
50
+ `,(0,c.jsx)(t.h3,{id:`1-описать-scope-и-данные`,children:`1. Описать scope и данные`}),`
51
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type OrdersScope = {
52
+ companyId: string;
53
+ };
54
+
55
+ type SearchOrdersArgs = {
56
+ search: string;
57
+ limit: number;
58
+ };
59
+
60
+ type Order = {
61
+ id: string;
62
+ title: string;
63
+ };
64
+
65
+ type SaveOrderInput = {
66
+ id: string;
67
+ title: string;
68
+ };
69
+ `})}),`
70
+ `,(0,c.jsx)(t.h3,{id:`2-создать-operations`,children:`2. Создать operations`}),`
71
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const searchOperation = createResourceQueryOperation<
72
+ OrdersScope,
73
+ SearchOrdersArgs,
74
+ Order[]
75
+ >({
76
+ async execute({ scope, args, signal }) {
77
+ const query = new URLSearchParams({
78
+ companyId: scope.companyId,
79
+ search: args.search,
80
+ limit: String(args.limit)
81
+ });
82
+
83
+ const response = await fetch(\`/api/orders?\${query}\`, { signal });
84
+ if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
85
+ return response.json() as Promise<Order[]>;
86
+ },
87
+ isEnabled: (scope, args) => Boolean(scope?.companyId && args.limit > 0),
88
+ staleTime: 60_000,
89
+ gcTime: 5 * 60_000
90
+ });
91
+
92
+ const saveOperation = createResourceMutationOperation<
93
+ OrdersScope,
94
+ SaveOrderInput,
95
+ Order,
96
+ unknown
97
+ >({
98
+ async execute({ scope, input }) {
99
+ const response = await fetch(\`/api/companies/\${scope.companyId}/orders/\${input.id}\`, {
100
+ method: "PUT",
101
+ headers: { "Content-Type": "application/json" },
102
+ body: JSON.stringify(input)
103
+ });
104
+
105
+ if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
106
+ return response.json() as Promise<Order>;
107
+ }
108
+ });
109
+ `})}),`
110
+ `,(0,c.jsxs)(t.p,{children:[`Factories `,(0,c.jsx)(t.code,{children:`createResourceQueryOperation`}),` и `,(0,c.jsx)(t.code,{children:`createResourceMutationOperation`}),` не изменяют объект. Они помогают TypeScript сохранить generic types.`]}),`
111
+ `,(0,c.jsx)(t.h3,{id:`3-создать-descriptor`,children:`3. Создать descriptor`}),`
112
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const ordersResource = createResourceDescriptor({
113
+ namespace: "sales",
114
+ resource: "orders",
115
+ normalizeScope: (scope: OrdersScope | null | undefined) => ({
116
+ companyId: scope?.companyId.trim() ?? ""
117
+ }),
118
+ operations: {
119
+ queries: { search: searchOperation },
120
+ mutations: { save: saveOperation }
121
+ },
122
+ isEnabled: (scope) => Boolean(scope?.companyId),
123
+ getScopeError: () => "Не выбрана компания"
124
+ });
125
+ `})}),`
126
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`namespace + resource`}),` должны быть устойчивыми и уникальными. Не включайте локализованные labels или случайные значения.`]}),`
127
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`normalizeScope`}),` влияет только на query key. В `,(0,c.jsx)(t.code,{children:`execute`}),` приходит исходный literal scope. Например, key получит trimmed `,(0,c.jsx)(t.code,{children:`companyId`}),`, но operation увидит строку ровно в переданном object. Это позволяет нормализовать identity, не переписывая draft/input.`]}),`
128
+ `,(0,c.jsx)(t.h3,{id:`4-использовать-query-hook`,children:`4. Использовать query hook`}),`
129
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function OrdersList({ companyId, search }: Props) {
130
+ const query = useResourceQuery(
131
+ ordersResource,
132
+ "search",
133
+ { companyId },
134
+ { search, limit: 50 }
135
+ );
136
+
137
+ if (query.isPending) return <p>Загрузка…</p>;
138
+ if (query.isError) return <p>Ошибка загрузки</p>;
139
+
140
+ return query.data.map((order) => <div key={order.id}>{order.title}</div>);
141
+ }
142
+ `})}),`
143
+ `,(0,c.jsx)(t.p,{children:`Rules of Hooks применяются полностью: hook нельзя вызывать условно или в callback.`}),`
144
+ `,(0,c.jsx)(t.h3,{id:`5-использовать-mutation-hook`,children:`5. Использовать mutation hook`}),`
145
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const mutation = useResourceMutation(
146
+ ordersResource,
147
+ "save",
148
+ { companyId },
149
+ {
150
+ onSuccess(savedOrder) {
151
+ showSuccess(\`Сохранён \${savedOrder.title}\`);
152
+ }
153
+ }
154
+ );
155
+
156
+ mutation.mutate({ id: "42", title: "Новый заголовок" });
157
+ `})}),`
158
+ `,(0,c.jsxs)(t.p,{children:[`Mutation key содержит resource/scope/operation, но не input. Input передаётся только в `,(0,c.jsx)(t.code,{children:`mutationFn`}),`.`]}),`
159
+ `,(0,c.jsx)(t.h2,{id:`query-lifecycle`,children:`Query lifecycle`}),`
160
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildResourceQueryOptions(descriptor, name, scope, args)`}),` создаёт TanStack `,(0,c.jsx)(t.code,{children:`queryOptions`}),`:`]}),`
161
+ `,(0,c.jsxs)(t.ul,{children:[`
162
+ `,(0,c.jsxs)(t.li,{children:[`key из `,(0,c.jsx)(t.code,{children:`descriptor.keys.operation`}),`;`]}),`
163
+ `,(0,c.jsxs)(t.li,{children:[`query function с `,(0,c.jsx)(t.code,{children:`{ scope, args, client, signal }`}),`;`]}),`
164
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`enabled`}),` из descriptor и operation;`]}),`
165
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`staleTime`}),`/`,(0,c.jsx)(t.code,{children:`gcTime`}),` из operation.`]}),`
166
+ `]}),`
167
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const options = buildResourceQueryOptions(
168
+ ordersResource,
169
+ "search",
170
+ { companyId: "1000" },
171
+ { search: "", limit: 50 }
172
+ );
173
+ `})}),`
174
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`enabled`}),` сначала проверяет `,(0,c.jsx)(t.code,{children:`descriptor.isEnabled(scope)`}),`, затем `,(0,c.jsx)(t.code,{children:`operation.isEnabled(scope, args)`}),`. Если одна проверка вернула `,(0,c.jsx)(t.code,{children:`false`}),`, React query не стартует автоматически.`]}),`
175
+ `,(0,c.jsxs)(t.p,{children:[`Перед фактическим `,(0,c.jsx)(t.code,{children:`execute`}),` scope обязан быть не `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),` и пройти descriptor policy. Иначе выбрасывается `,(0,c.jsx)(t.code,{children:`getScopeError`}),` или стандартная ошибка.`]}),`
176
+ `,(0,c.jsx)(t.h2,{id:`императивная-загрузка`,children:`Императивная загрузка`}),`
177
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const orders = await getResourceQueryData(
178
+ ordersResource,
179
+ "search",
180
+ { companyId: "1000" },
181
+ { search: "", limit: 50 },
182
+ queryClient
183
+ );
184
+ `})}),`
185
+ `,(0,c.jsxs)(t.p,{children:[`Функция использует `,(0,c.jsx)(t.code,{children:`queryClient.fetchQuery`}),`, поэтому переиспользует query cache. Передавайте только валидный scope: imperative `,(0,c.jsx)(t.code,{children:`fetchQuery`}),` нельзя воспринимать как disabled React observer; query function всё равно защищает scope и может бросить ошибку.`]}),`
186
+ `,(0,c.jsx)(t.h2,{id:`query-keys`,children:`Query keys`}),`
187
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const keys = createResourceKeys<OrdersScope, "search" | "save">({
188
+ namespace: "sales",
189
+ resource: "orders",
190
+ normalizeScope: (scope) => ({ companyId: scope?.companyId ?? "" })
191
+ });
192
+
193
+ keys.all;
194
+ // ["sales", "orders"]
195
+
196
+ keys.scope({ companyId: "1000" });
197
+ // ["sales", "orders", { companyId: "1000" }]
198
+
199
+ keys.operation("search", { companyId: "1000" }, { limit: 50 });
200
+ // ["sales", "orders", { companyId: "1000" }, "search", { limit: 50 }]
201
+ `})}),`
202
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`args === undefined`}),` не добавляется в key. `,(0,c.jsx)(t.code,{children:`args === null`}),` добавляется как `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
203
+ `,(0,c.jsx)(t.h3,{id:`normalizeresourcekeyvalue`,children:(0,c.jsx)(t.code,{children:`normalizeResourceKeyValue`})}),`
204
+ `,(0,c.jsx)(t.p,{children:`Нормализация рекурсивна:`}),`
205
+ `,(0,c.jsxs)(t.ul,{children:[`
206
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),` и `,(0,c.jsx)(t.code,{children:`undefined`}),` → `,(0,c.jsx)(t.code,{children:`null`}),`;`]}),`
207
+ `,(0,c.jsxs)(t.li,{children:[`string → `,(0,c.jsx)(t.code,{children:`trim()`}),`;`]}),`
208
+ `,(0,c.jsx)(t.li,{children:`number/boolean остаются без изменения;`}),`
209
+ `,(0,c.jsx)(t.li,{children:`array нормализуется по элементам, порядок сохраняется;`}),`
210
+ `,(0,c.jsx)(t.li,{children:`object keys сортируются, значения нормализуются;`}),`
211
+ `,(0,c.jsxs)(t.li,{children:[`другие значения превращаются через `,(0,c.jsx)(t.code,{children:`String(value)`}),`.`]}),`
212
+ `]}),`
213
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`normalizeResourceKeyValue({ b: " x ", a: undefined });
214
+ // { a: null, b: "x" }
215
+ `})}),`
216
+ `,(0,c.jsx)(t.p,{children:`Ограничения:`}),`
217
+ `,(0,c.jsxs)(t.ul,{children:[`
218
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Date`}),`, `,(0,c.jsx)(t.code,{children:`Map`}),`, `,(0,c.jsx)(t.code,{children:`Set`}),` и class instances не имеют специальной сериализации; обычный `,(0,c.jsx)(t.code,{children:`Date`}),` превратится в `,(0,c.jsx)(t.code,{children:`{}`}),`;`]}),`
219
+ `,(0,c.jsx)(t.li,{children:`cyclic object приведёт к рекурсивной ошибке;`}),`
220
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`NaN`}),`/`,(0,c.jsx)(t.code,{children:`Infinity`}),` остаются number, но их cache semantics могут быть неочевидны;`]}),`
221
+ `,(0,c.jsx)(t.li,{children:`function/symbol/bigint превращаются в строки и могут collision-иться.`}),`
222
+ `]}),`
223
+ `,(0,c.jsx)(t.p,{children:`Нормализуйте специальные значения сами, например Date → ISO string. Query key не должен содержать secrets, DOM nodes или огромные payload.`}),`
224
+ `,(0,c.jsx)(t.h2,{id:`cache-strategies-после-mutation`,children:`Cache strategies после mutation`}),`
225
+ `,(0,c.jsx)(t.h3,{id:`инвалидация-scope`,children:`Инвалидация scope`}),`
226
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const invalidateScope = createInvalidateResourceScopeCacheStrategy();
227
+ `})}),`
228
+ `,(0,c.jsxs)(t.p,{children:[`Стратегия вызывает `,(0,c.jsx)(t.code,{children:`client.invalidateQueries`}),` по `,(0,c.jsx)(t.code,{children:`descriptor.keys.scope(scope)`}),`. Все query этого resource/scope становятся stale и активные observers могут refetch.`]}),`
229
+ `,(0,c.jsxs)(t.h3,{id:`точечный-setquerydata`,children:[`Точечный `,(0,c.jsx)(t.code,{children:`setQueryData`})]}),`
230
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const updateDetail = createSetResourceQueryDataCacheStrategy<
231
+ OrdersScope,
232
+ SaveOrderInput,
233
+ Order,
234
+ Order[],
235
+ typeof ordersResource
236
+ >({
237
+ getQueryKey: ({ descriptor, scope }) =>
238
+ descriptor.keys.operation("search", scope, { search: "", limit: 50 }),
239
+ update: (current = [], { result }) =>
240
+ current.map((order) => (order.id === result.id ? result : order))
241
+ });
242
+ `})}),`
243
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`update`}),` получает текущее cache data или `,(0,c.jsx)(t.code,{children:`undefined`}),`, а также descriptor/scope/input/result/client. Оно должно возвращать новое значение и не мутировать старое.`]}),`
244
+ `,(0,c.jsx)(t.h3,{id:`композиция`,children:`Композиция`}),`
245
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const strategy = composeResourceCacheStrategies(
246
+ updateDetail,
247
+ invalidateScope
248
+ );
249
+ `})}),`
250
+ `,(0,c.jsxs)(t.p,{children:[`Strategies выполняются последовательно в переданном порядке. Если одна бросила ошибку, следующие и custom `,(0,c.jsx)(t.code,{children:`onSuccess`}),` mutation hook не выполнятся; сама server mutation при этом уже могла успешно завершиться.`]}),`
251
+ `,(0,c.jsx)(t.h3,{id:`override-в-hook`,children:`Override в hook`}),`
252
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`useResourceMutation(descriptor, "save", scope, {
253
+ cacheStrategy: undefined // Использовать strategy операции.
254
+ });
255
+
256
+ useResourceMutation(descriptor, "save", scope, {
257
+ cacheStrategy: null // Полностью отключить strategy операции.
258
+ });
259
+ `})}),`
260
+ `,(0,c.jsxs)(t.p,{children:[`Переданная strategy заменяет operation strategy, а не дополняет её. Для объединения используйте `,(0,c.jsx)(t.code,{children:`composeResourceCacheStrategies`}),`.`]}),`
261
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`applyResourceCacheStrategy(strategy, context)`}),` — низкоуровневый helper для ручного применения optional strategy.`]}),`
262
+ `,(0,c.jsx)(t.h2,{id:`ошибки-и-границы`,children:`Ошибки и границы`}),`
263
+ `,(0,c.jsxs)(t.ul,{children:[`
264
+ `,(0,c.jsx)(t.li,{children:`Отсутствующая operation даёт раннюю ошибку с именем resource/operation.`}),`
265
+ `,(0,c.jsxs)(t.li,{children:[`Невалидный scope блокирует hook через `,(0,c.jsx)(t.code,{children:`enabled`}),`, но ручное выполнение бросает ошибку.`]}),`
266
+ `,(0,c.jsx)(t.li,{children:`Error transport-а сохраняется TanStack Query без автоматического преобразования.`}),`
267
+ `,(0,c.jsx)(t.li,{children:`Descriptor лучше создавать на уровне module, чтобы ссылка не менялась на каждом render.`}),`
268
+ `,(0,c.jsx)(t.li,{children:`Args/scope должны быть сериализуемыми и описывать все данные, влияющие на query result.`}),`
269
+ `,(0,c.jsx)(t.li,{children:`Не используйте query cache как authoritative persistent storage.`}),`
270
+ `,(0,c.jsx)(t.li,{children:`Cache strategy выполняется только после успешной mutation.`}),`
271
+ `]}),`
272
+ `,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
273
+ `,(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:`Exports`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Descriptor/operations`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createResourceDescriptor`}),`, `,(0,c.jsx)(t.code,{children:`createResourceQueryOperation`}),`, `,(0,c.jsx)(t.code,{children:`createResourceMutationOperation`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Query/mutation`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`buildResourceQueryOptions`}),`, `,(0,c.jsx)(t.code,{children:`useResourceQuery`}),`, `,(0,c.jsx)(t.code,{children:`getResourceQueryData`}),`, `,(0,c.jsx)(t.code,{children:`useResourceMutation`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Keys`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeResourceKeyValue`}),`, `,(0,c.jsx)(t.code,{children:`createResourceKeys`}),`, `,(0,c.jsx)(t.code,{children:`ResourceKeyValue`}),`, `,(0,c.jsx)(t.code,{children:`ResourceKeys`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Cache`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`applyResourceCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`createInvalidateResourceScopeCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`createSetResourceQueryDataCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`composeResourceCacheStrategies`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Contracts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ResourceQueryOperationContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationOperationContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceQueryOperation`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationOperation`}),`, `,(0,c.jsx)(t.code,{children:`ResourceDescriptor`}),`, `,(0,c.jsx)(t.code,{children:`CreateResourceDescriptorOptions`}),`, `,(0,c.jsx)(t.code,{children:`ResourceCacheStrategyContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`UseResourceMutationOptions`}),`, `,(0,c.jsx)(t.code,{children:`ResourceSetQueryDataStrategyOptions`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Type extraction`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ResourceQueryArgs`}),`, `,(0,c.jsx)(t.code,{children:`ResourceQueryResult`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationInput`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationResult`})]})]})]})]})]})}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};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-BOu-P2xF.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-Ddv0ZNIG.js";function o(e){let t={a:`a`,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/Formatters/Boolean`}),`
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`,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/Formatters/Boolean`}),`
2
2
  `,(0,c.jsxs)(t.h1,{id:`boolean-и-abap-boolean-через-ryuzaki13react-foundation-libformatters`,children:[`Boolean и ABAP boolean через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formatters`})]}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Подмодуль `,(0,c.jsx)(t.code,{children:`boolean`}),` преобразует значения между JavaScript `,(0,c.jsx)(t.code,{children:`boolean`}),` и двухсимвольным ABAP-контрактом:`]}),`
4
4
  `,(0,c.jsxs)(t.ul,{children:[`