@ryuzaki13/react-foundation-ui 1.5.12 → 1.5.14

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 (211) hide show
  1. package/dist/listbox/index.js +1 -1
  2. package/dist/listbox/index.js.map +1 -1
  3. package/package.json +2 -1
  4. package/storybook-static/assets/{Badge-BeE_wR-e.js → Badge-CD1woSdo.js} +1 -1
  5. package/storybook-static/assets/{Badge.stories-BMLNLp7n.js → Badge.stories-DPunJSrK.js} +1 -1
  6. package/storybook-static/assets/{BadgeList-B1SSw9no.js → BadgeList-Baj24Y_J.js} +1 -1
  7. package/storybook-static/assets/{Button-CS7C3s7J.js → Button-CGuqXzCc.js} +1 -1
  8. package/storybook-static/assets/{Button-Vi1a4Q0N.js → Button-mnXUdKCZ.js} +1 -1
  9. package/storybook-static/assets/{Button.stories-BAyszGDt.js → Button.stories-Dr67FbTg.js} +1 -1
  10. package/storybook-static/assets/{CalendarView-CroQMfFX.js → CalendarView-vw1o_xNM.js} +1 -1
  11. package/storybook-static/assets/{CheckBox-BSQDnjGm.js → CheckBox-BJL2UykG.js} +1 -1
  12. package/storybook-static/assets/{CheckBox-Cj9xdsq2.js → CheckBox-QV3ntveq.js} +1 -1
  13. package/storybook-static/assets/{CheckBox.stories-JSQfqZK5.js → CheckBox.stories-DRQcsnNN.js} +1 -1
  14. package/storybook-static/assets/{Color-6AOWCN3U-D5PnNXqh.js → Color-6AOWCN3U-Bun7MdUD.js} +1 -1
  15. package/storybook-static/assets/{ContextMenu-rzpDsRZx.js → ContextMenu-C0ZNiHZl.js} +1 -1
  16. package/storybook-static/assets/{ContextMenu-CocuusYO.js → ContextMenu-CNxPWPTI.js} +1 -1
  17. package/storybook-static/assets/{ContextMenu.stories-CO9uACMA.js → ContextMenu.stories-BkZ0l4Tb.js} +1 -1
  18. package/storybook-static/assets/{DateInput-BFUW6ZnL.js → DateInput-BdjPpQBb.js} +1 -1
  19. package/storybook-static/assets/{DateInput-Du3E2ET_.js → DateInput-mz_D_J5f.js} +1 -1
  20. package/storybook-static/assets/{DateInput.stories-DDa04kSj.js → DateInput.stories-BleJdbF3.js} +1 -1
  21. package/storybook-static/assets/{DateRangePresetSelect-CSiFT5F5.js → DateRangePresetSelect-D-8_Suqc.js} +1 -1
  22. package/storybook-static/assets/{DateRangePresetSelect-D6xM7__Q.js → DateRangePresetSelect-DXJu8742.js} +1 -1
  23. package/storybook-static/assets/{DateRangePresetSelect.stories-eF33IA75.js → DateRangePresetSelect.stories-COMQj6gH.js} +1 -1
  24. package/storybook-static/assets/{Detail-BE-E18-T.js → Detail-CJChG-7Q.js} +1 -1
  25. package/storybook-static/assets/{Detail.stories-NCvSVTmL.js → Detail.stories-CX19zPog.js} +1 -1
  26. package/storybook-static/assets/{Dialog-C4HX9Sgs.js → Dialog-FuIbCMO-.js} +1 -1
  27. package/storybook-static/assets/{Dialog-DSmGfP7k.js → Dialog-a4GV2ZQ0.js} +1 -1
  28. package/storybook-static/assets/{Dialog.stories-CVtvkV1R.js → Dialog.stories-D1JgXIdZ.js} +1 -1
  29. package/storybook-static/assets/{Disclosure-CwhrFXI8.js → Disclosure-BSazy5rN.js} +1 -1
  30. package/storybook-static/assets/{Disclosure.stories-DHOMAfuS.js → Disclosure.stories-CES0qFr3.js} +1 -1
  31. package/storybook-static/assets/{DisclosureGroup-Be79LGlr.js → DisclosureGroup-zBtzBoZj.js} +1 -1
  32. package/storybook-static/assets/{DocsRenderer-JROSPFPF-DIVlRluw.js → DocsRenderer-JROSPFPF-P9L3PVGp.js} +1 -1
  33. package/storybook-static/assets/{DropZone-BZCyapHh.js → DropZone-DDByDKii.js} +1 -1
  34. package/storybook-static/assets/{DropZone-5B0A-vFn.js → DropZone-jynwO9zp.js} +1 -1
  35. package/storybook-static/assets/{DropZone.stories-BlTy-nE5.js → DropZone.stories-ChV6kmPA.js} +1 -1
  36. package/storybook-static/assets/{DropdownMenu-CqSO4Xln.js → DropdownMenu-DEekn_iq.js} +1 -1
  37. package/storybook-static/assets/{ExpandableActionPanel-DGK_hHxg.js → ExpandableActionPanel-B9KEphZt.js} +1 -1
  38. package/storybook-static/assets/{ExpandableActionPanel.stories-IH6Gcybn.js → ExpandableActionPanel.stories-hJSbWdEi.js} +1 -1
  39. package/storybook-static/assets/{Flex-D_Ov-qrX.js → Flex-DGw71nVa.js} +1 -1
  40. package/storybook-static/assets/{Flex.stories-DyibLGoC.js → Flex.stories-CisdWxc2.js} +1 -1
  41. package/storybook-static/assets/{FloatingPopover-Dt0czWS7.js → FloatingPopover-BgSpMYSa.js} +1 -1
  42. package/storybook-static/assets/{FormattedTableCell-BkTdSSLq.js → FormattedTableCell-DqGAaLSH.js} +1 -1
  43. package/storybook-static/assets/{Grid-CwZOkx33.js → Grid-DqrdfRPP.js} +1 -1
  44. package/storybook-static/assets/{Grid.stories-Dsu31tqi.js → Grid.stories-VUK1fVo1.js} +1 -1
  45. package/storybook-static/assets/{ImageCropper.stories-BqRshYgd.js → ImageCropper.stories-C8tsdj0y.js} +1 -1
  46. package/storybook-static/assets/{ImageRenderer-DiEaiphg.js → ImageRenderer-y_yPk15t.js} +1 -1
  47. package/storybook-static/assets/{ImageRenderer.stories-DXk_A_1N.js → ImageRenderer.stories-CdfTCmEM.js} +1 -1
  48. package/storybook-static/assets/{ImageView.stories-TuZxh1Fr.js → ImageView.stories-BpJA3U7W.js} +1 -1
  49. package/storybook-static/assets/{ImageViewer.stories-CL796ExX.js → ImageViewer.stories-joUGbNuk.js} +2 -2
  50. package/storybook-static/assets/{ImageViewerRuntime-CCVrFr6t.js → ImageViewerRuntime-Bd6bwD2G.js} +1 -1
  51. package/storybook-static/assets/{Input-Dmum9ojv.js → Input-B9yXA1bX.js} +1 -1
  52. package/storybook-static/assets/{Input-CRRkPSmn.js → Input-BqHQ13Py.js} +1 -1
  53. package/storybook-static/assets/{Input.stories-C8y8Gzjn.js → Input.stories-D5_EehUE.js} +1 -1
  54. package/storybook-static/assets/{InputDateTime-DozxwdSK.js → InputDateTime-DMUf2anh.js} +1 -1
  55. package/storybook-static/assets/{InputDateTime.stories-Dm86teu7.js → InputDateTime.stories-CSCBZZSt.js} +1 -1
  56. package/storybook-static/assets/{InputFile-DPYOyrse.js → InputFile--7YNcXk1.js} +1 -1
  57. package/storybook-static/assets/{InputFile-Cm1ipP_c.js → InputFile-Bb28M0Jz.js} +1 -1
  58. package/storybook-static/assets/{InputFile.stories-A9sXRTPi.js → InputFile.stories-BcmVjUTx.js} +1 -1
  59. package/storybook-static/assets/{InputFiles-DqYEI0vF.js → InputFiles-BCk2pk9f.js} +1 -1
  60. package/storybook-static/assets/{InputFiles-D6ibnj3Y.js → InputFiles-DGD8b7Ou.js} +1 -1
  61. package/storybook-static/assets/{InputFiles.stories-CTK_G05d.js → InputFiles.stories-CEI2y9jM.js} +1 -1
  62. package/storybook-static/assets/{InputFilesList-Cw2vB_I4.js → InputFilesList-BP0hLe6p.js} +1 -1
  63. package/storybook-static/assets/{InputImage-eWMt3Rpi.js → InputImage-CNW2H1oW.js} +1 -1
  64. package/storybook-static/assets/{InputImage-YaDG8UBR.js → InputImage-DGuYPBQF.js} +1 -1
  65. package/storybook-static/assets/{InputImage.stories-Ba5v3XyF.js → InputImage.stories-BRqt3EaX.js} +1 -1
  66. package/storybook-static/assets/{InteractiveComponents-C3WdIF2c.js → InteractiveComponents-BDlt0WQb.js} +1 -1
  67. package/storybook-static/assets/{InteractiveComponents.stories-CPqOBcYI.js → InteractiveComponents.stories-CCwZe0gu.js} +1 -1
  68. package/storybook-static/assets/{LayoutPicker-mQiBJ85c.js → LayoutPicker-NTQugPXW.js} +1 -1
  69. package/storybook-static/assets/{LayoutPicker-CAIujH3t.js → LayoutPicker-mhDjtSHC.js} +1 -1
  70. package/storybook-static/assets/{LayoutPicker.stories-BAqhsvOh.js → LayoutPicker.stories-B7pmo36I.js} +1 -1
  71. package/storybook-static/assets/{Listbox-vwKVwC47.js → Listbox-CX66_FoN.js} +1 -1
  72. package/storybook-static/assets/{Listbox-BCfY4SYB.js → Listbox-CgzrQDwl.js} +1 -1
  73. package/storybook-static/assets/{Listbox.stories-CA7VrO6z.js → Listbox.stories-BuvQeQ0-.js} +1 -1
  74. package/storybook-static/assets/{Modal-DvisZoA2.js → Modal-yA7tk-MI.js} +1 -1
  75. package/storybook-static/assets/{Modal.stories-Dj66uXRY.js → Modal.stories-fUsmoWsB.js} +1 -1
  76. package/storybook-static/assets/{ModalManagerProvider-CSsTef9-.js → ModalManagerProvider-CpW75Za1.js} +1 -1
  77. package/storybook-static/assets/{MultiSelect-CpNX4wyD.js → MultiSelect-CAK64RnT.js} +1 -1
  78. package/storybook-static/assets/{MultiSelect-C4uT-lwM.js → MultiSelect-CoqGVsBf.js} +1 -1
  79. package/storybook-static/assets/{MultiSelect.stories-CjIw1FBQ.js → MultiSelect.stories-BnOcEsh0.js} +1 -1
  80. package/storybook-static/assets/{NoData-J6gIe2DW.js → NoData-BLbA-zp6.js} +1 -1
  81. package/storybook-static/assets/{NotificationsHost-B4vBCIUo.js → NotificationsHost-JM9SHcK4.js} +1 -1
  82. package/storybook-static/assets/{NotificationsHost.stories-Btx0-jS4.js → NotificationsHost.stories-Cq6KBUGr.js} +1 -1
  83. package/storybook-static/assets/{ODataMultiSelect-BRWRd-T0.js → ODataMultiSelect-C000rYJO.js} +1 -1
  84. package/storybook-static/assets/{ODataMultiSelect.stories-AcwmUSqN.js → ODataMultiSelect.stories-D1JrPXno.js} +1 -1
  85. package/storybook-static/assets/{ODataSelect-DKF1dPMT.js → ODataSelect-D_bcFAMN.js} +1 -1
  86. package/storybook-static/assets/{ODataSelect.stories-BCCDQvG1.js → ODataSelect.stories-k0nZfp60.js} +1 -1
  87. package/storybook-static/assets/{ODataTreeMultiSelect-Jmrc7xEO.js → ODataTreeMultiSelect-yatLDsY7.js} +1 -1
  88. package/storybook-static/assets/{ODataTreeMultiSelect.stories-BWX3TG9B.js → ODataTreeMultiSelect.stories-DeTaeKuH.js} +1 -1
  89. package/storybook-static/assets/{ODataTreeSelect-CGO2HVbN.js → ODataTreeSelect-DbxkcIOC.js} +1 -1
  90. package/storybook-static/assets/{ODataTreeSelect.stories-DSmhE-Li.js → ODataTreeSelect.stories-BiL0Ew_l.js} +1 -1
  91. package/storybook-static/assets/{OneStepScroller-pU0sAFEq.js → OneStepScroller-CVMtNkB8.js} +1 -1
  92. package/storybook-static/assets/{PeriodSelect-DwozNnWV.js → PeriodSelect-BxUpa6Ti.js} +1 -1
  93. package/storybook-static/assets/{PeriodSelect-DmogN2kp.js → PeriodSelect-CvIh7s4o.js} +1 -1
  94. package/storybook-static/assets/{PeriodSelect.stories-Cwad_AnS.js → PeriodSelect.stories-9UkxLt3c.js} +1 -1
  95. package/storybook-static/assets/{PickerSelectionToolbar-B3N3Sv51.js → PickerSelectionToolbar-DCyKqj4d.js} +1 -1
  96. package/storybook-static/assets/{PickerTriggerActions-BurXeCTR.js → PickerTriggerActions-C2ml1dHu.js} +1 -1
  97. package/storybook-static/assets/{Popover-DYoRYOJQ.js → Popover-CIkFX8KE.js} +1 -1
  98. package/storybook-static/assets/{Popover-Bi3JzbPI.js → Popover-lL1gFyV9.js} +1 -1
  99. package/storybook-static/assets/{Popover.stories-jhxw-37b.js → Popover.stories-qdEo-ssX.js} +1 -1
  100. package/storybook-static/assets/{PresetRangeDateInput-5o-VfEMw.js → PresetRangeDateInput-BnjHtxAq.js} +1 -1
  101. package/storybook-static/assets/{PresetRangeDateInput-4GkY4C-R.js → PresetRangeDateInput-CJMd3--R.js} +1 -1
  102. package/storybook-static/assets/{PresetRangeDateInput.stories-BLrQFysM.js → PresetRangeDateInput.stories-CAeR9ZbD.js} +1 -1
  103. package/storybook-static/assets/{PresetSelect-VSLjZIEN.js → PresetSelect-DsWB0UAO.js} +1 -1
  104. package/storybook-static/assets/{RadioButton-DtZXxK2y.js → RadioButton-BoHDe82U.js} +1 -1
  105. package/storybook-static/assets/{RadioButton-BmDJRjUd.js → RadioButton-D8vPj5e8.js} +1 -1
  106. package/storybook-static/assets/{RadioButton.stories-CnjoSTqx.js → RadioButton.stories-CUj8nWsY.js} +1 -1
  107. package/storybook-static/assets/{RadioGroup-DKQukpG2.js → RadioGroup-BdV4BEd8.js} +1 -1
  108. package/storybook-static/assets/{RadioGroup-C5avdavC.js → RadioGroup-Ut9gYgVv.js} +1 -1
  109. package/storybook-static/assets/{RadioGroup.stories-D2RkFaPs.js → RadioGroup.stories-CqDdGawq.js} +1 -1
  110. package/storybook-static/assets/{Scrollable-BfWwu2om.js → Scrollable-CYqKWV-X.js} +1 -1
  111. package/storybook-static/assets/{Select-wCbHE4lQ.js → Select-CiCBBpv5.js} +1 -1
  112. package/storybook-static/assets/{Select-C8NwIhWM.js → Select-RbjV8dmi.js} +1 -1
  113. package/storybook-static/assets/{Select.stories-a2seNrPn.js → Select.stories-LhZxxpT7.js} +1 -1
  114. package/storybook-static/assets/{SelectOptionContent-ZSxvUFLm.js → SelectOptionContent-BzRajXPC.js} +1 -1
  115. package/storybook-static/assets/{SerializableSelect-4Goej9W_.js → SerializableSelect-Cy7gs4jX.js} +1 -1
  116. package/storybook-static/assets/{SerializableSelect.stories-BkCW3jp4.js → SerializableSelect.stories-C2_ryaWY.js} +1 -1
  117. package/storybook-static/assets/{SingleDateTimeInput-BfG4Wffa.js → SingleDateTimeInput-B_UBXx82.js} +1 -1
  118. package/storybook-static/assets/{SingleDateTimeInput-C2QxXHnT.js → SingleDateTimeInput-Dva2NFrn.js} +1 -1
  119. package/storybook-static/assets/{SingleDateTimeInput.stories-D1EHS_Lj.js → SingleDateTimeInput.stories-DYt31IoM.js} +1 -1
  120. package/storybook-static/assets/{Slider-DutRipBc.js → Slider-1ymlsxh9.js} +1 -1
  121. package/storybook-static/assets/{Slider-COfQFgR8.js → Slider-Cbcdmx97.js} +1 -1
  122. package/storybook-static/assets/{Slider.stories-DXNQd3RV.js → Slider.stories-CP_gKjK0.js} +1 -1
  123. package/storybook-static/assets/{SliderInput-CKdp2Gmo.js → SliderInput-XHYB3r06.js} +1 -1
  124. package/storybook-static/assets/{SliderInput-D15wYNK7.js → SliderInput-paqtqhAm.js} +1 -1
  125. package/storybook-static/assets/{SliderInput.stories-BHmBapUE.js → SliderInput.stories-W1GTuM_C.js} +1 -1
  126. package/storybook-static/assets/{Sortable-Cv98zRm4.js → Sortable-CT4fVwTv.js} +1 -1
  127. package/storybook-static/assets/{Sortable.stories-VjnupnmR.js → Sortable.stories-nKc7Upc2.js} +1 -1
  128. package/storybook-static/assets/{Splitter-jOqNKtm0.js → Splitter-N9erAT3u.js} +1 -1
  129. package/storybook-static/assets/{Splitter.stories-BTJf67_i.js → Splitter.stories-CK-GKi--.js} +1 -1
  130. package/storybook-static/assets/{StateSelect-BNXXcX4c.js → StateSelect-CIPFB33b.js} +1 -1
  131. package/storybook-static/assets/{StateSelect-D8Zep8nb.js → StateSelect-Dojqy1hR.js} +1 -1
  132. package/storybook-static/assets/{StateSelect.stories-B0nR14db.js → StateSelect.stories-C4On1tk0.js} +1 -1
  133. package/storybook-static/assets/{StringToggle.stories-Cat4CWpp.js → StringToggle.stories-BetJnFMH.js} +1 -1
  134. package/storybook-static/assets/{Switch-CNbwWtfu.js → Switch-D2p3kwTC.js} +1 -1
  135. package/storybook-static/assets/{Switch-CmxJq-nM.js → Switch-DUCOjbqF.js} +1 -1
  136. package/storybook-static/assets/{Switch.stories-T7MZJAke.js → Switch.stories-Blqtc2Hq.js} +1 -1
  137. package/storybook-static/assets/{Table-C7D3rt22.js → Table-h5VqBZQC.js} +1 -1
  138. package/storybook-static/assets/{Table.stories-C0jQhruO.js → Table.stories-DVNQ0tWI.js} +1 -1
  139. package/storybook-static/assets/{Tabs-BEO2hPOw.js → Tabs-oJ3wBcAV.js} +1 -1
  140. package/storybook-static/assets/{Tabs.stories-CgVofLQc.js → Tabs.stories-CBh5mcQQ.js} +1 -1
  141. package/storybook-static/assets/{TabsBox-C4gzhmdB.js → TabsBox-B9LCP1S7.js} +1 -1
  142. package/storybook-static/assets/{TagInput-C_nlfbRh.js → TagInput-DxR2Bj-i.js} +1 -1
  143. package/storybook-static/assets/{TagInput.stories-BMCmW5eG.js → TagInput.stories-0NpZyaKp.js} +1 -1
  144. package/storybook-static/assets/{Text-BqKrUz4Q.js → Text-DlyoUTZs.js} +1 -1
  145. package/storybook-static/assets/{Textarea-BbNW9GUS.js → Textarea--e-7GpNS.js} +1 -1
  146. package/storybook-static/assets/{Textarea-BRstHvhs.js → Textarea-CvpgjBoz.js} +1 -1
  147. package/storybook-static/assets/{Textarea.stories-B_22Qe-e.js → Textarea.stories-CLl8p2g4.js} +1 -1
  148. package/storybook-static/assets/{TimePanel-9AlN21FL.js → TimePanel-Fn9pUQDM.js} +1 -1
  149. package/storybook-static/assets/{TimePanel.stories-yxNANrSL.js → TimePanel.stories-BHUoKMY9.js} +1 -1
  150. package/storybook-static/assets/{Toggle-YLom0uCh.js → Toggle-B6twXbRN.js} +1 -1
  151. package/storybook-static/assets/{Toggle-Bl89R1NL.js → Toggle-j_swU_h-.js} +1 -1
  152. package/storybook-static/assets/{Toggle.stories-BGIwKyic.js → Toggle.stories-BkRbPfci.js} +1 -1
  153. package/storybook-static/assets/{TreeMultiSelect-C9hv75Z0.js → TreeMultiSelect-6SlJwvvJ.js} +1 -1
  154. package/storybook-static/assets/{TreeMultiSelect-Dhl8PI6r.js → TreeMultiSelect-86pFYMuR.js} +1 -1
  155. package/storybook-static/assets/{TreeMultiSelect.stories-DefpU9Nq.js → TreeMultiSelect.stories-Dvfg-_tX.js} +1 -1
  156. package/storybook-static/assets/{TreePickerBase-B5guKjut.js → TreePickerBase-B-C8g39p.js} +1 -1
  157. package/storybook-static/assets/{TreeSelect-Cbtl72S2.js → TreeSelect-B-rvlWXe.js} +1 -1
  158. package/storybook-static/assets/{TreeSelect-D1wgUUfD.js → TreeSelect-BsvnuuDK.js} +1 -1
  159. package/storybook-static/assets/{TreeSelect.stories-DK6Z_n2h.js → TreeSelect.stories-Bd7RvBSv.js} +1 -1
  160. package/storybook-static/assets/{TreeTable-CC5CA5OL.js → TreeTable-hKPiLJbk.js} +1 -1
  161. package/storybook-static/assets/{TreeTable.stories-DVYLy82M.js → TreeTable.stories-DW8-8XIt.js} +1 -1
  162. package/storybook-static/assets/{async-CDaecudw.js → async-ClBTLJJf.js} +1 -1
  163. package/storybook-static/assets/{blocks-DFQ7gHL7.js → blocks-BAkpxLLq.js} +3 -3
  164. package/storybook-static/assets/{browserAndReact-DNd3NO2z.js → browserAndReact-CVEbp_eh.js} +6 -41
  165. package/storybook-static/assets/{check-CDGa2frI.js → check-BI1SJVLE.js} +1 -1
  166. package/storybook-static/assets/{chevron-down-B5gF19ie.js → chevron-down-C8Jy-MyE.js} +1 -1
  167. package/storybook-static/assets/{chevron-left-BhhrtQ5w.js → chevron-left-BY47fHoH.js} +1 -1
  168. package/storybook-static/assets/{chevron-right-ULlpFrtQ.js → chevron-right-Uoc3pHM2.js} +1 -1
  169. package/storybook-static/assets/{chunk-W22LQPXL-bz_jGWFd.js → chunk-W22LQPXL-CL5_k7w9.js} +1 -1
  170. package/storybook-static/assets/{circle-alert-DG_0NWce.js → circle-alert-DmeiIhJa.js} +1 -1
  171. package/storybook-static/assets/{circle-check-DKgLpHr-.js → circle-check-DiYKn1po.js} +1 -1
  172. package/storybook-static/assets/{components-CgxL1hHE.js → components-CvASwB3y.js} +3 -3
  173. package/storybook-static/assets/{contextMenu-D_apFypV.js → contextMenu-CnFw0q-x.js} +1 -1
  174. package/storybook-static/assets/{defaultRenderers-CK6DySTx.js → defaultRenderers-BvRfeq-t.js} +1 -1
  175. package/storybook-static/assets/{download-BMlQunb2.js → download-9zZQxSfv.js} +1 -1
  176. package/storybook-static/assets/{filesAndExcel-BmDCLG9Y.js → filesAndExcel-BEg-oUnG.js} +6 -36
  177. package/storybook-static/assets/{floating-ui.react-DaDI6aL_.js → floating-ui.react-1JhRQUPm.js} +1 -1
  178. package/storybook-static/assets/formatters-CXfVcFH6.js +202 -0
  179. package/storybook-static/assets/{formatters-runtime-CsjNRxSG.js → formatters-runtime-BUROwHGI.js} +11 -66
  180. package/storybook-static/assets/foundationLib-BIERdAtE.js +25 -0
  181. package/storybook-static/assets/{hooks-C9DxdAXO.js → hooks-CU6FIrkU.js} +1 -1
  182. package/storybook-static/assets/{iframe-BOYfiRbQ.js → iframe-CyRHAH4o.js} +3 -3
  183. package/storybook-static/assets/iframe-DMUTCGyI.js +1 -0
  184. package/storybook-static/assets/{iframe-OPLBHfTR.css → iframe-I5gZKSOP.css} +1 -1
  185. package/storybook-static/assets/{info-BuKiC7d0.js → info-vRwdpcvs.js} +1 -1
  186. package/storybook-static/assets/{odata-CGjX6csD.js → odata-BeK1NpdX.js} +1 -1
  187. package/storybook-static/assets/odataAndTables-BsGyKbV-.js +77 -0
  188. package/storybook-static/assets/{odataFetchFn-DQBb33CS.js → odataFetchFn-CBB59F7H.js} +1 -1
  189. package/storybook-static/assets/{odataStoryFixtures-BYjSHUPv.js → odataStoryFixtures-D7UlbX90.js} +1 -1
  190. package/storybook-static/assets/{persisted-BmsVMmao.js → persisted-C-zkxkWy.js} +1 -1
  191. package/storybook-static/assets/pureUtilities-BhlI4P36.js +30 -0
  192. package/storybook-static/assets/{react-CPygFl97.js → react-4VaPHlD7.js} +1 -1
  193. package/storybook-static/assets/{refresh-cw-D9xWA1ag.js → refresh-cw-koABHMz2.js} +1 -1
  194. package/storybook-static/assets/{runtimeAndState-7kpVxxK8.js → runtimeAndState-DCiPKg2b.js} +4 -28
  195. package/storybook-static/assets/{settings-2-D5vKtCuh.js → settings-2-B-UnKmoE.js} +1 -1
  196. package/storybook-static/assets/{sortable-7ZhGDUUH.js → sortable-Cof-YMaC.js} +1 -1
  197. package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-BgPG-zNQ.js → syntaxhighlighter-T5IQBZDB-C1dGYx2A.js} +1 -1
  198. package/storybook-static/assets/{trash-2-COVTeKHf.js → trash-2-DIKrAYpi.js} +1 -1
  199. package/storybook-static/assets/{triangle-alert-Dc8CWEGx.js → triangle-alert-3L0K5wrt.js} +1 -1
  200. package/storybook-static/assets/{useODataSelectBase-BllI2D0F.js → useODataSelectBase-Cn7uL1Y6.js} +1 -1
  201. package/storybook-static/assets/{useODataTreeData-CNVWCnCt.js → useODataTreeData-MmRan049.js} +1 -1
  202. package/storybook-static/assets/{usePickerQuery-C0ti4hti.js → usePickerQuery-Dso-ufUa.js} +1 -1
  203. package/storybook-static/assets/{usePickerTriggerController-BSWvRSBy.js → usePickerTriggerController-B-FKRrNu.js} +1 -1
  204. package/storybook-static/assets/{x-BVvgKMRp.js → x-CI99aKu3.js} +1 -1
  205. package/storybook-static/iframe.html +3 -3
  206. package/storybook-static/project.json +1 -1
  207. package/storybook-static/assets/formatters-C5iLXNhs.js +0 -306
  208. package/storybook-static/assets/foundationLib-BcQgD58A.js +0 -82
  209. package/storybook-static/assets/iframe-Dy-1_8OT.js +0 -1
  210. package/storybook-static/assets/odataAndTables-CyGjgcKX.js +0 -126
  211. package/storybook-static/assets/pureUtilities-BbRRZPJI.js +0 -69
@@ -0,0 +1,202 @@
1
+ import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-CyRHAH4o.js";import{i as n,r}from"./react-qN2cStNd.js";import{l as i,m as a}from"./blocks-BAkpxLLq.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Formatters`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`форматтеры`,children:`Форматтеры`}),`
3
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formatters`}),` — единая публичная точка входа для
4
+ преобразования значений в host-проекте. Она покрывает даты, числа, строки,
5
+ логические значения, ФИО, телефон и числовые идентификаторы. Импортировать
6
+ внутренние файлы пакета и корневой пакет не нужно: все показанные ниже имена
7
+ доступны из опубликованного subpath.`]}),`
8
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { formatDate, formatNumber, normalizeText, parseBoolean } from "@ryuzaki13/react-foundation-lib/formatters";
9
+
10
+ import type { DateFormatPreset, NumberFormatPresetConfig } from "@ryuzaki13/react-foundation-lib/formatters";
11
+ `})}),`
12
+ `,(0,c.jsx)(t.h2,{id:`выбор-api`,children:`Выбор API`}),`
13
+ `,(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:`Отобразить или разобрать дату без неявного timezone-сдвига`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDate`}),`, `,(0,c.jsx)(t.code,{children:`parseDate`}),`, `,(0,c.jsx)(t.code,{children:`parseDateTZ`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Получить календарные границы или безопасный диапазон`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`normalizeDateRange`}),`, `,(0,c.jsx)(t.code,{children:`requireDateRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Отобразить число или разобрать SAP-подобную строку`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumber`}),`, `,(0,c.jsx)(t.code,{children:`toFiniteNumber`}),`, `,(0,c.jsx)(t.code,{children:`parseNumber`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Привести текст к безопасной строке или нормализовать пробелы`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`toSafeString`}),`, `,(0,c.jsx)(t.code,{children:`normalizeText`}),`, `,(0,c.jsx)(t.code,{children:`normalizeTextSpaces`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Склонить русское существительное по количеству`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`selectRussianPluralForm`}),`, `,(0,c.jsx)(t.code,{children:`formatRussianPlural`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Преобразовать ABAP boolean`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseAbapBoolean`}),`, `,(0,c.jsx)(t.code,{children:`toAbapBoolean`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Показать ФИО, российский номер или код с ведущими нулями`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatFullName`}),`, `,(0,c.jsx)(t.code,{children:`formatPhone`}),`, `,(0,c.jsx)(t.code,{children:`normalizeLeadingZerosStrict`})]})]})]})]}),`
14
+ `,(0,c.jsx)(t.h2,{id:`даты`,children:`Даты`}),`
15
+ `,(0,c.jsx)(t.h3,{id:`основной-форматтер`,children:`Основной форматтер`}),`
16
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { formatDate, formatDateAsDateTime, formatDateAsODataDate } from "@ryuzaki13/react-foundation-lib/formatters";
17
+
18
+ formatDate("2026-03-05T14:30:00", "date");
19
+ // "05.03.2026"
20
+
21
+ formatDateAsDateTime("/Date(1772713800000+0500)/");
22
+ // строка даты и времени в локальной календарной семантике
23
+
24
+ formatDateAsODataDate(new Date(2026, 2, 5));
25
+ // "2026-03-05"
26
+ `})}),`
27
+ `,(0,c.jsx)(t.p,{children:`Сигнатура универсального вызова:`}),`
28
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`formatDate(
29
+ value: unknown,
30
+ presetOrName?: string | DateFormatPreset,
31
+ options?: FormatDateOptions
32
+ ): string;
33
+ `})}),`
34
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`value`}),` может быть `,(0,c.jsx)(t.code,{children:`Date`}),`, Unix timestamp, OData ticks вида
35
+ `,(0,c.jsx)(t.code,{children:`/Date(…)/`}),`, OData literal, ABAP-дата/временная метка, ISO-строка,
36
+ ISO-длительность и несколько распространённых человекочитаемых форматов.
37
+ Неподходящее значение не выбрасывает исключение: результатом будет
38
+ `,(0,c.jsx)(t.code,{children:`options.fallback`}),`, либо `,(0,c.jsx)(t.code,{children:`invalidFallback`}),` выбранного пресета, либо пустая
39
+ строка по умолчанию.`]}),`
40
+ `,(0,c.jsxs)(t.p,{children:[`Исключение — неизвестное строковое имя пресета: `,(0,c.jsx)(t.code,{children:`formatDate`}),` выбросит
41
+ `,(0,c.jsx)(t.code,{children:`Error`}),`. Если формат получен из внешней конфигурации, сначала разрешите его
42
+ через `,(0,c.jsx)(t.code,{children:`resolveDateFormatPreset`}),` или проверьте через `,(0,c.jsx)(t.code,{children:`getDatePreset`}),`.`]}),`
43
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`FormatDateOptions`}),`:`]}),`
44
+ `,(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:`fallback?: string`})}),(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:`precision?: "day" | "month" | "year"`})}),(0,c.jsx)(t.td,{children:`Скрывает календарные части ниже выбранной точности.`})]})]})]}),`
45
+ `,(0,c.jsx)(t.h3,{id:`готовые-форматтеры`,children:`Готовые форматтеры`}),`
46
+ `,(0,c.jsxs)(t.p,{children:[`Все функции принимают `,(0,c.jsx)(t.code,{children:`value: unknown`}),` и необязательный `,(0,c.jsx)(t.code,{children:`FormatDateOptions`}),`,
47
+ возвращают строку и используют соответствующий встроенный пресет.`]}),`
48
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Результат / назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatDateAsDate`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`dd.MM.yyyy`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatDateAsDateTime`})}),(0,c.jsx)(t.td,{children:`Дата и время до минут.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsTime`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsTimeSeconds`})]}),(0,c.jsx)(t.td,{children:`Время до минут или секунд.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsDateShort`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDateMedium`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDateLong`})]}),(0,c.jsx)(t.td,{children:`Числовая, сокращённая и полная русская дата.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsMonthShort`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsMonthMedium`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsMonthLong`})]}),(0,c.jsx)(t.td,{children:`День и месяц без года: числовой, сокращённый или полный вид.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsMonthYearMedium`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsMonthYearLong`})]}),(0,c.jsx)(t.td,{children:`Месяц и год в сокращённом или полном виде.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsTimeShort`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsTimeMedium`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsTimeLong`})]}),(0,c.jsx)(t.td,{children:`Короткое или секундное время без вывода timezone.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsDatetimeShort`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDatetimeMedium`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDatetimeLong`})]}),(0,c.jsx)(t.td,{children:`Дата и время с разной детализацией.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsAbapYear`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapMonth`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDatetime`})]}),(0,c.jsxs)(t.td,{children:[`Машинные строки `,(0,c.jsx)(t.code,{children:`yyyy`}),`, `,(0,c.jsx)(t.code,{children:`yyyyMM`}),`, `,(0,c.jsx)(t.code,{children:`yyyyMMdd`}),`, `,(0,c.jsx)(t.code,{children:`yyyyMMddHHmmss`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsODataDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataDatetime`})]}),(0,c.jsxs)(t.td,{children:[`Машинные строки `,(0,c.jsx)(t.code,{children:`yyyy-MM-dd`}),`, `,(0,c.jsx)(t.code,{children:`yyyy-MM-ddTHH:mm:ss`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatDateAsODataTime`})}),(0,c.jsxs)(t.td,{children:[`Время как OData duration `,(0,c.jsx)(t.code,{children:`PT00H00M00S`}),`; для ISO-длительности форматирует её как время.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatDateRange(startValue, endValue, presetOrName?, options?)`})}),(0,c.jsxs)(t.td,{children:[`Две валидные даты через `,(0,c.jsx)(t.code,{children:`-`}),`; если любая невалидна, возвращает fallback.`]})]})]})]}),`
49
+ `,(0,c.jsx)(t.h3,{id:`разбор-даты-и-timezone-семантика`,children:`Разбор даты и timezone-семантика`}),`
50
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { parseDate, parseDateTZ, parseDateByPattern, parseDateValue } from "@ryuzaki13/react-foundation-lib/formatters";
51
+
52
+ parseDate("20260305");
53
+ // Date | null
54
+
55
+ parseDateTZ("2026-03-05T10:00:00+05:00");
56
+ // Date | null, сохраняет абсолютный instant
57
+
58
+ parseDateByPattern("05/03/2026", "dd/MM/yyyy");
59
+ // { kind: "date-time", source: "iso-local", date: Date } | null
60
+
61
+ parseDateValue("PT01H30M");
62
+ // { kind: "duration", source: "iso-duration", durationMs: 5_400_000 } | null
63
+ `})}),`
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:`API`}),(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:`parseDateValue(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ParsedDateValue | null`}),`. Обычный режим: сохраняет видимые календарные компоненты без применения timezone.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseDateValueTZ(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ParsedDateValue | null`}),`. Для Unix timestamp и ISO/OData со смещением сохраняет абсолютный момент времени.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseDate(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`Date | null`}),`; в том числе приводит duration к `,(0,c.jsx)(t.code,{children:`Date`}),` в «плавающей» календарной семантике.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseDateTZ(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`Date | null`}),` с timezone-aware трактовкой абсолютного времени.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseDateByPattern(value, pattern?, { precision? })`})}),(0,c.jsxs)(t.td,{children:[`Строго разбирает токены `,(0,c.jsx)(t.code,{children:`dd`}),`, `,(0,c.jsx)(t.code,{children:`MM`}),`, `,(0,c.jsx)(t.code,{children:`yyyy`}),`, `,(0,c.jsx)(t.code,{children:`yy`}),`, `,(0,c.jsx)(t.code,{children:`HH`}),`, `,(0,c.jsx)(t.code,{children:`mm`}),`, `,(0,c.jsx)(t.code,{children:`ss`}),`; невалидные компоненты дают `,(0,c.jsx)(t.code,{children:`null`}),`. Двузначный год `,(0,c.jsx)(t.code,{children:`00–69`}),` — это `,(0,c.jsx)(t.code,{children:`2000–2069`}),`, `,(0,c.jsx)(t.code,{children:`70–99`}),` — `,(0,c.jsx)(t.code,{children:`1970–1999`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseDateByFormat(value, dateFormat?, options?)`})}),(0,c.jsxs)(t.td,{children:[`Разбирает зарегистрированное имя пресета, style-алиас или ручной шаблон. `,(0,c.jsx)(t.code,{children:`options`}),`: `,(0,c.jsx)(t.code,{children:`defaultFormat`}),`, `,(0,c.jsx)(t.code,{children:`locale`}),`, `,(0,c.jsx)(t.code,{children:`precision`}),`, `,(0,c.jsx)(t.code,{children:`referenceDate`}),`.`]})]})]})]}),`
65
+ `,(0,c.jsxs)(t.p,{children:[`Публичные типы для результатов и контракта: `,(0,c.jsx)(t.code,{children:`DateInputSource`}),`,
66
+ `,(0,c.jsx)(t.code,{children:`ParsedDateValue`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPattern`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatStyle`}),`,
67
+ `,(0,c.jsx)(t.code,{children:`DateFormatPrecision`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPreset`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPresetConfig`}),`,
68
+ `,(0,c.jsx)(t.code,{children:`FormatDateOptions`}),`, `,(0,c.jsx)(t.code,{children:`ParseDateByPatternOptions`}),`, `,(0,c.jsx)(t.code,{children:`ParseDateByFormatOptions`}),`.`]}),`
69
+ `,(0,c.jsxs)(t.p,{children:[`Не заменяйте `,(0,c.jsx)(t.code,{children:`parseDate`}),` на `,(0,c.jsx)(t.code,{children:`new Date("YYYY-MM-DD")`}),`, если значение является
70
+ календарной датой: native parsing может изменить отображаемый день из-за
71
+ timezone.`]}),`
72
+ `,(0,c.jsx)(t.h3,{id:`пресеты-дат`,children:`Пресеты дат`}),`
73
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
74
+ DEFAULT_DATE_PRESET_NAMES,
75
+ getDatePreset,
76
+ registerDatePreset,
77
+ resolveDateFormatPreset
78
+ } from "@ryuzaki13/react-foundation-lib/formatters";
79
+
80
+ registerDatePreset({
81
+ name: "report-date",
82
+ pattern: "dd.MM.yyyy",
83
+ invalidFallback: "—"
84
+ });
85
+
86
+ formatDate("2026-03-05", "report-date"); // "05.03.2026"
87
+
88
+ const safePreset = resolveDateFormatPreset("dd/MM/yyyy");
89
+ formatDate("05/03/2026", safePreset); // "05/03/2026"
90
+ `})}),`
91
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`DEFAULT_DATE_PRESET_NAMES`}),` содержит: `,(0,c.jsx)(t.code,{children:`date`}),`, `,(0,c.jsx)(t.code,{children:`date-short`}),`, `,(0,c.jsx)(t.code,{children:`date-medium`}),`,
92
+ `,(0,c.jsx)(t.code,{children:`date-long`}),`, `,(0,c.jsx)(t.code,{children:`month-short`}),`, `,(0,c.jsx)(t.code,{children:`month-medium`}),`, `,(0,c.jsx)(t.code,{children:`month-long`}),`,
93
+ `,(0,c.jsx)(t.code,{children:`month-year-medium`}),`, `,(0,c.jsx)(t.code,{children:`month-year-long`}),`, `,(0,c.jsx)(t.code,{children:`datetime`}),`, `,(0,c.jsx)(t.code,{children:`datetime-seconds`}),`,
94
+ `,(0,c.jsx)(t.code,{children:`datetime-short`}),`, `,(0,c.jsx)(t.code,{children:`datetime-medium`}),`, `,(0,c.jsx)(t.code,{children:`datetime-long`}),`, `,(0,c.jsx)(t.code,{children:`time`}),`,
95
+ `,(0,c.jsx)(t.code,{children:`time-seconds`}),`, `,(0,c.jsx)(t.code,{children:`time-short`}),`, `,(0,c.jsx)(t.code,{children:`time-medium`}),`, `,(0,c.jsx)(t.code,{children:`time-long`}),`, `,(0,c.jsx)(t.code,{children:`odata-date`}),`,
96
+ `,(0,c.jsx)(t.code,{children:`odata-datetime`}),`, `,(0,c.jsx)(t.code,{children:`abap-datetime`}),`, `,(0,c.jsx)(t.code,{children:`abap-date`}),`, `,(0,c.jsx)(t.code,{children:`abap-month`}),`, `,(0,c.jsx)(t.code,{children:`abap-year`}),`.`]}),`
97
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`DATE_FORMAT_DEFAULTS`})}),(0,c.jsxs)(t.td,{children:[`Значения по умолчанию: `,(0,c.jsx)(t.code,{children:`ru-RU`}),`, числовая дата и пустой `,(0,c.jsx)(t.code,{children:`invalidFallback`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`DATE_FORMAT_STYLE_PRESET_NAMES`})}),(0,c.jsxs)(t.td,{children:[`Соответствие `,(0,c.jsx)(t.code,{children:`short`}),`, `,(0,c.jsx)(t.code,{children:`medium`}),`, `,(0,c.jsx)(t.code,{children:`long`}),` встроенным date-пресетам.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getDatePreset(name)`}),`, `,(0,c.jsx)(t.code,{children:`getDatePresetNames()`})]}),(0,c.jsxs)(t.td,{children:[`Возвращают пресет или `,(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:`registerDatePreset(config)`})}),(0,c.jsxs)(t.td,{children:[`Компилирует и регистрирует/перезаписывает пресет, возвращает готовый `,(0,c.jsx)(t.code,{children:`DateFormatPreset`}),`. Реестр module-scoped.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resetDatePresets()`})}),(0,c.jsx)(t.td,{children:`Сбрасывает реестр к встроенным пресетам; используйте для изолированных тестов, не в обычном runtime.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isDateFormatStyle(value)`}),`, `,(0,c.jsx)(t.code,{children:`isDateFormatPrecision(value)`})]}),(0,c.jsx)(t.td,{children:`Type guard для style и precision.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveDateFormatName(value?, defaultFormat?)`})}),(0,c.jsxs)(t.td,{children:[`Обрезает пробелы и переводит `,(0,c.jsx)(t.code,{children:`short`}),` / `,(0,c.jsx)(t.code,{children:`medium`}),` / `,(0,c.jsx)(t.code,{children:`long`}),` в имя date-пресета.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveDateFormatPreset(value?, options?)`})}),(0,c.jsx)(t.td,{children:`Возвращает имя зарегистрированного пресета или кешируемый объектный пресет для ручного шаблона.`})]})]})]}),`
98
+ `,(0,c.jsxs)(t.p,{children:[`Для ручных шаблонов доступны константы `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_DATE_TOKENS`}),`,
99
+ `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TIME_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKENS`}),` и `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKEN_RE`}),`.
100
+ Поддерживаются только перечисленные токены; остальные фрагменты шаблона —
101
+ литеральный текст.`]}),`
102
+ `,(0,c.jsx)(t.h3,{id:`календарные-значения-и-диапазоны`,children:`Календарные значения и диапазоны`}),`
103
+ `,(0,c.jsxs)(t.p,{children:[`Эти функции работают с локальными компонентами `,(0,c.jsx)(t.code,{children:`Date`}),` и не добавляют UTC- или
104
+ timezone-семантику.`]}),`
105
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Результат / fallback`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createCalendarDate(year, monthIndex, day, hour?, minute?, second?, millisecond?)`})}),(0,c.jsxs)(t.td,{children:[`Новый локальный `,(0,c.jsx)(t.code,{children:`Date`}),`; `,(0,c.jsx)(t.code,{children:`monthIndex`}),` соответствует `,(0,c.jsx)(t.code,{children:`Date#getMonth()`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getStartOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getEndOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfMonth`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfYear`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfWeek(date, weekStartsOn?)`})]}),(0,c.jsx)(t.td,{children:`Новая дата с календарной границей; по умолчанию неделя начинается в понедельник.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`addCalendarDays`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarMonths`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarYears`})]}),(0,c.jsxs)(t.td,{children:[`Новый `,(0,c.jsx)(t.code,{children:`Date`}),`, сдвинутый в календарной семантике.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isSameCalendarDay(left, right)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`false`}),`, если любой аргумент не является `,(0,c.jsx)(t.code,{children:`Date`}),`; иначе сравнивает год, месяц, день.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getCalendarPeriod(value, { selectionMode?, weekEndDay? })`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`{ start, end } | null`}),`; режимы `,(0,c.jsx)(t.code,{children:`day`}),`, `,(0,c.jsx)(t.code,{children:`week`}),`, `,(0,c.jsx)(t.code,{children:`month`}),`, `,(0,c.jsx)(t.code,{children:`year`}),`, конец недели — `,(0,c.jsx)(t.code,{children:`friday`}),`, `,(0,c.jsx)(t.code,{children:`saturday`}),` или `,(0,c.jsx)(t.code,{children:`sunday`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isDateInsideCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`isCalendarPeriodWithinDateBounds`})]}),(0,c.jsxs)(t.td,{children:[`Проверяют включительные границы; при отсутствующих/невалидных данных возвращают `,(0,c.jsx)(t.code,{children:`false`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveDateRangePair(value)`})}),(0,c.jsxs)(t.td,{children:[`Упорядоченная пара дат или `,(0,c.jsx)(t.code,{children:`null`}),`; одиночная дата становится диапазоном из неё самой.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeDateRange(value, { timeMode? })`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DateRange | null`}),`; по умолчанию расширяет до границ суток, `,(0,c.jsx)(t.code,{children:`preserve`}),` сохраняет время и создаёт копии.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`requireDateRange(value, options?)`})}),(0,c.jsxs)(t.td,{children:[`Как `,(0,c.jsx)(t.code,{children:`normalizeDateRange`}),`, но при отсутствии диапазона выбрасывает `,(0,c.jsx)(t.code,{children:`Error`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`countCalendarDaysInDateRange(value)`})}),(0,c.jsxs)(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:`isValidDate`}),`, `,(0,c.jsx)(t.code,{children:`isDateRangeTuple`}),`, `,(0,c.jsx)(t.code,{children:`cloneDate`}),`, `,(0,c.jsx)(t.code,{children:`orderDates`})]}),(0,c.jsx)(t.td,{children:`Низкоуровневые guards и операции диапазона.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeDateRangeReferenceDate`}),`, `,(0,c.jsx)(t.code,{children:`resolveTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveYesterdayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthAgoRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToYesterdayRange`})]}),(0,c.jsxs)(t.td,{children:[`Относительные диапазоны от `,(0,c.jsx)(t.code,{children:`{ referenceDate }`}),`; на первом дне месяца «по вчера» не создаёт инверсию.`]})]})]})]}),`
106
+ `,(0,c.jsxs)(t.p,{children:[`Публичные типы диапазонов: `,(0,c.jsx)(t.code,{children:`CalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`CalendarPeriodOptions`}),`,
107
+ `,(0,c.jsx)(t.code,{children:`CalendarPeriodDateBounds`}),`, `,(0,c.jsx)(t.code,{children:`CalendarPeriodSelectionMode`}),`,
108
+ `,(0,c.jsx)(t.code,{children:`CalendarWeekEndDay`}),`, `,(0,c.jsx)(t.code,{children:`DateRange`}),`, `,(0,c.jsx)(t.code,{children:`NullableDateRange`}),`, `,(0,c.jsx)(t.code,{children:`DateRangeInput`}),`,
109
+ `,(0,c.jsx)(t.code,{children:`DateRangeTimeMode`}),`, `,(0,c.jsx)(t.code,{children:`NormalizeDateRangeOptions`}),`, `,(0,c.jsx)(t.code,{children:`DateRangeReferenceContext`}),`.`]}),`
110
+ `,(0,c.jsx)(t.h3,{id:`учебный-календарь`,children:`Учебный календарь`}),`
111
+ `,(0,c.jsxs)(t.p,{children:[`Для образовательной модели доступны `,(0,c.jsx)(t.code,{children:`EducationDateKey`}),` (`,(0,c.jsx)(t.code,{children:`YYYY-MM-DD`}),`),
112
+ `,(0,c.jsx)(t.code,{children:`EducationYearRange`}),` и `,(0,c.jsx)(t.code,{children:`EducationWeekRange`}),`.`]}),`
113
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`createEducationDateTime`})]}),(0,c.jsxs)(t.td,{children:[`Возвращают `,(0,c.jsx)(t.code,{children:`Date | null`}),` при неверном ключе или времени.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`formatEducationTimeKey`})]}),(0,c.jsxs)(t.td,{children:[`Создают стабильные локальные ключи `,(0,c.jsx)(t.code,{children:`YYYY-MM-DD`}),` и `,(0,c.jsx)(t.code,{children:`HH:mm`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getEducationYear`}),`, `,(0,c.jsx)(t.code,{children:`getEducationYearRange`}),`, `,(0,c.jsx)(t.code,{children:`isEducationDateInCurrentYear`})]}),(0,c.jsx)(t.td,{children:`Учебный год: 1 сентября — 31 августа.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getEducationWeekStartDate`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekRange`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekDays`}),`, `,(0,c.jsx)(t.code,{children:`getCurrentEducationWeekKey`})]}),(0,c.jsx)(t.td,{children:`Учебная неделя: понедельник — суббота; воскресенье относится к следующей.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`resolveEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`isCurrentEducationWeek`})]}),(0,c.jsxs)(t.td,{children:[`Невалидный или вне текущего учебного года ключ даёт `,(0,c.jsx)(t.code,{children:`undefined`}),`; `,(0,c.jsx)(t.code,{children:`resolve…`}),` вместо этого возвращает текущую неделю.`]})]})]})]}),`
114
+ `,(0,c.jsx)(t.h2,{id:`числа`,children:`Числа`}),`
115
+ `,(0,c.jsx)(t.h3,{id:`форматирование-и-пресеты`,children:`Форматирование и пресеты`}),`
116
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
117
+ formatNumber,
118
+ formatNumberAsDecimal2,
119
+ formatNumberAsIntegerOrEmpty,
120
+ registerNumberPreset
121
+ } from "@ryuzaki13/react-foundation-lib/formatters";
122
+
123
+ formatNumberAsDecimal2(12345.6); // "12\xA0345,60" в ru-RU
124
+ formatNumberAsIntegerOrEmpty("0"); // ""
125
+
126
+ registerNumberPreset({
127
+ name: "quantity-4",
128
+ decimals: 4,
129
+ grouping: false
130
+ });
131
+
132
+ formatNumber(12.5, "quantity-4"); // "12,5000"
133
+ `})}),`
134
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`formatNumber(value: unknown, presetOrName: string | NumberFormatPreset): string;
135
+ `})}),`
136
+ `,(0,c.jsxs)(t.p,{children:[`Форматирование использует `,(0,c.jsx)(t.code,{children:`Intl.NumberFormat("ru-RU")`}),`. Пустая строка,
137
+ `,(0,c.jsx)(t.code,{children:`NaN`}),`, `,(0,c.jsx)(t.code,{children:`Infinity`}),` и значения, которые `,(0,c.jsx)(t.code,{children:`Number(value)`}),` не может привести к
138
+ конечному числу, возвращают строку `,(0,c.jsx)(t.code,{children:`"0"`}),`. Неизвестное строковое имя пресета
139
+ выбрасывает `,(0,c.jsx)(t.code,{children:`Error`}),`.`]}),`
140
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`formatNumber`}),` не является SAP-парсером: переданная строка `,(0,c.jsx)(t.code,{children:`"1 234,5"`}),` не
141
+ обязана быть принята `,(0,c.jsx)(t.code,{children:`Number`}),`. Для такого входа сначала используйте
142
+ `,(0,c.jsx)(t.code,{children:`toFiniteNumber`}),` или `,(0,c.jsx)(t.code,{children:`parseNumber`}),`.`]}),`
143
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumberAsInteger`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsCurrency`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsPrice`})]}),(0,c.jsx)(t.td,{children:`Встроенные пресеты с нулевой дробной частью. Валютный знак не добавляется.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumberAsDecimal`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsDecimal2`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsDecimal3`})]}),(0,c.jsx)(t.td,{children:`Один, два или три знака после запятой.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumberAsPercent`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsTonnage`})]}),(0,c.jsxs)(t.td,{children:[`Встроенные пресеты с двумя и одним знаком соответственно; знак `,(0,c.jsx)(t.code,{children:`%`}),` не добавляется.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumberAsIntegerOrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsCurrencyOrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsDecimalOrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsDecimal2OrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsDecimal3OrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsPercentOrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsPriceOrEmpty`}),`, `,(0,c.jsx)(t.code,{children:`formatNumberAsTonnageOrEmpty`})]}),(0,c.jsxs)(t.td,{children:[`Сначала проверяют семантический ноль; для него возвращают `,(0,c.jsx)(t.code,{children:`""`}),`, иначе используют одноимённый форматтер.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`truncateNumber(number, decimals)`})}),(0,c.jsx)(t.td,{children:`Усечение дробной части математически, без форматирования и без проверки аргументов.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`clearFormatCache()`})}),(0,c.jsxs)(t.td,{children:[`Очищает module-scoped кеш `,(0,c.jsx)(t.code,{children:`Intl.NumberFormat`}),`; обычно нужен только для тестов или смены изолированного окружения.`]})]})]})]}),`
144
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`DEFAULT_NUMBER_PRESET_NAMES`}),` содержит: `,(0,c.jsx)(t.code,{children:`integer`}),`, `,(0,c.jsx)(t.code,{children:`decimal`}),`, `,(0,c.jsx)(t.code,{children:`decimal-2`}),`,
145
+ `,(0,c.jsx)(t.code,{children:`decimal-3`}),`, `,(0,c.jsx)(t.code,{children:`currency`}),`, `,(0,c.jsx)(t.code,{children:`price`}),`, `,(0,c.jsx)(t.code,{children:`percent`}),`, `,(0,c.jsx)(t.code,{children:`tonnage`}),`,
146
+ `,(0,c.jsx)(t.code,{children:`compact-currency`}),`, `,(0,c.jsx)(t.code,{children:`compact-currency-round`}),`, `,(0,c.jsx)(t.code,{children:`compact-percent`}),`,
147
+ `,(0,c.jsx)(t.code,{children:`compact-percent-round`}),`, `,(0,c.jsx)(t.code,{children:`compact-tonnage`}),`, `,(0,c.jsx)(t.code,{children:`compact-tonnage-round`}),`.
148
+ Компактность задаётся через поле `,(0,c.jsx)(t.code,{children:`compact`}),` самого пресета: при значении от
149
+ 1000 по умолчанию используются суффиксы `,(0,c.jsx)(t.code,{children:`тыс`}),`, `,(0,c.jsx)(t.code,{children:`млн`}),`, `,(0,c.jsx)(t.code,{children:`млрд`}),`, `,(0,c.jsx)(t.code,{children:`трлн`}),`.`]}),`
150
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API / тип`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`NUMBER_FORMAT_DEFAULTS`})}),(0,c.jsxs)(t.td,{children:[`Базовые значения: один знак, `,(0,c.jsx)(t.code,{children:`,`}),`, группировка ru-RU, размер группы 3.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`NumberFormatPreset`}),`, `,(0,c.jsx)(t.code,{children:`NumberFormatPresetConfig`})]}),(0,c.jsx)(t.td,{children:`Контракт пресета и конфигурации регистрации.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`NumberFormatCompactOptions`}),`, `,(0,c.jsx)(t.code,{children:`NumberFormatCompactUnit`}),`, `,(0,c.jsx)(t.code,{children:`NumberFormatCompactRoundingMode`})]}),(0,c.jsxs)(t.td,{children:[`Настройки compact-представления: минимум, дробная часть, режим `,(0,c.jsx)(t.code,{children:`round`}),` / `,(0,c.jsx)(t.code,{children:`floor`}),` / `,(0,c.jsx)(t.code,{children:`ceil`}),` / `,(0,c.jsx)(t.code,{children:`trunc`}),`, суффиксы и единицы.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getNumberPreset(name)`}),`, `,(0,c.jsx)(t.code,{children:`getNumberPresetNames()`})]}),(0,c.jsxs)(t.td,{children:[`Чтение пресета или `,(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:`registerNumberPreset(config)`})}),(0,c.jsxs)(t.td,{children:[`Регистрирует или перезаписывает пресет, дополняя отсутствующие поля `,(0,c.jsx)(t.code,{children:`NUMBER_FORMAT_DEFAULTS`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resetNumberPresets()`})}),(0,c.jsx)(t.td,{children:`Возвращает только встроенные пресеты; не вызывайте в работающем приложении.`})]})]})]}),`
151
+ `,(0,c.jsx)(t.h3,{id:`разбор-и-проверки`,children:`Разбор и проверки`}),`
152
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { isPositiveValue, parseNumber, toFiniteNumber, toPositiveInteger } from "@ryuzaki13/react-foundation-lib/formatters";
153
+
154
+ toFiniteNumber("1\xA0234,50"); // 1234.5
155
+ parseNumber("не число"); // 0
156
+ toPositiveInteger("12"); // 12
157
+ isPositiveValue("0"); // false
158
+ `})}),`
159
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Fallback`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`toFiniteNumber(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`number | undefined`}),`. Поддерживает пробелы, NBSP, узкий NBSP и `,(0,c.jsx)(t.code,{children:`'`}),` как группировку; запятую как десятичный разделитель.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseNumber(value)`})}),(0,c.jsxs)(t.td,{children:[`Как `,(0,c.jsx)(t.code,{children:`toFiniteNumber`}),`, но возвращает `,(0,c.jsx)(t.code,{children:`0`}),` вместо `,(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:`toPositiveInteger(value)`})}),(0,c.jsxs)(t.td,{children:[`Положительное целое или `,(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:`isPositiveValue(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`true`}),` только для конечного значения строго больше нуля.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isZeroValue(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`true`}),` для значений, семантически равных нулю; используется вариантами `,(0,c.jsx)(t.code,{children:`…OrEmpty`}),`.`]})]})]})]}),`
160
+ `,(0,c.jsx)(t.h2,{id:`строки`,children:`Строки`}),`
161
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { formatRussianPlural } from "@ryuzaki13/react-foundation-lib/formatters";
162
+
163
+ const elementForms = {
164
+ one: "элемент",
165
+ few: "элемента",
166
+ many: "элементов"
167
+ };
168
+
169
+ formatRussianPlural(1, elementForms); // "1 элемент"
170
+ formatRussianPlural(2, elementForms); // "2 элемента"
171
+ formatRussianPlural(7, elementForms); // "7 элементов"
172
+ `})}),`
173
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Вход, результат и fallback`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`selectRussianPluralForm(value, forms)`})}),(0,c.jsxs)(t.td,{children:[`Выбирает полную русскую форму `,(0,c.jsx)(t.code,{children:`one`}),`, `,(0,c.jsx)(t.code,{children:`few`}),`, `,(0,c.jsx)(t.code,{children:`many`}),` или `,(0,c.jsx)(t.code,{children:`other`}),`; для дробного значения без `,(0,c.jsx)(t.code,{children:`other`}),` использует `,(0,c.jsx)(t.code,{children:`few`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatRussianPlural(value, forms)`})}),(0,c.jsx)(t.td,{children:`Возвращает исходное количество и выбранную форму через пробел; не округляет и не форматирует число отдельно.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeText(value)`})}),(0,c.jsxs)(t.td,{children:[`Обрезанная непустая строка или `,(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:`normalizeTextWithFallback(value, fallback = "")`})}),(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:`normalizeRequiredText(value)`})}),(0,c.jsxs)(t.td,{children:[`Нормализованный текст или `,(0,c.jsx)(t.code,{children:`""`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeTextToLower(value)`})}),(0,c.jsxs)(t.td,{children:[`Нормализованный текст в нижнем регистре или `,(0,c.jsx)(t.code,{children:`""`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeTextSpaces(value)`})}),(0,c.jsx)(t.td,{children:`Убирает пробелы по краям и сворачивает пробельные символы, NBSP и узкие NBSP в один обычный пробел.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`toSafeString(value)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`""`}),` для `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),`, иначе `,(0,c.jsx)(t.code,{children:`String(value)`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`stripInnerSpaces(value)`})}),(0,c.jsx)(t.td,{children:`Удаляет только обычные, неразрывные и узкие неразрывные пробелы внутри строки.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`stripLeadingZeros(value)`})}),(0,c.jsx)(t.td,{children:`Для целых цифровых строк удаляет ведущие нули, оставляя один ноль; поддерживает минус. Нечисловая строка возвращается с обрезанными краями.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`startsWithIgnoringZeros(value, searchText)`})}),(0,c.jsx)(t.td,{children:`Case-insensitive проверка префикса после удаления ведущих нулей у обеих строк.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`truncateText(value, maxLength)`})}),(0,c.jsxs)(t.td,{children:[`Обрезает нормализованный текст и добавляет `,(0,c.jsx)(t.code,{children:`...`}),`; пустой/невалидный текст даёт `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]})]})]})]}),`
174
+ `,(0,c.jsx)(t.h2,{id:`логические-значения-abap`,children:`Логические значения ABAP`}),`
175
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { parseAbapBoolean, parseBoolean, toAbapBoolean } from "@ryuzaki13/react-foundation-lib/formatters";
176
+
177
+ parseAbapBoolean("X"); // true
178
+ parseBoolean("true"); // true
179
+ toAbapBoolean(false); // " "
180
+ `})}),`
181
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseAbapBoolean(value)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`true`}),` только для строкового точного `,(0,c.jsx)(t.code,{children:`"X"`}),`; всё остальное — `,(0,c.jsx)(t.code,{children:`false`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseBoolean(value)`})}),(0,c.jsxs)(t.td,{children:[`Для строк регистронезависимо принимает `,(0,c.jsx)(t.code,{children:`"true"`}),`, `,(0,c.jsx)(t.code,{children:`"x"`}),`, `,(0,c.jsx)(t.code,{children:`"1"`}),`; для остальных значений использует JS truthiness.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`toAbapBoolean(value)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает ABAP `,(0,c.jsx)(t.code,{children:`"X"`}),` или `,(0,c.jsx)(t.code,{children:`" "`}),`. Строка `,(0,c.jsx)(t.code,{children:`"0"`}),` — ложь; любая другая строка, включая `,(0,c.jsx)(t.code,{children:`""`}),`, — истина.`]})]})]})]}),`
182
+ `,(0,c.jsx)(t.h2,{id:`фио-телефон-и-ведущие-нули`,children:`ФИО, телефон и ведущие нули`}),`
183
+ `,(0,c.jsx)(t.h3,{id:`фио-и-телефон`,children:`ФИО и телефон`}),`
184
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { clearPhone, formatFullName, formatPhone, formatShortName } from "@ryuzaki13/react-foundation-lib/formatters";
185
+
186
+ formatFullName(" иванов иван иванович "); // "Иванов Иван Иванович"
187
+ formatShortName("иванов иван иванович"); // "Иванов И.И."
188
+ formatPhone("8 (912) 345-67-89"); // "+7 (912) 345-67-89"
189
+ `})}),`
190
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Ограничения и fallback`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatFullName(fullName)`})}),(0,c.jsx)(t.td,{children:`Нормализует пробелы, нижний регистр и регистр первых трёх частей. Это presentation helper, а не валидатор ФИО; дополнительные части игнорируются.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatShortName(fullName)`})}),(0,c.jsxs)(t.td,{children:[`Показывает фамилию и одну/две инициалы. Пустая строка даёт `,(0,c.jsx)(t.code,{children:`""`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`clearPhone(number)`})}),(0,c.jsxs)(t.td,{children:[`Оставляет цифры, ограничивает ввод первыми 11 цифрами, приводит начальный `,(0,c.jsx)(t.code,{children:`7`}),`/`,(0,c.jsx)(t.code,{children:`8`}),` к `,(0,c.jsx)(t.code,{children:`+7`}),`. Предназначен для российских номеров.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatPhone(number)`})}),(0,c.jsxs)(t.td,{children:[`Форматирует только полный нормализованный номер `,(0,c.jsx)(t.code,{children:`+7`}),` и 10 цифр. Если после очистки номер неполный, возвращает исходную строку без изменений.`]})]})]})]}),`
191
+ `,(0,c.jsx)(t.h3,{id:`числовые-идентификаторы`,children:`Числовые идентификаторы`}),`
192
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { normalizeLeadingZeros, normalizeLeadingZerosStrict } from "@ryuzaki13/react-foundation-lib/formatters";
193
+
194
+ normalizeLeadingZeros("0012", 5); // "00012"
195
+ normalizeLeadingZerosStrict("0012", -1); // "12"
196
+ normalizeLeadingZerosStrict("12,5", 4); // "0012,5"
197
+ `})}),`
198
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeLeadingZeros(value, fixed?)`})}),(0,c.jsxs)(t.td,{children:[`Приводит конечное числовое значение через `,(0,c.jsx)(t.code,{children:`Number`}),` к строке; при `,(0,c.jsx)(t.code,{children:`fixed > 0`}),` дополняет целую часть нулями. Нечисловое/бесконечное значение возвращает как есть. Поэтому этот вариант может изменить строковое представление и тип результата.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeLeadingZerosStrict(value, fixed?)`})}),(0,c.jsxs)(t.td,{children:[`Сохраняет тип `,(0,c.jsx)(t.code,{children:`T`}),`: при `,(0,c.jsx)(t.code,{children:`fixed`}),` отсутствующем, нулевом или не конечном — no-op; при `,(0,c.jsx)(t.code,{children:`fixed < 0`}),` удаляет нули в целой части строки, при `,(0,c.jsx)(t.code,{children:`fixed > 0`}),` дополняет. Не распознанная числовая строка возвращается без изменений. Для `,(0,c.jsx)(t.code,{children:`number`}),` ведущие нули представить невозможно, поэтому результат остаётся числом.`]})]})]})]}),`
199
+ `,(0,c.jsxs)(t.p,{children:[`Для пользовательского draft не вызывайте нормализацию во время ввода. Храните
200
+ буквальное значение, а `,(0,c.jsx)(t.code,{children:`normalizeLeadingZerosStrict`}),` применяйте только на
201
+ явной границе сохранения или восстановления, если это действительно часть
202
+ контракта данных.`]})]})}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-C0FnF6B9.js";import{n as t}from"./iframe-BOYfiRbQ.js";import{i as n,r}from"./react-qN2cStNd.js";import{l as i,m as a}from"./blocks-DFQ7gHL7.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Formatters Runtime`}),`
1
+ import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-CyRHAH4o.js";import{i as n,r}from"./react-qN2cStNd.js";import{l as i,m as a}from"./blocks-BAkpxLLq.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/Formatters Runtime`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`runtime-форматтеров-pipeline-row-based-и-value-state`,children:`Runtime форматтеров: pipeline, row-based и value state`}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Эта страница описывает конфигурируемый runtime из
4
4
  `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formatters`}),`. Он предназначен для host-кода,
@@ -28,12 +28,7 @@ import type {
28
28
  plan?: FormattersPipelinePlan;
29
29
  };
30
30
  `})}),`
31
- `,(0,c.jsxs)(t.p,{children:[`| Представление | Для чего хранится | Содержимое |
32
- | -------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------- |
33
- | `,(0,c.jsx)(t.code,{children:`graph`}),` | Редактор настройки | Узлы, рёбра и необязательный `,(0,c.jsx)(t.code,{children:`viewport`}),`. Граф обязан быть линейным от `,(0,c.jsx)(t.code,{children:`source`}),` к `,(0,c.jsx)(t.code,{children:`sink`}),`. |
34
- | `,(0,c.jsx)(t.code,{children:`plan`}),` | Быстрое выполнение | Массив последовательных шагов без координат. Если он валиден, у него приоритет над `,(0,c.jsx)(t.code,{children:`graph`}),`. |
35
- | `,(0,c.jsx)(t.code,{children:`FormattersPipelineExecutor`}),` | Только runtime | Функция `,(0,c.jsx)(t.code,{children:`execute`}),` и флаги. Появляется после компиляции, не сериализуется. |
36
- | `,(0,c.jsx)(t.code,{children:`FormattersPipelineRuntimeField`}),` | Construction-stage объекта поля | Содержит пользовательский конфиг и может получить `,(0,c.jsx)(t.code,{children:`formulaExecutor`}),` / `,(0,c.jsx)(t.code,{children:`formattersPipelineExecutor`}),`. |`]}),`
31
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Представление`}),(0,c.jsx)(t.th,{children:`Для чего хранится`}),(0,c.jsx)(t.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:`graph`})}),(0,c.jsx)(t.td,{children:`Редактор настройки`}),(0,c.jsxs)(t.td,{children:[`Узлы, рёбра и необязательный `,(0,c.jsx)(t.code,{children:`viewport`}),`. Граф обязан быть линейным от `,(0,c.jsx)(t.code,{children:`source`}),` к `,(0,c.jsx)(t.code,{children:`sink`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`plan`})}),(0,c.jsx)(t.td,{children:`Быстрое выполнение`}),(0,c.jsxs)(t.td,{children:[`Массив последовательных шагов без координат. Если он валиден, у него приоритет над `,(0,c.jsx)(t.code,{children:`graph`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FormattersPipelineExecutor`})}),(0,c.jsx)(t.td,{children:`Только runtime`}),(0,c.jsxs)(t.td,{children:[`Функция `,(0,c.jsx)(t.code,{children:`execute`}),` и флаги. Появляется после компиляции, не сериализуется.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`FormattersPipelineRuntimeField`})}),(0,c.jsx)(t.td,{children:`Construction-stage объекта поля`}),(0,c.jsxs)(t.td,{children:[`Содержит пользовательский конфиг и может получить `,(0,c.jsx)(t.code,{children:`formulaExecutor`}),` / `,(0,c.jsx)(t.code,{children:`formattersPipelineExecutor`}),`.`]})]})]})]}),`
37
32
  `,(0,c.jsx)(t.p,{children:`Безопасный порядок работы:`}),`
38
33
  `,(0,c.jsxs)(t.ol,{children:[`
39
34
  `,(0,c.jsx)(t.li,{children:`Создать или восстановить конфиг как обычные JSON-данные.`}),`
@@ -116,12 +111,7 @@ const display = formatPipelineDisplayValue({
116
111
  `})}),`
117
112
  `,(0,c.jsx)(t.h2,{id:`шаги-pipeline`,children:`Шаги pipeline`}),`
118
113
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`FormattersPipelineFormatterId`}),` допускает только четыре значения.`]}),`
119
- `,(0,c.jsxs)(t.p,{children:[`| Шаг | Конфигурация | Выполнение и fallback |
120
- | ----------------------- | ------------------------------------------- | ------------------------------------------------------------- |
121
- | `,(0,c.jsx)(t.code,{children:`normalizeLeadingZeros`}),` | `,(0,c.jsx)(t.code,{children:`{ fixed?: number }`}),` | Передаёт текущее значение в `,(0,c.jsx)(t.code,{children:`normalizeLeadingZeros`}),`. |
122
- | `,(0,c.jsx)(t.code,{children:`rowBasedOverride`}),` | field- или formula-вариант ниже | Подменяет текущее значение данными строки. |
123
- | `,(0,c.jsx)(t.code,{children:`resolveValueState`}),` | fixed/threshold resolver и настройки иконки | Вычисляет `,(0,c.jsx)(t.code,{children:`state`}),`, `,(0,c.jsx)(t.code,{children:`showIcon`}),`, `,(0,c.jsx)(t.code,{children:`showValue`}),`, `,(0,c.jsx)(t.code,{children:`iconPosition`}),`. |
124
- | `,(0,c.jsx)(t.code,{children:`typedValueFormat`}),` | `,(0,c.jsx)(t.code,{children:`{ numberPresetName?, datePresetName? }`}),` | Форматирует итог по OData-type поля: number, date или строка. |`]}),`
114
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Шаг`}),(0,c.jsx)(t.th,{children:`Конфигурация`}),(0,c.jsx)(t.th,{children:`Выполнение и fallback`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeLeadingZeros`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`{ fixed?: number }`})}),(0,c.jsxs)(t.td,{children:[`Передаёт текущее значение в `,(0,c.jsx)(t.code,{children:`normalizeLeadingZeros`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`rowBasedOverride`})}),(0,c.jsx)(t.td,{children:`field- или formula-вариант ниже`}),(0,c.jsx)(t.td,{children:`Подменяет текущее значение данными строки.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveValueState`})}),(0,c.jsx)(t.td,{children:`fixed/threshold resolver и настройки иконки`}),(0,c.jsxs)(t.td,{children:[`Вычисляет `,(0,c.jsx)(t.code,{children:`state`}),`, `,(0,c.jsx)(t.code,{children:`showIcon`}),`, `,(0,c.jsx)(t.code,{children:`showValue`}),`, `,(0,c.jsx)(t.code,{children:`iconPosition`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`typedValueFormat`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`{ numberPresetName?, datePresetName? }`})}),(0,c.jsx)(t.td,{children:`Форматирует итог по OData-type поля: number, date или строка.`})]})]})]}),`
125
115
  `,(0,c.jsx)(t.p,{children:`Ограничения валидатора:`}),`
126
116
  `,(0,c.jsxs)(t.ul,{children:[`
127
117
  `,(0,c.jsx)(t.li,{children:`В плане разрешён не более чем один шаг каждого вида.`}),`
@@ -156,10 +146,7 @@ const display = formatPipelineDisplayValue({
156
146
  fallbackToRaw?: boolean;
157
147
  };
158
148
  `})}),`
159
- `,(0,c.jsxs)(t.p,{children:[`| Режим | Источник значения | Семантика по типу строки |
160
- | --------- | ---------------------------------- | ----------------------------------------------------------------- |
161
- | `,(0,c.jsx)(t.code,{children:`field`}),` | `,(0,c.jsx)(t.code,{children:`rowData[fieldKey]`}),` | Работает для `,(0,c.jsx)(t.code,{children:`plain`}),`, `,(0,c.jsx)(t.code,{children:`tree`}),`, `,(0,c.jsx)(t.code,{children:`group`}),`; не применяется к `,(0,c.jsx)(t.code,{children:`totals`}),`. |
162
- | `,(0,c.jsx)(t.code,{children:`formula`}),` | `,(0,c.jsx)(t.code,{children:`fn(context)`}),` из row-based реестра | Работает для `,(0,c.jsx)(t.code,{children:`plain`}),`, `,(0,c.jsx)(t.code,{children:`tree`}),`, `,(0,c.jsx)(t.code,{children:`group`}),` и `,(0,c.jsx)(t.code,{children:`totals`}),`. |`]}),`
149
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Режим`}),(0,c.jsx)(t.th,{children:`Источник значения`}),(0,c.jsx)(t.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:`field`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`rowData[fieldKey]`})}),(0,c.jsxs)(t.td,{children:[`Работает для `,(0,c.jsx)(t.code,{children:`plain`}),`, `,(0,c.jsx)(t.code,{children:`tree`}),`, `,(0,c.jsx)(t.code,{children:`group`}),`; не применяется к `,(0,c.jsx)(t.code,{children:`totals`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formula`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`fn(context)`}),` из row-based реестра`]}),(0,c.jsxs)(t.td,{children:[`Работает для `,(0,c.jsx)(t.code,{children:`plain`}),`, `,(0,c.jsx)(t.code,{children:`tree`}),`, `,(0,c.jsx)(t.code,{children:`group`}),` и `,(0,c.jsx)(t.code,{children:`totals`}),`.`]})]})]})]}),`
163
150
  `,(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:`fallbackToRaw`}),` по умолчанию
164
151
  сохраняет предыдущее значение. При `,(0,c.jsx)(t.code,{children:`fallbackToRaw: false`}),` это значение
165
152
  допускается как новый результат. Ошибка formula в executor не пробрасывается:
@@ -187,37 +174,18 @@ configureRowBasedFormatterRegistry(
187
174
  ])
188
175
  );
189
176
  `})}),`
190
- `,(0,c.jsxs)(t.p,{children:[`| API | Контракт |
191
- | ---------------------------------------------- | ---------------------------------------------------------------------------------------- |
192
- | `,(0,c.jsx)(t.code,{children:`createRowBasedFormatterRegistry(definitions)`}),` | Возвращает immutable registry. Бросает `,(0,c.jsx)(t.code,{children:`Error`}),` для пустого `,(0,c.jsx)(t.code,{children:`id`}),` или дубликата. |
193
- | `,(0,c.jsx)(t.code,{children:`configureRowBasedFormatterRegistry(registry)`}),` | Подменяет активный module-scoped реестр. Не вызывайте повторно в обычном rendering flow. |
194
- | `,(0,c.jsx)(t.code,{children:`getRowBasedFormatterList()`}),` | Список доступных host-формул. |
195
- | `,(0,c.jsx)(t.code,{children:`getRowBasedFormatterById(id)`}),` | Формула или `,(0,c.jsx)(t.code,{children:`undefined`}),` для пустого/неизвестного id. |
196
- | `,(0,c.jsx)(t.code,{children:`createRowBasedFormatterContext(args)`}),` | Создаёт контекст для прямого запуска formula или теста. |`]}),`
177
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Контракт`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createRowBasedFormatterRegistry(definitions)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает immutable registry. Бросает `,(0,c.jsx)(t.code,{children:`Error`}),` для пустого `,(0,c.jsx)(t.code,{children:`id`}),` или дубликата.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`configureRowBasedFormatterRegistry(registry)`})}),(0,c.jsx)(t.td,{children:`Подменяет активный module-scoped реестр. Не вызывайте повторно в обычном rendering flow.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getRowBasedFormatterList()`})}),(0,c.jsx)(t.td,{children:`Список доступных host-формул.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getRowBasedFormatterById(id)`})}),(0,c.jsxs)(t.td,{children:[`Формула или `,(0,c.jsx)(t.code,{children:`undefined`}),` для пустого/неизвестного id.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createRowBasedFormatterContext(args)`})}),(0,c.jsx)(t.td,{children:`Создаёт контекст для прямого запуска formula или теста.`})]})]})]}),`
197
178
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`RowBasedFormatterDefinition`}),` содержит `,(0,c.jsx)(t.code,{children:`id`}),`, `,(0,c.jsx)(t.code,{children:`name`}),`, `,(0,c.jsx)(t.code,{children:`description`}),`,
198
179
  `,(0,c.jsx)(t.code,{children:`fn`}),`. `,(0,c.jsx)(t.code,{children:`RowBasedFormatterContext`}),` содержит `,(0,c.jsx)(t.code,{children:`rowData`}),`, `,(0,c.jsx)(t.code,{children:`rawValue`}),`, `,(0,c.jsx)(t.code,{children:`columnId`}),`
199
180
  и методы:`]}),`
200
- `,(0,c.jsxs)(t.p,{children:[`| Метод | Результат |
201
- | -------------- | --------------------------------------------------------------------------- |
202
- | `,(0,c.jsx)(t.code,{children:`key(index)`}),` | ID зависимости или `,(0,c.jsx)(t.code,{children:`undefined`}),` для некорректного/вне диапазона индекса. |
203
- | `,(0,c.jsx)(t.code,{children:`value(index)`}),` | Значение `,(0,c.jsx)(t.code,{children:`rowData`}),` зависимости или `,(0,c.jsx)(t.code,{children:`undefined`}),`. |
204
- | `,(0,c.jsx)(t.code,{children:`num(index)`}),` | `,(0,c.jsx)(t.code,{children:`parseNumber`}),` значения зависимости; при отсутствии/невалидном значении `,(0,c.jsx)(t.code,{children:`0`}),`. |`]}),`
181
+ `,(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:`key(index)`})}),(0,c.jsxs)(t.td,{children:[`ID зависимости или `,(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:`value(index)`})}),(0,c.jsxs)(t.td,{children:[`Значение `,(0,c.jsx)(t.code,{children:`rowData`}),` зависимости или `,(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:`num(index)`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseNumber`}),` значения зависимости; при отсутствии/невалидном значении `,(0,c.jsx)(t.code,{children:`0`}),`.`]})]})]})]}),`
205
182
  `,(0,c.jsxs)(t.p,{children:[`Формула должна быть синхронной и не должна полагаться на DOM, React state или
206
183
  неявные внешние данные. Валидация запускает её на тестовых положительных и
207
184
  отрицательных значениях, чтобы обнаружить недостающие/неиспользуемые
208
185
  `,(0,c.jsx)(t.code,{children:`dependencyIds`}),` и потенциальную runtime-ошибку. Это диагностический прогон, а
209
186
  не гарантия корректности для всех данных.`]}),`
210
187
  `,(0,c.jsx)(t.h2,{id:`проверка-нормализация-копирование-и-новые-id`,children:`Проверка, нормализация, копирование и новые ID`}),`
211
- `,(0,c.jsxs)(t.p,{children:[`| API | Когда вызывать | Результат |
212
- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
213
- | `,(0,c.jsx)(t.code,{children:`validateFormattersPipelinePlan(plan)`}),` | Перед сохранением/компиляцией готового линейного плана. | `,(0,c.jsx)(t.code,{children:`FormattersPipelineValidationResult`}),` с `,(0,c.jsx)(t.code,{children:`ok`}),`, `,(0,c.jsx)(t.code,{children:`errors`}),`, `,(0,c.jsx)(t.code,{children:`warnings`}),` и безопасным `,(0,c.jsx)(t.code,{children:`plan`}),` только при успехе. |
214
- | `,(0,c.jsx)(t.code,{children:`validateFormattersPipelineGraph(graph)`}),` | Для editor graph. | Проверяет структуру и строит линейный `,(0,c.jsx)(t.code,{children:`plan`}),`. |
215
- | `,(0,c.jsx)(t.code,{children:`validateFormattersPipelineConfig(config)`}),` | Основная проверка конфигурации. | Валидный `,(0,c.jsx)(t.code,{children:`plan`}),` имеет приоритет; если он невалиден и есть `,(0,c.jsx)(t.code,{children:`graph`}),`, выполняется попытка построения по графу с warning. |
216
- | `,(0,c.jsx)(t.code,{children:`normalizeFormattersPipelineConfig(unknownValue)`}),` | На внешней restore/save boundary. | Возвращает валидный независимый `,(0,c.jsx)(t.code,{children:`FormattersPipelineConfig`}),` или `,(0,c.jsx)(t.code,{children:`undefined`}),`; не исправляет невалидные данные «по умолчанию». |
217
- | `,(0,c.jsx)(t.code,{children:`cloneFormattersPipelineConfig(config)`}),` | Для literal draft, setter или безопасного переноса конфигурации. | Глубокая независимая копия или `,(0,c.jsx)(t.code,{children:`undefined`}),`; не валидирует и не нормализует. |
218
- | `,(0,c.jsx)(t.code,{children:`cloneTypedValueFormatConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneNormalizeLeadingZerosConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneRowBasedOverrideConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneResolveValueStateConfig`}),` | Для узких UI-операций редактора. | Копия соответствующего вложенного конфига. |
219
- | `,(0,c.jsx)(t.code,{children:`cloneFormatterPipelinePlanStep`}),`, `,(0,c.jsx)(t.code,{children:`cloneFormatterPipelinePlanStepToNode`}),` | При преобразовании plan-шага в editor node. | Независимый step или node с заданной позицией. |
220
- | `,(0,c.jsx)(t.code,{children:`rekeyFormattersPipelineConfig(config, idFactory?)`}),` | Только при создании независимой копии для нового редактора/сущности. | Переиздаёт технические id пользовательских step/node и рёбер; `,(0,c.jsx)(t.code,{children:`source`}),`/`,(0,c.jsx)(t.code,{children:`sink`}),` сохраняют id. По умолчанию использует UUID. |`]}),`
188
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Когда вызывать`}),(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:`validateFormattersPipelinePlan(plan)`})}),(0,c.jsx)(t.td,{children:`Перед сохранением/компиляцией готового линейного плана.`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`FormattersPipelineValidationResult`}),` с `,(0,c.jsx)(t.code,{children:`ok`}),`, `,(0,c.jsx)(t.code,{children:`errors`}),`, `,(0,c.jsx)(t.code,{children:`warnings`}),` и безопасным `,(0,c.jsx)(t.code,{children:`plan`}),` только при успехе.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`validateFormattersPipelineGraph(graph)`})}),(0,c.jsx)(t.td,{children:`Для editor graph.`}),(0,c.jsxs)(t.td,{children:[`Проверяет структуру и строит линейный `,(0,c.jsx)(t.code,{children:`plan`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`validateFormattersPipelineConfig(config)`})}),(0,c.jsx)(t.td,{children:`Основная проверка конфигурации.`}),(0,c.jsxs)(t.td,{children:[`Валидный `,(0,c.jsx)(t.code,{children:`plan`}),` имеет приоритет; если он невалиден и есть `,(0,c.jsx)(t.code,{children:`graph`}),`, выполняется попытка построения по графу с warning.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeFormattersPipelineConfig(unknownValue)`})}),(0,c.jsx)(t.td,{children:`На внешней restore/save boundary.`}),(0,c.jsxs)(t.td,{children:[`Возвращает валидный независимый `,(0,c.jsx)(t.code,{children:`FormattersPipelineConfig`}),` или `,(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:`cloneFormattersPipelineConfig(config)`})}),(0,c.jsx)(t.td,{children:`Для literal draft, setter или безопасного переноса конфигурации.`}),(0,c.jsxs)(t.td,{children:[`Глубокая независимая копия или `,(0,c.jsx)(t.code,{children:`undefined`}),`; не валидирует и не нормализует.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`cloneTypedValueFormatConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneNormalizeLeadingZerosConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneRowBasedOverrideConfig`}),`, `,(0,c.jsx)(t.code,{children:`cloneResolveValueStateConfig`})]}),(0,c.jsx)(t.td,{children:`Для узких UI-операций редактора.`}),(0,c.jsx)(t.td,{children:`Копия соответствующего вложенного конфига.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`cloneFormatterPipelinePlanStep`}),`, `,(0,c.jsx)(t.code,{children:`cloneFormatterPipelinePlanStepToNode`})]}),(0,c.jsx)(t.td,{children:`При преобразовании plan-шага в editor node.`}),(0,c.jsx)(t.td,{children:`Независимый step или node с заданной позицией.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`rekeyFormattersPipelineConfig(config, idFactory?)`})}),(0,c.jsx)(t.td,{children:`Только при создании независимой копии для нового редактора/сущности.`}),(0,c.jsxs)(t.td,{children:[`Переиздаёт технические id пользовательских step/node и рёбер; `,(0,c.jsx)(t.code,{children:`source`}),`/`,(0,c.jsx)(t.code,{children:`sink`}),` сохраняют id. По умолчанию использует UUID.`]})]})]})]}),`
221
189
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`FormattersPipelineValidationMessage`}),` содержит машинный `,(0,c.jsx)(t.code,{children:`code`}),` и русское
222
190
  `,(0,c.jsx)(t.code,{children:`message`}),`; не распознавайте проблему по тексту сообщения. Для UI удобно
223
191
  показывать `,(0,c.jsx)(t.code,{children:`errors`}),`, а `,(0,c.jsx)(t.code,{children:`warnings`}),` отображать как необязательные рекомендации.`]}),`
@@ -261,22 +229,13 @@ formatTypedCellValue(12.5, { role: "measure", type: "decimal" });
261
229
  надо исправить порядок bootstrap и зарегистрировать formula, а не подменять
262
230
  её локальной функцией в сериализуемом конфиге.`]}),`
263
231
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`formatTypedCellValue(value, column, config?)`}),` работает и без pipeline:`]}),`
264
- `,(0,c.jsxs)(t.p,{children:[`| Базовый OData-type | Поведение |
265
- | --------------------- | ------------------------------------------------------- |
266
- | Число | `,(0,c.jsx)(t.code,{children:`formatNumber`}),`; default preset `,(0,c.jsx)(t.code,{children:`decimal`}),`. |
267
- | Дата | `,(0,c.jsx)(t.code,{children:`parseDate`}),`, затем `,(0,c.jsx)(t.code,{children:`formatDate`}),`; default preset `,(0,c.jsx)(t.code,{children:`date`}),`. |
268
- | Остальное | `,(0,c.jsx)(t.code,{children:`toSafeString`}),`. |
269
- | Небезопасное значение | Пустая строка. |`]}),`
232
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Базовый OData-type`}),(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.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatNumber`}),`; default preset `,(0,c.jsx)(t.code,{children:`decimal`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Дата`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseDate`}),`, затем `,(0,c.jsx)(t.code,{children:`formatDate`}),`; default preset `,(0,c.jsx)(t.code,{children:`date`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Остальное`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`toSafeString`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Небезопасное значение`}),(0,c.jsx)(t.td,{children:`Пустая строка.`})]})]})]}),`
270
233
  `,(0,c.jsxs)(t.p,{children:[`Для прямого вызова неизвестное имя number/date-пресета заменяется default
271
234
  пресетом. В полноценном pipeline валидатор отдельно делает неизвестный или
272
235
  пустой `,(0,c.jsx)(t.code,{children:`numberPresetName`}),` ошибкой; неизвестный `,(0,c.jsx)(t.code,{children:`datePresetName`}),` в runtime
273
236
  безопасно даёт preset `,(0,c.jsx)(t.code,{children:`date`}),`.`]}),`
274
237
  `,(0,c.jsx)(t.h3,{id:`runtime-полей`,children:`Runtime полей`}),`
275
- `,(0,c.jsxs)(t.p,{children:[`| API | Важное свойство |
276
- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
277
- | `,(0,c.jsx)(t.code,{children:`compileFormattersPipelineRuntime(field)`}),` | Компилирует `,(0,c.jsx)(t.code,{children:`formulaExecutor`}),` и `,(0,c.jsx)(t.code,{children:`formattersPipelineExecutor`}),` и `,(0,c.jsxs)(t.strong,{children:[`мутирует переданный `,(0,c.jsx)(t.code,{children:`field`})]}),`. Допустим только до помещения поля в readonly snapshot, memoized context или cache. |
278
- | `,(0,c.jsx)(t.code,{children:`compileFormattersPipelineRuntimeFields(fieldsById)`}),` | Компилирует каждое существующее поле; также не пересобирает и не копирует сами поля. |
279
- | `,(0,c.jsx)(t.code,{children:`formatPipelineDisplayValue(args)`}),` | Возвращает `,(0,c.jsx)(t.code,{children:`FormattersPipelineDisplayValue`}),`, пригодный для UI: значение, state, настройки иконки и `,(0,c.jsx)(t.code,{children:`overflowTooltip`}),`. |`]}),`
238
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Важное свойство`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`compileFormattersPipelineRuntime(field)`})}),(0,c.jsxs)(t.td,{children:[`Компилирует `,(0,c.jsx)(t.code,{children:`formulaExecutor`}),` и `,(0,c.jsx)(t.code,{children:`formattersPipelineExecutor`}),` и `,(0,c.jsxs)(t.strong,{children:[`мутирует переданный `,(0,c.jsx)(t.code,{children:`field`})]}),`. Допустим только до помещения поля в readonly snapshot, memoized context или cache.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`compileFormattersPipelineRuntimeFields(fieldsById)`})}),(0,c.jsx)(t.td,{children:`Компилирует каждое существующее поле; также не пересобирает и не копирует сами поля.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`formatPipelineDisplayValue(args)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`FormattersPipelineDisplayValue`}),`, пригодный для UI: значение, state, настройки иконки и `,(0,c.jsx)(t.code,{children:`overflowTooltip`}),`.`]})]})]})]}),`
280
239
  `,(0,c.jsxs)(t.p,{children:[`Перед pipeline `,(0,c.jsx)(t.code,{children:`formatPipelineDisplayValue`}),` при необходимости выполняет
281
240
  `,(0,c.jsx)(t.code,{children:`field.formulaExecutor`}),`. Если формула отсутствует/ошиблась, `,(0,c.jsx)(t.code,{children:`purelyDerived`}),`
282
241
  поле отображается пустым, а обычное поле возвращается к `,(0,c.jsx)(t.code,{children:`rawValue`}),`. После
@@ -343,27 +302,13 @@ resolve(60); // "warning": boundary "lower" использует <=
343
302
  resolve(95); // "error": числовой threshold по умолчанию использует <
344
303
  `})}),`
345
304
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ThresholdValueStateResolverConfig`}),`:`]}),`
346
- `,(0,c.jsxs)(t.p,{children:[`| Поле | Правило |
347
- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
348
- | `,(0,c.jsx)(t.code,{children:`thresholds`}),` | Числа либо `,(0,c.jsx)(t.code,{children:`{ value, boundary? }`}),`; `,(0,c.jsx)(t.code,{children:`boundary: "upper"`}),` по умолчанию означает, что порог относится к верхнему сегменту (`,(0,c.jsx)(t.code,{children:`<`}),` для нижнего). `,(0,c.jsx)(t.code,{children:`"lower"`}),` включает его в нижний сегмент (`,(0,c.jsx)(t.code,{children:`<=`}),`). |
349
- | `,(0,c.jsx)(t.code,{children:`states`}),` | Ровно `,(0,c.jsx)(t.code,{children:`thresholds.length + 1`}),` состояний в порядке диапазонов от меньших значений к большим. Иначе `,(0,c.jsx)(t.code,{children:`create…`}),`/`,(0,c.jsx)(t.code,{children:`register…`}),` бросит `,(0,c.jsx)(t.code,{children:`Error`}),`. |
350
- | `,(0,c.jsx)(t.code,{children:`invalidState`}),` | Результат для пустого, `,(0,c.jsx)(t.code,{children:`NaN`}),`, бесконечного или нечислового значения; default `,(0,c.jsx)(t.code,{children:`"none"`}),`. |`]}),`
305
+ `,(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:`thresholds`})}),(0,c.jsxs)(t.td,{children:[`Числа либо `,(0,c.jsx)(t.code,{children:`{ value, boundary? }`}),`; `,(0,c.jsx)(t.code,{children:`boundary: "upper"`}),` по умолчанию означает, что порог относится к верхнему сегменту (`,(0,c.jsx)(t.code,{children:`<`}),` для нижнего). `,(0,c.jsx)(t.code,{children:`"lower"`}),` включает его в нижний сегмент (`,(0,c.jsx)(t.code,{children:`<=`}),`).`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`states`})}),(0,c.jsxs)(t.td,{children:[`Ровно `,(0,c.jsx)(t.code,{children:`thresholds.length + 1`}),` состояний в порядке диапазонов от меньших значений к большим. Иначе `,(0,c.jsx)(t.code,{children:`create…`}),`/`,(0,c.jsx)(t.code,{children:`register…`}),` бросит `,(0,c.jsx)(t.code,{children:`Error`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`invalidState`})}),(0,c.jsxs)(t.td,{children:[`Результат для пустого, `,(0,c.jsx)(t.code,{children:`NaN`}),`, бесконечного или нечислового значения; default `,(0,c.jsx)(t.code,{children:`"none"`}),`.`]})]})]})]}),`
351
306
  `,(0,c.jsxs)(t.p,{children:[`Пороги сортируются перед compilation, но массив `,(0,c.jsx)(t.code,{children:`states`}),` не переставляется.
352
307
  Передавайте `,(0,c.jsx)(t.code,{children:`thresholds`}),` сразу по возрастанию, чтобы соответствие сегментов и
353
308
  states было однозначным. Для дублирующихся порогов библиотека выводит
354
309
  `,(0,c.jsx)(t.code,{children:`console.warn`}),`, но продолжает работу.`]}),`
355
310
  `,(0,c.jsx)(t.h3,{id:`реестр-и-presentation-helpers`,children:`Реестр и presentation helpers`}),`
356
- `,(0,c.jsxs)(t.p,{children:[`| API | Поведение / side effect |
357
- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
358
- | `,(0,c.jsx)(t.code,{children:`registerFixedResolver`}),`, `,(0,c.jsx)(t.code,{children:`registerThresholdResolver`}),` | Регистрируют конфигурационный resolver и возвращают его детерминированный короткий id. |
359
- | `,(0,c.jsx)(t.code,{children:`createFixedResolver`}),`, `,(0,c.jsx)(t.code,{children:`createThresholdResolver`}),` | Возвращают функцию resolver; также используют общий registry и дедупликацию. |
360
- | `,(0,c.jsx)(t.code,{children:`resolveValueState(id, value)`}),` | Возвращает `,(0,c.jsx)(t.code,{children:`"none"`}),`, если id не найден. |
361
- | `,(0,c.jsx)(t.code,{children:`getValueStateResolver(id)`}),`, `,(0,c.jsx)(t.code,{children:`getValueStateResolverIds()`}),` | Читают resolver или список ids. |
362
- | `,(0,c.jsx)(t.code,{children:`registerResolver(canonicalKey, compileFunction)`}),`, `,(0,c.jsx)(t.code,{children:`findResolverByCanonicalKey`}),`, `,(0,c.jsx)(t.code,{children:`computeShortHash`}),` | Низкоуровневый API для специальных host-резолверов. `,(0,c.jsx)(t.code,{children:`compileFunction`}),` — runtime-функция, её нельзя хранить в config. |
363
- | `,(0,c.jsx)(t.code,{children:`resetValueStateResolvers()`}),` | Очищает global registry. Только для изолированных тестов: сбросит resolvers, созданные скомпилированными pipeline. |
364
- | `,(0,c.jsx)(t.code,{children:`DEFAULT_VALUE_STATES`}),` | Readonly список presentation-состояний без пустого значения. |
365
- | `,(0,c.jsx)(t.code,{children:`VALUE_STATE_COLOR_TOKENS`}),` | Соответствие `,(0,c.jsx)(t.code,{children:`State`}),` CSS token. Не меняет DOM и не подключает стили. |
366
- | `,(0,c.jsx)(t.code,{children:`resolveValueStateClassName(state, fallbackClassName?)`}),` | Для `,(0,c.jsx)(t.code,{children:`success`}),` / `,(0,c.jsx)(t.code,{children:`warning`}),` / `,(0,c.jsx)(t.code,{children:`error`}),` / `,(0,c.jsx)(t.code,{children:`information`}),` возвращает `,(0,c.jsx)(t.code,{children:`status…`}),`; для остальных — fallback. |`]}),`
311
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Поведение / side effect`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`registerFixedResolver`}),`, `,(0,c.jsx)(t.code,{children:`registerThresholdResolver`})]}),(0,c.jsx)(t.td,{children:`Регистрируют конфигурационный resolver и возвращают его детерминированный короткий id.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createFixedResolver`}),`, `,(0,c.jsx)(t.code,{children:`createThresholdResolver`})]}),(0,c.jsx)(t.td,{children:`Возвращают функцию resolver; также используют общий registry и дедупликацию.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveValueState(id, value)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`"none"`}),`, если id не найден.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getValueStateResolver(id)`}),`, `,(0,c.jsx)(t.code,{children:`getValueStateResolverIds()`})]}),(0,c.jsx)(t.td,{children:`Читают resolver или список ids.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`registerResolver(canonicalKey, compileFunction)`}),`, `,(0,c.jsx)(t.code,{children:`findResolverByCanonicalKey`}),`, `,(0,c.jsx)(t.code,{children:`computeShortHash`})]}),(0,c.jsxs)(t.td,{children:[`Низкоуровневый API для специальных host-резолверов. `,(0,c.jsx)(t.code,{children:`compileFunction`}),` — runtime-функция, её нельзя хранить в config.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resetValueStateResolvers()`})}),(0,c.jsx)(t.td,{children:`Очищает global registry. Только для изолированных тестов: сбросит resolvers, созданные скомпилированными pipeline.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`DEFAULT_VALUE_STATES`})}),(0,c.jsx)(t.td,{children:`Readonly список presentation-состояний без пустого значения.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`VALUE_STATE_COLOR_TOKENS`})}),(0,c.jsxs)(t.td,{children:[`Соответствие `,(0,c.jsx)(t.code,{children:`State`}),` CSS token. Не меняет DOM и не подключает стили.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveValueStateClassName(state, fallbackClassName?)`})}),(0,c.jsxs)(t.td,{children:[`Для `,(0,c.jsx)(t.code,{children:`success`}),` / `,(0,c.jsx)(t.code,{children:`warning`}),` / `,(0,c.jsx)(t.code,{children:`error`}),` / `,(0,c.jsx)(t.code,{children:`information`}),` возвращает `,(0,c.jsx)(t.code,{children:`status…`}),`; для остальных — fallback.`]})]})]})]}),`
367
312
  `,(0,c.jsx)(t.h2,{id:`runtime-ограничения`,children:`Runtime-ограничения`}),`
368
313
  `,(0,c.jsxs)(t.ul,{children:[`
369
314
  `,(0,c.jsx)(t.li,{children:`Реестры row-based formatter-ов и value-state resolver-ов — module-scoped
@@ -0,0 +1,25 @@
1
+ import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-CyRHAH4o.js";import{i as n,r}from"./react-qN2cStNd.js";import{l as i,m as a}from"./blocks-BAkpxLLq.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Обзор`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`ryuzaki13react-foundation-lib`,children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib`})}),`
3
+ `,(0,c.jsx)(t.p,{children:`Технический фундамент для host-приложений: чистые преобразования данных, browser/React hooks, сериализуемые runtime-контракты, OData metadata helpers и инфраструктура состояния. Пакет не знает домен приложения, UI-компоненты и transport конкретного backend.`}),`
4
+ `,(0,c.jsx)(t.h2,{id:`подключение`,children:`Подключение`}),`
5
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib
6
+ `})}),`
7
+ `,(0,c.jsxs)(t.p,{children:[`Пакет ESM и намеренно `,(0,c.jsx)(t.strong,{children:`не имеет корневого импорта`}),`. Подключайте ровно тот опубликованный subpath, который нужен сценарию:`]}),`
8
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { formatDateAsDate } from "@ryuzaki13/react-foundation-lib/formatters";
9
+ import { createQueryClient } from "@ryuzaki13/react-foundation-lib/query-client";
10
+ import type { RowRecord } from "@ryuzaki13/react-foundation-lib/types";
11
+ `})}),`
12
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Неверно: корневой entrypoint не опубликован.
13
+ import { formatDateAsDate } from "@ryuzaki13/react-foundation-lib";
14
+ `})}),`
15
+ `,(0,c.jsx)(t.h2,{id:`граница-ответственности`,children:`Граница ответственности`}),`
16
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Задача`}),(0,c.jsx)(t.th,{children:`Использовать`}),(0,c.jsx)(t.th,{children:`Не использовать вместо этого`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Чистые OData V2 metadata, path, filter и value helpers`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`odata-service`})}),(0,c.jsx)(t.td,{children:`HTTP/OData transport`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Вызовы SAP Gateway, SSO, X-CSRF и TanStack Query operation`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/odata`})}),(0,c.jsxs)(t.td,{children:[`ручной `,(0,c.jsx)(t.code,{children:`fetch`}),` или этот пакет`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`UI primitives и дизайн-система`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-ui/<module>`})}),(0,c.jsx)(t.td,{children:`hooks/utilities из lib как компонент`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Доменный mapping и пользовательский сценарий`}),(0,c.jsx)(t.td,{children:`host entity/feature`}),(0,c.jsx)(t.td,{children:`foundation-lib`})]})]})]}),`
17
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`react-foundation-lib`}),` не создаёт бизнес-правила, не хранит backend snapshot и не заменяет API- или UI-пакеты.`]}),`
18
+ `,(0,c.jsx)(t.h2,{id:`среда-выполнения-и-peer-dependencies`,children:`Среда выполнения и peer dependencies`}),`
19
+ `,(0,c.jsx)(t.p,{children:`Большинство pure helpers не требуют React. Entry point с React hook, DOM, browser storage или Service Worker должен вызываться только в браузерном runtime и по правилам React hooks. Совместимые peer dependencies должны быть разрешены host-проектом для используемого entrypoint.`}),`
20
+ `,(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:`Когда нужна в host`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`react`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`hooks`}),`, `,(0,c.jsx)(t.code,{children:`dom`}),`, `,(0,c.jsx)(t.code,{children:`copy`}),`, `,(0,c.jsx)(t.code,{children:`media`}),`, `,(0,c.jsx)(t.code,{children:`pwa`}),`, `,(0,c.jsx)(t.code,{children:`three-scene`}),`, selection/table hooks`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`@tanstack/react-query`}),`, persistence, broadcast`]}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`query-client`}),`, часть `,(0,c.jsx)(t.code,{children:`error-report`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@tanstack/react-table`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`table`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@tanstack/react-virtual`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`virtualizer`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@tanstack/react-router`})}),(0,c.jsxs)(t.td,{children:[`search helpers из `,(0,c.jsx)(t.code,{children:`hooks`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@floating-ui/react`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`useFloatingListbox`}),`, DOM reference guards`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`@dnd-kit/core`}),`, `,(0,c.jsx)(t.code,{children:`@dnd-kit/sortable`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDndSortableSensors`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`zustand`}),`, `,(0,c.jsx)(t.code,{children:`immer`})]}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`notifications`}),`, OData store`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`zod`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`odata-service`}),` schemas`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`write-excel-file`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`excel`})})]})]})]}),`
21
+ `,(0,c.jsx)(t.h2,{id:`выбор-entrypoint`,children:`Выбор entrypoint`}),`
22
+ `,(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:`Точный import`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Массивы, дедупликация, grouping, reorder`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/array`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`Base64 и `,(0,c.jsx)(t.code,{children:`Blob`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/binary`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ограниченный стек копий`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/bounded-copy-stack`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Anchor и state контекстного меню`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/context-menu`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Clipboard и feedback hooks`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/copy`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Hash и UUID`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/crypto`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Валютные labels по OData-параметрам`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/currency`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Сегменты маски даты`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/date-segments`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Portal, focus, observers, browser download`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/dom`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ошибка отсутствующего React context`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Подготовка и диагностика error report`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Excel и экспорт таблиц`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/excel`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`FileReader`}),`, MIME, Content-Disposition, изображения`]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/file`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Client fingerprint`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/fingerprint`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Form errors и presets`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/form`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Даты, числа, строки, pipeline и value state`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formatters`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Реестр и выполнение клиентских формул таблицы`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formulas`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Общие React hooks`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/hooks`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`HTTP headers и text `,(0,c.jsx)(t.code,{children:`Response`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/http`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Breakpoints и media-query hooks`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/media`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Imperative notifications и store`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/notifications`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Математика slider/scale`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/number-scale`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`OData code/text collections и store`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/odata`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`OData V2 metadata, builder, filters, formats`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/odata-service`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нормализация сохранённых preset ids`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/presets`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Service Worker update и cache policy`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/pwa`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Только cache policy`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/pwa/sw-cache-policy`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`QueryClient, persistence, broadcast`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/query-client`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Вывод открытых границ диапазона`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/range-output`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`SEO/head metadata contracts`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/seo`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`ID в `,(0,c.jsx)(t.code,{children:`sessionStorage`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/session-storage`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Предсказуемое строковое сравнение`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/string-comparison`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`TanStack Table layout, selection и OData adapter`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/table`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Проверка доступности Three.js`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/three-scene`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Построение tree-table rows`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/tree-table`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Общие TypeScript contracts`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/types`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Clone, className, keyboard, stable stringify, tree`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/utils`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Runtime guards и URL/image validation`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/validators`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Infinite-query подгрузка virtualizer`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/virtualizer`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`XML parse/build`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/xml`})})]})]})]}),`
23
+ `,(0,c.jsx)(t.h2,{id:`как-читать-справочник`,children:`Как читать справочник`}),`
24
+ `,(0,c.jsxs)(t.p,{children:[`Каждая последующая страница построена вокруг `,(0,c.jsx)(t.strong,{children:`published subpath`}),`, а не каталога исходников. В ней указаны точный import, публичные contracts, обязательная инициализация, результат, lifecycle/cleanup и ограничения. Для pure helpers достаточно вызвать функцию; registry, browser и global-store API требуют отдельного раздела «Инициализация и side effects».`]}),`
25
+ `,(0,c.jsxs)(t.p,{children:[`Если API не описан как публичный на соответствующей странице, не импортируйте его глубоким путём из `,(0,c.jsx)(t.code,{children:`src`}),` или `,(0,c.jsx)(t.code,{children:`dist`}),`: это не часть стабильного consumer contract.`]})]})}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};