@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,110 @@
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`,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/Data/Range Output`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`подстановка-открытых-границ-через-ryuzaki13react-foundation-librange-output`,children:[`Подстановка открытых границ через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/range-output`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль хранит в UI открытые границы диапазона как `,(0,c.jsx)(t.code,{children:`null`}),`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
5
+ `,(0,c.jsxs)(t.ul,{children:[`
6
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5`,children:`Назначение`})}),`
7
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Установка и импорт`})}),`
8
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82%D1%8B`,children:`Контракты`})}),`
9
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#readrangeoutputvaluefallback`,children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})})}),`
10
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#resolverangeoutputvalue`,children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})})}),`
11
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-boundary`,children:`Правильная boundary`})}),`
12
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#api-%D0%B8-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8`,children:`API и ошибки`})}),`
13
+ `]}),`
14
+ `,(0,c.jsx)(t.h2,{id:`назначение`,children:`Назначение`}),`
15
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`UI range [null, 6]
16
+ fallback { start: 0, end: 12 }
17
+
18
+
19
+ external output [0, 6]
20
+ `})}),`
21
+ `,(0,c.jsxs)(t.p,{children:[`Исходное UI-значение не изменяется. `,(0,c.jsx)(t.code,{children:`null`}),` заменяется только при построении отдельного output tuple.`]}),`
22
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
23
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { readRangeOutputValueFallback, resolveRangeOutputValue } from "@ryuzaki13/react-foundation-lib/range-output";
24
+
25
+ import type { RangeOutputFallbackEndpointParser, RangeOutputValueFallback } from "@ryuzaki13/react-foundation-lib/range-output";
26
+ `})}),`
27
+ `,(0,c.jsx)(t.p,{children:`Модуль pure, не требует React/browser APIs.`}),`
28
+ `,(0,c.jsx)(t.h2,{id:`контракты`,children:`Контракты`}),`
29
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RangeOutputValueFallback<TValue extends BaseType> = {
30
+ start?: TValue | null;
31
+ end?: TValue | null;
32
+ };
33
+
34
+ type RangeOutputFallbackEndpointParser<TValue extends BaseType> = (value: unknown) => TValue | null | undefined;
35
+ `})}),`
36
+ `,(0,c.jsx)(t.p,{children:`Смысл результата parser:`}),`
37
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Результат parser`}),(0,c.jsx)(t.th,{children:`Что происходит`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`конкретное value`}),(0,c.jsx)(t.td,{children:`сохраняется как fallback`})]}),(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:`явная пустая fallback-граница`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`undefined`})}),(0,c.jsx)(t.td,{children:`поле отсутствует/невалидно и не входит в result`})]})]})]}),`
38
+ `,(0,c.jsx)(t.h2,{id:`readrangeoutputvaluefallback`,children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})}),`
39
+ `,(0,c.jsx)(t.p,{children:`Функция читает только форму:`}),`
40
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
41
+ outputValueFallback: {
42
+ start: unknown,
43
+ end: unknown
44
+ }
45
+ }
46
+ `})}),`
47
+ `,(0,c.jsx)(t.p,{children:`Пример числового parser:`}),`
48
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function parseFiniteNumber(value: unknown): number | undefined {
49
+ const parsed = typeof value === "number" ? value : Number(value);
50
+ return Number.isFinite(parsed) ? parsed : undefined;
51
+ }
52
+
53
+ const fallback = readRangeOutputValueFallback({ outputValueFallback: { start: "1", end: "bad" } }, parseFiniteNumber);
54
+
55
+ console.log(fallback); // { start: 1 }.
56
+ `})}),`
57
+ `,(0,c.jsxs)(t.p,{children:[`Функция возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, если:`]}),`
58
+ `,(0,c.jsxs)(t.ul,{children:[`
59
+ `,(0,c.jsxs)(t.li,{children:[`верхний `,(0,c.jsx)(t.code,{children:`props`}),` не object-like record;`]}),`
60
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`outputValueFallback`}),` не object-like record;`]}),`
61
+ `,(0,c.jsxs)(t.li,{children:[`оба parser-result равны `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
62
+ `]}),`
63
+ `,(0,c.jsxs)(t.p,{children:[`Parser вызывается отдельно для `,(0,c.jsx)(t.code,{children:`start`}),` и `,(0,c.jsx)(t.code,{children:`end`}),`, в том числе когда raw field отсутствует. Он не должен иметь side effects.`]}),`
64
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`isRecord`}),` здесь допускает не только plain object, но исключает arrays/null. Runtime schema конкретного значения полностью задаёт parser.`]}),`
65
+ `,(0,c.jsx)(t.h2,{id:`resolverangeoutputvalue`,children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})}),`
66
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveRangeOutputValue([null, 6], { start: 0, end: 12 });
67
+ // [0, 6].
68
+
69
+ resolveRangeOutputValue([3, null], { start: 0, end: 12 });
70
+ // [3, 12].
71
+ `})}),`
72
+ `,(0,c.jsx)(t.p,{children:`Правила для каждой позиции:`}),`
73
+ `,(0,c.jsxs)(t.ol,{children:[`
74
+ `,(0,c.jsxs)(t.li,{children:[`Если UI endpoint не `,(0,c.jsx)(t.code,{children:`null`}),`, он возвращается буквально.`]}),`
75
+ `,(0,c.jsxs)(t.li,{children:[`Если endpoint равен `,(0,c.jsx)(t.code,{children:`null`}),`, используется соответствующий fallback.`]}),`
76
+ `,(0,c.jsxs)(t.li,{children:[`Если fallback отсутствует или равен `,(0,c.jsx)(t.code,{children:`null`}),`, output остаётся `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
77
+ `]}),`
78
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveRangeOutputValue([null, null], { end: 12 });
79
+ // [null, 12].
80
+
81
+ resolveRangeOutputValue([null, null], undefined);
82
+ // [null, null].
83
+ `})}),`
84
+ `,(0,c.jsxs)(t.p,{children:[`Всегда создаётся новый tuple. Вложенные ссылочные `,(0,c.jsx)(t.code,{children:`Date`}),` не клонируются.`]}),`
85
+ `,(0,c.jsx)(t.h2,{id:`правильная-boundary`,children:`Правильная boundary`}),`
86
+ `,(0,c.jsx)(t.p,{children:`Helper специально отделяет UI draft и внешний snapshot:`}),`
87
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draftRange: readonly [number | null, number | null] = [null, 6];
88
+
89
+ function getConfig() {
90
+ return {
91
+ range: resolveRangeOutputValue(draftRange, outputFallback)
92
+ };
93
+ }
94
+ `})}),`
95
+ `,(0,c.jsx)(t.p,{children:`Не записывайте output обратно в draft:`}),`
96
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`draft [null, 6] ───────────────► UI продолжает показывать открытую границу
97
+
98
+ └─ save boundary ───────► snapshot [0, 6]
99
+ `})}),`
100
+ `,(0,c.jsx)(t.p,{children:`Это output substitution, а не общая нормализация диапазона: порядок start/end, min/max и domain validation не проверяются.`}),`
101
+ `,(0,c.jsx)(t.h2,{id:`api-и-ошибки`,children:`API и ошибки`}),`
102
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(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:`RangeOutputValueFallback`})}),(0,c.jsx)(t.td,{children:`Optional start/end fallback`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`RangeOutputFallbackEndpointParser`})}),(0,c.jsx)(t.td,{children:`Parser одного endpoint`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})}),(0,c.jsxs)(t.td,{children:[`Parsed fallback или `,(0,c.jsx)(t.code,{children:`undefined`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})}),(0,c.jsx)(t.td,{children:`Новый output tuple`})]})]})]}),`
103
+ `,(0,c.jsx)(t.p,{children:`Типичные ошибки:`}),`
104
+ `,(0,c.jsxs)(t.ul,{children:[`
105
+ `,(0,c.jsxs)(t.li,{children:[`Считать `,(0,c.jsx)(t.code,{children:`0`}),`, `,(0,c.jsx)(t.code,{children:`false`}),` или `,(0,c.jsx)(t.code,{children:`""`}),` отсутствующими: используется nullish logic, эти значения сохраняются.`]}),`
106
+ `,(0,c.jsxs)(t.li,{children:[`Передавать `,(0,c.jsx)(t.code,{children:`undefined`}),` как UI endpoint при generic `,(0,c.jsx)(t.code,{children:`TValue`}),`, включающем undefined: заменяется только строго `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
107
+ `,(0,c.jsx)(t.li,{children:`Мутировать draft результатом output resolver.`}),`
108
+ `,(0,c.jsx)(t.li,{children:`Ожидать, что helper поменяет местами границы или проверит диапазон.`}),`
109
+ `,(0,c.jsxs)(t.li,{children:[`Делать parser через unsafe cast внешнего `,(0,c.jsx)(t.code,{children:`unknown`}),`.`]}),`
110
+ `]})]})}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,147 @@
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`,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 API/Transport/HTTP`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`обычный-http-через-ryuzaki13react-foundation-apihttp`,children:[`Обычный HTTP через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/http`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль выполняет нейтральные HTTP/REST запросы и создаёт функции, совместимые с TanStack Query. Внешний payload остаётся `,(0,c.jsx)(t.code,{children:`unknown`}),`, пока consumer явно не проверит его через `,(0,c.jsx)(t.code,{children:`parse`}),`.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
5
+ `,(0,c.jsxs)(t.ul,{children:[`
6
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C`,children:`Когда использовать`})}),`
7
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Импорт`})}),`
8
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#httpfetch`,children:(0,c.jsx)(t.code,{children:`httpFetch`})})}),`
9
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#httpfetchpayload`,children:(0,c.jsx)(t.code,{children:`httpFetchPayload`})})}),`
10
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#httpjsonqueryfn`,children:(0,c.jsx)(t.code,{children:`httpJsonQueryFn`})})}),`
11
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#httpjsonmutationfn`,children:(0,c.jsx)(t.code,{children:`httpJsonMutationFn`})})}),`
12
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#routeerror`,children:(0,c.jsx)(t.code,{children:`RouteError`})})}),`
13
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-runtime-%D0%B8-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C`,children:`Ошибки, runtime и безопасность`})}),`
14
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-api`,children:`Полный API`})}),`
15
+ `]}),`
16
+ `,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
17
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`обычный REST/HTTP ──► /http
18
+ SAP Gateway/OData ──► /odata
19
+ `})}),`
20
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`http`}),` не добавляет SAP headers, `,(0,c.jsx)(t.code,{children:`credentials: include`}),`, X-CSRF token, SSO recovery, OData V2 headers и не снимает envelope `,(0,c.jsx)(t.code,{children:`{ d: { results } }`}),`. Для SAP/OData используйте `,(0,c.jsx)(t.a,{href:`../odata/README.mdx`,children:(0,c.jsx)(t.code,{children:`/odata`})}),`.`]}),`
21
+ `,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
22
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
23
+ httpFetch,
24
+ httpFetchPayload,
25
+ httpJsonMutationFn,
26
+ httpJsonQueryFn,
27
+ RouteError
28
+ } from "@ryuzaki13/react-foundation-api/http";
29
+
30
+ import type {
31
+ HttpMutationFnOptions,
32
+ HttpQueryFnOptions,
33
+ HttpRequestOptions
34
+ } from "@ryuzaki13/react-foundation-api/http";
35
+ `})}),`
36
+ `,(0,c.jsxs)(t.p,{children:[`Нужны глобальные Web Fetch API: `,(0,c.jsx)(t.code,{children:`fetch`}),`, `,(0,c.jsx)(t.code,{children:`Request`}),`, `,(0,c.jsx)(t.code,{children:`Response`}),`, `,(0,c.jsx)(t.code,{children:`Headers`}),`, `,(0,c.jsx)(t.code,{children:`URL`}),`.`]}),`
37
+ `,(0,c.jsx)(t.h2,{id:`httpfetch`,children:(0,c.jsx)(t.code,{children:`httpFetch`})}),`
38
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const response = await httpFetch("/health", {
39
+ baseUrl: "https://api.example.com",
40
+ init: {
41
+ method: "GET",
42
+ headers: { Accept: "text/plain" }
43
+ }
44
+ });
45
+
46
+ console.log(await response.text());
47
+ `})}),`
48
+ `,(0,c.jsxs)(t.p,{children:[`Функция возвращает исходный `,(0,c.jsx)(t.code,{children:`Response`}),`, если `,(0,c.jsx)(t.code,{children:`response.ok === true`}),`. Body ещё не прочитан.`]}),`
49
+ `,(0,c.jsx)(t.p,{children:`Для string input URL строится простой конкатенацией:`}),`
50
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`baseUrl + input
51
+ `})}),`
52
+ `,(0,c.jsx)(t.p,{children:`Helper не исправляет slash:`}),`
53
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Правильно.
54
+ { baseUrl: "https://api.example.com", input: "/users" }
55
+
56
+ // Получится https://api.example.comusers — неверно.
57
+ { baseUrl: "https://api.example.com", input: "users" }
58
+ `})}),`
59
+ `,(0,c.jsxs)(t.p,{children:[`Если input является `,(0,c.jsx)(t.code,{children:`Request`}),` или `,(0,c.jsx)(t.code,{children:`URL`}),`, `,(0,c.jsx)(t.code,{children:`baseUrl`}),` игнорируется. Это не proxy/url resolver.`]}),`
60
+ `,(0,c.jsx)(t.h2,{id:`httpfetchpayload`,children:(0,c.jsx)(t.code,{children:`httpFetchPayload`})}),`
61
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const payload: unknown = await httpFetchPayload("/api/profile");
62
+ `})}),`
63
+ `,(0,c.jsx)(t.p,{children:`Правила parser-а:`}),`
64
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Response`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`status `,(0,c.jsx)(t.code,{children:`204`}),` или `,(0,c.jsx)(t.code,{children:`205`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`Content-Type`}),` содержит `,(0,c.jsx)(t.code,{children:`application/json`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`response.json()`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`любой другой content type`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`response.text()`})})]})]})]}),`
65
+ `,(0,c.jsxs)(t.p,{children:[`Результат намеренно `,(0,c.jsx)(t.code,{children:`unknown`}),`. Generic type не может проверить данные, пришедшие по сети:`]}),`
66
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function parseProfile(value: unknown): Profile {
67
+ if (!isProfile(value)) throw new Error("Некорректный Profile payload");
68
+ return value;
69
+ }
70
+
71
+ const profile = parseProfile(await httpFetchPayload("/api/profile"));
72
+ `})}),`
73
+ `,(0,c.jsxs)(t.p,{children:[`Если сервер отдаёт JSON без корректного `,(0,c.jsx)(t.code,{children:`Content-Type`}),`, модуль вернёт JSON как string. Исправьте backend или разберите string на своей boundary.`]}),`
74
+ `,(0,c.jsx)(t.h2,{id:`httpjsonqueryfn`,children:(0,c.jsx)(t.code,{children:`httpJsonQueryFn`})}),`
75
+ `,(0,c.jsxs)(t.p,{children:[`Factory возвращает async-функцию с формой TanStack Query `,(0,c.jsx)(t.code,{children:`queryFn`}),`:`]}),`
76
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const loadProfile = httpJsonQueryFn("/api/profile", {
77
+ baseUrl: "https://api.example.com",
78
+ parse: parseProfile,
79
+ swCache: "ttl=10m;name=profile"
80
+ });
81
+
82
+ const profile = await loadProfile({ signal });
83
+ `})}),`
84
+ `,(0,c.jsx)(t.p,{children:`С React Query:`}),`
85
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const profileQuery = useQuery({
86
+ queryKey: ["profile", userId],
87
+ queryFn: httpJsonQueryFn(\`/api/users/\${userId}\`, {
88
+ parse: parseProfile
89
+ })
90
+ });
91
+ `})}),`
92
+ `,(0,c.jsx)(t.p,{children:`Factory:`}),`
93
+ `,(0,c.jsxs)(t.ul,{children:[`
94
+ `,(0,c.jsxs)(t.li,{children:[`использует `,(0,c.jsx)(t.code,{children:`init.signal`}),`, если он задан явно;`]}),`
95
+ `,(0,c.jsx)(t.li,{children:`иначе подставляет signal, переданный TanStack Query;`}),`
96
+ `,(0,c.jsxs)(t.li,{children:[`добавляет `,(0,c.jsx)(t.code,{children:`x-sw-cache`}),`, только если `,(0,c.jsx)(t.code,{children:`swCache`}),` truthy;`]}),`
97
+ `,(0,c.jsxs)(t.li,{children:[`вызывает обязательный `,(0,c.jsx)(t.code,{children:`parse(payload)`}),` после успешного запроса.`]}),`
98
+ `]}),`
99
+ `,(0,c.jsxs)(t.p,{children:[`Header `,(0,c.jsx)(t.code,{children:`x-sw-cache`}),` — только protocol с Service Worker. Без соответствующего SW он не создаёт cache.`]}),`
100
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`parse`}),` может вернуть преобразованную domain model, но обычно лучше ограничиться runtime validation и вынести бизнес-mapping владельцу entity.`]}),`
101
+ `,(0,c.jsx)(t.h2,{id:`httpjsonmutationfn`,children:(0,c.jsx)(t.code,{children:`httpJsonMutationFn`})}),`
102
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type CreateUserInput = { name: string };
103
+
104
+ const createUser = httpJsonMutationFn<CreateUserInput, User>("/api/users", {
105
+ method: "POST",
106
+ mapBody: (input) => ({ displayName: input.name }),
107
+ parse: parseUser
108
+ });
109
+
110
+ const user = await createUser({ name: "Анна" });
111
+ `})}),`
112
+ `,(0,c.jsxs)(t.p,{children:[`С `,(0,c.jsx)(t.code,{children:`useMutation`}),`:`]}),`
113
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const mutation = useMutation({ mutationFn: createUser });
114
+ mutation.mutate({ name: "Анна" });
115
+ `})}),`
116
+ `,(0,c.jsx)(t.p,{children:`Поведение:`}),`
117
+ `,(0,c.jsxs)(t.ol,{children:[`
118
+ `,(0,c.jsxs)(t.li,{children:[`Вычисляет body через `,(0,c.jsx)(t.code,{children:`mapBody(input)`}),` или использует input.`]}),`
119
+ `,(0,c.jsxs)(t.li,{children:[`Сериализует body через `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),`.`]}),`
120
+ `,(0,c.jsxs)(t.li,{children:[`Использует method `,(0,c.jsx)(t.code,{children:`POST`}),` по умолчанию; поддерживаются `,(0,c.jsx)(t.code,{children:`POST`}),`, `,(0,c.jsx)(t.code,{children:`PUT`}),`, `,(0,c.jsx)(t.code,{children:`PATCH`}),`, `,(0,c.jsx)(t.code,{children:`DELETE`}),`.`]}),`
121
+ `,(0,c.jsxs)(t.li,{children:[`Добавляет `,(0,c.jsx)(t.code,{children:`Content-Type: application/json`}),`, только если header ещё не задан.`]}),`
122
+ `,(0,c.jsxs)(t.li,{children:[`Выполняет запрос и передаёт payload в обязательный `,(0,c.jsx)(t.code,{children:`parse`}),`.`]}),`
123
+ `]}),`
124
+ `,(0,c.jsxs)(t.p,{children:[`Сигнатура mutation function также допускает второй `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` при ручном вызове. Стандартный `,(0,c.jsx)(t.code,{children:`useMutation`}),` TanStack Query не передаёт signal автоматически. Если `,(0,c.jsx)(t.code,{children:`options.init.signal`}),` уже задан, второй signal не заменит его.`]}),`
125
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`JSON.stringify`}),` может бросить ошибку для `,(0,c.jsx)(t.code,{children:`BigInt`}),`/циклического объекта. `,(0,c.jsx)(t.code,{children:`undefined`}),` body сериализуется в `,(0,c.jsx)(t.code,{children:`undefined`}),`; убедитесь, что это соответствует endpoint.`]}),`
126
+ `,(0,c.jsx)(t.h2,{id:`http-errors`,children:`HTTP errors`}),`
127
+ `,(0,c.jsxs)(t.p,{children:[`Для `,(0,c.jsx)(t.code,{children:`response.ok === false`}),` обе низкоуровневые функции бросают обычный `,(0,c.jsx)(t.code,{children:`Error`}),`:`]}),`
128
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`HTTP error: <message>
129
+ `})}),`
130
+ `,(0,c.jsxs)(t.p,{children:[`Если error body — непустой text, он становится message. Для JSON error object поля `,(0,c.jsx)(t.code,{children:`message`}),`, `,(0,c.jsx)(t.code,{children:`error`}),` и `,(0,c.jsx)(t.code,{children:`details`}),` не извлекаются; fallback — `,(0,c.jsx)(t.code,{children:`<status> <statusText>`}),`.`]}),`
131
+ `,(0,c.jsxs)(t.p,{children:[`Network error/CORS/abort от глобального `,(0,c.jsx)(t.code,{children:`fetch`}),` пробрасывается без обёртки.`]}),`
132
+ `,(0,c.jsx)(t.h2,{id:`routeerror`,children:(0,c.jsx)(t.code,{children:`RouteError`})}),`
133
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`throw new RouteError(404);
134
+ `})}),`
135
+ `,(0,c.jsxs)(t.p,{children:[`Это маленький `,(0,c.jsx)(t.code,{children:`Error`}),` с числовым полем `,(0,c.jsx)(t.code,{children:`status`}),` и пустым message. `,(0,c.jsx)(t.code,{children:`httpFetch`}),` сам его не создаёт. Класс нужен для routing/error-boundary policy приложения, если оно договорилось понимать такой error.`]}),`
136
+ `,(0,c.jsx)(t.h2,{id:`ошибки-runtime-и-безопасность`,children:`Ошибки, runtime и безопасность`}),`
137
+ `,(0,c.jsxs)(t.ul,{children:[`
138
+ `,(0,c.jsxs)(t.li,{children:[`TypeScript generic не валидирует сеть; используйте `,(0,c.jsx)(t.code,{children:`parse`}),`/schema guard.`]}),`
139
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`baseUrl`}),` и path не нормализуются и не кодируются.`]}),`
140
+ `,(0,c.jsxs)(t.li,{children:[`Authorization, cookies, CORS и retry задаёт consumer через `,(0,c.jsx)(t.code,{children:`init`}),` или внешний слой.`]}),`
141
+ `,(0,c.jsxs)(t.li,{children:[`Модуль не делает timeout. Для него используйте `,(0,c.jsx)(t.code,{children:`AbortController`}),`.`]}),`
142
+ `,(0,c.jsx)(t.li,{children:`Не помещайте token/secret в query string и cache key.`}),`
143
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`x-sw-cache`}),` для персональных данных требует изолированной cache policy.`]}),`
144
+ `,(0,c.jsx)(t.li,{children:`На SSR абсолютный/относительный URL и cookies должны быть настроены server runtime-ом.`}),`
145
+ `]}),`
146
+ `,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
147
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(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:`httpFetch`})}),(0,c.jsxs)(t.td,{children:[`Успешный `,(0,c.jsx)(t.code,{children:`Response`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`httpFetchPayload`})}),(0,c.jsxs)(t.td,{children:[`JSON/text/`,(0,c.jsx)(t.code,{children:`null`}),` как `,(0,c.jsx)(t.code,{children:`unknown`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`httpJsonQueryFn`})}),(0,c.jsx)(t.td,{children:`Query-compatible async function`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`httpJsonMutationFn`})}),(0,c.jsx)(t.td,{children:`Mutation-compatible async function`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`RouteError`})}),(0,c.jsxs)(t.td,{children:[`Error с `,(0,c.jsx)(t.code,{children:`status`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`HttpRequestOptions`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`baseUrl`}),` и `,(0,c.jsx)(t.code,{children:`init`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`HttpQueryFnOptions`})}),(0,c.jsxs)(t.td,{children:[`Request options + `,(0,c.jsx)(t.code,{children:`swCache`}),` + `,(0,c.jsx)(t.code,{children:`parse`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`HttpMutationFnOptions`})}),(0,c.jsx)(t.td,{children:`Request options + method/body mapper/parse`})]})]})]})]})}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,296 @@
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`,ol:`ol`,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/Data/Excel`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`excel`,children:`Excel`}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/excel`}),` формирует и скачивает `,(0,c.jsx)(t.code,{children:`.xlsx`}),`-файлы в браузере. Он поддерживает:`]}),`
4
+ `,(0,c.jsxs)(t.ul,{children:[`
5
+ `,(0,c.jsx)(t.li,{children:`одну или несколько таблиц-листов;`}),`
6
+ `,(0,c.jsxs)(t.li,{children:[`типизированные ячейки `,(0,c.jsx)(t.code,{children:`String`}),`, `,(0,c.jsx)(t.code,{children:`Number`}),`, `,(0,c.jsx)(t.code,{children:`Date`}),`, `,(0,c.jsx)(t.code,{children:`Boolean`}),`;`]}),`
7
+ `,(0,c.jsx)(t.li,{children:`Excel number/date formats;`}),`
8
+ `,(0,c.jsx)(t.li,{children:`ширину колонок;`}),`
9
+ `,(0,c.jsx)(t.li,{children:`стили отдельных ячеек;`}),`
10
+ `,(0,c.jsx)(t.li,{children:`auto-filter;`}),`
11
+ `,(0,c.jsx)(t.li,{children:`адаптацию OData/table-описаний к Excel.`}),`
12
+ `]}),`
13
+ `,(0,c.jsxs)(t.p,{children:[`Модуль строится поверх `,(0,c.jsx)(t.code,{children:`write-excel-file/browser`}),` и не предназначен для Node.js/SSR-скачивания.`]}),`
14
+ `,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
15
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib write-excel-file
16
+ `})}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Версия `,(0,c.jsx)(t.code,{children:`write-excel-file`}),` должна соответствовать peer dependency пакета.`]}),`
18
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
19
+ buildExcelSheetData,
20
+ downloadExcelFile,
21
+ downloadExcelWorkbook,
22
+ type ExcelColumn,
23
+ type ExcelRow
24
+ } from "@ryuzaki13/react-foundation-lib/excel";
25
+ `})}),`
26
+ `,(0,c.jsx)(t.h2,{id:`самый-простой-экспорт`,children:`Самый простой экспорт`}),`
27
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadExcelFile({
28
+ fileName: "orders.xlsx",
29
+ columns: [
30
+ { id: "ID", header: "Номер", type: String, width: 18 },
31
+ {
32
+ id: "AMOUNT",
33
+ header: "Сумма",
34
+ type: Number,
35
+ format: "#,##0.00",
36
+ width: 14
37
+ },
38
+ {
39
+ id: "CREATED_AT",
40
+ header: "Создан",
41
+ type: Date,
42
+ format: "dd.mm.yyyy hh:mm",
43
+ width: 20
44
+ }
45
+ ],
46
+ rows: [
47
+ {
48
+ ID: "A-100",
49
+ AMOUNT: 1250.5,
50
+ CREATED_AT: "2026-08-21T09:30:00+05:00"
51
+ }
52
+ ],
53
+ autoFilter: true
54
+ });
55
+ `})}),`
56
+ `,(0,c.jsxs)(t.p,{children:[`Браузер скачает книгу с единственным листом `,(0,c.jsx)(t.code,{children:`Sheet1`}),`.`]}),`
57
+ `,(0,c.jsx)(t.h2,{id:`базовая-модель`,children:`Базовая модель`}),`
58
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ExcelColumn = {
59
+ id: string;
60
+ header: string;
61
+ width?: number;
62
+ type?: StringConstructor | NumberConstructor | DateConstructor | BooleanConstructor;
63
+ format?: string;
64
+ };
65
+
66
+ type ExcelRow = Record<string, unknown>;
67
+ `})}),`
68
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`column.id`}),` — ключ, по которому значение читается из строки. Если в row такого ключа нет, ячейка будет пустой.`]}),`
69
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`header`}),` попадает в первую строку. Заголовок автоматически получает жирный шрифт и тонкую серую нижнюю границу.`]}),`
70
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`width`}),` передаётся writer как ширина Excel-колонки. Единица соответствует API `,(0,c.jsx)(t.code,{children:`write-excel-file`}),`, а не CSS-пикселям.`]}),`
71
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`format`}),` — маска Excel, например `,(0,c.jsx)(t.code,{children:`#,##0.00`}),`, `,(0,c.jsx)(t.code,{children:`dd.mm.yyyy`}),`, `,(0,c.jsx)(t.code,{children:`hh:mm:ss`}),`. Это не `,(0,c.jsx)(t.code,{children:`Intl`}),`-формат и не строковый formatter: Excel применяет маску к настоящему числу или дате.`]}),`
72
+ `,(0,c.jsx)(t.h2,{id:`почему-тип-ячейки-важен`,children:`Почему тип ячейки важен`}),`
73
+ `,(0,c.jsx)(t.p,{children:`Неправильно передавать заранее отформатированную сумму:`}),`
74
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
75
+ AMOUNT: "1 250,50 ₽";
76
+ }
77
+ `})}),`
78
+ `,(0,c.jsx)(t.p,{children:`Excel увидит текст и не сможет корректно суммировать, сортировать и применять числовую маску.`}),`
79
+ `,(0,c.jsx)(t.p,{children:`Правильно:`}),`
80
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`columns: [{ id: "AMOUNT", header: "Сумма", type: Number, format: "#,##0.00" }],
81
+ rows: [{ AMOUNT: 1250.5 }],
82
+ `})}),`
83
+ `,(0,c.jsx)(t.h2,{id:`нормализация-значений`,children:`Нормализация значений`}),`
84
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildExcelSheetData`}),` приводит данные согласно `,(0,c.jsx)(t.code,{children:`column.type`}),`.`]}),`
85
+ `,(0,c.jsx)(t.h3,{id:`пустые-значения`,children:`Пустые значения`}),`
86
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`null`}),`, `,(0,c.jsx)(t.code,{children:`undefined`}),` и пустая строка `,(0,c.jsx)(t.code,{children:`""`}),` становятся пустой ячейкой. Строка из пробелов не считается пустой.`]}),`
87
+ `,(0,c.jsx)(t.h3,{id:`number`,children:(0,c.jsx)(t.code,{children:`Number`})}),`
88
+ `,(0,c.jsxs)(t.p,{children:[`Число сохраняется как есть. Другое значение проходит через `,(0,c.jsx)(t.code,{children:`Number(value)`}),` и принимается только при конечном результате.`]}),`
89
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`"125.5"; // 125.5
90
+ ""; // пустая ячейка
91
+ "not a number"; // пустая ячейка
92
+ Infinity; // пустая ячейка
93
+ `})}),`
94
+ `,(0,c.jsxs)(t.p,{children:[`Учитывайте стандартные правила JavaScript: строки `,(0,c.jsx)(t.code,{children:`"0x10"`}),` и `,(0,c.jsx)(t.code,{children:`"1e2"`}),` преобразуются в `,(0,c.jsx)(t.code,{children:`16`}),` и `,(0,c.jsx)(t.code,{children:`100`}),`.`]}),`
95
+ `,(0,c.jsx)(t.h3,{id:`string`,children:(0,c.jsx)(t.code,{children:`String`})}),`
96
+ `,(0,c.jsxs)(t.p,{children:[`Используется `,(0,c.jsx)(t.code,{children:`String(value)`}),`. Объект без собственного осмысленного `,(0,c.jsx)(t.code,{children:`toString`}),` станет строкой `,(0,c.jsx)(t.code,{children:`"[object Object]"`}),`, поэтому сложные данные подготавливайте заранее.`]}),`
97
+ `,(0,c.jsx)(t.h3,{id:`boolean`,children:(0,c.jsx)(t.code,{children:`Boolean`})}),`
98
+ `,(0,c.jsxs)(t.p,{children:[`Используется `,(0,c.jsx)(t.code,{children:`Boolean(value)`}),`. Непустая строка `,(0,c.jsx)(t.code,{children:`"false"`}),` является `,(0,c.jsx)(t.code,{children:`true`}),`. Если backend присылает строковые флаги, сначала преобразуйте их в реальный boolean.`]}),`
99
+ `,(0,c.jsx)(t.h3,{id:`date`,children:(0,c.jsx)(t.code,{children:`Date`})}),`
100
+ `,(0,c.jsxs)(t.p,{children:[`Готовый `,(0,c.jsx)(t.code,{children:`Date`}),` используется напрямую. Остальное разбирается общим `,(0,c.jsx)(t.code,{children:`parseDate`}),` из formatters. Нераспознанное значение становится пустым.`]}),`
101
+ `,(0,c.jsx)(t.p,{children:`Для предсказуемого времени используйте ISO/OData-формат с явной временной зоной. Excel хранит дату как значение, а отображение дополнительно зависит от format и настроек программы пользователя.`}),`
102
+ `,(0,c.jsxs)(t.h3,{id:`без-type`,children:[`Без `,(0,c.jsx)(t.code,{children:`type`})]}),`
103
+ `,(0,c.jsxs)(t.p,{children:[`Значение передаётся writer почти без преобразования. Этот режим требует, чтобы вызывающий код уже подготовил тип, поддерживаемый `,(0,c.jsx)(t.code,{children:`write-excel-file`}),`.`]}),`
104
+ `,(0,c.jsx)(t.h2,{id:`buildexcelsheetdataargs`,children:(0,c.jsx)(t.code,{children:`buildExcelSheetData(args)`})}),`
105
+ `,(0,c.jsxs)(t.p,{children:[`Создаёт `,(0,c.jsx)(t.code,{children:`SheetData`}),` без скачивания файла. Полезно для тестов и собственного вызова writer.`]}),`
106
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const data = buildExcelSheetData({
107
+ columns,
108
+ rows,
109
+ getCellStyle: ({ row, column, rowIndex, columnIndex }) => {
110
+ if (column.id === "AMOUNT" && Number(row.AMOUNT) < 0) {
111
+ return { textColor: "#C50F1F", fontWeight: "bold" };
112
+ }
113
+
114
+ return undefined;
115
+ }
116
+ });
117
+ `})}),`
118
+ `,(0,c.jsxs)(t.p,{children:[`Первая строка результата — header, затем строки данных. `,(0,c.jsx)(t.code,{children:`rowIndex`}),` и `,(0,c.jsx)(t.code,{children:`columnIndex`}),` в callback начинаются с нуля `,(0,c.jsx)(t.strong,{children:`для данных`}),`, не включая header.`]}),`
119
+ `,(0,c.jsxs)(t.p,{children:[`Стиль объединяется после `,(0,c.jsx)(t.code,{children:`value`}),`, `,(0,c.jsx)(t.code,{children:`type`}),` и `,(0,c.jsx)(t.code,{children:`format`}),`. Тип `,(0,c.jsx)(t.code,{children:`ExcelCellStyle`}),` специально исключает эти три поля, поэтому callback предназначен только для визуальных параметров writer.`]}),`
120
+ `,(0,c.jsx)(t.h2,{id:`стили-по-value-state`,children:`Стили по value state`}),`
121
+ `,(0,c.jsx)(t.h3,{id:`resolveexcelcellstylefromstatestate`,children:(0,c.jsx)(t.code,{children:`resolveExcelCellStyleFromState(state)`})}),`
122
+ `,(0,c.jsxs)(t.p,{children:[`Преобразует общий `,(0,c.jsx)(t.code,{children:`State`}),` в цвет текста:`]}),`
123
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`State`}),(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:`information`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#2563EB`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`success`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#107C10`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`warning`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#B7791F`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`error`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#C50F1F`})})]})]})]}),`
124
+ `,(0,c.jsxs)(t.p,{children:[`Для `,(0,c.jsx)(t.code,{children:`none`}),`, пустой строки и `,(0,c.jsx)(t.code,{children:`undefined`}),` возвращается `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
125
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getCellStyle: ({ row }) =>
126
+ resolveExcelCellStyleFromState(row.STATE as State),
127
+ `})}),`
128
+ `,(0,c.jsxs)(t.p,{children:[`Helper задаёт только `,(0,c.jsx)(t.code,{children:`textColor`}),`. При необходимости объедините результат со своим стилем.`]}),`
129
+ `,(0,c.jsx)(t.h2,{id:`auto-filter`,children:`Auto-filter`}),`
130
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`autoFilter: true;
131
+ `})}),`
132
+ `,(0,c.jsx)(t.p,{children:`Фильтр охватывает header и все строки данных. Он добавляется через низкоуровневую OpenXML transform-feature, потому что используемый writer не предоставляет отдельной высокоуровневой опции.`}),`
133
+ `,(0,c.jsx)(t.h3,{id:`buildexcelautofilterrefcolumncount-rowcount`,children:(0,c.jsx)(t.code,{children:`buildExcelAutoFilterRef(columnCount, rowCount)`})}),`
134
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`buildExcelAutoFilterRef(1, 2); // "A1:A2"
135
+ buildExcelAutoFilterRef(28, 10); // "A1:AB10"
136
+ buildExcelAutoFilterRef(0, 10); // undefined
137
+ `})}),`
138
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`rowCount`}),` должен включать строку header. `,(0,c.jsx)(t.code,{children:`downloadExcelFile`}),` и workbook API вычисляют его автоматически.`]}),`
139
+ `,(0,c.jsx)(t.h2,{id:`несколько-листов`,children:`Несколько листов`}),`
140
+ `,(0,c.jsx)(t.h3,{id:`downloadexcelworkbookargs`,children:(0,c.jsx)(t.code,{children:`downloadExcelWorkbook(args)`})}),`
141
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadExcelWorkbook({
142
+ fileName: "report.xlsx",
143
+ sheets: [
144
+ {
145
+ name: "Заказы",
146
+ columns: orderColumns,
147
+ rows: orders,
148
+ autoFilter: true
149
+ },
150
+ {
151
+ name: "Справочник статусов",
152
+ columns: statusColumns,
153
+ rows: statuses,
154
+ autoFilter: false
155
+ }
156
+ ]
157
+ });
158
+ `})}),`
159
+ `,(0,c.jsx)(t.p,{children:`Каждый лист имеет собственные колонки, ширины, строки, стили и filter. Порядок массива — порядок вкладок Excel.`}),`
160
+ `,(0,c.jsxs)(t.p,{children:[`Пустой массив `,(0,c.jsx)(t.code,{children:`sheets`}),` приводит к ошибке: «Для формирования Excel-книги нужен минимум один лист».`]}),`
161
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fileName`}),` передаётся browser writer. Рекомендуется явно добавлять расширение `,(0,c.jsx)(t.code,{children:`.xlsx`}),` и заранее очищать пользовательский ввод от нежелательных символов имени файла.`]}),`
162
+ `,(0,c.jsx)(t.h2,{id:`имена-листов`,children:`Имена листов`}),`
163
+ `,(0,c.jsx)(t.h3,{id:`resolveexcelsheetnamesnames`,children:(0,c.jsx)(t.code,{children:`resolveExcelSheetNames(names)`})}),`
164
+ `,(0,c.jsxs)(t.p,{children:[`Excel ограничивает имя листа 31 символом и запрещает управляющие символы, `,(0,c.jsx)(t.code,{children:`[ ] / \\ : * ?`}),`. Helper:`]}),`
165
+ `,(0,c.jsxs)(t.ul,{children:[`
166
+ `,(0,c.jsx)(t.li,{children:`заменяет запрещённые группы пробелом;`}),`
167
+ `,(0,c.jsx)(t.li,{children:`схлопывает пробелы;`}),`
168
+ `,(0,c.jsx)(t.li,{children:`удаляет апострофы по краям;`}),`
169
+ `,(0,c.jsxs)(t.li,{children:[`использует `,(0,c.jsx)(t.code,{children:`Лист N`}),` для пустого результата;`]}),`
170
+ `,(0,c.jsx)(t.li,{children:`обрезает до 31 символа;`}),`
171
+ `,(0,c.jsxs)(t.li,{children:[`делает имена уникальными без учёта регистра через суффиксы `,(0,c.jsx)(t.code,{children:` (2)`}),`, `,(0,c.jsx)(t.code,{children:` (3)`}),`.`]}),`
172
+ `]}),`
173
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveExcelSheetNames(["Продажи/Россия", "продажи россия", ""]);
174
+
175
+ // ["Продажи Россия", "продажи россия (2)", "Лист 3"]
176
+ `})}),`
177
+ `,(0,c.jsx)(t.p,{children:`Функция возвращает новый массив и не меняет входные строки.`}),`
178
+ `,(0,c.jsx)(t.h2,{id:`tableodata-адаптер`,children:`Table/OData-адаптер`}),`
179
+ `,(0,c.jsxs)(t.p,{children:[`Вторая часть модуля помогает экспортировать таблицу, описание колонок которой использует `,(0,c.jsx)(t.code,{children:`ColumnRole`}),`, `,(0,c.jsx)(t.code,{children:`ODataMetaType`}),` и formatter pipeline.`]}),`
180
+ `,(0,c.jsx)(t.h3,{id:`tableexcelcolumndescriptor`,children:(0,c.jsx)(t.code,{children:`TableExcelColumnDescriptor`})}),`
181
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type TableExcelColumnDescriptor = {
182
+ id: string;
183
+ header: string;
184
+ width?: number;
185
+ role?: ColumnRole;
186
+ odataType?: ODataMetaType;
187
+ clientOnly?: boolean;
188
+ formattersPipeline?: FormattersPipelineConfig;
189
+ };
190
+ `})}),`
191
+ `,(0,c.jsx)(t.h3,{id:`resolvetableexcelcolumntypedescriptor`,children:(0,c.jsx)(t.code,{children:`resolveTableExcelColumnType(descriptor)`})}),`
192
+ `,(0,c.jsx)(t.p,{children:`Тип определяется в следующем порядке:`}),`
193
+ `,(0,c.jsxs)(t.ol,{children:[`
194
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`clientOnly: true`}),` → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
195
+ `,(0,c.jsxs)(t.li,{children:[`OData date/time type → `,(0,c.jsx)(t.code,{children:`Date`}),`;`]}),`
196
+ `,(0,c.jsxs)(t.li,{children:[`OData boolean type → `,(0,c.jsx)(t.code,{children:`Boolean`}),`;`]}),`
197
+ `,(0,c.jsxs)(t.li,{children:[`OData numeric type → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
198
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`role: "measure"`}),` → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
199
+ `,(0,c.jsxs)(t.li,{children:[`иначе → `,(0,c.jsx)(t.code,{children:`String`}),`.`]}),`
200
+ `]}),`
201
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`clientOnly`}),` здесь предполагает вычисляемую числовую колонку. Если приложение создаёт client-only текст, generic descriptor не сможет вывести его автоматически — сформируйте `,(0,c.jsx)(t.code,{children:`ExcelColumn`}),` вручную.`]}),`
202
+ `,(0,c.jsx)(t.h3,{id:`createtableexcelcolumndescriptor`,children:(0,c.jsx)(t.code,{children:`createTableExcelColumn(descriptor)`})}),`
203
+ `,(0,c.jsxs)(t.p,{children:[`Создаёт `,(0,c.jsx)(t.code,{children:`ExcelColumn`}),`, включая тип и format.`]}),`
204
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const column = createTableExcelColumn({
205
+ id: "NET_AMOUNT",
206
+ header: "Сумма",
207
+ odataType: "decimal",
208
+ role: "measure",
209
+ width: 16,
210
+ formattersPipeline: {
211
+ steps: [
212
+ {
213
+ type: "typedValueFormat",
214
+ config: { numberPresetName: "currency" }
215
+ }
216
+ ]
217
+ }
218
+ });
219
+ `})}),`
220
+ `,(0,c.jsxs)(t.p,{children:[`Точная структура pipeline описана в документации `,(0,c.jsx)(t.code,{children:`/formatters`}),`. Excel использует первый валидированный step `,(0,c.jsx)(t.code,{children:`typedValueFormat`}),`.`]}),`
221
+ `,(0,c.jsx)(t.h3,{id:`числовые-форматы-из-presets`,children:`Числовые форматы из presets`}),`
222
+ `,(0,c.jsxs)(t.p,{children:[`Если pipeline содержит существующий `,(0,c.jsx)(t.code,{children:`numberPresetName`}),`, число получает столько десятичных нулей, сколько указано в preset:`]}),`
223
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`decimals = 0 → #,##0
224
+ decimals = 2 → #,##0.00
225
+ `})}),`
226
+ `,(0,c.jsxs)(t.p,{children:[`Для OData integer по умолчанию выбирается preset `,(0,c.jsx)(t.code,{children:`integer`}),`, для других чисел — `,(0,c.jsx)(t.code,{children:`decimal`}),`. Неизвестное имя preset игнорируется и заменяется подходящим default.`]}),`
227
+ `,(0,c.jsx)(t.h3,{id:`форматы-дат-из-presets`,children:`Форматы дат из presets`}),`
228
+ `,(0,c.jsx)(t.p,{children:`По умолчанию:`}),`
229
+ `,(0,c.jsxs)(t.ul,{children:[`
230
+ `,(0,c.jsxs)(t.li,{children:[`OData `,(0,c.jsx)(t.code,{children:`time`}),` → time preset;`]}),`
231
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`datetime`}),`/`,(0,c.jsx)(t.code,{children:`datetimeOffset`}),` → datetime preset;`]}),`
232
+ `,(0,c.jsx)(t.li,{children:`остальные date types → date preset.`}),`
233
+ `]}),`
234
+ `,(0,c.jsxs)(t.p,{children:[`Встроенные presets переводятся в Excel-маски, включая варианты `,(0,c.jsx)(t.code,{children:`dd.mm`}),`, `,(0,c.jsx)(t.code,{children:`d mmm`}),`, `,(0,c.jsx)(t.code,{children:`mmm yyyy`}),`, `,(0,c.jsx)(t.code,{children:`hh:mm`}),` и форматы с секундами.`]}),`
235
+ `,(0,c.jsxs)(t.p,{children:[`Для пользовательского date pattern токены нормализуются для Excel: `,(0,c.jsx)(t.code,{children:`H`}),` заменяется на `,(0,c.jsx)(t.code,{children:`h`}),`, `,(0,c.jsx)(t.code,{children:`M`}),` — на `,(0,c.jsx)(t.code,{children:`m`}),`. Если `,(0,c.jsx)(t.code,{children:`datePresetName`}),` не найден в registry, он исторически трактуется как ручной pattern.`]}),`
236
+ `,(0,c.jsx)(t.p,{children:`Форматы даты в JavaScript formatter и Excel не полностью взаимозаменяемы. Всегда проверяйте пользовательские patterns в реальном Excel/LibreOffice.`}),`
237
+ `,(0,c.jsx)(t.h2,{id:`подготовленная-таблица`,children:`Подготовленная таблица`}),`
238
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ResolvedExcelTable = {
239
+ columns: ExcelColumn[];
240
+ rows: ExcelRow[];
241
+ cellStyles?: ReadonlyArray<Readonly<Record<string, ExcelCellStyle | undefined>>>;
242
+ };
243
+ `})}),`
244
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`cellStyles[rowIndex][columnId]`}),` задаёт стиль конкретной ячейки. Индекс соответствует массиву `,(0,c.jsx)(t.code,{children:`rows`}),`.`]}),`
245
+ `,(0,c.jsx)(t.h3,{id:`downloadresolvedexceltableargs`,children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelTable(args)`})}),`
246
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadResolvedExcelTable({
247
+ fileName: "table.xlsx",
248
+ table: {
249
+ columns,
250
+ rows,
251
+ cellStyles: [{ AMOUNT: { textColor: "#107C10" } }, { AMOUNT: { textColor: "#C50F1F" } }]
252
+ }
253
+ });
254
+ `})}),`
255
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`autoFilter`}),` по умолчанию `,(0,c.jsx)(t.code,{children:`true`}),`.`]}),`
256
+ `,(0,c.jsx)(t.h3,{id:`downloadresolvedexcelworkbookargs`,children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelWorkbook(args)`})}),`
257
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadResolvedExcelWorkbook({
258
+ fileName: "analytics.xlsx",
259
+ sheets: [
260
+ { name: "План", table: planTable },
261
+ { name: "Факт", table: factTable, autoFilter: false }
262
+ ]
263
+ });
264
+ `})}),`
265
+ `,(0,c.jsx)(t.p,{children:`Для каждого resolved sheet auto-filter тоже включён по умолчанию.`}),`
266
+ `,(0,c.jsx)(t.h2,{id:`browser-boundary-и-обработка-ошибок`,children:`Browser boundary и обработка ошибок`}),`
267
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`downloadExcelFile`}),`, `,(0,c.jsx)(t.code,{children:`downloadExcelWorkbook`}),` и resolved download-функции используют browser bundle writer и инициируют сохранение файла. Вызывайте их из пользовательского действия в клиентском коде.`]}),`
268
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function onExportClick() {
269
+ setExporting(true);
270
+
271
+ try {
272
+ await downloadExcelFile(args);
273
+ } catch (error) {
274
+ showExportError(error);
275
+ } finally {
276
+ setExporting(false);
277
+ }
278
+ }
279
+ `})}),`
280
+ `,(0,c.jsxs)(t.p,{children:[`Promise завершается после `,(0,c.jsx)(t.code,{children:`toFile`}),`. Ошибки writer, нехватка памяти и запрет скачивания браузером не подавляются.`]}),`
281
+ `,(0,c.jsx)(t.p,{children:`Для больших таблиц построение всей книги происходит в памяти главного потока и может временно заблокировать UI. Модуль не реализует streaming, worker и серверную генерацию.`}),`
282
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
283
+ `,(0,c.jsx)(t.h3,{id:`передавать-display-строки-вместо-typed-values`,children:`Передавать display-строки вместо typed values`}),`
284
+ `,(0,c.jsxs)(t.p,{children:[`Excel теряет возможность вычислять и сортировать данные. Передавайте настоящие `,(0,c.jsx)(t.code,{children:`number`}),`, `,(0,c.jsx)(t.code,{children:`boolean`}),` и `,(0,c.jsx)(t.code,{children:`Date`}),`.`]}),`
285
+ `,(0,c.jsxs)(t.h3,{id:`ожидать-javascript-формат-в-поле-format`,children:[`Ожидать JavaScript-формат в поле `,(0,c.jsx)(t.code,{children:`format`})]}),`
286
+ `,(0,c.jsxs)(t.p,{children:[`Это маска Excel. `,(0,c.jsx)(t.code,{children:`Intl.DateTimeFormat`}),` options и formatter preset напрямую туда не подходят.`]}),`
287
+ `,(0,c.jsxs)(t.h3,{id:`экспортировать-false-как-boolean`,children:[`Экспортировать `,(0,c.jsx)(t.code,{children:`"false"`}),` как Boolean`]}),`
288
+ `,(0,c.jsxs)(t.p,{children:[`Непустая строка истинна. Нормализуйте transport-значение до `,(0,c.jsx)(t.code,{children:`false`}),`.`]}),`
289
+ `,(0,c.jsx)(t.h3,{id:`использовать-api-на-сервере`,children:`Использовать API на сервере`}),`
290
+ `,(0,c.jsxs)(t.p,{children:[`Импорт идёт из `,(0,c.jsx)(t.code,{children:`write-excel-file/browser`}),`. Для server-side Excel нужен другой owner/адаптер.`]}),`
291
+ `,(0,c.jsx)(t.h3,{id:`передавать-пустой-workbook`,children:`Передавать пустой workbook`}),`
292
+ `,(0,c.jsx)(t.p,{children:`Многолистовая книга требует минимум один sheet. Пустой лист с header допустим, если есть columns.`}),`
293
+ `,(0,c.jsx)(t.h3,{id:`полагаться-на-исходные-имена-листов`,children:`Полагаться на исходные имена листов`}),`
294
+ `,(0,c.jsxs)(t.p,{children:[`Они нормализуются и могут получить суффикс. Если имя нужно показывать пользователю заранее, вызовите `,(0,c.jsx)(t.code,{children:`resolveExcelSheetNames`}),` до download.`]}),`
295
+ `,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
296
+ `,(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:`buildExcelSheetData`})}),(0,c.jsx)(t.td,{children:`Собрать типизированные ячейки без скачивания`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadExcelFile`})}),(0,c.jsxs)(t.td,{children:[`Скачать книгу с одним листом `,(0,c.jsx)(t.code,{children:`Sheet1`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadExcelWorkbook`})}),(0,c.jsx)(t.td,{children:`Скачать книгу из нескольких независимых листов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildExcelAutoFilterRef`})}),(0,c.jsx)(t.td,{children:`Построить Excel-диапазон фильтра`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveExcelSheetNames`})}),(0,c.jsx)(t.td,{children:`Нормализовать и дедуплицировать имена листов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveExcelCellStyleFromState`})}),(0,c.jsx)(t.td,{children:`Получить цвет текста из общего value state`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveTableExcelColumnType`})}),(0,c.jsx)(t.td,{children:`Вывести Excel type из OData/table descriptor`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createTableExcelColumn`})}),(0,c.jsx)(t.td,{children:`Создать колонку с type и format`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelTable`})}),(0,c.jsx)(t.td,{children:`Скачать заранее подготовленную таблицу`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelWorkbook`})}),(0,c.jsx)(t.td,{children:`Скачать несколько подготовленных таблиц`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ExcelColumn`}),`, `,(0,c.jsx)(t.code,{children:`ExcelRow`}),`, `,(0,c.jsx)(t.code,{children:`ExcelCellStyle`})]}),(0,c.jsx)(t.td,{children:`Базовые generic-типы`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ResolvedExcelTable`})}),(0,c.jsx)(t.td,{children:`Таблица с optional map стилей`})]})]})]})]})}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/Formulas`}),`
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/Formulas`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`табличные-формулы`,children:`Табличные формулы`}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formulas`}),` предоставляет безопасную инфраструктуру для заранее написанных клиентских формул таблицы.`]}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Формула получает значения других полей текущей строки, выполняет синхронный расчёт и возвращает конечное JavaScript-число. Например, она может вычислить сумму, разницу, отношение или процент для calculated-колонки.`}),`